ruhuxu hai 5 meses
achega
2a4c4ec479
Modificáronse 100 ficheiros con 25347 adicións e 0 borrados
  1. BIN=BIN
      .DS_Store
  2. 44 0
      App.vue
  3. 10131 0
      alf/Main.css
  4. 1133 0
      alf/commonValidator.js
  5. 1462 0
      alf/ext_lf_inp.jsp
  6. 338 0
      alf/mp_excelRcXcdjl_edit.ss.jsp
  7. 1562 0
      alf/validation.js
  8. 68 0
      api/user.js
  9. 35 0
      api/xuncha.js
  10. BIN=BIN
      components/.DS_Store
  11. 97 0
      components/Form/index.vue
  12. 112 0
      components/SsBottom/index.vue
  13. 337 0
      components/SsDatetimePicker/index.vue
  14. 85 0
      components/SsInput/index.vue
  15. 352 0
      components/SsSelect/index.vue
  16. 18 0
      components/SsTableTitle/index.vue
  17. 245 0
      components/Td/index.vue
  18. 226 0
      components/agreement/AgreementPopup.vue
  19. 53 0
      components/icon/index.vue
  20. 471 0
      components/login/LoginPopup.vue
  21. 133 0
      components/tabbar/index.vue
  22. 143 0
      composables/useFormValidation.js
  23. 3 0
      config/env.js
  24. 20 0
      index.html
  25. 13 0
      main.js
  26. 73 0
      manifest.json
  27. 17 0
      node_modules/.bin/lessc
  28. 126 0
      node_modules/.modules.yaml
  29. 22 0
      node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/LICENSE
  30. 19 0
      node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/README.md
  31. 295 0
      node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/lib/index.js
  32. 0 0
      node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/lib/index.js.map
  33. 31 0
      node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/package.json
  34. 22 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/LICENSE
  35. 19 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/README.md
  36. 8 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/identifier.js
  37. 0 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map
  38. 57 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/index.js
  39. 1 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/index.js.map
  40. 35 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/keyword.js
  41. 0 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/keyword.js.map
  42. 31 0
      node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/package.json
  43. 1073 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/CHANGELOG.md
  44. 19 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/LICENSE
  45. 19 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/README.md
  46. 15 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/babel-parser.js
  47. 1463 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/lib/index.js
  48. 0 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/lib/index.js.map
  49. 17 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules/.bin/parser
  50. 50 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/package.json
  51. 239 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/typings/babel-parser.d.ts
  52. 1 0
      node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/types
  53. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/helper-string-parser
  54. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/helper-validator-identifier
  55. 22 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/LICENSE
  56. 19 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/README.md
  57. 16 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/assertNode.js
  58. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/assertNode.js.map
  59. 1251 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/generated/index.js
  60. 0 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/generated/index.js.map
  61. 3 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/ast-types/generated/index.js
  62. 0 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/ast-types/generated/index.js.map
  63. 18 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js
  64. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js.map
  65. 31 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js
  66. 0 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js.map
  67. 29 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/index.js
  68. 0 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/index.js.map
  69. 2896 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/lowercase.js
  70. 0 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/lowercase.js.map
  71. 5 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/uppercase.js
  72. 0 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/uppercase.js.map
  73. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/productions.js
  74. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/productions.js.map
  75. 24 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/react/buildChildren.js
  76. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/react/buildChildren.js.map
  77. 22 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js
  78. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js.map
  79. 21 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/validateNode.js
  80. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/validateNode.js.map
  81. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/clone.js
  82. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/clone.js.map
  83. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeep.js
  84. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeep.js.map
  85. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js
  86. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js.map
  87. 107 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneNode.js
  88. 0 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneNode.js.map
  89. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js
  90. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js.map
  91. 15 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComment.js
  92. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComment.js.map
  93. 22 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComments.js
  94. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComments.js.map
  95. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritInnerComments.js
  96. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritInnerComments.js.map
  97. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritLeadingComments.js
  98. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritLeadingComments.js.map
  99. 12 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritTrailingComments.js
  100. 1 0
      node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritTrailingComments.js.map

BIN=BIN
.DS_Store


+ 44 - 0
App.vue

@@ -0,0 +1,44 @@
+<script>
+import { userApi } from '@/api/user.js'
+
+export default {
+	onLaunch: function() {
+		// 获取并保存设备信息
+		if (!uni.getStorageSync("deviceInfo")) {
+			const deviceInfo = uni.getDeviceInfo()
+			uni.setStorageSync("deviceInfo", deviceInfo)
+			console.log("初始化设备信息", deviceInfo)
+		}
+	},
+	onShow: async function() {
+		// 检查是否有token,有则自动登录
+		const userInfo = uni.getStorageSync("userInfo")
+		if (userInfo?.yhsbToken) {
+			try {
+				console.log("自动登录", userInfo.yhsbToken)
+				const res = await userApi.autoLogin({
+					mdToken: userInfo.yhsbToken
+				})
+				console.log("自动登录", res.data)
+				// 更新整个 userInfo 对象,主要更新yhsbToken
+				
+				uni.setStorageSync("userInfo", res.data)
+				
+			} catch (error) {
+				console.error("自动登录失败", error)
+				// 可以在这里处理登录失败的情况,比如清除token
+				// uni.removeStorageSync("userInfo")
+			}
+		} else {
+			console.log("无token,跳过自动登录")
+		}
+	},
+	onHide: function() {
+		console.log('App Hide')
+	}
+}
+</script>
+
+<style lang="scss">
+	@import "uview-plus/index.scss";
+</style>

+ 10131 - 0
alf/Main.css

@@ -0,0 +1,10131 @@
+/*-----------------start 20240708 样式--------------*/
+/*
+* {
+    cursor: url(image/cur.ico), default;
+}
+*/
+html,
+body {
+    height: 100%;
+}
+
+body,
+div,
+span,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+pre,
+em,
+a,
+img,
+ul,
+li,
+form,
+b,
+u,
+i,
+fieldset,
+form,
+label,
+tbody,
+thead,
+tr,
+th,
+td,
+canvas,
+audio,
+textarea,
+video {
+    font-size: 100%;
+    margin: 0;
+    padding: 0;
+    vertical-align: baseline;
+    border: none;
+    font-weight: normal;
+    text-decoration: none;
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
+    outline: none;
+}
+
+body {
+    font-size: 14px;
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    cursor: url(image/cur.ico), default;
+
+    -webkit-text-size-adjust: none;
+    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+hr {
+    margin: 0px;
+    height: 0px;
+    border: none;
+    border-bottom: 1px solid #cccccc;
+}
+
+body,
+input,
+button,
+select {
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
+    margin: 0;
+    padding: 0;
+}
+
+strong span {
+    font-weight: bold;
+}
+
+input {
+    background: none;
+}
+
+ul {
+    list-style: none;
+}
+
+textarea {
+    background-color: transparent;
+    outline: none;
+}
+
+input[type='text'],
+input[type='number'],
+input[type='password'] {
+    width: 160px;
+    height: 30px;
+    color: #000000;
+    border: none;
+    vertical-align: middle;
+    margin-right: 2px;
+    padding-left: 12px;
+    box-sizing: border-box;
+    border-radius: 2px;
+    font-size: 16px;
+    outline: none;
+    background: none;
+}
+
+input[type='text']:focus,
+input[type='number']:focus,
+input[type='password']:focus {
+    border: 1px solid #6c9ed7;
+    /* box-shadow: 0 0 5px #6c9ed7; */
+    outline: none;
+}
+
+input[type='text']::-webkit-input-placeholder,
+input[type='number']::-webkit-input-placeholder,
+input[type='password']::-webkit-input-placeholder {
+    color: #ccc;
+    font-family: "SimHei", Georgia, Serif !important;
+    font-size: 14px;
+}
+
+
+
+
+
+
+/*-------锁屏样式-------*/
+
+.lock-screen {
+    background: url(image/SuoPin1.jpg) !important;
+    background-repeat: no-repeat !important;
+    background-position: center center !important;
+    background-attachment: fixed !important;
+    background-size: cover !important;
+
+
+}
+
+/*----------------线样式-----------------*/
+/*hLine*/
+/*普通hLine*/
+.hLine {
+    border-bottom: 1px solid #d9d9d9;
+}
+
+/*上边框浅色实线*/
+.hLine-top {
+    border-top: 1px solid #d9d9d9;
+}
+
+/*浅色hLine*/
+.hLine-dim {
+    border-bottom: 1px solid #e5e8e9;
+}
+
+/*hLine高亮*/
+.hLine-highlight {
+    border-bottom: 1px solid #6c9ed7;
+}
+
+/*hLine高亮加粗*/
+.hLine-highlightBlod {
+    border-bottom: 2px solid #6c9ed7;
+}
+
+.hLine-dashed {
+    border-bottom: 1px dashed #ededed;
+}
+
+/* 拖拉界面的红线 */
+.hLine-warning {
+    width: calc(100% - 4px);
+    height: 2px;
+    background-color: red;
+    display: inline-block;
+    vertical-align: top;
+}
+
+/*vLine*/
+/*普通vLine*/
+.vLine {
+    border-right: 1px solid #d9d9d9;
+}
+
+/*左边框浅色实线*/
+.vLine-left {
+    border-left: 1px solid #d9d9d9;
+}
+
+/*vLine虚线*/
+.vLine-dashed {
+    border-right: 1px dashed #cacfd9;
+}
+
+/*非空校验的样式*/
+.vLine-leftWarning {
+    border-left: 2px solid red;
+    height: 100%;
+    position: absolute;
+    left: -1px;
+    top: 0px;
+}
+
+.vLine-warning {
+    border-left: 2px solid red;
+    height: 20px;
+    display: inline-block;
+    float: left;
+}
+
+.vline-dim {
+    border-right: 1px solid #c3c3c3;
+}
+
+/* .menu-vLine {
+    border-right: 1px solid rgba(30, 39, 105, 1);
+    box-shadow: 1px 0px 0px rgba(60, 74, 185, 1);
+} */
+
+.vLine-leftHighlight {
+    border-left: 2px solid #71a0ce;
+}
+
+/*-------------------线样式结束----------------------*/
+
+/* ------------------鼠标样式 -----------------------*/
+/* 向左拖一个 */
+.cursor-hDrag {
+    cursor: url(image/cursor-hDrag.ico), default !important;
+}
+
+.cursor-hDrag * {
+    cursor: url(image/cursor-hDrag.ico), default !important;
+}
+
+/* 向左拖多个 */
+.cursor-hDragMultiple {
+    cursor: url(image/cursor-hDragMultiple.ico), default !important;
+}
+
+.cursor-hDragMultiple * {
+    cursor: url(image/cursor-hDragMultiple.ico), default !important;
+}
+
+/* 手形(点击打开) */
+.cursor-click {
+    cursor: url(image/cursor-click.ico), default !important;
+}
+
+.cursor-click * {
+    cursor: url(image/cursor-click.ico), default !important;
+}
+
+/* 向上拖一个 */
+.cursor-vDrag {
+    cursor: url(image/cursor-vDrag.ico), default !important;
+}
+
+.cursor-vDrag * {
+    cursor: url(image/cursor-vDrag.ico), default !important;
+}
+
+/* 向上拖多个 */
+.cursor-vDragMultiple {
+    cursor: url(image/cursor-vDragMultiple.ico), default !important;
+}
+
+.cursor-vDragMultiple * {
+    cursor: url(image/cursor-vDragMultiple.ico), default !important;
+}
+
+/* 可点击带帮助 */
+.cursor-clickHelp {
+    cursor: url(image/cursor-clickHelp.ico), default !important;
+}
+
+/* 带帮助 */
+.cursor-help {
+    cursor: url(image/cursor-help.ico), default !important;
+}
+
+/* 普通 */
+.cursor {
+    cursor: url(image/cur.ico), default !important;
+}
+
+/* 倒计时 */
+.cursor-timing1 * {
+    cursor: url(image/ready1.ico), default !important;
+}
+
+.cursor-timing2 * {
+    cursor: url(image/ready2.ico), default !important;
+}
+
+.cursor-timing3 * {
+    cursor: url(image/ready3.ico), default !important;
+}
+
+.cursor-timing4 * {
+    cursor: url(image/ready4.ico), default !important;
+}
+
+.cursor-timing5 * {
+    cursor: url(image/ready5.ico), default !important;
+}
+
+.cursor-timing6 * {
+    cursor: url(image/ready6.ico), default !important;
+}
+
+.cursor-timing7 * {
+    cursor: url(image/ready7.ico), default !important;
+}
+
+.cursor-timing8 * {
+    cursor: url(image/ready8.ico), default !important;
+}
+
+.cursor-timing9 * {
+    cursor: url(image/ready9.ico), default !important;
+}
+
+.cursor-timing10 * {
+    cursor: url(image/ready10.ico), default !important;
+}
+
+.cursor-timing11 * {
+    cursor: url(image/ready11.ico), default !important;
+}
+
+.cursor-timing12 * {
+    cursor: url(image/ready12.ico), default !important;
+}
+
+/*忙(转圈圈)*/
+.cursor-loading {
+    width: 34px;
+    height: 34px;
+    background: url(image/cursor-loading.gif) center center no-repeat;
+}
+
+/*------------------鼠标样式结束--------------------*/
+
+/*--------------------滚动条样式--------------------*/
+/*大滚动条*/
+div.nicescroll-rails {
+    /*background-color: inherit !important;*/
+}
+
+/*大滚动条样式*/
+/* .scrollbar{} */
+
+/*小滚动条样式*/
+/* .smallScrollbar {} */
+/*---------------------滚动条样式结束----------------*/
+
+/*----------------------背景颜色样式-------------*/
+/*主体背景颜色*/
+.home-div {
+    background-color: #f5f5f5;
+
+
+}
+
+/*内容*/
+.background-content {
+    background-color: #fff;
+}
+
+/*应用首页操作区底色*/
+.sysbar-div {
+    background-color: #fff;
+}
+
+.cms-background {
+    background-color: #f5f5f5;
+}
+
+/*---------------------背景颜色样式结束------------*/
+
+/*---------------------按钮样式-------------------*/
+/* 搜索按钮 */
+.content-invertButton {
+    font-size: 14px;
+    color: #fff;
+    padding: 0px 13px;
+    height: 28px;
+    line-height: 28px;
+    background-color: #393d51;
+    box-sizing: border-box;
+    border: 1px solid #393d51;
+    vertical-align: middle;
+    border-radius: 3px;
+    outline: none;
+    margin-right: 2px;
+}
+
+.content-invertButton:hover {
+    border: 1px solid #c4c7cc;
+    color: #c4c7cc;
+    background-color: transparent;
+}
+
+.content-invertButton:active {
+    border: 1px solid #000;
+    color: #fff;
+    background: #000;
+}
+
+/* 管理按钮 */
+.content-button {
+    font-size: 14px;
+    color: #999999;
+    padding: 0px 13px;
+    height: 29px;
+    line-height: 28px;
+    box-sizing: border-box;
+    border: 1px solid #c4c7cc;
+    vertical-align: middle;
+    border-radius: 3px;
+    outline: none;
+    margin-right: 2px;
+    background: none;
+}
+
+.content-button:hover {
+    background-color: #393d51;
+    border: 1px solid #393d51;
+    color: #fff;
+    /* background-color: #6b9fd3; */
+}
+
+.content-button:active {
+    border: 1px solid #000;
+    color: #fff;
+    background-color: #000;
+}
+
+/*底部按钮样式*/
+.bottom-button {
+    width: 161px;
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
+    font-size: 16px;
+    font-weight: normal;
+    clear: both;
+    /* height: 37px; */
+    box-sizing: border-box;
+    padding: 5px 20px;
+    line-height: 33px;
+    /* margin: 0 12.5px; */
+    color: #333333;
+    border: none;
+    border-radius: 5px;
+    background: #FFFFFF;
+    border-radius: 4px 4px 4px 4px;
+    border: 1px solid #A6ABB3;
+    outline: none;
+    letter-spacing: unset !important;
+}
+
+.bottom-button:hover {
+    color: #fff;
+    background-color: #575D6D;
+}
+
+.bottom-button:active {
+    color: #fff;
+    background-color: #575D6D;
+}
+
+/*on按钮*/
+.content-onButton {
+    display: inline-block;
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
+    font-size: 16px;
+    min-width: 80px;
+    font-weight: normal;
+    height: 28px;
+    line-height: 28px;
+    outline: none;
+    color: #393d51;
+    background: url(image/svg_icon/gouxuan.svg) right bottom no-repeat;
+    background-color: #ffffff;
+    overflow: hidden;
+    padding: 5px 10px;
+    vertical-align: middle;
+    position: relative;
+    box-sizing: border-box;
+    border-radius: 2px;
+    border: 1px solid #393d51;
+    background-size: 24px;
+}
+
+.content-onButton:hover {
+    color: #fff;
+    background: #393d51 url(image/svg_icon/gouxuan.svg) right bottom no-repeat;
+}
+
+/*off按钮*/
+.content-offButton {
+    display: inline-block;
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
+    font-size: 16px;
+    min-width: 80px;
+    font-weight: normal;
+    padding: 5px 10px;
+    outline: none;
+    color: #c3c6ca;
+    background: url(image/svg_icon/bugouxuan.svg) right bottom no-repeat;
+    background-color: #ffffff;
+    border-radius: 4px;
+    overflow: hidden;
+    /* padding: 0px 13px; */
+    vertical-align: middle;
+    border: 1px solid #bfc1c6;
+    box-sizing: border-box;
+    background-size: 24px;
+}
+
+.content-offButton:hover {
+    border-radius: 4px;
+    color: #fff;
+    background: #393d51 url(image/svg_icon/bugouxuan.svg) right bottom no-repeat;
+}
+
+/*label按钮*/
+.label-button {
+    font-size: 14px;
+    padding: 0px 13px;
+    background-color: #6c9ed7;
+    box-sizing: border-box;
+    border: 1px solid #fff;
+    height: 28px;
+    line-height: 28px;
+    vertical-align: middle;
+    color: #fff;
+    border-radius: 4px;
+    outline: none;
+    cursor: pointer;
+    margin-right: 2px;
+}
+
+.label-button:hover {
+    border-radius: 4px;
+    color: #6c9ed7;
+    background-color: #fff;
+}
+
+.smallButton {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background-color: #f7f7f7;
+    color: #6c9ddb;
+    text-align: center;
+    line-height: 22px;
+    box-shadow: -1px 1px 1px rgba(108, 158, 215, .4);
+    border-radius: 2px;
+    outline: none;
+    border: none;
+    background-position: center center;
+    background-repeat: no-repeat;
+}
+
+.smallButton:hover {
+    color: #fff;
+    background-color: #6c9ed7;
+}
+
+.smallButton:active {
+    color: #fff;
+    background-color: #415f7f;
+}
+
+.button {
+    width: 50px;
+    background-color: #f7f7f7;
+    border-radius: 2px;
+    color: #6c9ed7;
+    text-align: center;
+    outline: none;
+    border: none;
+    display: inline-block;
+    box-shadow: -1px 1px 1px rgba(108, 158, 215, .4);
+    background-position-x: center;
+    background-position-y: calc(50% - 10px);
+    font-size: 13px;
+    background-repeat: no-repeat;
+}
+
+.button:hover {
+    background-color: #6c9ed7;
+    color: #fff;
+}
+
+.button:active {
+    background-color: #415f7f;
+    color: #fff;
+}
+
+.builtinButton {
+    width: 50px;
+    background-color: #f7f7f7;
+    border-radius: 2px;
+    color: #6c9ed7;
+    text-align: center;
+    outline: none;
+    border: none;
+    display: inline-block;
+    box-shadow: -1px 0px 1px rgba(108, 158, 215, .4);
+    background-position-x: center;
+    background-position-y: calc(50% - 10px);
+    font-size: 13px;
+    background-repeat: no-repeat;
+}
+
+.builtinButton:hover {
+    background-color: #6c9ed7;
+    color: #fff;
+}
+
+.builtinButton:active {
+    background-color: #415f7f;
+    color: #fff;
+}
+
+/*--------------------按钮样式结束----------------------*/
+
+/*--------------------icon图标样式-----------------------*/
+/*附件*/
+.icon-attachment {
+    background-image: url(image/icon-attachment.png);
+}
+
+.icon-attachment:hover {
+    background-image: url(image/icon-attachment-hover.png);
+}
+
+.icon-attachment:active {
+    background-image: url(image/icon-attachment-hover.png);
+}
+
+/*常用语*/
+.icon-phrase {
+    background-image: url(image/icon-phrase.png);
+}
+
+.icon-phrase:hover {
+    background-image: url(image/icon-phrase-hover.png);
+}
+
+.icon-phrase:active {
+    background-image: url(image/icon-phrase-hover.png);
+}
+
+/*手写*/
+.icon-pen {
+    background-image: url(image/icon-pen.png);
+}
+
+.icon-pen:hover {
+    background-image: url(image/icon-pen-hover.png);
+}
+
+.icon-pen:active {
+    background-image: url(image/icon-pen-hover.png);
+}
+
+/*待办小I*/
+.icon-i {
+    vertical-align: middle;
+    background-image: url(image/smallButton-i.png);
+    cursor: url(image/cur.ico), default !important;
+    float: left;
+    margin-top: 10px !important;
+    margin-left: 8px;
+}
+
+.smallButton.icon-i:hover {
+    background-image: url(image/smallButton-i-hover.png);
+}
+
+.smallButton.icon-i:active {
+    background-image: url(image/smallButton-i-hover.png);
+}
+
+/*待办大I按钮*/
+.icon-bigI {
+    vertical-align: middle;
+    background-image: url(image/smallButton-bigIbutton.png);
+    float: left;
+    cursor: url(image/cur.ico), default !important;
+    margin-top: 10px;
+    margin-left: 10px;
+}
+
+.smallButton.icon-bigI:hover {
+    background-image: url(image/smallButton-bigIbutton-hover.png);
+}
+
+.smallButton.icon-bigI:active {
+    background-image: url(image/smallButton-bigIbutton-hover.png);
+}
+
+/*增加*/
+.icon-add {
+    background-image: url(image/addIcon.png);
+    background-position-x: center;
+    background-repeat: no-repeat;
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+}
+
+input.icon-add {
+    
+    border: none;
+    outline: none;
+    float: left;
+    margin-right: 8px;
+    
+}
+
+.button.icon-add:hover {
+    background-image: url(image/addIcon-hover.png);
+    background-position-x: center;
+    background-repeat: no-repeat;
+}
+
+/*删除*/
+.icon-del {
+    background-image: url(image/icon-del.png);
+}
+
+input.icon-del {
+    width: 22px;
+    height: 22px;
+    border: none;
+    outline: none;
+    float: left;
+    margin-right: 8px;
+    display: inline-block;
+}
+
+.button.icon-del:hover {
+    background-image: url(image/icon-del-hover.png);
+}
+
+
+/* 变动 */
+.icon-change {
+    background-image: url(image/changeIcon.png);
+}
+
+input.icon-change {
+    width: 22px;
+    height: 22px;
+    border: none;
+    outline: none;
+    float: left;
+    margin-right: 8px;
+    display: inline-block;
+}
+
+/* 停用 */
+.icon-disable {
+    background-image: url(image/disableIcon.png);
+}
+
+input.icon-disable {
+    width: 22px;
+    height: 22px;
+    border: none;
+    outline: none;
+    float: left;
+    margin-right: 8px;
+    display: inline-block;
+}
+
+/* 启用 */
+.icon-enable {
+    background-image: url(image/icon-enable.png);
+}
+
+input.icon-enable {
+    width: 22px;
+    height: 22px;
+    border: none;
+    outline: none;
+    float: left;
+    margin-right: 8px;
+    display: inline-block;
+}
+
+/*数量*/
+.icon-num {
+    display: inline-block;
+    height: 19px;
+    line-height: 19px;
+    font-size: 14px;
+    color: #6c9ed7;
+    background-color: #fff;
+    padding: 0px 5px;
+    border: 1px solid #6c9ed7;
+    vertical-align: middle;
+}
+
+/* 总数超过9的图标 */
+.icon-fullNum {
+    height: 19px;
+    width: 19px;
+    box-sizing: border-box;
+    border: 1px solid #6c9ed7;
+    background: url(image/icon-num-9p.png) center center;
+    background-color: #fff;
+    background-color: #6c9ed7;
+}
+
+/*objectpicker不可输入时下拉图标*/
+.icon-down {
+    display: inline-block;
+    vertical-align: middle;
+    width: 26px;
+    height: 26px;
+    background: url(image/dialog-select-icon.png) center center no-repeat;
+    /* border: 1px solid rgb(195 199 203); */
+    position: absolute;
+    right: 2px;
+    border-radius: 2px;
+    box-shadow: none;
+    /* top: 8px; */
+    /* transform: translateY(-50%); */
+}
+
+/*objectpicker可输入时下拉图标*/
+.smallButton.icon-down {
+    position: absolute;
+    right: -1px;
+    top: -1px;
+    background-image: url(image/svg_icon/xiangxiajiantou.svg);
+    background-position: center !important;
+    background-size: 80%;
+    border-radius: 2px;
+    border: 1px solid rgb(195 199 203);
+}
+
+.smallButton.icon-down:hover {
+    background-color: #393d51;
+    background-image: url(image/svg_icon/xiangxiajiantou.svg);
+}
+
+.smallButton.icon-down:active {
+    background-color: rgb(0 0 0);
+    background-image: url(image/svg_icon/xiangxiajiantou.svg);
+}
+
+/*实心闭合文件夹icon*/
+.icon-fullFolder {
+    display: inline-block;
+    width: 22px;
+    height: 40px;
+    background: url(image/list-fullGroupIcon.png) center calc(50% - 2px) no-repeat;
+    color: #333;
+    font-size: 0px;
+    text-align: center;
+    line-height: 40px;
+    vertical-align: middle;
+    float: left;
+    margin-right: 6px;
+    cursor: url(image/cursor-click.ico), default;
+}
+
+.icon-fullFolder:hover {
+    background: url(image/list-fullGroupIcon-hover.png) center calc(50% - 2px) no-repeat;
+    color: #fff;
+}
+
+.icon-fullFolder:active {
+    color: #fff;
+    background: url(image/list-fullGroupIcon-active.png) center calc(50% - 2px) no-repeat;
+}
+
+.icon-fullFolder a {
+    color: #333;
+    vertical-align: middle;
+    display: inline-block;
+    width: 100%;
+    height: 100%;
+    cursor: url(image/cursor-click.ico), default;
+    line-height: inherit;
+}
+
+.icon-fullFolder:hover a {
+    color: #fff;
+}
+
+.icon-fullFolder:active a {
+    color: #fff;
+}
+
+/*实心展开文件夹icon*/
+.icon-openFullFolder {
+    display: inline-block;
+    width: 22px;
+    height: 40px;
+    background: url(image/list-expandedFullGroupIcon.png) center calc(50% - 2px) no-repeat;
+    color: #333;
+    font-size: 0px;
+    text-align: center;
+    vertical-align: middle;
+    float: left;
+    margin-right: 6px;
+    cursor: url(image/cursor-click.ico), default;
+    line-height: 40px;
+}
+
+.icon-openFullFolder:hover {
+    background: url(image/list-expandedFullGroupIcon-hover.png) center calc(50% - 2px) no-repeat;
+    color: #fff;
+}
+
+.icon-openFullFolder:active {
+    color: #fff;
+    background: url(image/list-expandedFullGroupIcon-active.png) center calc(50% - 2px) no-repeat;
+}
+
+.icon-openFullFolder a {
+    color: #333;
+    vertical-align: middle;
+    display: inline-block;
+    width: 100%;
+    height: 40px;
+    cursor: url(image/cursor-click.ico), default;
+    line-height: inherit;
+}
+
+.icon-openFullFolder:hover a {
+    color: #fff;
+}
+
+.icon-openFullFolder:active a {
+    color: #fff;
+}
+
+/*闭合文件夹icon*/
+.icon-folder {
+    display: inline-block;
+    width: 22px;
+    height: 40px;
+    background: url(image/svg_icon/folderShare.svg) center calc(50% - 2px) no-repeat;
+    color: #333;
+    font-size: 13px;
+    text-align: center;
+    line-height: 40px;
+    vertical-align: middle;
+    float: left;
+    margin-right: 6px;
+    letter-spacing: 0.5px;
+    cursor: url(image/cur.ico), default !important;
+}
+
+/* .icon-folder:hover {
+    background: url(image/list-groupIcon-hover.png) center calc(50% - 2px) no-repeat;
+    color: #fff;
+}
+
+.icon-folder:active {
+    color: #fff;
+    background: url(image/list-groupIcon-active.png) center calc(50% - 2px) no-repeat;
+} */
+
+.icon-folder a {
+    color: #fff;
+    vertical-align: middle;
+    display: inline-block;
+    width: 100%;
+    height: 100%;
+    line-height: inherit;
+    cursor: url(image/cur.ico), default !important;
+}
+
+.icon-folder:hover a {
+    color: #fff;
+}
+
+.icon-folder:active a {
+    color: #fff;
+}
+
+/*展开文件夹icon*/
+.icon-openFolder {
+    font-size: 13px;
+    letter-spacing: 0.5px;
+    color: #fff;
+    display: inline-block;
+    width: 22px;
+    height: 40px;
+    background: url(image/svg_icon/olderOpen.svg) center calc(50% - 2px) no-repeat;
+    text-align: center;
+    line-height: inherit;
+    vertical-align: middle;
+    float: left;
+    margin-right: 6px;
+    cursor: url(image/cur.ico), default !important;
+}
+
+/* .icon-openFolder:hover {
+    color: #fff;
+    background: url(image/list-expandedGroupIcon-hover.png) center calc(50% - 2px) no-repeat;
+}
+
+.icon-openFolder:active {
+    color: #fff;
+    background: url(image/list-expandedGroupIcon-active.png) center calc(50% - 2px) no-repeat;
+} */
+
+.icon-openFolder a {
+    color: #fff;
+    font-size: 12px;
+    vertical-align: middle;
+    display: inline-block;
+    width: 100%;
+    height: 100%;
+    line-height: inherit;
+    cursor: url(image/cur.ico), default !important;
+}
+
+.icon-openFolder:hover a {
+    color: #fff;
+}
+
+.icon-openFolder:active a {
+    color: #fff;
+}
+
+/*子文件icon*/
+.icon-point {
+    display: inline-block;
+    width: 22px;
+    height: 40px;
+    vertical-align: middle;
+    /* background: url(image/list-itemIcon.png) right center no-repeat; */
+    float: left;
+    margin-right: 6px;
+    cursor: url(image/cur.ico), default !important;
+    position: relative;
+}
+
+.icon-point::after {
+    content: '';
+    width: 6px;
+    height: 6px;
+    border-radius: 50%;
+    background-color: #666;
+    display: block;
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+    right: 0;
+}
+
+/*单文件icon*/
+.icon-doc {
+    width: 22px;
+    height: 40px;
+    display: inline-block;
+    vertical-align: middle;
+    background: url(image/list-icon.png) center center no-repeat;
+    float: left;
+    margin-right: 6px;
+    cursor: url(image/cur.ico), default !important;
+}
+
+/*草稿单文件*/
+.icon-writingDoc {
+    width: 22px;
+    /* height:40px; */
+    height: 100%;
+    display: inline-block;
+    vertical-align: middle;
+    background: url(image/icon-writingDoc.png) center center no-repeat;
+    float: left;
+    margin-right: 6px;
+    cursor: url(image/cur.ico), default !important;
+}
+
+.icon-writingDoc:hover {
+    background: url(image/icon-writingDoc-hover.png) center center no-repeat;
+}
+
+.icon-writingDoc:active {
+    background: url(image/icon-writingDoc-active.png) center center no-repeat;
+}
+
+/*代理icon*/
+.icon-proxy {
+    width: 22px;
+    height: 40px;
+    display: inline-block;
+    vertical-align: middle;
+    background: url(image/icon-proxy.png) center center no-repeat;
+    float: left;
+    margin-right: 6px;
+    cursor: url(image/cur.ico), default !important;
+}
+
+/*带下划线的附件*/
+.underlineIcon-attachment {
+    width: 25px;
+    height: 40px;
+    border: none;
+    outline: none;
+    background: url(image/underlineIcon-attachment.png) center center no-repeat;
+}
+
+.toolbar-button.underlineIcon-attachment:hover {
+    background-image: url(image/underlineIcon-attachment-hover.png);
+}
+
+.toolbar-button.underlineIcon-attachment:active {
+    background-image: url(image/underlineIcon-attachment-hover.png);
+}
+
+/*带下划线的媒体*/
+.underlineIcon-media {
+    width: 25px;
+    height: 40px;
+    border: none;
+    outline: none;
+    background: url(image/icon-image.png) center center no-repeat;
+}
+
+/* 转换 */
+.icon-translate {
+    width: 22px;
+    height: 40px;
+    display: inline-block;
+    vertical-align: middle;
+    background: url(image/icon-translate.png) center center no-repeat;
+    float: left;
+    margin-right: 6px;
+}
+
+/* 关闭按钮 */
+.icon-close {
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: url(image/svg_icon/guanbi.svg) center center no-repeat;
+    position: absolute;
+    top: 9px;
+    right: 10px;
+}
+
+/* 复制帮助代码按钮 */
+.icon-key {
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: url(image/help-keyButton.png) center center no-repeat;
+    /* position: absolute;*/
+    /* right: 45px;*/
+    top: 9px;
+}
+
+/*退格图标*/
+.icon-backspace {
+    background-image: url(image/icon-backspace.png);
+}
+
+.icon-backspace:hover {
+    background-image: url(image/icon-backspace-hover.png);
+}
+
+.icon-backspace:active {
+    background-image: url(image/icon-backspace-hover.png);
+}
+
+/* 选项卡灰色圆点 */
+.icon-dimPoint {
+    display: inline-block;
+    width: 6px;
+    height: 6px;
+    background-color: #acacac;
+    border-radius: 50%;
+    float: right;
+    margin-right: -20px;
+    margin-top: 4px;
+}
+
+/* 选项卡高亮圆点 */
+.icon-highlightPoint {
+    display: inline-block;
+    width: 6px;
+    height: 6px;
+    background-color: #fa8c00;
+    border-radius: 50%;
+    float: right;
+    margin-right: -22px;
+    margin-top: 3px;
+}
+
+/* 撤销 */
+.icon-undo {
+    background-image: url(image/icon-undo.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-undo:hover {
+    background-image: url(image/icon-undo-hover.png);
+}
+
+.icon-undo:active {
+    background-image: url(image/icon-undo-hover.png);
+}
+
+/* 重做 */
+.icon-redo {
+    background-image: url(image/icon-redo.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-redo:hover {
+    background-image: url(image/icon-redo-hover.png);
+}
+
+.icon-redo:active {
+    background-image: url(image/icon-redo-hover.png);
+}
+
+/* 加粗 */
+.icon-bold {
+    background-image: url(image/icon-bold.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-bold:hover {
+    background-image: url(image/icon-bold-hover.png);
+}
+
+.icon-bold:active {
+    background-image: url(image/icon-bold-hover.png);
+}
+
+/* 颜色 */
+.icon-color {
+    background-image: url(image/icon-color.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+/* 插入图片 */
+.icon-image {
+    background-image: url(image/icon-image.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-image:hover {
+    background-image: url(image/icon-image-hover.png);
+}
+
+.icon-image:active {
+    background-image: url(image/icon-image-hover.png);
+}
+
+/* 插入表格 */
+.icon-table {
+    background-image: url(image/icon-table.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-table:hover {
+    background-image: url(image/icon-table-hover.png);
+}
+
+.icon-table:active {
+    background-image: url(image/icon-table-hover.png);
+}
+
+/* 插入分隔线 */
+.icon-hLine {
+    background-image: url(image/icon-hLine.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-hLine:hover {
+    background-image: url(image/icon-hLine-hover.png);
+}
+
+.icon-hLine:active {
+    background-image: url(image/icon-hLine-hover.png);
+}
+
+/* 查找 */
+.icon-search {
+    background-image: url(image/icon-search1.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-search:hover {
+    background-image: url(image/icon-search-hover.png);
+}
+
+.icon-search:active {
+    background-image: url(image/icon-search-hover.png);
+}
+
+/* 下划线 */
+.icon-underline {
+    background-image: url(image/icon-underline.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-underline:hover {
+    background-image: url(image/icon-underline-hover.png);
+}
+
+.icon-underline:active {
+    background-image: url(image/icon-underline-hover.png);
+}
+
+/* 更多 */
+.icon-more {
+    background-image: url(image/icon-more.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-more:hover {
+    background-image: url(image/icon-more-hover.png);
+}
+
+.icon-more:active {
+    background-image: url(image/icon-more-hover.png);
+}
+
+/* 斜体 */
+.icon-italic {
+    background-image: url(image/icon-italic.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-italic:hover {
+    background-image: url(image/icon-italic-hover.png);
+}
+
+.icon-italic:active {
+    background-image: url(image/icon-italic-hover.png);
+}
+
+/* 删除线 */
+.icon-strikethrough {
+    background-image: url(image/icon-strikethrough.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-strikethrough:hover {
+    background-image: url(image/icon-strikethrough-hover.png);
+}
+
+.icon-strikethrough:active {
+    background-image: url(image/icon-strikethrough-hover.png);
+}
+
+/* 上标 */
+.icon-superScript {
+    background-image: url(image/icon-superScript.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-superScript:hover {
+    background-image: url(image/icon-superScript-hover.png);
+}
+
+.icon-superScript:active {
+    background-image: url(image/icon-superScript-hover.png);
+}
+
+/* 下标 */
+.icon-subScript {
+    background-image: url(image/icon-subScript.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-subScript:hover {
+    background-image: url(image/icon-subScript-hover.png);
+}
+
+.icon-subScript:active {
+    background-image: url(image/icon-subScript-hover.png);
+}
+
+/* 居左 */
+.icon-justifyLeft {
+    background-image: url(image/icon-justifyLeft.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-justifyLeft:hover {
+    background-image: url(image/icon-justifyLeft-hover.png);
+}
+
+.icon-justifyLeft:active {
+    background-image: url(image/icon-justifyLeft-hover.png);
+}
+
+.toolbar-button-selected.icon-justifyLeft {
+    background-image: url(image/icon-justifyLeft-hover.png);
+}
+
+/* 右对齐 */
+.icon-justifyRight {
+    background-image: url(image/icon-justifyRight.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-justifyRight:hover {
+    background-image: url(image/icon-justifyRight-hover.png);
+}
+
+.icon-justifyRight:active {
+    background-image: url(image/icon-justifyRight-hover.png);
+}
+
+.toolbar-button-selected.icon-justifyRight {
+    background-image: url(image/icon-justifyRight-hover.png);
+}
+
+/* 居中 */
+.icon-justifyCenter {
+    background-image: url(image/icon-justifyCenter.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-justifyCenter:hover {
+    background-image: url(image/icon-justifyCenter-hover.png);
+}
+
+.icon-justifyCenter:active {
+    background-image: url(image/icon-justifyCenter-hover.png);
+}
+
+.toolbar-button-selected.icon-justifyCenter {
+    background-image: url(image/icon-justifyCenter-hover.png);
+}
+
+/* 首行缩进 */
+.icon-indent {
+    background-image: url(image/icon-indent.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-indent:hover {
+    background-image: url(image/icon-indent-hover.png);
+}
+
+.icon-indent:active {
+    background-image: url(image/icon-indent-hover.png);
+}
+
+/* 段前距 */
+.icon-rowSpacingTop {
+    background-image: url(image/icon-rowSpacingTop.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-rowSpacingTop:hover {
+    background-image: url(image/icon-rowSpacingTop-hover.png);
+}
+
+.icon-rowSpacingTop:active {
+    background-image: url(image/icon-rowSpacingTop-hover.png);
+}
+
+/* 段后距 */
+.icon-rowSpacingBottom {
+    background-image: url(image/icon-rowSpacingBottom.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-rowSpacingBottom:hover {
+    background-image: url(image/icon-rowSpacingBottom-hover.png);
+}
+
+.icon-rowSpacingBottom:active {
+    background-image: url(image/icon-rowSpacingBottom-hover.png);
+}
+
+/* 行间距 */
+.icon-lineHeight {
+    background-image: url(image/icon-lineHeight.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-lineHeight:hover {
+    background-image: url(image/icon-lineHeight-hover.png);
+}
+
+.icon-lineHeight:active {
+    background-image: url(image/icon-lineHeight-hover.png);
+}
+
+/* 地图 */
+.icon-map {
+    background-image: url(image/icon-map.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-map:hover {
+    background-image: url(image/icon-map-hover.png);
+}
+
+.icon-map:active {
+    background-image: url(image/icon-map-hover.png);
+}
+
+/* 插入word */
+.icon-word {
+    background-image: url(image/icon-word.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-word:hover {
+    background-image: url(image/icon-word-hover.png);
+}
+
+.icon-word:active {
+    background-image: url(image/icon-word-hover.png);
+}
+
+/* 插入excel */
+.icon-excel {
+    background-image: url(image/icon-excel.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-excel:hover {
+    background-image: url(image/icon-excel-hover.png);
+}
+
+.icon-excel:active {
+    background-image: url(image/icon-excel-hover.png);
+}
+
+/* 快捷图标 */
+.icon-shortcut {
+    background-image: url(image/icon-shortcut.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-shortcut:hover {
+    background-image: url(image/icon-shortcut-hover.png);
+}
+
+.icon-shortcut:active {
+    background-image: url(image/icon-shortcut-hover.png);
+}
+
+/* 超链接 */
+.icon-link {
+    background-image: url(image/icon-link.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-link:hover {
+    background-image: url(image/icon-link-hover.png);
+}
+
+.icon-link:active {
+    background-image: url(image/icon-link-hover.png);
+}
+
+.icon-backColor {
+    background-image: url(image/icon-backgroundColor.png);
+}
+
+/* 全部往右移 */
+.icon-allRight {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/rightYi1.png) center center no-repeat;
+    position: absolute;
+    left: 50%;
+    top: 10px;
+}
+
+.icon-allRight:hover {
+    background: url(image/rightYi3.png) center center no-repeat;
+}
+
+.icon-allRight:active {
+    background: url(image/rightYi3.png) center center no-repeat;
+}
+
+/* 全部往左移 */
+.icon-allLeft {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/leftYi1.png) center center no-repeat;
+    position: absolute;
+    left: 50%;
+    top: 10px;
+}
+
+.icon-allLeft:hover {
+    background: url(image/leftYi3.png) center center no-repeat;
+}
+
+.icon-allLeft:active {
+    background: url(image/leftYi3.png) center center no-repeat;
+}
+
+/* 播放按钮 */
+.icon-play {
+    background: url(image/play-button.png) center center no-repeat;
+}
+
+.icon-play:hover {
+    background: url(image/play-button-hover.png) center center no-repeat;
+}
+
+/* 暂停按钮 */
+.icon-pause {
+    background: url(image/pause-button.png) center center no-repeat;
+}
+
+.icon-pause:hover {
+    background: url(image/pause-button-hover.png) center center no-repeat;
+}
+
+/*批示录入框中的喇叭图标*/
+.icon-voiceMsg {
+    display: inline-block;
+    width: 110px;
+    height: 40px;
+    background: url(image/mobileIcon-voiceMsg.png) center center no-repeat;
+    box-sizing: border-box;
+    margin-top: 5px;
+    margin-bottom: 5px;
+}
+
+/*批示录入框中的播放录音图标*/
+.icon-playVoice {
+    display: inline-block;
+    background: url(image/mobileIcon-playVoice.gif) center center no-repeat;
+    box-sizing: border-box;
+    border: none;
+    width: 110px;
+    height: 40px;
+}
+
+/*批示录入框中的播放录音图标*/
+.icon-pauseVoice {
+    display: inline-block;
+    background: url(image/stop-msg.png) center center no-repeat;
+    box-sizing: border-box;
+    width: 110px;
+    height: 40px;
+    background-size: 40px 40px;
+}
+
+.icon-copy {
+    width: 22px;
+    height: 22px;
+    box-sizing: border-box;
+    z-index: 99999;
+    background: url(image/smallButton-timechecked.png) center center no-repeat;
+}
+
+/* 切换一二次登录页图标 */
+.icon-replace {
+    background: url('image/svg_icon/qiehuanyonghu.svg');
+}
+
+/*登录页用户名图标*/
+.icon-user {
+    color: #fff;
+    background: url("image/svg_icon/yonghuming.svg") no-repeat #575D6D;
+
+}
+
+
+/*登录页密码图标 */
+.icon-password {
+    color: #fff;
+    background: url("image/svg_icon/mima.svg") no-repeat #575D6D;
+}
+
+/*登录页验证码图标*/
+.icon-captcha {
+    color: #fff;
+    background: url("image/svg_icon/yanzhengma.svg") no-repeat #575D6D;
+}
+
+/*登录页锁屏时间图标*/
+.icon-timer {
+    color: #fff;
+    background: url("image/svg_icon/shijian.svg") no-repeat #575D6D;
+}
+
+/*密码框小眼睛*/
+/* .icon-eye {
+    background-image: url("image/ksmm.png");
+    background-size: 100%;
+}
+
+.icon-eye:hover {
+    background-image: url("image/ksmm-hover.png");
+    background-size: 100%;
+} */
+
+/*按钮左边的小手机图标*/
+.icon-mobile {
+    background-image: url(image/bottom-buttonIcon.png);
+    background-position: 10px 5px;
+    background-repeat: no-repeat;
+    padding: 0px 10px;
+    text-indent: 25px;
+}
+
+.icon-mobile:hover {
+    background-image: url(image/bottom-buttonIcon-hover.png);
+}
+
+/*按钮左边的二维码扫码图标*/
+.icon-qrcode {
+    background: url('image/svg_icon/yaoyiyaocu.svg') no-repeat 30px center;
+    background-size: 15%;
+    padding-left: 40px;
+    /* 给图标预留空间 */
+    letter-spacing: unset !important;
+}
+
+.icon-qrcode:hover {
+    background: url('image/svg_icon/yaoyiyaocu_hover.svg') no-repeat 30px center #575D6D;
+    background-size: 15%;
+    padding-left: 40px;
+    /* 给图标预留空间 */
+    letter-spacing: unset !important;
+}
+
+/* 登录按钮的图标 */
+.icon-login {
+    background: url('image/svg_icon/denglu.svg') no-repeat 45px center;
+    background-size: 10%;
+    text-indent: 20px;
+    padding: 0px 25px;
+    padding-left: 40px;
+    /* 给图标预留空间 */
+    letter-spacing: unset !important;
+}
+
+.icon-login:hover {
+    background: url('image/svg_icon/denglu_hover.svg') no-repeat 45px center #575D6D;
+    background-size: 10%;
+    text-indent: 20px;
+    padding: 0px 25px;
+    padding-left: 40px;
+    /* 给图标预留空间 */
+}
+
+/*锁屏页倒计时按钮*/
+.icon-countdownButton {
+    color: #fff;
+    background: #3e5d7c;
+}
+
+/*锁屏页评论图标*/
+.icon-forum {
+    background: url(image/icon_comment.png);
+}
+
+/*锁屏页点赞图标*/
+.icon-like {
+    background: url(image/icon-like-alt.png);
+}
+
+.icon-like:active {
+    background: url(image/icon_like_alt-red.png);
+}
+
+/*锁屏页i图标*/
+.icon-info {
+    background: url(image/icon-error-circle-alt.png);
+}
+
+.icon-setHelpButton {
+    display: none;
+    width: 36px;
+    height: 36px;
+    background: url(image/home-plugin-editWdHelpButton.png) center center no-repeat;
+    background-size: 24px;
+}
+
+.icon-setHelpButton:hover {
+    background: #383d50 url(image/home-plugin-editWdHelpButton.png) center center no-repeat;
+    background-size: 24px;
+    border-radius: 4px;
+}
+
+.icon-setHelpButton:active {
+    background: #000 url(image/home-plugin-editWdHelpButton.png) center center no-repeat;
+    background-size: 24px;
+    border-radius: 4px;
+}
+
+.icon-helpButton {
+    display: none;
+    width: 22px;
+    height: 22px;
+    background: url(image/home-plugin-WdHelpButton.png) center center no-repeat;
+}
+
+.icon-helpButton:hover {
+    background: url(image/home-plugin-WdHelpButton-hover.png) center center no-repeat;
+}
+
+.icon-helpButton:active {
+    background: url(image/home-plugin-WdHelpButton-active.png) center center no-repeat;
+}
+
+.hugeIcon-help {
+    width: 42px;
+    height: 42px;
+    background: url(image/download-document.png) center center no-repeat;
+    background-size: 100% 100%;
+}
+
+/*变动按钮*/
+.icon-change {
+    float: right;
+    background-image: url(image/list-change-button.png);
+}
+
+.icon-change:hover {
+    background-image: url(image/icon-change-hover.png);
+}
+
+.icon-change-hover {
+    width: 22px;
+    height: 22px;
+    background-image: url(image/icon-change-hover.png);
+    border: none;
+    outline: none;
+    display: inline-block;
+}
+
+.button.icon-change:hover {
+    background-image: url(image/list-change-button-hover.png);
+}
+
+.button.icon-change:active {
+    background-image: url(image/list-change-button-hover.png);
+}
+
+.toolbar-button.icon-change:hover {
+    background-image: url(image/list-change-button-hover.png);
+}
+
+.toolbar-button.icon-change:active {
+    background-image: url(image/list-change-button-hover.png);
+}
+
+/*  办理按钮图标 */
+.icon-do {
+    background-image: url(image/icon-do.png);
+    /* width: 22px;
+	height: 22px; */
+    border: none;
+    outline: none;
+    float: right;
+    margin-right: 8px;
+    display: inline-block;
+}
+
+.icon-do:hover {
+    background-image: url(image/icon-do-hover.png);
+}
+
+.icon-do:active {
+    background-image: url(image/icon-do-hover.png);
+}
+
+/*启用按钮*/
+.icon-enable {
+    background-image: url(image/button-enable.png);
+    float: right;
+}
+
+.button.icon-enable:hover {
+    background-image: url(image/button-enable-hover.png);
+}
+
+.button.icon-enable:active {
+    background-image: url(image/button-enable-hover.png);
+}
+
+/*改稿按钮*/
+.icon-revise {
+    background-image: url(image/button-rewrite.png);
+    float: right;
+}
+
+.button.icon-revise:hover {
+    background-image: url(image/button-rewrite-hover.png);
+}
+
+.button.icon-revise:active {
+    background-image: url(image/button-rewrite-hover.png);
+}
+
+/*原由按钮*/
+.icon-reason {
+    background-image: url(image/list-reasonButton.png);
+    float: right;
+}
+
+.button.icon-reason:hover {
+    background-image: url(image/list-reasonButton-hover.png);
+}
+
+.button.icon-reason:active {
+    background-image: url(image/list-reasonButton-hover.png);
+}
+
+/*报名按钮*/
+.icon-register {
+    background-image: url("image/icon-register.png");
+    float: right;
+}
+
+.button.icon-register:hover {
+    background-image: url("image/icon-register-hover.png");
+}
+
+.button.icon-register:active {
+    background-image: url("image/icon-register-hover.png");
+}
+
+.icon-vLine-dashed {
+    display: block;
+    min-height: 30px !important;
+    background: url(image/icon-vLine-dashed.png) -3px top repeat-y !important;
+}
+
+.icon-TLine-dashed {
+    display: inline-block !important;
+    width: 22px !important;
+    height: 30px !important;
+    background: url(image/icon-TLine-dashed.png) left center no-repeat !important;
+    /* background-color: #fff !important;*/
+}
+
+.icon-LLine-dashed {
+    display: inline-block !important;
+    width: 22px !important;
+    height: 30px !important;
+    background: url(image/icon-LLine-dashed.png) left center no-repeat !important;
+    /* background-color: #fff !important;*/
+}
+
+/*已打钩*/
+.icon-checked {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-checked.png) center center no-repeat;
+}
+
+.icon-checked:hover {
+    background: url(image/icon-checked-hover.png) center center no-repeat !important;
+}
+
+/*未钩*/
+.icon-unchecked {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-unchecked.png) center center no-repeat;
+}
+
+.icon-unchecked:hover {
+    background: url(image/icon-unchecked-hover.png) center center no-repeat !important;
+}
+
+.list .icon-unchecked {
+    background: none;
+}
+
+.list:hover .icon-unchecked {
+    background: url(image/icon-unchecked.png) center center no-repeat;
+}
+
+.cardList-div .icon-unchecked {
+    background: none;
+}
+
+.cardList-div:hover .icon-unchecked {
+    background: url(image/icon-unchecked.png) center center no-repeat;
+}
+
+.iconList-div .icon-unchecked {
+    background: none;
+}
+
+.iconList-div:hover .icon-unchecked {
+    background: url(image/icon-unchecked.png) center center no-repeat;
+}
+
+
+/* 截图功能放大按钮 */
+.icon-zoomIn {
+    background-image: url(image/icon-zoomIn.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-zoomIn:hover {
+    background-image: url(image/icon-zoomIn-hover.png);
+}
+
+.icon-zoomIn:active {
+    background-image: url(image/icon-zoomIn-hover.png);
+}
+
+.disableIcon-zoomIn {
+    background-image: url(image/disableIcon-zoomIn.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+/* 截图功能缩小按钮 */
+.icon-zoomOut {
+    background-image: url(image/icon-zoomOut.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-zoomOut:hover {
+    background-image: url(image/icon-zoomOut-hover.png);
+}
+
+.icon-zoomOut:active {
+    background-image: url(image/icon-zoomOut-hover.png);
+}
+
+/* 截图功能顺时针选择按钮 */
+.icon-rightRotation {
+    background-image: url(image/icon-rightRotation.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-rightRotation:hover {
+    background-image: url(image/icon-rightRotation-hover.png);
+}
+
+.icon-rightRotation:active {
+    background-image: url(image/icon-rightRotation-hover.png);
+}
+
+/* 截图功能逆时针旋转按钮 */
+.icon-leftRotation {
+    background-image: url(image/icon--leftRotation.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-leftRotation:hover {
+    background-image: url(image/icon--leftRotation-hover.png);
+}
+
+.icon-leftRotation:active {
+    background-image: url(image/icon--leftRotation-hover.png);
+}
+
+/*编辑选项卡按钮*/
+.icon-set {
+    display: inline-block;
+    width: 36px;
+    height: 36px;
+
+    background: url(image/svg_icon/shezhi.svg) center center no-repeat;
+    background-size: 24px;
+}
+
+.icon-set:hover {
+    background: #383d50 url(image/svg_icon/shezhi.svg) center center no-repeat;
+    background-size: 24px;
+    border-radius: 4px;
+}
+
+.icon-set:active {
+    background: #000 url(image/svg_icon/shezhi.svg) center center no-repeat;
+    background-size: 24px;
+    border-radius: 4px;
+}
+
+/* 打钩按钮 */
+.invertIcon-save {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background-image: url(image/icon-ok.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.invertIcon-save:hover {
+    background-image: url(image/icon-ok-hover.png);
+}
+
+.invertIcon-save:active {
+    background-image: url(image/icon-ok-hover.png);
+}
+
+/* 收藏按钮 */
+.icon-favorite {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-favorite.png) center center no-repeat;
+}
+
+.icon-favorite:hover {
+    background: url(image/icon-favorite-hover.png) center center no-repeat;
+}
+
+.icon-favorite:active {
+    background: url(image/icon-favorite-active.png) center center no-repeat;
+}
+
+/* 帮助按钮 */
+.icon-help {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-help.png) center center no-repeat;
+}
+
+.icon-help:hover {
+    background: url(image/icon-help-hover.png) center center no-repeat;
+}
+
+.icon-help:active {
+    background: url(image/icon-help-active.png) center center no-repeat;
+}
+
+/* 下载按钮 */
+.icon-download {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-download.png) center center no-repeat;
+}
+
+.icon-download:hover {
+    background: url(image/icon-download-hover.png) center center no-repeat;
+}
+
+.icon-download:active {
+    background: url(image/icon-download-active.png) center center no-repeat;
+}
+
+/* 锁定按钮 */
+.icon-lock {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-lock.png) center center no-repeat;
+}
+
+.icon-lock:hover {
+    background: url(image/icon-lock-hover.png) center center no-repeat;
+}
+
+.icon-lock:active {
+    background: url(image/icon-lock-active.png) center center no-repeat;
+}
+
+/* 编辑个人选值按钮 */
+.icon-setValue {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-setValue.png) center center no-repeat;
+}
+
+.icon-setValue:hover {
+    background: url(image/icon-setValue-hover.png) center center no-repeat;
+}
+
+.icon-setValue:active {
+    background: url(image/icon-setValue-active.png) center center no-repeat;
+}
+
+/* 编辑帮助按钮 */
+.icon-editHelp {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-setHelp.png) center center no-repeat;
+}
+
+.icon-editHelp:hover {
+    background: url(image/icon-setHelp-hover.png) center center no-repeat;
+}
+
+.icon-editHelp:active {
+    background: url(image/icon-setHelp-active.png) center center no-repeat;
+}
+
+/* (内容)属性按钮 */
+.icon-property {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-property.png) center center no-repeat;
+}
+
+.icon-property:hover {
+    background: url(image/icon-property-hover.png) center center no-repeat;
+}
+
+.icon-property:active {
+    background: url(image/icon-property-active.png) center center no-repeat;
+}
+
+/* 变动查看-关按钮 */
+.icon-history {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-history.png) center center no-repeat;
+}
+
+.icon-history:hover {
+    background: url(image/icon-history-hover.png) center center no-repeat;
+}
+
+.icon-history:active {
+    background: url(image/icon-history-active.png) center center no-repeat;
+}
+
+/* 变动查看-开按钮 */
+.icon-historyOn {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-historyOn.png) center center no-repeat;
+}
+
+.icon-historyOn:hover {
+    background: url(image/icon-historyOn-hover.png) center center no-repeat;
+}
+
+.icon-historyOn:active {
+    background: url(image/icon-historyOn-active.png) center center no-repeat;
+}
+
+/* 已收藏按钮 */
+.icon-favoriteOn {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-favoriteOn.png) center center no-repeat;
+}
+
+.icon-favoriteOn:hover {
+    background: url(image/icon-favoriteOn-hover.png) center center no-repeat;
+}
+
+.icon-favoriteOn:active {
+    background: url(image/icon-favoriteOn-active.png) center center no-repeat;
+}
+
+/* 已收藏按钮 */
+.largeIcon-close {
+    display: inline-block;
+    width: 32px;
+    height: 32px;
+    background: url(image/largeIcon-close.png) center 2px no-repeat;
+}
+
+.largeIcon-close:hover {
+    background: url(image/largeIcon-close-hover.png) center 2px no-repeat;
+}
+
+.largeIcon-close:active {
+    background: url(image/largeIcon-close-active.png) center 2px no-repeat;
+}
+
+/* 全屏按钮 */
+.icon-fullscreen {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-fullscreen.png) center center no-repeat;
+}
+
+.icon-fullscreen:hover {
+    background: url(image/icon-fullscreen-hover.png) center center no-repeat;
+}
+
+.icon-fullscreen:active {
+    background: url(image/icon-fullscreen-active.png) center center no-repeat;
+}
+
+/* 退出全屏按钮 */
+.icon-restore {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-restore.png) center center no-repeat;
+}
+
+.icon-restore:hover {
+    background: url(image/icon-restore-hover.png) center center no-repeat;
+}
+
+.icon-restore:active {
+    background: url(image/icon-restore-active.png) center center no-repeat;
+}
+
+/* 退出全屏按钮(大) */
+.largeIcon-restore {
+    display: inline-block;
+    width: 42px;
+    height: 42px;
+    background: url(image/largeIcon-restore.png) center center no-repeat;
+}
+
+.largeIcon-restore:hover {
+    background: url(image/largeIcon-restore-hover.png) center center no-repeat;
+}
+
+.largeIcon-restore:active {
+    background: url(image/largeIcon-restore-active.png) center center no-repeat;
+}
+
+/*删除表格*/
+.icon-deleteTable {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-deleteTable.png) center center no-repeat;
+}
+
+.icon-deleteTable:hover {
+    background-image: url(image/icon-deleteTable-hover.png);
+}
+
+.icon-deleteTable:active {
+    background-image: url(image/icon-deleteTable-hover.png);
+}
+
+/*插入行*/
+.icon-insertRow {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-insertRow.png) center center no-repeat;
+    padding: 0px;
+    margin-right: 3px;
+}
+
+.icon-insertRow:hover {
+    background-image: url(image/icon-insertRow-hover.png);
+}
+
+.icon-insertRow:active {
+    background-image: url(image/icon-insertRow-hover.png);
+}
+
+/*插入列*/
+.icon-insertCol {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-insertCol.png) center center no-repeat;
+    padding: 0px;
+    margin-right: 3px;
+}
+
+.icon-insertCol:hover {
+    background-image: url(image/icon-insertCol-hover.png);
+}
+
+.icon-insertCol:active {
+    background-image: url(image/icon-insertCol-hover.png);
+}
+
+/*删除行*/
+.icon-deleteRow {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-deleteRow.png) center center no-repeat;
+    padding: 0px;
+    margin-right: 3px;
+}
+
+.icon-deleteRow:hover {
+    background-image: url(image/icon-deleteRow-hover.png);
+}
+
+.icon-deleteRow:active {
+    background-image: url(image/icon-deleteRow-hover.png);
+}
+
+/*删除列*/
+.icon-deleteCol {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-deleteCol.png) center center no-repeat;
+    padding: 0px;
+    margin-right: 3px;
+}
+
+.icon-deleteCol:hover {
+    background-image: url(image/icon-deleteCol-hover.png);
+}
+
+.icon-deleteCol:active {
+    background-image: url(image/icon-deleteCol-hover.png);
+}
+
+/*右合并*/
+.icon-mergeRight {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-mergeRight.png) center center no-repeat;
+    padding: 0px;
+    margin-right: 3px;
+}
+
+.icon-mergeRight:hover {
+    background-image: url(image/icon-mergeRight-hover.png);
+}
+
+.icon-mergeRight:active {
+    background-image: url(image/icon-mergeRight-hover.png);
+}
+
+/*向下合并*/
+.icon-mergeDown {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-mergeDown.png) center center no-repeat;
+    padding: 0px;
+    margin-right: 3px;
+}
+
+.icon-mergeDown:hover {
+    background-image: url(image/icon-mergeDown-hover.png);
+}
+
+.icon-mergeDown:active {
+    background-image: url(image/icon-mergeDown-hover.png);
+}
+
+/*选中合并*/
+.icon-mergeCells {
+    width: 60px;
+    height: 45px;
+    background: url(image/icon-mergeCells.png) center center no-repeat;
+    padding: 0px;
+    margin-right: 3px;
+}
+
+.icon-mergeCells:hover {
+    background-image: url(image/icon-mergeCells-hover.png);
+}
+
+.icon-mergeCells:active {
+    background-image: url(image/icon-mergeCells-hover.png);
+}
+
+/* 附件 */
+.invertIcon-fullscreen {
+    background-image: url(image/invertIcon-fullscreen.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.invertIcon-fullscreen:hover {
+    background-image: url(image/invertIcon-fullscreen-hover.png);
+}
+
+.invertIcon-fullscreen:active {
+    background-image: url(image/invertIcon-fullscreen-hover.png);
+}
+
+.toolbar-button-selected.invertIcon-fullscreen {
+    background-image: url(image/invertIcon-fullscreen-hover.png);
+}
+
+/*顺排*/
+.icon-justifyDefault {
+    background-image: url(image/icon-justifyDefault.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-justifyDefault:hover {
+    background-image: url(image/icon-justifyDefault-hover.png);
+}
+
+.icon-justifyDefault:active {
+    background-image: url(image/icon-justifyDefault-hover.png);
+}
+
+/*左环绕*/
+.icon-imageLeft {
+    background-image: url(image/icon-imageLeft.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-imageLeft:hover {
+    background-image: url(image/icon-imageLeft-hover.png);
+}
+
+.icon-imageLeft:active {
+    background-image: url(image/icon-imageLeft-hover.png);
+}
+
+/*右环绕*/
+.icon-imageRight {
+    background-image: url(image/icon-imageRight.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-imageRight:hover {
+    background-image: url(image/icon-imageRight-hover.png);
+}
+
+.icon-imageRight:active {
+    background-image: url(image/icon-imageRight-hover.png);
+}
+
+/*不环绕*/
+.icon-imageCenter {
+    background-image: url(image/icon-imageCenter.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-imageCenter:hover {
+    background-image: url(image/icon-imageCenter-hover.png);
+}
+
+.icon-imageCenter:active {
+    background-image: url(image/icon-imageCenter-hover.png);
+}
+
+.icon-pin {
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: url(image/icon-pin.png) center center no-repeat;
+}
+
+.icon-unpin {
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: url(image/icon-unpin.png) center center no-repeat;
+}
+
+/* 打印按钮 */
+.icon-print {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/icon-print.png) center center no-repeat;
+}
+
+.icon-print:hover {
+    background: url(image/icon-print-hover.png) center center no-repeat;
+}
+
+.icon-print:active {
+    background: url(image/icon-print-active.png) center center no-repeat;
+}
+
+/*统计图标*/
+.icon-chart {
+    background: url(image/icon-chart.png) center center no-repeat;
+}
+
+/*统计刷新图标*/
+.icon-loadingChart {
+    background: url(image/icon-chart.gif) center center no-repeat;
+}
+
+/*课程表图标*/
+.icon-schedule {
+    background: url(image/icon-schedule.png) center center no-repeat;
+}
+
+/*清除按钮*/
+.icon-clear {
+    background-image: url(image/icon-clear.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-clear:hover {
+    background-image: url(image/icon-clear-hover.png);
+}
+
+.icon-clear:active {
+    background-image: url(image/icon-clear-hover.png);
+}
+
+/*--------------------icon图标样式结束--------------------*/
+
+/*--------------------选项卡样式------------------------*/
+.tab-div {
+    position: relative;
+    float: left;
+    width: 100%;
+    display: inline-block;
+    background-color: #fff;
+    box-sizing: border-box;
+    border-bottom: 1px solid #e0e0e0;
+    padding-top: 1px;
+}
+
+.tab-div ul {
+    list-style: none;
+}
+
+.tab-div ul li ul {
+    margin-left: -26px;
+}
+
+.tab-div ul:after {
+    display: block;
+    visibility: hidden;
+    clear: both;
+    width: 0;
+    height: 0;
+    content: '';
+}
+
+/*默认选项卡样式*/
+.tab {
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
+    font-size: 16px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 25px;
+    margin-left: 8px;
+    margin-bottom: -1px;
+    float: left;
+    border-top-left-radius: 3px;
+    border-top-right-radius: 3px;
+    color: #808080;
+    border: 1px solid #becacc;
+    background: top -webkit-linear-gradient(#e1e5e7, #cfd4d7);
+    cursor: url(image/cursor-click.ico), default !important;
+}
+
+/*选项卡鼠标悬停样式*/
+.tab:hover {
+    color: #fff;
+    border: 1px solid #6b9fd3;
+    border-bottom: 1px solid #e0e0e0;
+    background: #6b9fd3;
+}
+
+/*选项卡选中样式*/
+.tab-selected {
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
+    font-size: 16px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 25px;
+    margin-left: 8px;
+    margin-bottom: -1px;
+    float: left;
+    border-top-left-radius: 3px;
+    border-top-right-radius: 3px;
+    color: #5f81b3;
+    border: 1px solid #e0e0e0;
+    border-bottom: 1px solid #fff;
+    background: #fff;
+    /*cursor: url(image/cursor-click.ico), default !important;*/
+    cursor: url(image/cursor-click.ico), default;
+}
+
+/*选项卡下的打钩区域不显示*/
+.tab .icon-unchecked,
+.tab-selected .icon-unchecked {
+    display: none !important;
+}
+
+.tab .icon-checked,
+.tab-selected .icon-checked {
+    display: none !important;
+}
+
+.lightTab-selected .icon-checked,
+.lightTab .icon-checked {
+    display: none !important;
+}
+
+.lightTab-selected .icon-unchecked,
+.lightTab .icon-unchecked {
+    display: none !important;
+}
+
+/*查询页面管理区域选项卡样式默认样式*/
+.lightTab {
+    display: inline-block;
+    color: #808080;
+    font-size: 14px;
+    padding: 0px 10px;
+    height: 37px;
+    line-height: 37px;
+    box-sizing: border-box;
+    cursor: url(image/cursor-click.ico), default !important;
+}
+
+/*查询页面管理区域选项卡样式鼠标滑过样式*/
+.lightTab:hover {
+    color: #6b9fd3;
+    border-bottom: 2px solid #6b9fd3;
+}
+
+/*查询页面管理区域选项卡样式选中样式*/
+.lightTab-selected {
+    border-bottom: 2px solid #6b9fd3;
+    display: inline-block;
+    color: #000;
+    font-size: 14px;
+    padding: 0px 10px;
+    height: 37px;
+    line-height: 37px;
+    box-sizing: border-box;
+}
+
+/*左侧选项卡*/
+.leftTab {
+    width: calc(100% - 10px);
+    box-sizing: border-box;
+    background-color: #f5f5f5;
+    margin: 0 auto;
+    padding: 0 5px;
+    font-size: 14px;
+    color: #666666;
+    overflow: hidden;
+}
+
+.leftTab-selected {
+    width: 100%;
+    background: #FFF;
+    padding: 0px 11px 0px 10px;
+    border-top: 1px solid #6c9ed7;
+    border-bottom: 1px solid #6c9ed7;
+    margin-top: -1px;
+    font-size: 14px;
+    color: #000;
+}
+
+.leftTab-dim {
+    font-size: 13px;
+    color: #666666;
+}
+
+/*右侧选项卡*/
+.rightTab {
+    width: calc(100% - 10px);
+    box-sizing: border-box;
+    background-color: #fff;
+    margin: 0 auto;
+    padding: 0 5px;
+    font-size: 14px;
+    color: #666666;
+    overflow: hidden;
+}
+
+.rightTab-selected {
+    width: 100%;
+    background: #f5f5f5;
+    padding: 0px 11px 0px 10px;
+    border-top: 1px solid #6c9ed7;
+    border-bottom: 1px solid #6c9ed7;
+    margin-top: -1px;
+    font-size: 14px;
+    color: #000;
+}
+
+.rightTab-dim {
+    font-size: 13px;
+    color: #666666;
+}
+
+/*-----------------------------选项卡样式结束--------------------------*/
+
+/*-----------------------------largeIcon样式-----------------------------*/
+.largeIcon-home {
+    background: url(image/svg_icon/home.svg) no-repeat center;
+    background-size: 24px 24px;
+}
+
+/* .largeIcon-home:hover {
+    background: url(image/svg_icon/home.svg) no-repeat center;
+    width: 34px !important;
+    height: 34px !important;
+    background-size: 24px 24px;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+}
+
+.largeIcon-home:active {
+    background: url(image/svg_icon/home.svg) no-repeat center;
+} */
+
+/*退出按钮*/
+.largeIcon-exit {
+    width: 48px !important;
+    height: 48px !important;
+
+    background: url(image/svg_icon/tuichu.svg) no-repeat center;
+    background-size: 36px 36px;
+}
+
+.largeIcon-exit:hover {
+    width: 46px !important;
+    height: 46px !important;
+    background: #242835 url(image/svg_icon/tuichu.svg) no-repeat center;
+    background-size: 36px 36px;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+}
+
+.largeIcon-exit:active {
+    width: 46px !important;
+    height: 46px !important;
+    background: #000 url(image/svg_icon/tuichu.svg) no-repeat center;
+    background-size: 36px 36px;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+}
+
+/*换肤按钮*/
+.largeIcon-skin {
+    background: url(image/svg_icon/huanfu.svg) no-repeat center;
+    background-size: 24px 24px;
+}
+
+.largeIcon-skin:hover {
+    width: 34px !important;
+    height: 34px !important;
+    background: #242835 url(image/svg_icon/huanfu.svg) no-repeat center;
+    background-size: 24px 24px;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+}
+
+.largeIcon-skin:active {
+    width: 34px !important;
+    height: 34px !important;
+    background: #000 url(image/svg_icon/huanfu.svg) no-repeat center;
+    background-size: 24px 24px;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+}
+
+/*锁定按钮*/
+.largeIcon-lock {
+    background: url(image/svg_icon/suoping.svg) no-repeat center;
+    background-size: 24px 24px;
+}
+
+.largeIcon-lock:hover {
+    width: 34px !important;
+    height: 34px !important;
+    background: #242835 url(image/svg_icon/suoping.svg) no-repeat center;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+    background-size: 24px 24px;
+}
+
+.largeIcon-lock:active {
+    width: 34px !important;
+    height: 34px !important;
+    background: #000 url(image/svg_icon/suoping.svg) no-repeat center;
+    background-size: 24px 24px;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+}
+
+/*帮助按钮*/
+.largeIcon-help {
+    background: url(image/svg_icon/zaixianbangzhu.svg) no-repeat center;
+    background-size: 24px 24px;
+}
+
+.largeIcon-help:hover {
+    width: 34px !important;
+    height: 34px !important;
+    background: #242835 url(image/svg_icon/zaixianbangzhu.svg) no-repeat center;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+    background-size: 24px 24px;
+}
+
+.largeIcon-help:active {
+    width: 34px !important;
+    height: 34px !important;
+    background: #000 url(image/svg_icon/zaixianbangzhu.svg) no-repeat center;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+    background-size: 24px 24px;
+}
+
+/*下载按钮*/
+.largeIcon-download {
+    background: url(image/svg_icon/xiazai.svg) no-repeat center;
+    background-size: 24px 24px;
+}
+
+.largeIcon-download:hover {
+    width: 34px !important;
+    height: 34px !important;
+    background: #242835 url(image/svg_icon/xiazai.svg) no-repeat center;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+    background-size: 24px 24px;
+}
+
+.largeIcon-download:active {
+    width: 34px !important;
+    height: 34px !important;
+    background: #000 url(image/svg_icon/xiazai.svg) no-repeat center;
+    border: 1px solid #EDF1F5;
+    border-radius: 4px;
+    background-size: 24px 24px;
+}
+
+/*编辑首页按钮*/
+.largeIcon-set {
+    background: url(image/svg_icon/shouyeshezhi.svg) no-repeat center;
+    background-size: 24px 24px;
+    /* box-sizing: border-box; */
+}
+
+.largeIcon-set:hover {
+    width: 34px !important;
+    height: 34px !important;
+    border: 1px solid white;
+    border-radius: 4px;
+    background: #242835 url(image/svg_icon/shouyeshezhi.svg) no-repeat center;
+    background-size: 24px 24px;
+}
+
+.largeIcon-set:active {
+    width: 34px !important;
+    height: 34px !important;
+    border: 1px solid white;
+    border-radius: 4px;
+    background: #000 url(image/svg_icon/shouyeshezhi.svg) no-repeat center;
+    background-size: 24px 24px;
+}
+
+/* 首页添加删除时的 部件居中 */
+.gridster>ul {
+    margin-top: 5px;
+    margin-bottom: 30px;
+    margin-left: 0px;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(255, 255, 255, 0);
+    margin: 0 auto;
+}
+
+/* 首页部件编辑状态 关闭按钮 */
+.gridster .close {
+    background-image: url("image/svg_icon/shanchujiaobiao.svg");
+    cursor: pointer;
+    right: 0px;
+    top: 0px;
+    position: absolute;
+    width: 36px;
+    height: 36px;
+    font-size: 0;
+    z-index: 2;
+    transform: rotate(270deg);
+}
+
+/* 首页部件编辑状态 右下角拖拽图标 */
+.gs-resize-handle-both {
+    width: 36px !important;
+    height: 36px !important;
+    bottom: 0px !important;
+    right: 0px !important;
+    /* position: relative !important; */
+    /* background-color: red; */
+    background-image: url(image/svg_icon/guangbiao-tuozhuai.svg) !important;
+    background-position: center !important;
+    transform: rotate(-45deg);
+}
+
+/* .gs-resize-handle-both::after{
+    content: '';
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    display: block;
+    width:100%;
+    height:3px;
+    background:green;
+    transform: rotate(45deg);
+}
+.gs-resize-handle-both::before{
+    content: '';
+    position: absolute;
+    right:  0;
+    bottom: 0;
+    display: block;
+    width:3px;
+    height:100%;
+    background:green;
+    transform: rotate(45deg);
+} */
+/*编辑帮助*/
+.largeIcon-setHelp {
+    background-image: url(image/editWdHelp.png);
+}
+
+.largeIcon-setHelp:hover {
+    background-image: url(image/editWdHelp-hover.png);
+}
+
+.largeIcon-setHelp:active {
+    background-image: url(image/editWdHelp-active.png);
+}
+
+/*菜单开始按钮*/
+.largeIcon-start {
+    width: 28px;
+    height: 28px;
+    cursor: url(image/cursor-click.ico), default;
+    background: url(image/menu-startButton.png) center center no-repeat;
+}
+
+/*菜单查询按钮*/
+.largeIcon-search {
+    width: 28px;
+    height: 28px;
+    background: url(image/menu-searchButton.png) center center no-repeat;
+    cursor: url(image/cursor-click.ico), default;
+}
+
+/*-----------------------------largeIcon样式结束-----------------------------*/
+
+/*---------------------------------翻页样式--------------------------*/
+.icon-prevPage {
+    background: url('image/prevPage.png') 0px center no-repeat;
+    cursor: url(image/cursor-click.ico), default !important;
+}
+
+.icon-prevPage:hover {
+    background: url('image/prevPage.png') 0px center no-repeat;
+}
+
+.icon-nextPage {
+    background: url('image/nextPage.png') 0px center no-repeat;
+    cursor: url(image/cursor-click.ico), default !important;
+}
+
+.icon-nextPage:hover {
+    background: url('image/nextPage.png') 0px center no-repeat;
+}
+
+/*-----------------------------翻页样式结束--------------------*/
+
+/*----------------------------底部区域样式--------------------*/
+/* 外框 */
+.bottom-div {
+    position: fixed;
+    bottom: 0px;
+    left: 0px;
+    z-index: 100;
+    width: 100%;
+    background-color: rgba(231, 234, 234, 1);
+}
+
+/*底部区域上部*/
+.bottom-up-div {
+    height: 110px;
+    background-color: rgba(246, 249, 249, 1);
+    border-top: 3px solid #4863a4;
+}
+
+/* 底部区域下部 */
+.bottom-down-div {
+    padding: 10px 10px 9px 0px;
+    text-align: right;
+    border-top: 1px solid #e2e4ec;
+    box-shadow: 0px -1px 1px rgba(241, 241, 241, 1);
+    font-size: 18px;
+    gap: 20px;
+    color: #333;
+    background: #fafbfe;
+}
+
+.bottom-div .input-div {
+    background-color: #fff;
+    border: 1px solid #e1e1e1;
+}
+
+/* 其中一格手写区域 */
+.write-div {
+    background: url(image/input-write-div.png) center center no-repeat;
+}
+
+/*----------------------------底部区域样式结束--------------------*/
+
+/*----------------------------popup样式----------------------*/
+.popup-div {
+    box-shadow: 4px 4px 9px rgba(0, 0, 0, .13);
+    box-sizing: border-box;
+    background-color: #393d51;
+    border-left: 1px solid #e1e1e1;
+    border-right: 1px solid #e1e1e1;
+    border-bottom: 1px solid #e1e1e1;
+    border-radius: 4px;
+    z-index: 1013;
+    position: absolute;
+    width: auto;
+    /* border-top: 1px solid #6c9ed7; */
+    min-width: max-content;
+}
+
+.popupList {
+    text-indent: 12px;
+    height: 30px;
+    padding-left: 6px;
+    /*padding-right: 28px;*/
+    line-height: 30px;
+    font-size: 14px;
+    color: #fff;
+    text-align: left;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+    position: relative;
+}
+
+.popupList.selected::before {
+    content: '';
+    position: absolute;
+    width: 14px;
+    height: 14px;
+    background: url(image/svg_icon/baocun.svg) no-repeat center;
+    left: 2px;
+    top: 50%;
+    transform: translateY(-50%);
+}
+
+.popupList:hover {
+    color: #393d51;
+    background: #fff;
+}
+
+/* 向上长的 */
+.popupUp-Div {
+    box-shadow: 4px 4px 9px rgba(0, 0, 0, .13);
+    padding-right: 4px;
+    box-sizing: border-box;
+    background-color: #fff;
+    border-left: 1px solid #e1e1e1;
+    border-bottom: 1px solid #e1e1e1;
+    z-index: 1013;
+    position: absolute;
+    width: auto;
+}
+
+/*-------------------------------popup样式结束---------------------*/
+
+/*------------------------------form区域样式--------------------------*/
+.form {
+    width: 100%;
+    height: auto;
+    /* border-collapse: collapse;*/
+    border-collapse: separate;
+    border-spacing: 0px;
+    border-left: 1px solid #E2E4EC;
+    border-top: 1px solid #E2E4EC;
+    overflow: auto;
+}
+
+.form tr {
+    height: 55px;
+
+}
+
+.form th {
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
+    font-size: 14px;
+    color: #666666;
+    height: 55px;
+    text-align: right;
+    background-color: #f8f9fb;
+    border-right: 1px solid #E2E4EC;
+    border-bottom: 1px solid #E2E4EC;
+    word-break: break-word;
+    position: relative;
+    vertical-align: middle;
+    padding: 0px 10px 0px 48px;
+    box-sizing: border-box;
+}
+
+.form td {
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
+    font-size: 14px;
+    color: #333;
+    height: 55px;
+    background: #fff;
+    vertical-align: middle;
+    word-break: break-word;
+    border-right: 1px solid #e8eaed;
+    border-bottom: 1px solid #d4d6d9;
+    position: relative;
+    box-sizing: border-box;
+    padding: 0px 12px 0px 12px;
+    line-height: 28px;
+}
+
+.form .tdWidth {
+    width: 11.6rem !important
+}
+
+/*----------------------------------form区域样式结束-----------------------*/
+
+/*-----------------------------------objectpicker样式-------------------------*/
+.form .input-div {
+    margin-left: -6px;
+}
+
+.input-div {
+    border: 1px solid transparent;
+    outline: none;
+    border-radius: 2px;
+    font-size: 14px;
+    color: #000;
+    line-height: 22.8px;
+    background-color: transparent;
+    box-sizing: border-box;
+    position: relative;
+    min-height: 28px;
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.input-div textarea,
+.input-div textarea:disabled {
+    border: none;
+    outline: none;
+    border-radius: 2px;
+    line-height: 19px;
+    color: #000;
+    vertical-align: middle;
+    box-sizing: border-box;
+}
+
+.search-div .input-div {
+    border: 1px solid #c4c7cc;
+}
+
+.search-div .input-div textarea {
+    padding-left: 11px !important;
+}
+
+/* 选中状态的文本框蓝色边框 */
+.input-div-selected {
+    border: 1px solid rgb(195 199 203) !important;
+    box-shadow: 2px 2px 2px #dedede;
+    box-sizing: border-box;
+    word-break: break-all;
+    z-index: 9999 !important;
+}
+
+.input-underlineDiv {
+    font-size: 14px;
+    color: #276bab;
+    letter-spacing: 2px;
+    border: none;
+    outline: none;
+    position: relative;
+    border-bottom: 1px solid #5482b8;
+    display: inline-block;
+    padding-right: 21px;
+}
+
+.input-underlineDiv::after {
+    content: "";
+    width: 14px;
+    height: 8px;
+    background: url(image/uditor-select.png) center center no-repeat;
+    position: absolute;
+    right: 0px;
+    top: 11px;
+}
+
+.input-div {}
+
+.input-div textarea::-webkit-input-placeholder {
+    color: #ccc;
+}
+
+.input-div textarea::-moz-placeholder {
+    color: #ccc;
+}
+
+.input-div textarea:-moz-placeholder {
+    color: #ccc;
+}
+
+.input-div textarea:-ms-input-placeholder {
+    color: #ccc;
+}
+
+/*时间输入框外层div*/
+.input-inside {
+    display: inline-block;
+    position: relative;
+}
+
+/*-----------------------------------objectpicker样式结束-------------------------*/
+
+/*--------------------------------------search-div区域样式------------------------*/
+.search-div {
+    font-size: 14px;
+    color: #808080;
+    overflow: hidden;
+    box-sizing: border-box;
+
+}
+
+/*-----------------------------------search-div区域样式结束------------------------*/
+
+/*-----------------------------------list样式------------------------------*/
+.list-div {
+    position: relative;
+    overflow: auto;
+    box-sizing: border-box;
+}
+
+.list {
+    font-size: 14px;
+    color: #000;
+}
+
+.list:nth-child(odd) {
+    background-color: #ffffff;
+}
+
+.list:nth-child(even) {
+    background-color: #fafafa;
+}
+
+span.list:hover {
+    background-color: #c7e3fc;
+}
+
+div.list:hover {
+    background-color: #c7e3fc;
+}
+
+.list a {
+    color: #000;
+}
+
+table.list {
+    width: calc(100% - 60px) !important;
+    height: auto;
+    border-collapse: separate;
+    border-top-left-radius: 5px;
+    border-top-right-radius: 5px;
+    border-spacing: 0px;
+    overflow: hidden;
+    box-sizing: border-box;
+    border: 1px solid #e0e0e0;
+    margin-left: 30px;
+}
+
+.list tr {
+    height: 40px;
+}
+
+.list tr:nth-child(odd) {
+    background-color: #ffffff;
+}
+
+.list tr:nth-child(even) {
+    background-color: #fafafa;
+}
+
+.list th {
+    background-color: #6c9ed7;
+    font-size: 14px;
+    height: 40px;
+    padding: 0px 30px 0px 12px;
+    color: #fff;
+    min-width: 50px;
+    max-width: 250px;
+    text-align: left;
+    border-right: 1px solid #f2f2f2;
+    box-sizing: border-box;
+    word-break: break-word;
+    vertical-align: middle;
+    position: relative;
+}
+
+.list th:last-child {
+    border-right: none;
+}
+
+.list tr td {
+    font-size: 14px;
+    color: #747474;
+    box-sizing: border-box;
+    word-break: break-word;
+    position: relative;
+    line-height: 42px;
+    overflow: hidden;
+    font-weight: normal;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    padding: 0px 30px 0px 12px;
+    border-right: 1px solid #f2f2f2;
+    vertical-align: middle;
+    max-width: 370px;
+}
+
+.list tr td:last-child {
+    border-right: none;
+}
+
+/*闭合文件夹样式*/
+.list-highlight {
+    color: #333;
+    font-size: 14px;
+}
+
+/* 次要的(待办列表灰色时间) */
+.list-smallDim {
+    color: #969696;
+    font-size: 12px;
+    display: inline-block;
+    vertical-align: middle;
+    /* box-sizing: border-box; */
+    height: 40px;
+    cursor: url(image/cur.ico), default !important;
+}
+
+/* 警告的(待办列表红色时间) */
+.list-warning {
+    color: #ff0000;
+    font-size: 12px;
+    display: inline-block;
+    vertical-align: middle;
+    box-sizing: border-box;
+    cursor: url(image/cur.ico), default !important;
+}
+
+.list-dim {
+    font-size: 14px;
+    color: #666666;
+    width: 130px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    margin-right: 5px;
+    height: 41px;
+}
+
+/*列表按钮样式*/
+.list-button {
+    font-size: 14px;
+    height: 26px;
+    line-height: 26px;
+    text-align: center;
+    color: rgba(108, 158, 215, 1);
+    background-color: rgba(255, 255, 255, 1);
+    border-radius: 2px;
+    padding: 0px 13px;
+    outline: none;
+    border: 1px solid rgba(108, 158, 215, 1);
+    cursor: pointer;
+}
+
+.list-button:hover {
+    background-color: rgba(108, 158, 215, 1);
+    color: rgba(255, 255, 255, 1);
+}
+
+/*-----------------------------------list样式结束------------------------------*/
+
+/*----------------------------------longCardList-div区域样式-------------------------------*/
+.longCardList-div {
+    background: #fff;
+    margin-bottom: 10px;
+}
+
+.longCardList-div table {
+    border-collapse: collapse;
+    display: block;
+}
+
+.longCardList-div table tbody {
+    display: block;
+}
+
+.longCardList-div table tr {
+    display: block;
+    width: 100%;
+}
+
+.longCardList-div table tr td {
+    position: relative;
+    display: block;
+    width: 100%;
+    padding: 16px 10px 11px 14px;
+    box-sizing: border-box;
+    zoom: 1;
+}
+
+.longCardList-div table tr td:hover {
+    background: #c7e3fc;
+}
+
+.longCardList-div table tr td::after {
+    clear: both;
+    content: "";
+    display: block;
+    width: 0px;
+    height: 0px;
+}
+
+.longCardList-div .longCardList-thumbnail {
+    max-width: 141px;
+    max-height: 80px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    border-radius: 3px;
+    overflow: hidden;
+    box-sizing: border-box;
+    float: left;
+}
+
+.longCardList-div .longCardList-thumbnail img {
+    max-width: 139px;
+    max-height: 78px;
+    border: 1px solid #ededed;
+}
+
+.longCardList-dim {
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
+    font-size: 13px;
+    color: #666;
+    line-height: 20px;
+    min-height: 20px;
+    max-height: 40px;
+    overflow: hidden;
+    max-width: 100%;
+    margin-bottom: 6px;
+}
+
+.longCardList {
+    font-size: 13px;
+    color: #010101;
+    line-height: 18px;
+    height: 18px;
+    margin-top: 3px;
+}
+
+.longCardList span {
+    margin-right: 8px;
+    vertical-align: middle;
+}
+
+.longCardList-highlight {
+    width: 100%;
+    height: 20px;
+    line-height: 20px;
+    font-size: 16px !important;
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica !important;
+    display: inline-block;
+    color: #273495 !important;
+}
+
+.longCardList-highlight a {
+    text-decoration: none;
+    color: #273495;
+    font-size: 16px;
+}
+
+/* 滤镜-黑白 */
+.filter {
+    -webkit-filter: grayscale(100%);
+    filter: grayscale(100%);
+    /*background-color: #f7f7f7 !important;*/
+}
+
+/*----------------------------------longCardList-div区域样式结束-------------------------------*/
+
+/*----------------------------------box样式-------------------------------*/
+.box {
+    border: 1px solid #a9c5e1;
+    box-sizing: border-box;
+    border-radius: 3px;
+    font-size: 18px;
+    color: #4c4c4c;
+}
+
+/* 左侧盒子边框(左边圆角,右边直角) */
+.leftBox-dim {
+    position: relative;
+    float: left;
+    overflow: auto;
+    width: 761px;
+    border: 1px solid #c2c2c2;
+    font-size: 0px;
+    box-sizing: border-box;
+    font-size: 0px;
+    background: #fff;
+    border-radius: 3px 0px 0px 3px;
+}
+
+/* rightBox  右侧栏边框(左边直角,右边圆角) */
+.rightBox {
+    border: 1px solid #a9c5e1;
+    box-sizing: border-box;
+    border-radius: 0px 3px 3px 0px;
+}
+
+/*----------------------------------box样式结束-------------------------------*/
+
+/*---------------------------------cardList-div区域样式----------------------------------*/
+.cardList-div {
+    display: inline-block;
+    color: #333;
+    box-sizing: border-box;
+    position: relative;
+}
+
+.cardList-div:hover:before {
+    content: "";
+    display: inline-block;
+    position: absolute;
+    height: 90%;
+    right: 0px;
+    bottom: 0px;
+    width: 2px;
+    background-color: #6c9ed7;
+}
+
+.cardList-div:hover:after {
+    content: "";
+    display: inline-block;
+    position: absolute;
+    width: 90%;
+    right: 0px;
+    bottom: 0px;
+    height: 2px;
+    background-color: #6c9ed7;
+}
+
+.cardList-thumbnail {
+    padding: 2px 2px 2px 2px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    box-sizing: border-box;
+}
+
+.cardList-thumbnail img {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.cardList-highlight {
+    font-size: 14px;
+    color: #000;
+}
+
+.cardList-smallDim {
+    font-size: 12px;
+    color: #666;
+    word-break: break-all;
+}
+
+.cardList {
+    position: relative;
+    float: left;
+    overflow: auto;
+    width: 761px;
+    border: 1px solid #c2c2c2;
+    font-size: 0px;
+    height: 516px;
+    border-radius: 3px;
+    box-sizing: border-box;
+    font-size: 0px;
+    background: #fff;
+}
+
+.cardList-dim {
+    font-size: 14px;
+    color: #666;
+    line-height: 14px;
+    margin-left: 5px;
+    box-sizing: border-box;
+}
+
+/*---------------------------------cardList-div区域样式结束----------------------------------*/
+
+/*---------------------------------iconlist区域样式------------------------------------------*/
+.iconList-div {
+    display: inline-block;
+    color: #333;
+    box-sizing: border-box;
+    position: relative;
+}
+
+.iconList-div:hover:before {
+    content: "";
+    display: inline-block;
+    position: absolute;
+    height: 90%;
+    right: 0px;
+    bottom: 0px;
+    width: 2px;
+    background-color: #6c9ed7;
+    z-index: 1;
+}
+
+.iconList-div:hover:after {
+    content: "";
+    display: inline-block;
+    position: absolute;
+    width: 90%;
+    right: 0px;
+    bottom: 0px;
+    height: 2px;
+    background-color: #6c9ed7;
+}
+
+.iconList-thumbnail {
+    padding: 2px 2px 2px 2px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    box-sizing: border-box;
+}
+
+.iconList-thumbnail img {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.iconList-smallDim {
+    font-size: 12px;
+    color: #666;
+    line-height: 14px;
+    margin-left: 5px;
+    box-sizing: border-box;
+}
+
+.icon-status {
+    position: absolute;
+    width: 26px;
+    height: 26px;
+    box-sizing: border-box;
+}
+
+/* 绿色 */
+.mainState-green {
+    background-color: #cdecdf;
+}
+
+/*黄色*/
+.mainState-yellow {
+    background-color: #fef6dc;
+}
+
+/*红色*/
+.mainState-red {
+    background-color: #f9dcdb;
+}
+
+/*橙色*/
+.mainState-orange {
+    background-color: #f8d7ae;
+}
+
+/*灰色*/
+.mainState-gray {
+    background-color: #e3e3e3;
+}
+
+/*---------------------------------iconlist区域样式结束------------------------------------------*/
+
+/*---------------------------------contextMenu右键菜单样式---------------------------------------*/
+.contextMenu-div {
+    background-color: #f5f5f5;
+    border-radius: 2px;
+    overflow: hidden;
+    position: absolute;
+    z-index: 999999;
+    display: none;
+    box-shadow: 1px 1px 1px rgba(0, 0, 0, .3);
+    padding: 3px 8px;
+    font-size: 0px;
+}
+
+.contextMenu-button {
+    font-size: 13px;
+    font-weight: normal;
+    line-height: 15px;
+    padding: 5px 8px;
+    margin-right: 2px;
+    letter-spacing: 2px;
+    color: #FFf;
+    border: 1px solid #6c94d7;
+    background-color: #6c94d7;
+    border-radius: 4px;
+}
+
+/*---------------------------------contextMenu右键菜单样式结束--------------------------------------*/
+
+/*--------------------------------dragList拖拽区域样式---------------------------------------------*/
+.dragList-div {
+    overflow: hidden;
+}
+
+.dragList-div .box {
+    overflow: hidden;
+    width: 48.5%;
+    box-sizing: border-box;
+}
+
+.dragList-div .box:first-child {
+    float: left;
+    margin-left: 7px;
+}
+
+.dragList-div .box:last-child {
+    float: right;
+    margin-right: 7px;
+}
+
+.label {
+    margin: 0;
+    background-color: #6c9ddb;
+    text-indent: 15px;
+    height: 42px;
+    text-overflow: ellipsis;
+    box-sizing: border-box;
+    overflow: hidden;
+    white-space: nowrap;
+    vertical-align: middle;
+    font-weight: bold;
+    color: #fff;
+    line-height: 42px;
+    font-size: 16px;
+    position: relative;
+}
+
+/*--------------------------------dragList拖拽区域样式结束---------------------------------------------*/
+
+/*--------------------------------smallList区域样式------------------------------------------------------*/
+.smallList-div {
+    position: relative;
+    width: auto;
+    margin: 0 auto;
+    box-sizing: border-box;
+    box-shadow: 2px 2px 2px rgba(0, 0, 0, .13);
+}
+
+.smallList-div table {
+    width: auto;
+    height: auto;
+    border-collapse: separate;
+    text-decoration: none;
+    color: #000000;
+    background-color: #fafafa;
+    border: 1px solid #e1e1e1;
+    border-spacing: 0px;
+    box-sizing: border-box;
+}
+
+.smallList-div th {
+    background-color: #6c9ed7;
+    font-size: 14px;
+    height: 28px;
+    line-height: 28px;
+    padding: 0px 30px 0px 12px;
+    color: #fff;
+    text-align: left;
+    border-right: 1px solid #f0f0f0;
+    border-bottom: 1px solid #cccccc;
+}
+
+.smallList-div td {
+    font-size: 14px;
+    box-sizing: border-box;
+    word-break: break-word;
+    position: relative;
+    height: 25px;
+    line-height: 25px;
+    overflow: hidden;
+    font-weight: normal;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    padding: 0px 30px 0px 12px;
+    border-right: 1px solid #f0f0f0;
+    border-bottom: 1px solid #cccccc;
+    max-width: 350px;
+}
+
+/*--------------------------------smallList区域样式结束-------------------------------------------------*/
+
+/*----------------------------------------个人首页样式--------------------------------------------------*/
+.plugin-div {
+    overflow: hidden;
+    border: 1px solid #ededed;
+    border-radius: 4px;
+    list-style: none;
+    box-shadow: 1px 1px 1px #e6e6e6;
+    background-color: #fff;
+    font-size: 14px;
+    color: #333;
+}
+
+.plugin-largeText {
+    font-size: 14px;
+    color: #333;
+}
+
+.plugin-boldText {
+    font-size: 14px;
+    color: #1a1a1a;
+}
+
+.plugin-title {
+    font-weight: bold;
+    height: 55px;
+    line-height: 55px;
+    position: relative;
+    width: 100%;
+    margin: 0px;
+    color: #1a1a1a;
+    font-size: 16px;
+}
+
+/*个人首页部件图标共用样式*/
+.plugin-icon {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    margin-left: 15px;
+    vertical-align: middle;
+    cursor: url(image/cursor-click.ico), default !important;
+}
+
+/* 个人首页部件右边那些按钮应该鼠标进入部件才显示 */
+.todoPlugin-title-right,
+.infoPlugin-title-right {
+    visibility: hidden;
+}
+
+.ContainerForLoad:hover .todoPlugin-title-right,
+.ContainerForLoad:hover .infoPlugin-title-right {
+    visibility: visible;
+}
+
+/*待办图标*/
+.todoPlugin-icon {
+    background: url(image/svg_icon/daiban.svg) center center no-repeat;
+}
+
+.todoPlugin-icon:hover {
+    background: url(image/svg_icon/shaugxin.svg) center center no-repeat;
+}
+
+/*待办刷新图标*/
+.todoPlugin-loadingIcon {
+    background: url(image/home-todoPlugin-icon.gif) center center no-repeat;
+}
+
+/* 待办 一级文件夹,一级文件背景颜色 */
+.folder1:hover,
+.file1:hover {
+    background-color: #edf1f5;
+}
+
+/* 待办 二级文件颜色和底部边框*/
+.file2::after {
+    display: block;
+    content: '';
+    width: calc(100% - 52px);
+    height: 100%;
+    background-color: transparent;
+    position: absolute;
+    left: 43px;
+    bottom: 0;
+    border-bottom: 1px solid #eee;
+    z-index: 0;
+}
+
+/* 待办 二级文件鼠标经过背景颜色 */
+.file2:hover:after {
+    background-color: #edf1f5;
+}
+
+/*催办图标*/
+.urgePlugin-icon {
+    background: url(image/home-urgePlugin-icon.png) center center no-repeat;
+}
+
+/*催办刷新图标*/
+.urgePlugin-loadingIcon {
+    background: url(image/urgePlugin-loadingIcon.gif) center center no-repeat;
+}
+
+/*公告图标*/
+.noticePlugin-icon {
+    background: url(image/noticePlugin-icon.png) center center no-repeat;
+}
+
+/*公告刷新图标*/
+.noticePlugin-loadingIcon {
+    background: url(image/noticePlugin-loadingIcon.gif) center center no-repeat;
+}
+
+/*快捷图标*/
+.shortcutPlugin-icon {
+    background: url(image/home-shortcutPlugin-icon.png) center center no-repeat;
+}
+
+/*分隔符,分隔菜单组左右两边*/
+.menu-seperator {
+    width: 36px;
+    height: 36px;
+    background: url(image/menu-separator.png) center center no-repeat;
+    visibility: hidden;
+}
+
+.menu-seperator:hover {
+    background: url(image/menu-draggingSplit.png) center center no-repeat;
+}
+
+/*催办梯形按钮*/
+.listProgress-button {
+    float: right;
+    background-color: #edeff0;
+    height: 27px;
+    display: inline-block;
+    line-height: 32px;
+    border-top-right-radius: 2px;
+    border-bottom-right-radius: 2px;
+    font-size: 0px;
+    color: #333;
+    position: relative;
+    border-top-left-radius: 3px;
+}
+
+/*催办梯形按钮三角形*/
+.listProgress-button:before {
+    content: "";
+    width: 0px;
+    height: 0px;
+    border-top: 27px solid transparent;
+    border-bottom: 27px solid #edeff0;
+    border-left: 24px solid transparent;
+    border-right: none;
+    position: absolute;
+    top: -27px;
+    left: -23px;
+}
+
+.listProgress-button:hover {
+    background-color: #6c9fd3;
+    color: #fff;
+}
+
+.listProgress-button:hover:before {
+    border-bottom: 27px solid #6c9fd3;
+}
+
+.listProgress-button:hover .list-smallDim {
+    color: #fff;
+}
+
+.listProgress-button:hover .vLine-dashed {
+    border-right: 1px dashed #fff;
+}
+
+/*催办进度条外围的DIV*/
+.listProgress-div {
+    height: 5px;
+    background: #f0f0f0;
+    border-top-left-radius: 2.5px;
+    border-bottom-left-radius: 2.5px;
+    border-bottom-right-radius: 2.5px;
+}
+
+/*进度条进度*/
+.listProgress-done {
+    height: 100%;
+    background-color: #6c9ed7;
+    border-radius: 2.5px;
+}
+
+/*快捷部件-快捷部件搜索小图标*/
+.miniIcon-search {
+    position: absolute;
+    left: 0px;
+    bottom: 0px;
+    width: 19px;
+    height: 19px;
+    background: url(image/icon-search.png) center center no-repeat;
+    z-index: 10;
+}
+
+/*快捷部件-快捷部件开始小图标*/
+.miniIcon-start {
+    position: absolute;
+    left: 0px;
+    bottom: 0px;
+    width: 19px;
+    height: 19px;
+    background: url(image/icon-start.png) center center no-repeat;
+    z-index: 10;
+}
+
+/*个人信息进度条外围的DIV*/
+.progress-div {
+    height: 20px;
+    background: #edeff0;
+    border-radius: 10px;
+    /* box-shadow: 0px 1px 1px #959595; */
+}
+
+/*个人信息进度条进度*/
+.progress-done {
+    height: 5px;
+    background: #759acf;
+    border-radius: 2px;
+    position: relative;
+    width: 0px;
+}
+
+/*个人信息梯形*/
+.progress-button {
+    float: right;
+    background-color: rgba(237, 239, 240, 1);
+    height: 18px;
+    display: inline-block;
+    line-height: 18px;
+    border-top-right-radius: 2px;
+    border-bottom-right-radius: 2px;
+    font-size: 14px;
+    color: #333;
+    position: relative;
+    text-align: center;
+    padding: 0 8px;
+    box-sizing: border-box;
+    border-top-left-radius: 2px;
+}
+
+/*个人信息三角形*/
+.progress-button:before {
+    content: "";
+    width: 0px;
+    height: 0px;
+    border-top: 31px solid transparent;
+    border-bottom: 31px solid rgba(237, 239, 240, 1);
+    border-left: 24px solid transparent;
+    border-right: none;
+    position: absolute;
+    top: -30px;
+    left: -24px;
+}
+
+.progress-button:hover {
+    background-color: #6c9fd3;
+    color: #fff;
+}
+
+.progress-button:hover:before {
+    border-bottom: 31px solid #6c9fd3;
+}
+
+/* 小文本 */
+.plugin-smallText {
+    color: #1a1a1a;
+    font-size: 14px;
+    padding-top: 11px;
+}
+
+/* 搜索录入框 */
+.home-input {
+    height: 28px;
+    color: #000000;
+    border: 1px solid #6c9ed7 !important;
+    vertical-align: middle;
+    margin-right: 2px;
+    box-sizing: border-box;
+    padding-left: 12px;
+    border-radius: 2px;
+    font-size: 14px;
+    outline: none;
+}
+
+.plugin-dragHeight {
+    display: block;
+    width: 100%;
+    height: 1px;
+    background-color: transparent;
+    border-radius: 1px;
+    vertical-align: bottom;
+    position: relative;
+}
+
+.plugin-dragHeight span {
+    width: 35px;
+    height: 11px;
+    position: absolute;
+    right: 1px;
+    bottom: 1px;
+    background: url(image/handlebtn.png) center center no-repeat;
+    z-index: 9999999999;
+}
+
+.plugin-dragHeight span:hover::after {
+    content: "";
+    display: inline-block;
+    width: 12px;
+    height: 18px;
+    background: url(image/handlebtn-cursor.png);
+    position: absolute;
+    top: -4px;
+    right: 8px;
+}
+
+/*拖动调节大小按钮*/
+.plugin-drag {
+    display: inline-block;
+    width: 22px;
+    height: 22px;
+    background: url(image/plugin-drag.png) center center no-repeat;
+}
+
+.plugin-drag:hover::after {
+    content: "";
+    display: inline-block;
+    width: 16px;
+    height: 16px;
+    background: url(image/plugin-drag-cursor.png) center center no-repeat;
+    position: absolute;
+    right: 4px;
+    bottom: 3px;
+}
+
+.plugin-invertDiv {
+    display: inline-block;
+    background-color: #f3f3f3;
+}
+
+/*----------------------------------------个人首页样式结束--------------------------------------------------*/
+
+/*-----------------------------------------反色图标样式----------------------------------------------------*/
+/*场地*/
+.invertIcon-place {
+    display: inline-block;
+    height: 100%;
+    width: 40px;
+    background: url(image/field.png) center center no-repeat;
+    vertical-align: top;
+}
+
+/*人员*/
+.invertIcon-person {
+    display: inline-block;
+    height: 100%;
+    width: 40px;
+    background: url(image/ycd-ry.png) center center no-repeat;
+    vertical-align: top;
+}
+
+/*服务*/
+.invertIcon-service {
+    display: inline-block;
+    height: 100%;
+    width: 40px;
+    background: url(image/ycd-fw.png) center center no-repeat;
+    vertical-align: top;
+}
+
+/* 复制帮助代码按钮 */
+.invertIcon-key {
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: url(image/smallHelp-keyButton.png) center center no-repeat;
+    display: inline-block;
+    position: absolute;
+    right: 23px;
+    top: 4px;
+}
+
+/*信息框固定按钮*/
+.invertIcon-unpin {
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: url(image/smallHelp-fixButton.png) center center no-repeat;
+    position: absolute;
+    top: 4px;
+    right: -8px;
+}
+
+/* 信息框关闭按钮 */
+.invertIcon-close {
+    display: inline-block;
+    width: 15px;
+    height: 15px;
+    background: url(image/smallHelp-closeButton.png) center center no-repeat;
+    position: absolute;
+    right: -8px;
+    top: 4px;
+}
+
+.invertIcon-mobile {
+    background-image: url(image/bottom-buttonIcon-hover.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.invertIcon-mobile:hover {
+    background-image: url(image/bottom-buttonIcon.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+/*-----------------------------------------反色图标样式结束----------------------------------------------------*/
+
+/*-----------------------------------------分隔线样式---------------------------------------------------*/
+/*拖拉分隔线*/
+.content-hSeperator {
+    position: relative;
+    z-index: 99;
+    width: 100%;
+    height: 7px;
+    background-color: #6c9ed7;
+    border-radius: 4px;
+    box-shadow: 0px 2px 1px #415e7f;
+}
+
+.content-hSeperator span {
+    right: 0px;
+    position: absolute;
+    top: -26px;
+    background-image: url(image/dragmask.png);
+    width: 109px;
+    height: 32px;
+    display: inline-block;
+}
+
+.content-hSeperator span:hover {
+    background-image: url(image/dragmask-hover.png);
+}
+
+/*-----------------------------------------分隔线样式结束------------------------------------------------*/
+
+/*-------------------------------------自动消失的信息框-------------------------------------------------*/
+.flashMsg-div {
+    display: inline-block;
+    background-color: #6c9ed7;
+    padding: 5px 16px;
+    line-height: 20px;
+    position: absolute;
+    border-radius: 3px;
+    color: #fff;
+    font-size: 14px;
+    font-family: 'SimHei', 'Microsoft YaHei', 'Helvetica Neue', Helvetica;
+    max-width: 260px;
+    display: none;
+}
+
+/* 向下箭头 */
+.flashMsg-down {
+    display: inline-block;
+    width: 0px;
+    height: 0px;
+    border-style: solid;
+    border-width: 10px 7px 0px 0px;
+    border-color: #6c9ed7 transparent transparent transparent;
+    position: absolute;
+    bottom: -10px;
+    left: 7px;
+}
+
+.flashMsg-up {
+    display: inline-block;
+    width: 0px;
+    height: 0px;
+    border-style: solid;
+    border-width: 0px 7px 10px 0px;
+    border-color: transparent transparent #6c9ed7 transparent;
+    position: absolute;
+    top: -10px;
+    left: 7px;
+}
+
+.flashMsg-title {
+    height: 23px;
+    position: relative;
+
+}
+
+/*登录提示框*/
+.warningFlashMsg-div {
+    background-color: #ffffff;
+    color: #ff0000;
+    box-shadow: 1px 1px 1px #dddddd;
+    padding: 8px 16px;
+    border-radius: 3px;
+}
+
+/*登录页提示框向上箭头 */
+.warningFlashMsg-up::before {
+    border-width: 1px 11px 18px 8px;
+    border-style: solid;
+    border-color: transparent transparent #ffffff transparent;
+}
+
+/*登录页提示框向下箭头*/
+.warningFlashMsg-down::before {
+    border-width: 17px 8px 1px 4px;
+    border-style: solid;
+    border-color: #ffffff transparent transparent transparent;
+}
+
+/*烽火台登录页提示框向上箭头*/
+.loginFlashMsg-up {
+    display: inline-block;
+    width: 0px;
+    height: 0px;
+    border-style: solid;
+    border-width: 0px 7px 10px 0px;
+    border-color: transparent transparent #6c9ed7 transparent;
+    position: absolute;
+}
+
+/*烽火台登录页提示框向下箭头*/
+.loginFlashMsg-down {
+    display: inline-block;
+    width: 0px;
+    height: 0px;
+    border-style: solid;
+    border-width: 10px 7px 0px 0px;
+    border-color: #6c9ed7 transparent transparent transparent;
+    position: absolute;
+}
+
+/*-------------------------------------自动消失的信息框结束--------------------------------------------*/
+
+/*-------------------------------------menu样式------------------------------------------------------*/
+.menu-div {
+    /* border: 1px solid #e6e6e6; */
+    box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.8);
+    display: inline-block;
+    position: relative;
+    background-color: #393d51;
+    border-radius: 4px;
+}
+
+/* 下拉菜单中的菜单项 */
+.menu-item {
+    /* background-color: #393d51; */
+    height: 30px;
+    line-height: 30px;
+    color: #FFFDFD;
+    font-size: 14px;
+    padding-right: 15px;
+}
+
+.menu-item:hover {
+    background-color: rgb(245, 245, 245);
+    font-size: 14px;
+    color: #393d51;
+}
+
+/* 打横菜单上面的菜单项 */
+.menu-group {
+    position: relative;
+    float: left;
+    font-family: "Microsoft YaHei";
+    font-size: 14px;
+    font-weight: bolder;
+    white-space: nowrap;
+    -moz-user-select: none;
+    height: 33px;
+    line-height: 33px;
+    vertical-align: middle;
+    margin-top: 0px;
+    margin-left: 0px;
+    margin-right: 0px;
+    padding-top: 0px;
+    padding-left: 0px;
+    padding-right: 0px;
+    background: none;
+    color: #ffffff;
+}
+
+.menu-group:hover {
+    background-color: rgb(245, 245, 245);
+    color: rgb(58, 62, 81);
+}
+
+/*--------------------------------------menu样式结束------------------------------------------------*/
+
+/*--------------------------------------照片样式----------------------------------------------------*/
+/* 工作照 */
+.photo {
+    width: 102px;
+    height: 142px;
+    border: 1px solid #cccccc;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    box-sizing: border-box;
+    overflow: hidden;
+    float: left;
+}
+
+.photo img {
+    max-height: 100%;
+    max-width: 100%;
+}
+
+/*个性照*/
+.personalPhoto {
+    width: 100px;
+    height: 100px;
+    border: 1px solid #cccccc;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    box-sizing: border-box;
+    overflow: hidden;
+    border-radius: 50%;
+    background: #fff;
+}
+
+.personalPhoto img {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+/* 小个性照*/
+.personalPhoto-small {
+    width: 60px;
+    height: 60px;
+    overflow: hidden;
+    border-radius: 50%;
+    border: 1px solid #ccc;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    float: left;
+    margin-left: 11px;
+    margin-top: 8px;
+    box-sizing: border-box;
+    background: #fff;
+}
+
+.personalPhoto-small img {
+    max-height: 100%;
+    max-width: 100%;
+}
+
+/*--------------------------------------照片样式结束------------------------------------------------*/
+
+/*--------------------------------------content样式------------------------------------------------*/
+.content-div {
+    position: relative;
+    overflow: auto;
+    box-sizing: border-box;
+    padding: 12px 8px 17px 8px;
+    color: #666;
+    font-size: 14px;
+}
+
+.content-div input[type='text'],
+.content-div input[type='number'] {
+    border: 1px solid transparent;
+    padding-left: 0px;
+}
+
+/*-------------------------------------content样式结束--------------------------------------------*/
+
+/*------------------------------------轻量级弹窗-------------------------------*/
+.lightDialog-div {
+    background: #f7f7f7;
+    box-sizing: border-box;
+    border: 1px solid #ebebeb;
+    border-radius: 3px;
+}
+
+.lightDialog-title {
+    height: 37px;
+    line-height: 37px;
+    padding-left: 10px;
+    position: relative;
+    box-sizing: border-box;
+    background-color: #f2f2f2;
+}
+
+/*------------------------------------轻量级弹窗结束----------------------------*/
+
+/*------------------------------------帮助弹窗样式------------------------------*/
+.help-div {
+    background: #e6f2ff;
+    border-radius: 3px;
+    color: #fff;
+}
+
+.help {
+    font-size: 14px;
+    color: #686868;
+    line-height: 20px;
+    margin-top: 5px;
+    margin-bottom: 5px;
+}
+
+.help-title {
+    display: block;
+    padding-bottom: 20px;
+    font-size: 20px;
+    color: #000;
+    text-align: center;
+    margin-top: 15px;
+}
+
+.help-title1 {
+    font-size: 18px;
+    color: #001111;
+    line-height: 30px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+}
+
+.help-title2 {
+    font-size: 16px;
+    color: #111;
+    line-height: 24px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+}
+
+.help-item {
+    font-size: 14px;
+    color: #111;
+    background: url(image/item-text.png) 29px 11px no-repeat;
+    padding-left: 38px;
+    box-sizing: border-box;
+    line-height: 22px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+}
+
+.help-highlight {
+    font-size: 14px;
+    color: #2b368f;
+    line-height: 20px;
+    margin-top: 5px;
+    margin-bottom: 5px;
+}
+
+.help-highlightTitle {
+    display: block;
+    padding-bottom: 20px;
+    font-size: 20px;
+    color: #2b368f;
+    text-align: center;
+    margin-top: 15px;
+}
+
+.help-highlightTitle1 {
+    font-size: 18px;
+    color: #2b368f;
+    line-height: 30px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+}
+
+.help-highlightTitle2 {
+    font-size: 16px;
+    color: #2b368f;
+    line-height: 24px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+}
+
+.help-highlightItem {
+    font-size: 14px;
+    color: #2b368f;
+    background: url(image/item-text.png) 29px 11px no-repeat;
+    padding-left: 38px;
+    box-sizing: border-box;
+    line-height: 22px;
+    margin-bottom: 5px;
+    margin-top: 5px;
+}
+
+/* 帮助窗口边框、背景色 */
+.smallHelp-div {
+    background: #6c9ddb;
+    border-radius: 3px;
+    padding-bottom: 16px;
+    padding-left: 18px;
+    padding-right: 18px;
+    color: #fff;
+}
+
+.smallHelp-div::before {
+    content: "";
+    width: 0px;
+    height: 0px;
+    border-top: none;
+    border-bottom: 15px solid #6c9ddb;
+    border-left: 0px solid transparent;
+    border-right: 15px solid transparent;
+    position: absolute;
+    top: -12px;
+    left: 15px;
+}
+
+.smallHelp {
+    font-size: 14px;
+    color: #fff;
+    margin-top: 5px;
+}
+
+/* 帮助标题(文章顶部居中的那个) */
+.smallHelp-title {
+    font-size: 20px;
+    color: #fff;
+    height: 48px;
+    line-height: 48px;
+    text-align: center;
+}
+
+/* 一级标题 */
+.smallHelp-title1 {
+    font-size: 18px;
+    color: #fff;
+}
+
+/* 二级标题 */
+.smallHelp-title2 {
+    font-size: 16px;
+    color: #fff;
+}
+
+/* 项目 */
+.smallHelp-item {
+    font-size: 14px;
+    color: #fff;
+    background: url(image/item-text.png) 29px 5px no-repeat;
+    padding-left: 38px;
+}
+
+.smallHelp-highlight {
+    font-size: 14px;
+    color: #2b368f;
+    margin-top: 5px;
+}
+
+/* 帮助标题(文章顶部居中的那个) */
+.smallHelp-highlightTitle {
+    font-size: 20px;
+    color: #2b368f;
+    height: 48px;
+    line-height: 48px;
+    text-align: center;
+}
+
+/* 一级标题 */
+.smallHelp-highlightTitle1 {
+    font-size: 18px;
+    color: #2b368f;
+}
+
+/* 二级标题 */
+.smallHelp-highlightTitle2 {
+    font-size: 16px;
+    color: #2b368f;
+}
+
+/*------------------------------------帮助弹窗样式结束--------------------------*/
+
+/*------------------------------------弹窗样式-------------------------------*/
+/*关闭按钮*/
+.dialog-closeButton {
+    background: url(image/dialog-closeButton.png) center center no-repeat;
+}
+
+.dialog-closeButton:hover {
+    background: url(image/dialog-closeButton-hover.png) center center no-repeat;
+}
+
+.dialog-closeButton:active {
+    background: url(image/dialog-closeButton-active.png) center center no-repeat;
+}
+
+/* 帮助按钮 */
+.dialog-helpButton {
+    background: url(image/dialog-helpButton.png) center center no-repeat;
+}
+
+.dialog-helpButton:hover {
+    background: url(image/dialog-helpButton-hover.png) center center no-repeat;
+}
+
+.dialog-helpButton:active {
+    background: url(image/dialog-helpButton-active.png) center center no-repeat;
+}
+
+/* 下载按钮 */
+.dialog-downloadButton {
+    background: url(image/dialog-downloadButton.png) center center no-repeat;
+}
+
+.dialog-downloadButton:hover {
+    background: url(image/dialog-downloadButton-hover.png) center center no-repeat;
+}
+
+.dialog-downloadButton:active {
+    background: url(image/dialog-downloadButton-active.png) center center no-repeat;
+}
+
+/* 打钩按钮 */
+.dialog-okButton {
+    background: url(image/dialog-okButton.png) center center no-repeat;
+}
+
+.dialog-okButton:hover {
+    background: url(image/dialog-okButton-hover.png) center center no-repeat;
+}
+
+.dialog-okButton:active {
+    background: url(image/dialog-okButton-active.png) center center no-repeat;
+}
+
+/* 编辑选项卡按钮 */
+.dialog-setButton {
+    background: url(image/dialog-setButton.png) center center no-repeat;
+}
+
+.dialog-setButton:hover {
+    background: url(image/dialog-setButton-hover.png) center center no-repeat;
+}
+
+.dialog-setButton:active {
+    background: url(image/dialog-setButton-active.png) center center no-repeat;
+}
+
+/* 编辑个人选值按钮 */
+.dialog-setValueButton {
+    background: url(image/dialog-setValueButton.png) center center no-repeat;
+}
+
+.dialog-setValueButton:hover {
+    background: url(image/dialog-setValueButton-hover.png) center center no-repeat;
+}
+
+.dialog-setValueButton:active {
+    background: url(image/dialog-setValueButton-active.png) center center no-repeat;
+}
+
+/* 编辑帮助按钮 */
+.dialog-setHelpButton {
+    background: url(image/dialog-setHelpButton.png) center center no-repeat;
+}
+
+.dialog-setHelpButton:hover {
+    background: url(image/dialog-setHelpButton-hover.png) center center no-repeat;
+}
+
+.dialog-setHelpButton:active {
+    background: url(image/dialog-setHelpButton-active.png) center center no-repeat;
+}
+
+/* 收藏按钮 */
+.dialog-favoriteButton {
+    background: url(image/dialog-favoriteButton.png) center center no-repeat;
+}
+
+.dialog-favoriteButton:hover {
+    background: url(image/dialog-favoriteButton-hover.png) center center no-repeat;
+}
+
+.dialog-favoriteButton:active {
+    background: url(image/dialog-favoriteButton-active.png) center center no-repeat;
+}
+
+/* 已收藏按钮 */
+.dialog-favoriteOnButton {
+    background: url(image/dialog-favoriteButton-hover.png) center center no-repeat;
+}
+
+.dialog-favoriteOnButton:hover {
+    background: url(image/dialog-favoriteButton-hover.png) center center no-repeat;
+}
+
+.dialog-favoriteOnButton:hover {
+    background: url(image/dialog-favoriteButton.png) center center no-repeat;
+}
+
+/*弹窗遮罩层*/
+.dialog-mask {
+    position: absolute;
+    top: 0%;
+    left: 0%;
+    width: 100%;
+    height: 100%;
+    -moz-opacity: 0.2;
+    opacity: .20;
+    filter: alpha(opacity=20);
+    background-color: rgba(0, 0, 0, 1);
+}
+
+/*------------------------------------弹窗样式结束-------------------------------*/
+
+/*------------------------------------toolbar样式------------------------*/
+.toolbar-button {
+    border: none;
+    outline: none;
+    display: inline-block;
+    width: 28px;
+    height: 28px;
+    border-radius: 2px;
+    overflow: hidden;
+    font-size: 12px;
+    color: #276bab;
+    text-align: center;
+}
+
+.toolbar-button:hover {
+    background-color: #6c9ed7;
+    color: #fff;
+}
+
+.toolbar-button:active {
+    background-color: #276ab0;
+    color: #fff;
+}
+
+.toolbar-button-selected {
+    border: none;
+    outline: none;
+    display: inline-block;
+    width: 28px;
+    height: 28px;
+    background-color: #276ab0;
+    color: #fff;
+    overflow: hidden;
+    border-radius: 2px;
+}
+
+/*div加背景颜色*/
+.toolbar-div {
+    background-color: #f7f7f7;
+    border-radius: 2px;
+    font-size: 14px;
+    color: #6c9ed7;
+}
+
+.floatToolbar-div {
+    background-color: rgba(255, 255, 255, .7);
+    border-radius: 2px;
+    font-size: 14px;
+    color: #666;
+    box-shadow: none;
+    border: none;
+}
+
+/*------------------------------------toolbar样式结束------------------------*/
+
+/*------------------------------------large样式-------------------------------*/
+.largeVWarningProgress-div {
+    width: 15px;
+    background-color: #e1e1e1;
+}
+
+.largeVWarningProgress-done {
+    width: 15px;
+    background-color: #ff0000;
+}
+
+/*------------------------------------large样式结束-------------------------------*/
+
+/*------------------------------------warningProgress样式------------------------*/
+.warningProgress-div {
+    background-color: #ebebeb;
+    height: 3px;
+    border-radius: 1px;
+}
+
+.warningProgress-done {
+    background-color: #f00;
+    height: 3px;
+    border-radius: 1px;
+}
+
+/*------------------------------------warningProgress样式结束------------------------*/
+
+/*---------------------------------------login样式-----------------------------------*/
+
+.login-wrapper-top {
+    width: 510px;
+    height: 100%;
+    position: absolute;
+    right: 0;
+    background-size: 100% 100%;
+    background-color: rgba(255, 255, 255, 0.2);
+}
+
+.login-div {
+    width: 434px;
+    height: 496px;
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    box-shadow: 5px 0px 5px 0px #000000;
+    background: #f7f7f7;
+    border-radius: 4px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.logo {
+    float: left;
+    margin-top: 41px;
+    margin-bottom: 41px;
+    /* margin-left: 52px; */
+    width: 348px;
+    height: 98px;
+    background-size: 100% !important;
+}
+
+.form-wrapper {
+    display: inline-block;
+    float: right;
+    /* width: 383px;
+    height: 267px; */
+    /* position: relative; */
+    box-sizing: border-box;
+    /* padding-top: 27px;
+    padding-left: 44px; */
+}
+
+.form-wrapper form {
+    width: 100%;
+    height: 100%;
+    /* position: relative; */
+}
+
+.form-wrapper .form-wrapper-row {
+    display: block;
+    width: 359px;
+    height: 37px;
+    position: relative;
+    overflow: hidden;
+    margin-bottom: 16px;
+}
+
+/*登录页输入框的*/
+.login-div input[type="text"],
+.login-div input[type="password"],
+.login-div .goon {
+    width: calc(100% - 48px);
+    height: 37px;
+    box-sizing: border-box;
+    margin-right: 0px;
+    /* padding-left: 12px; */
+    /* outline: none; */
+    background: #fff;
+    font-size: 14px;
+    border: 1px solid #575D6D !important;
+    border-radius: 0 4px 4px 0;
+    color: #999999;
+    box-sizing: border-box;
+    outline: none;
+}
+
+/* 登录页验证码输入框 */
+.login-div .login-yzm_input {
+    text-indent: 120px;
+}
+
+.login-div .goon {
+    text-indent: 10px;
+}
+
+.login-div .form-icon {
+    display: inline-block;
+    width: 46px;
+    height: 36px;
+    float: left;
+    border-radius: 4px 0 0 4px;
+    background-size: 40%;
+    background-position: center;
+    border: 1px solid #575D6D;
+    /* margin-right: 13px; */
+}
+
+.login-div .loginScanCodeBox {
+    display: flex !important;
+    position: relative !important;
+    justify-content: space-between !important;
+}
+
+.ksmm {
+    width: 17px;
+    height: 11px;
+    display: inline-block;
+    position: absolute;
+    right: 8px;
+    top: 8px;
+}
+
+.header_yzmimg {
+    position: absolute;
+    left: 48px;
+    top: 1px;
+    width: 120px;
+    height: 35px;
+}
+
+.login-div .bottom-button {
+    margin: 0px;
+}
+
+.zdspDiv {
+    position: absolute;
+}
+
+.ic {
+    z-index: 2
+}
+
+select {
+    appearance: none;
+    -moz-appearance: none;
+    -webkit-appearance: none;
+}
+
+.goon {
+    /* border: 1px solid rgba(0, 0, 0, 0);
+    width: calc(100% - 48px);
+    height: 37px;
+    box-sizing: border-box;
+    margin-right: 0px;
+
+    outline: none;
+    font-size: 14px;
+    color: #999;
+    border-radius: 2px;
+    appearance: none;
+    background: rgba(0, 0, 0, 0); */
+}
+
+.sp {
+    position: relative;
+    padding-left: 33px;
+    bottom: 21px;
+    width: 240px;
+}
+
+
+.bottom-container {
+    width: 1000px;
+    height: 2px;
+    position: absolute;
+    left: 50% !important;
+    top: 50% !important;
+    margin-left: -500px;
+    margin-top: 155px;
+}
+
+
+.resetpwddiv,
+.phonelogindiv {
+    display: inline-block;
+    position: relative;
+
+}
+
+.login {
+    position: relative;
+    width: 80px;
+    text-align: center !important;
+}
+
+.phoneloginmask,
+.resetpwdmask {
+    width: 100%;
+    text-align: center;
+    line-height: 33px;
+    outline: medium;
+    /* color: rgb(72, 99, 164); */
+    font-size: 16px;
+
+    border-radius: 5px;
+    position: absolute;
+    top: 0;
+}
+
+/*登录次数*/
+.login-sca {
+
+    display: inline-block;
+    position: absolute;
+    left: 14px;
+    bottom: 10px;
+    display: flex;
+    flex-direction: column;
+
+}
+
+.login-sc {
+    margin-bottom: 5px;
+}
+
+.link_gs a {
+    position: fixed;
+    right: 40px;
+    bottom: 30px;
+}
+
+.link_bbh {
+    position: fixed;
+    right: 40px;
+    bottom: 60px;
+}
+
+#msgDiv::before {
+    position: absolute;
+    content: '';
+    top: -12px;
+    right: 13px;
+    z-index: 9999;
+}
+
+.Start-banben {
+    color: #fff;
+    font-size: 18px;
+    text-align: right;
+    position: fixed;
+    bottom: 7%;
+    right: 3%;
+    width: 100%;
+    font-family: "SIL Hei";
+}
+
+.Start-copyright {
+    color: #fff;
+    font-size: 18px;
+    text-align: right;
+    position: fixed;
+    right: 3%;
+    bottom: 3%;
+    width: 100%;
+    font-family: "黑体";
+}
+
+#trianglebottomright {
+    width: 40px;
+    height: 40px;
+}
+
+.bottomright {
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    position: absolute;
+    right: 0;
+    background-color: #FFF;
+    border-radius: 5px;
+    bottom: 0;
+    padding: 8px;
+}
+
+.bottomright-small {
+    position: absolute;
+    right: 8px;
+    bottom: 8px;
+}
+
+.qrcode-text {
+    font-family: "SIL Hei";
+    font-size: 14px;
+    line-height: 24px;
+}
+
+/*整个大的背景图*/
+.login-pageBackground {
+    width: 100vw;
+    height: 100vh;
+    position: fixed;
+    left: 0px;
+    top: 0px;
+    background: url(image/bgpic.png) center center no-repeat;
+    background-size: 100% 100%;
+}
+
+/*中间(线)左边部份*/
+.login-pageLeftLine {
+    background: linear-gradient(to right, rgba(108, 157, 192, 0), rgba(108, 157, 192, 1));
+    width: 500px;
+    height: 2px;
+    display: inline-block;
+
+}
+
+/*中间(线)右边部份*/
+.login-pageRightLine {
+    background: linear-gradient(to left, rgba(108, 157, 192, 0), rgba(108, 157, 192, 1));
+    width: 500px;
+    height: 2px;
+    display: inline-block;
+    float: right;
+}
+
+/*倒影*/
+.login-pageShadow {
+    width: 668px;
+    height: 65px;
+    background: linear-gradient(180deg, rgb(145, 165, 195, 0.15), rgba(145, 165, 195, 0));
+    border-radius: 3px;
+    position: absolute;
+    left: 50% !important;
+    top: 50% !important;
+    margin-left: -333px;
+    margin-top: 180px;
+}
+
+/*二次登录页登录区域*/
+.login-translucentDiv {
+    background: #f7f7f7;
+    border-radius: 4px;
+    box-shadow: 5px 0px 5px 0px #000000;
+    font-size: 16px;
+    color: #000;
+    font-weight: 400;
+}
+
+/*登录页登录区域*/
+.login-div {
+    /* background: url(image/login-div.png) center center no-repeat; */
+}
+
+/*登录页版权信息*/
+.login-copyright {
+    color: #fff;
+    font-size: 20px;
+}
+
+/*登录错误次数*/
+.login-used {
+    border: 1px solid #cacbcc;
+}
+
+.login-unused {
+    width: 10px !important;
+    height: 10px !important;
+    border: none !important;
+    background-color: #EF5D0C;
+}
+
+/*登录页版本信息*/
+.login-version {
+    color: #fff;
+    font-size: 20px;
+}
+
+/*锁屏页登录区域*/
+.login-unlockDiv {
+    background: url(image/sp-bg.png);
+}
+
+/*锁屏页输入框字体颜色*/
+.login-unlockInput {
+    color: #4f83b2;
+}
+
+/*锁屏页箭头图标*/
+.icon-enter {
+    /* background: url(image/icon-enter.png); */
+    background-image: url(image/icon-enter.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.icon-enter:hover {
+    background-image: url(image/icon-enter-hover.png);
+    background-repeat: no-repeat;
+    background-position: center;
+}
+
+/*锁屏页时间*/
+.desktop-time {
+    font-size: 60px;
+    color: #fff;
+}
+
+
+.login-translucentDiv input[type='text'],
+.login-translucentDiv input[type='password'] {
+    background: #fff;
+    font-size: 14px;
+    border: 1px solid #575D6D !important;
+    border-radius: 4px;
+    color: #999999;
+    outline: none;
+}
+
+/*------------------------------------login样式结束---------------------------------*/
+
+/*--------------------------content-vSeperator样式---------------------------------------*/
+.content-vSeperator-left {
+    width: 1px;
+    height: 100%;
+    position: relative;
+    background-color: #6c9ed7;
+    display: inline-block;
+    position: relative;
+    vertical-align: top;
+}
+
+.content-vSeperator-left span {
+    width: 11px;
+    height: 35px;
+    background: url(image/handlevbtn.png) center center no-repeat;
+    position: absolute;
+    bottom: 0px;
+    right: 0px;
+    z-index: 99999999999;
+}
+
+.content-vSeperator-left span:hover::after {
+    content: "";
+    width: 23px;
+    height: 12px;
+    display: inline-block;
+    background: url(image/handlevbtn-cursor.png) center center no-repeat;
+    position: absolute;
+    bottom: 6px;
+    left: -5px;
+}
+
+.content-vSeperator {
+    width: 1px;
+    height: 100%;
+    position: relative;
+    background-color: #6c9ed7;
+    display: inline-block;
+    position: relative;
+    vertical-align: top;
+}
+
+.content-vSeperator span {
+    width: 11px;
+    height: 35px;
+    background: url(image/handlevbtn-r.png) center center no-repeat;
+    position: absolute;
+    bottom: 0px;
+    left: 0px;
+    z-index: 99999999999;
+}
+
+.content-vSeperator span:hover::after {
+    content: "";
+    width: 23px;
+    height: 12px;
+    display: inline-block;
+    background: url(image/handlevbtn-cursor.png) center center no-repeat;
+    position: absolute;
+    bottom: 6px;
+    left: -5px;
+}
+
+/*--------------------------content-vSeperator样式结束---------------------------------------*/
+
+/*--------------------------sideList样式---------------------------------------*/
+.sideList {
+    color: #333;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+}
+
+.sideList:hover {
+    background-color: #c7e4fa;
+}
+
+/*--------------------------sideList样式结束---------------------------------------*/
+
+/*--------------------------iconList样式------------------------------------------*/
+.iconList-dim {
+    font-size: 14px;
+    color: #666;
+    line-height: 14px;
+    margin-left: 5px;
+    box-sizing: border-box;
+}
+
+.iconList-highlight {
+    color: #6c9ddb;
+    font-weight: bold;
+    font-size: 12px;
+}
+
+.iconList-boxDiv {
+    border: 1px solid #c2c2c2 !important;
+    border-radius: 2px;
+    font-size: 12px;
+    color: #000;
+}
+
+.iconList {
+    position: relative;
+    float: left;
+    overflow: auto;
+    width: 761px;
+    border: 1px solid #c2c2c2;
+    font-size: 0px;
+    height: 516px;
+    box-sizing: border-box;
+    font-size: 0px;
+    background: transparent;
+    border-top-left-radius: 3px;
+    border-bottom-left-radius: 3px;
+}
+
+/*--------------------------iconList样式结束------------------------------------------*/
+
+/*--------------------------滚动条箭头样式----------------------------------------------*/
+/* 滚动条上箭头 */
+.scrollbar-up {
+    border-top: none;
+    border-right: 5px solid transparent;
+    border-left: 5px solid transparent;
+    border-bottom: 8px solid #c4c4c4;
+}
+
+/* 滚动条下箭头 */
+.scrollbar-down {
+    border-top: 8px solid #c4c4c4;
+    border-right: 5px solid transparent;
+    border-left: 5px solid transparent;
+    border-bottom: none;
+}
+
+/* 滚动条左箭头 */
+.scrollbar-left {
+    border-top: 5px solid transparent;
+    border-right: 8px solid #c4c4c4;
+    border-bottom: 5px solid transparent;
+    border-left: none;
+}
+
+/* 滚动条右箭头 */
+.scrollbar-right {
+    border-top: 5px solid transparent;
+    border-left: 8px solid #c4c4c4;
+    border-bottom: 5px solid transparent;
+    border-right: none;
+}
+
+/*--------------------------滚动条箭头样式结束-----------------------------------------*/
+
+/* 录入框内嵌标签 2019.9.11  */
+.builtinLabel-focus {
+    border: 1px solid #6b9ed6 !important;
+    box-shadow: 2px 2px 2px #dedede;
+    word-break: break-all;
+    z-index: 9999 !important;
+    border-radius: 3px;
+    display: inline-block;
+}
+
+.builtinLabel {
+    border: 1px solid #ebebeb;
+    border-radius: 3px;
+    z-index: 9999;
+    display: inline-block;
+    vertical-align: middle;
+
+}
+
+.builtinLabel span {
+    background: #ebebeb;
+    float: left;
+    color: #999;
+    text-align: center;
+    line-height: 26px;
+    font-size: 14px;
+    border-radius: 2px 0 0 2px;
+    display: inline-block;
+}
+
+.builtinLabel-focus span {
+    background: #ebebeb;
+    float: left;
+    color: #999;
+    text-align: center;
+    line-height: 26px;
+    font-size: 14px;
+    border-radius: 2px 0 0 2px;
+    display: inline-block;
+}
+
+.builtinLabel input {
+    border: none;
+    color: #000;
+    outline: none;
+    background: white;
+    font-size: 14px;
+}
+
+.builtinLabel-focus input {
+    border: none;
+    color: #000;
+    outline: none;
+    background: white;
+    font-size: 14px;
+}
+
+/************************************************************************mobile样式开始*****************************************************************************/
+/*-------------------------------mobileVWarning样式---------------*/
+.mobileLargeVWarningProgress-div {
+    width: 0.75rem;
+    background-color: #e1e1e1;
+}
+
+.mobileLargeVWarningProgress-done {
+    width: 0.75rem;
+    background-color: #ff0000;
+}
+
+.mobileSmallWarningProgress-div {
+    height: 0.15rem;
+    background-color: #e1e1e1;
+}
+
+.mobileSmallWarningProgress-done {
+    height: 0.15rem;
+    background-color: #ff0000;
+}
+
+/*-------------------------------mobileVWarning样式结束---------------*/
+
+/*------------------------------mobileIcon样式----------------------*/
+/* 菜单图标 */
+/* .mobileIcon-menu{
+    background: #6c9ed7 url(image/meun.png) center center no-repeat;
+    width: 2.25rem;
+    height: 2.25rem;
+    float: right;
+    position: relative;
+    background-size: 1.4rem 1.0rem;
+} */
+/* 菜单图标底部按钮 */
+.mobileList-invertButton {
+    background: #6c9ed7;
+    width: 2.25rem;
+    height: 2.25rem;
+    float: right;
+    position: relative;
+    /* background-size: 1.4rem 1.0rem; */
+}
+
+/* 菜单图标白色三横 */
+.mobileInvertIcon-menu {
+    width: 100%;
+    height: 100%;
+    display: inline-block;
+    background: url(image/mobileInvertIcon-menu.png) no-repeat center center;
+    background-size: 70%;
+}
+
+.mobileSmallIcon-add {
+    width: .9rem;
+    height: .9rem;
+    background: url(image/icon-add.png) center center no-repeat;
+    background-size: contain;
+    border: none;
+    outline: none;
+}
+
+.mobileSmallIcon-change {
+    width: .9rem;
+    height: .9rem;
+    background: url(image/changeIcon.png) center center no-repeat;
+    background-size: contain;
+    border: none;
+    outline: none;
+}
+
+.mobileSmallIcon-disable {
+    width: .9rem;
+    height: .9rem;
+    background: url(image/disableIcon.png) center center no-repeat;
+    background-size: contain;
+    border: none;
+    outline: none;
+}
+
+.mobileSmallIcon-enable {
+    width: .9rem;
+    height: .9rem;
+    background: url(image/icon-enable.png) center center no-repeat;
+    background-size: contain;
+    border: none;
+    outline: none;
+}
+
+.mobileIcon-down {
+    display: inline-block;
+    width: 0.825rem;
+    height: 0.45rem;
+    background: url(image/mobileIcon-down.png) center center no-repeat;
+    background-size: contain;
+    vertical-align: middle;
+    float: right;
+    margin: 0rem;
+    /* 原来的值 */
+    top: 0.8rem;
+
+    /* margin-top: 0.9rem;   杨文俊10/14有改动 
+    margin-right: -5.5rem;   杨文俊10/14有改动*/
+
+    position: absolute;
+    right: 0.8rem;
+    pointer-events: none;
+}
+
+.mobileLargeIcon-playVoice {
+    width: 3.325rem;
+    height: 3.425rem;
+    background: url("image/voice-big.gif") center center no-repeat;
+    background-size: contain;
+}
+
+/*手写按钮*/
+.mobileIcon-pen {
+    width: 3.15rem;
+    height: 1.5rem;
+    background: url(image/mobileButton-pen.png) center center no-repeat;
+    background-size: 3.15rem 1.5rem;
+    margin-left: 0.625rem;
+}
+
+.mobileIcon-pen:active {
+    background: url(image/mobileButton-pen-active.png) center center no-repeat;
+    background-size: 3.15rem 1.5rem;
+}
+
+/*语音按钮*/
+.mobileIcon-voice {
+    width: 4.7rem;
+    height: 1.5rem;
+    background: url(image/mobileButton-voice.png) center center no-repeat;
+    background-size: 4.7rem 1.5rem;
+    margin-left: 0.625rem;
+}
+
+.mobileIcon-voice:active {
+    background: url(image/mobileButton-voice-active.png) center center no-repeat;
+    background-size: 4.7rem 1.5rem;
+}
+
+/*常用语*/
+.mobileIcon-phrase {
+    width: 4.075rem;
+    height: 1.5rem;
+    background: url(image/mobileButton-phrase.png) center center no-repeat;
+    background-size: 4.075rem 1.5rem;
+    margin-left: 0.625rem;
+}
+
+.mobileIcon-phrase:active {
+    background: url(image/mobileButton-phrase-active.png) center center no-repeat;
+    background-size: 4.075rem 1.5rem;
+}
+
+/*删除按钮*/
+.mobileIcon-backspace {
+    width: 1.5rem;
+    height: 1.5rem;
+    background: url(image/mobileButton-backspace.png) center center no-repeat;
+    background-size: 1.5rem 1.5rem;
+    position: absolute;
+    right: 0rem;
+    top: 0rem;
+}
+
+.mobileIcon-backspace:active {
+    background: url(image/mobileButton-backspace-active.png) center center no-repeat;
+}
+
+/*批示录入框中的喇叭图标*/
+.mobileIcon-voiceMsg {
+    display: inline-block;
+    height: 1.5rem;
+    width: 1.8rem;
+    background: url(image/mobileIcon-voiceMsg.png) center center no-repeat;
+    background-size: 1.8rem 1.5rem;
+    box-sizing: border-box;
+    border: none;
+}
+
+/*批示录入框中的播放录音图标*/
+.mobileIcon-playVoice {
+    display: inline-block;
+    height: 1.5rem;
+    width: 1.8rem;
+    background: url(image/mobileIcon-playVoice.gif) center center no-repeat;
+    background-size: 1rem 1rem;
+    box-sizing: border-box;
+    border: none;
+}
+
+/*删除按钮*/
+.mobileIcon-backspace {
+    background-image: url(image/mobileButton-backspace-big.png);
+    background-size: 1.175rem 1.45rem;
+}
+
+.mobileIcon-backspace:active {
+    background-image: url(image/mobileButton-backspace-big-active.png);
+    background-size: 1.175rem 1.45rem;
+}
+
+/*灰色小圆点*/
+.mobileIcon-dimPoint {
+    width: 0.25rem;
+    height: 0.25rem;
+    display: inline-block;
+    background-color: #acacac;
+    float: right;
+    margin-top: 0.625rem;
+    margin-right: -0.25rem;
+    border-radius: 50%;
+}
+
+/* 高亮小圆点 */
+.mobileIcon-highlightPoint {
+    width: 0.25rem;
+    height: 0.25rem;
+    display: inline-block;
+    background-color: #f99138;
+    margin-top: 0.625rem;
+    float: right;
+    border-radius: 50%;
+    margin-right: -0.25rem;
+}
+
+.mobileIcon-media {
+    display: inline-block;
+    width: 0.875rem;
+    height: 1.075rem;
+    background: url(image/mobileIcon-media.png) center center no-repeat;
+    background-size: 0.875rem 1.075rem;
+    float: left;
+}
+
+.mobileIcon-attachment {
+    display: inline-block;
+    width: 0.875rem;
+    height: 1.075rem;
+    background: url(image/mobileIcon-attachment.png) center center no-repeat;
+    background-size: 0.875rem 1.075rem;
+    float: left;
+}
+
+.mobileIcon-checked {
+    background: url(image/mobileIcon-checked.png) center center no-repeat;
+    background-size: contain;
+    display: inline-block;
+    width: 0.7rem;
+    height: 0.45rem;
+}
+
+/*移动端待办i图标*/
+.mobileIcon-i {
+    vertical-align: middle;
+    background: url(image/mobileSmallButton-i.png)center center no-repeat;
+    width: 1.25rem;
+    height: 1.25rem;
+    cursor: url(image/cur.ico), default !important;
+    background-size: 88%;
+}
+
+/*------------------------------mobileIcon样式结束----------------------*/
+
+/*-----------------------------mobile选项卡样式--------------------------*/
+.mobileTab-div {
+    background-color: #ebebeb;
+    height: 2.25rem;
+    width: 100%;
+    box-sizing: border-box;
+    padding: 0 0.375rem;
+    overflow-x: auto;
+    position: absolute;
+}
+
+.mobileTab-div::after {
+    content: "";
+    display: inline-block;
+    width: 1.25rem;
+    height: 2.125rem;
+    /* background: -webkit-linear-gradient(left, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1));
+    background: -o-linear-gradient(right, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1));
+    background: -moz-linear-gradient(right, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1));
+    background: linear-gradient(to right, rgba(235, 235, 235, 0.1), rgba(235, 235, 235, 1)); */
+    position: fixed;
+    right: 0rem;
+    top: 0rem;
+}
+
+.mobileTab-selected {
+    display: inline-block;
+    padding: 0 0.875rem;
+    height: 100%;
+    font-size: 0.75rem;
+    color: #2b368f;
+    box-sizing: border-box;
+    height: 2.25rem;
+    line-height: 2.25rem;
+    border-bottom: 0.125rem solid #6c9ed7;
+    /* margin: 0 0.25rem; */
+    float: left;
+}
+
+.mobileTab {
+    display: inline-block;
+    padding: 0 0.875rem;
+    height: 100%;
+    font-size: 0.75rem;
+    color: #2b368f;
+    box-sizing: border-box;
+    height: 2.25rem;
+    line-height: 2.25rem;
+    /* margin: 0 0.25rem; */
+    color: #000000;
+    float: left;
+}
+
+.mobileSearchTab-selected {
+    font-size: 0.75rem;
+    color: #2b368f;
+    display: inline-block;
+    height: 100%;
+    box-sizing: border-box;
+    border-bottom: 0.125rem solid #6c9ed7;
+    line-height: 2.25rem;
+    padding: 0 0.65rem;
+    margin: 0 0.45rem;
+}
+
+.mobileSearchTab {
+    font-size: 0.75rem;
+    color: #000;
+    display: inline-block;
+    height: 100%;
+    box-sizing: border-box;
+    line-height: 2.25rem;
+    padding: 0 0.65rem;
+    margin: 0 0.45rem;
+}
+
+.mobileTab-content {
+    margin-top: 2.25rem;
+    height: calc(100% - 2.25rem);
+    box-sizing: border-box;
+}
+
+/*-----------------------------mobile选项卡样式结束--------------------------*/
+
+.mobileDelete-button,
+.mobileAdd-button {
+    width: 1.5rem;
+    height: 1.5rem;
+    background: #999999;
+    color: #fff;
+    text-align: center;
+    line-height: 1.5rem;
+    border-radius: 50%;
+    display: block;
+
+}
+
+.mobileAdd-button {
+    position: relative;
+}
+
+.mobileAdd-button::after {
+    content: "";
+    /* 生成一个空内容 */
+    display: block;
+    /* 使伪元素成为块元素 */
+    width: 100%;
+    /* 适应父元素宽度 */
+    height: 100%;
+    /* 适应父元素高度 */
+    background: url(image/svg_icon/xinzeng.svg) no-repeat center;
+    /* 使用 SVG 作为背景 */
+    background-size: 70%;
+    position: absolute;
+    /* 绝对定位 */
+    top: 0;
+    /* 位置在顶部 */
+    left: 0;
+    /* 位置在左边 */
+    filter: brightness(0) invert(1);
+    /* 将 SVG 颜色改为白色 */
+}
+
+.mobileDelete-button {
+    position: relative;
+
+}
+
+.mobileDelete-button::after {
+    content: "";
+    width: 1rem;
+    height: 2px;
+    display: block;
+    background: white;
+    background-size: 70%;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+
+}
+
+.mobileDelete-button:active,
+.mobileAdd-button:active {
+    background-color: #585e6e;
+}
+
+.mobileApply-bg {
+    background-color: #f2f3f4;
+}
+
+/*----------------------------mobileForm样式-------------------------------*/
+.mobileForm-title {
+    font-size: 1rem;
+    width: calc(100% - 20px);
+    margin: 0 auto;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+.mobileForm {
+    width: 100%;
+
+}
+
+.mobileForm table {
+    width: calc(100% - 20px);
+    margin: 0.5rem auto 0.5rem auto;
+    border-collapse: collapse;
+    border: 0.05rem solid #d4d6d9;
+    margin-bottom: 1rem;
+}
+
+.mobileForm table tr {
+    border: 0.05rem solid #e6e6e6;
+}
+
+.mobileForm table th {
+    border: 0.05rem solid #e6e6e6;
+    box-sizing: border-box;
+    color: #000;
+    font-size: 1rem;
+    text-align: right;
+    background-color: #fafafa;
+    padding: 0.4rem 0.65rem 0.4rem 1rem;
+    line-height: 1.2rem;
+    vertical-align: middle;
+    word-break: break-all;
+    white-space: normal;
+}
+
+.mobileForm table td {
+    border: 0.05rem solid #e6e6e6;
+    background-color: #fff;
+    box-sizing: border-box;
+    color: #000000;
+    font-size: 1rem;
+    text-align: left;
+    padding: 0.4rem 0.75rem 0.4rem 1rem;
+    line-height: 1.2rem;
+    vertical-align: middle;
+    position: relative;
+}
+
+.mobileForm input {
+    padding-left: 0;
+}
+
+/*----------------------------mobileForm样式结束-------------------------------*/
+
+/*-----------------------------mobile图片样式---------------------------------*/
+.mobilePhoto {
+    width: 3.75rem;
+    height: 5.25rem;
+    border: 0.025rem solid #d1d1d1;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    overflow: hidden;
+}
+
+.mobilePhoto img {
+    max-height: 100%;
+    max-width: 100%;
+}
+
+.mobilePersonalPhoto {
+    width: 4rem;
+    height: 4rem;
+    border: 1px solid #d1d1d1;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    box-sizing: border-box;
+    overflow: hidden;
+    border-radius: 50%;
+    background: #fff;
+    margin: 0.35rem 0.525rem 0 0.525rem;
+}
+
+.mobilePersonalPhoto img {
+    max-height: 100%;
+    max-width: 100%;
+
+}
+
+/*-----------------------------mobile图片样式---------------------------------*/
+
+/*-----------------------------mobile底部区域----------------------------------*/
+.mobileBottom-div {
+    position: fixed;
+    bottom: 0px;
+    left: 0px;
+    z-index: 100;
+    width: 100%;
+}
+
+.mobileBottom-down-div {
+    display: flex;
+    background-color: #e6e6e6;
+    border-top: 0.075rem solid #e6e6e6;
+    overflow: hidden;
+}
+
+.mobileBottom-button {
+    border: none;
+    outline: none;
+    width: 0;
+    /* width: calc(50% - 0.075rem); */
+    flex: 1;
+    height: 3rem;
+    color: #000;
+    font-size: 1rem;
+    box-sizing: border-box;
+    background-color: #fafafb;
+    -webkit-appearance: none;
+    border-radius: 0rem;
+    border-left: 0.075rem solid #e6e6e6;
+    border-right: 0.075rem solid #e6e6e6;
+}
+
+.mobileBottom-button:first-child {
+    border-left: none !important;
+}
+
+.mobileBottom-button:last-child {
+    border-right: none !important;
+}
+
+.mobileBottom-button:active {
+    color: #fff;
+    background-color: #585e6e;
+}
+.mobileBottom-active-button{
+    color: #659af1;
+}
+
+/*-----------------------------mobile底部区域结束------------------------------*/
+
+/*----------------------------mobile分隔线样式----------------------------*/
+.mobileContent-hSeperator {
+    position: relative;
+    z-index: 99;
+    width: 100%;
+    height: 0.2rem;
+    background-color: #6c9ed7;
+    border-radius: 4px;
+    box-shadow: 0px 2px 1px #415e7f;
+}
+
+.mobileContent-hSeperator span {
+    right: 0px;
+    position: absolute;
+    top: -0.875rem;
+    background-image: url(image/mobileContent-hSeperator.png);
+    width: 3.45rem;
+    height: 1.075rem;
+    display: inline-block;
+    background-size: cover;
+}
+
+.mobileContent-vSeperator {
+    display: inline-block;
+    width: .15rem;
+    height: 100%;
+    background-color: #6c9ed7;
+    border-radius: 0.1rem;
+    position: relative;
+}
+
+.mobileContent-vSeperator span {
+    display: inline-block;
+    width: 0.6rem;
+    height: 1.6rem;
+    background: url(image/mobileContent-vSeperator.gif) no-repeat;
+    background-size: contain;
+    background-position-y: bottom;
+    margin-left: -0.6rem;
+    position: absolute;
+    left: 0rem;
+    bottom: 0rem;
+}
+
+/*----------------------------mobile分隔线样式结束----------------------------*/
+
+/*----------------------------mobileButton样式---------------------------*/
+/* 批示历史意见列表聚合行右面点击可展开折叠行的按钮 */
+.mobileFreeButton {
+    width: 3.2rem;
+    height: 3.2rem;
+    background-color: #f2f2f2;
+    float: right;
+    box-shadow: -0.025rem -0.05rem 0 0.025rem #c8daee;
+    font-size: 0px;
+}
+
+/* (左滑拉出的)更多按钮 */
+.mobileMoreButton {
+    width: 3.15rem;
+    background-color: #6ca0d3;
+    float: left;
+    font-size: .75rem;
+    color: #fff;
+    line-height: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin-left: -1px
+}
+
+/*20200410新增样式-begin*-by 杨文俊/
+/*列表左滑拉出红色更多按钮*/
+.mobileList-warningInvertButton {
+    width: 3.15rem;
+    background-color: red;
+    float: left;
+    font-size: .75rem;
+    color: #fff;
+    line-height: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin-left: -1px
+}
+
+/*相片图标(附件)*/
+.mobileIcon-camera {
+    width: 2.75rem;
+    height: 2.15rem;
+    background-image: url(image/mobileIcon-camera.png);
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: 50%;
+    display: inline-block;
+}
+
+/*录像图标(附件)*/
+.mobileIcon-videocamera {
+    width: 2.75rem;
+    height: 2.15rem;
+    background-image: url(image/mobileIcon-videocamera.png);
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: 50%;
+    display: inline-block;
+}
+
+/*麦克风图标(附件)*/
+.mobileIcon-mike {
+    width: 2.75rem;
+    height: 2.15rem;
+    background-image: url(image/mobileIcon-mike.png);
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: 44%;
+    display: inline-block;
+}
+
+/*文件图标(附件)*/
+.mobileIcon-file {
+    width: 2.75rem;
+    height: 2.15rem;
+    background-image: url(image/mobileIcon-file.png);
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: 50%;
+    display: inline-block;
+}
+
+/*(分隔图标的)浅色纵向分隔线*/
+.mobileVLine-dim {
+    width: 0.1rem;
+    height: 1.725rem;
+    background: #ebf0f2;
+    display: inline-block;
+    vertical-align: super;
+}
+
+/*20200410新增样式-end*/
+
+.mobileButton {
+    border-radius: 0.05rem;
+    box-shadow: -0.05rem 0.05rem 0.025rem rgba(108, 158, 215, .4);
+    -webkit-appearance: none;
+    background-size: contain;
+    background-color: #f2f2f2;
+}
+
+.mobileButton:active {
+    background-color: #6c9fd3;
+}
+
+.mobileBuiltinButton {
+    background-color: #f2f2f2;
+    border-radius: 0.05rem;
+    box-shadow: -0.05rem 0rem 0.025rem rgba(108, 158, 215, .4);
+    -webkit-appearance: none;
+}
+
+.mobileBuiltinButton:active {
+    background-color: #6c9fd3;
+}
+
+/*----------------------------mobileButton样式结束-----------------------*/
+
+/*----------------------------mobileList样式----------------------------------*/
+.mobileList-largeHighlight {
+    font-size: 1.35rem;
+    color: #6c9ed7;
+}
+
+.mobileList-highlight {
+    font-size: 0.75rem;
+    color: #2b368f;
+    height: 2rem;
+    line-height: 2rem;
+}
+
+.mobileList {
+    height: 2rem;
+    line-height: 2rem;
+    font-size: 0.75rem;
+    color: #4c4c4c;
+}
+
+/*----------------------------mobileList样式结束----------------------------------*/
+
+/*-----------------------------mobileIcon样式-------------------------------------*/
+.mobileIcon-openFolder {
+    width: 0.75rem;
+    height: 0.675rem;
+    float: left;
+    margin: 0.425rem 0.425rem 0 0.35rem;
+    display: inline-block;
+    background: url(image/mobileList-expandedGroupIcon.png) center center no-repeat;
+    background-size: cover;
+}
+
+.mobileIcon-folder {
+    width: 0.75rem;
+    height: 0.675rem;
+    float: left;
+    margin: 0.425rem 0.425rem 0 0.35rem;
+    display: inline-block;
+    background: url(image/mobileList-groupIcon.png) center center no-repeat;
+    background-size: cover;
+}
+
+.mobileIcon-point {
+    width: 0.75rem;
+    height: 0.675rem;
+    float: left;
+    margin: 0.425rem 0.425rem 0 0.35rem;
+    display: inline-block;
+    background: url(image/mobileList-itemIcon.png) center center no-repeat;
+    background-size: cover;
+}
+
+.mobileIcon-doc {
+    width: 0.75rem;
+    height: 0.675rem;
+    float: left;
+    margin: 0.425rem 0.425rem 0 0.35rem;
+    display: inline-block;
+    background: url(image/mobileList-icon.png) center center no-repeat;
+    background-size: cover;
+}
+
+/*-----------------------------mobileIcon样式结束-------------------------------------*/
+
+
+/*----------------------------mobile底部区域样式-------------------------------------*/
+.mobileBottom-up-div {
+    border-top: 0.075rem solid #e6e6e6;
+    background: #e6e6e6;
+    height: 3rem;
+    box-sizing: border-box;
+    background-color: #e1e1e1;
+    display: flex;
+
+
+}
+
+.mobileBottom-up-left-div {
+    flex: 1;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    font-size: 1rem;
+    justify-content: center;
+}
+
+.mobileBottom-up-right-div {
+    flex: 3;
+    background: #fff;
+    height: 100%;
+}
+
+.mobileBottom-up-right-div input {
+    width: 100%;
+    height: 100%;
+    padding-left: 12px;
+    font-size: 1rem;
+}
+
+.mobileBottom-up-right-div input:focus {
+    border: none;
+}
+
+.mobileBottom-up-right-div input::placeholder {
+    font-size: 1rem;
+}
+
+/*----------------------------mobile底部区域样式-------------------------------------*/
+
+
+/*---------------------------mobileLongCardList样式----------------------------------*/
+.mobileLongCardList-div {}
+
+.mobileLongCardList-highlight {
+    color: #2b368f;
+    font-size: 0.75rem;
+    line-height: 1rem;
+}
+
+li.mobileLongCardList-highlight {
+    margin-bottom: .8rem;
+}
+
+.mobileLongCardList-dim {
+    font-size: 0.65rem;
+    color: #666666;
+    float: left;
+    line-height: 0.9rem;
+    max-height: 2.7rem;
+    overflow: hidden;
+}
+
+.mobileLongCardList {
+    font-size: 0.65rem;
+    line-height: 0.9rem;
+    color: #000;
+    margin-top: 0.175rem;
+}
+
+.mobileLongCardList-thumbnail {
+    max-width: 5.5rem;
+    max-height: 3.1rem;
+    height: 4rem;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    border: 0.05rem solid #edeff2;
+    overflow: hidden;
+    border-radius: 0.125rem;
+    float: left;
+    margin-right: 0.3rem;
+}
+
+.mobileLongCardList-thumbnail img {
+    max-width: 100%;
+    max-height: 100%;
+}
+
+/*---------------------------mobileLongCardList样式结束----------------------------------*/
+
+/*-------------------------mobileList样式-----------------------*/
+.mobileList-background:nth-child(odd) {
+    background-color: #fff;
+}
+
+.mobileList-background:nth-child(even) {
+    background-color: #fafafa;
+}
+
+/*-------------------------mobileList样式结束-----------------------*/
+
+/*------------------------mobile线样式------------------------------*/
+.mobileHLine {
+    border-bottom: 0.05rem solid #edeff2;
+}
+
+.mobileHLine-bold {
+    border-bottom: 0.25rem solid #edeff2;
+}
+
+.mobileHLine-highlight {
+    border-bottom: 0.05rem solid #6c9ed7;
+}
+
+.mobileVLine-highlight {
+    border-right: 0.2rem solid #6ca0d3;
+}
+
+.mobileVline-leftHighlight {
+    border-left: 0.2rem solid #71a0ce;
+}
+
+.mobileVLine-warning {
+    border-right: 0.25rem solid #ff0000;
+    border-top-right-radius: 0.05rem;
+    /*杨文俊10.24新增*/
+    border-bottom-right-radius: 0.05rem;
+    /*杨文俊10.24新增*/
+}
+
+.mobileVLine-dashed {
+    border-right: 0.025rem dashed #c2c2c2;
+}
+
+.mobileVLine-leftDashed {
+    border-left: 0.05rem dashed #c2c2c2;
+}
+
+/*------------------------mobile线样式------------------------------*/
+
+/*-----------------------mobileSearch样式--------------------------*/
+.mobileSearch-div {
+    box-sizing: border-box;
+    margin-left: 0.675rem;
+    margin-right: 0.825rem;
+    width: 95%;
+    display: flex;
+    /* justify-content: space-between; */
+    gap: 5px;
+}
+.mobileSearch-input-div{
+    position: relative;
+    flex: 1;
+    border: 1px solid #eceded;
+    background: white;
+    border-radius: 4px;
+}
+.mobileSearch-div input[type="text"] {
+    border: none;
+    font-size: 1rem;
+    width: calc(100% - 3rem - 2px);
+    box-sizing: border-box;
+    padding-left: 0.75rem;
+    height: 2rem;
+    line-height: 2rem;
+    color: #000;
+    
+    
+}
+
+.mobileSearch-div input[type='text']::-webkit-input-placeholder,
+.mobileSearch-div input[type='number']::-webkit-input-placeholder {
+    color: #999;
+    font-family: "SimHei", Georgia, Serif !important;
+    font-size: 0.75rem;
+}
+
+.mobileSearch-div input[type='text']::-moz-placeholder,
+.mobileSearch-div input[type='number']::-moz-placeholder {
+    font-size: 0.75rem;
+    font-family: "SimHei", Georgia, Serif !important;
+    color: #999;
+}
+
+.mobileSearch-div input[type='text']:-moz-placeholder,
+.mobileSearch-div input[type='number']:-moz-placeholder {
+    font-size: 0.75rem;
+    font-family: "SimHei", Georgia, Serif !important;
+    color: #999;
+}
+
+.mobileSearch-div input[type='text']:-ms-input-placeholder,
+.mobileSearch-div input[type='number']:-ms-input-placeholder {
+    font-size: 0.75rem;
+    font-family: "SimHei", Georgia, Serif !important;
+    color: #999;
+}
+.mobileSearch-icon{
+    width: calc(3rem - 2px);
+    height: calc(2rem - 2px);
+    display: block;
+    background: #fff url(image/svg_icon/chazhao.svg) no-repeat center;
+    background-size: 35%;
+    position: absolute;
+    right: 1px;
+    top: 1px;
+    border-radius: 4px;
+}
+.mobileSearch-icon::before{
+    display:block;
+    content: '';
+    width: 1px;
+    height: 1rem;
+    background-color: #c3c6ca;
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+}
+/* 移动端搜索上的二维码区域 */
+.mobileSearch-qrcode{
+    background-size: 90%;
+    border-radius:  4px;
+    border: 1px solid #eceded;
+    width: 2rem;
+    height: 2rem;
+}
+.mobileSearch-button {
+    width: auto;
+    height: auto;
+    padding: 0 1rem;
+    border: 1px solid #eceded;
+    outline: none;
+    background-color: #fff;
+    text-align: center;
+    /* line-height: 1.375rem; */
+    font-size: 1rem;
+    color: #585d6e;
+    letter-spacing: 0.1rem;
+    border-radius: 4px;
+    margin: unset;
+    display: flex;
+    align-items: center;
+    -webkit-appearance: none;
+}
+.mobileSearch-button:active {
+    background-color: #eceded;
+    color: #fff;
+}
+/*-----------------------mobileSearch样式结束--------------------------*/
+
+/*-----------------------mobilePopup样式--------------------------------*/
+.mobilePopup-div {
+    border: 0.05rem solid #b7b7b7;
+    border-top: 0.125rem solid #6d9edb;
+    display: inline-block;
+    max-height: 12.957rem;
+    overflow: auto;
+
+    box-shadow: 0.1rem 0.1rem 0.225rem rgba(0, 0, 0, .13);
+    box-sizing: border-box;
+    background-color: #fff;
+    position: absolute;
+}
+
+.mobilePopup-div select {
+    width: 100%;
+}
+
+.mobilePopupList {
+    height: 1.95rem;
+    line-height: 1.95rem;
+    padding: 0 1.4rem;
+    font-size: 0.75rem;
+    color: #000;
+    background: #fff;
+    position: relative;
+}
+
+/*-----------------------mobilePopup样式结束--------------------------------*/
+
+/*------------------------mobileBox样式---------------------------------*/
+.mobileBox {
+    border: .05rem solid #75a3dd;
+    border-radius: 0.325rem;
+}
+
+.mobileBox-dim {
+    border: 0.05rem solid #c2c8cc !important;
+    border-radius: 0.5rem !important;
+    box-sizing: border-box;
+}
+
+/* 校验码边框 */
+.mobileDownBox {
+    border-radius: 0rem 0rem .3rem .3rem;
+    border: 0.1rem solid #6c9ddb;
+    height: 4.5rem;
+    position: absolute;
+    padding: .1rem 0.1rem;
+    box-sizing: border-box;
+    top: 0px;
+    /* left: 0px; */
+    width: calc(100% - 0.25rem);
+    background: #fff;
+    font-size: 0.8rem;
+    color: #4b4b4b;
+    transform: translate(-50%, 0%);
+    left: 50%;
+}
+
+.mobileBox-dashed {
+    border: 0.025rem dashed #6c9ed7;
+    border-radius: .1rem;
+}
+
+.iconList-boxDiv-selected {
+    border: 1px solid rgba(255, 0, 0, 1);
+}
+
+.mobileBox-highlight {
+    border: .05rem solid #6c9ed7;
+    border-radius: 0.325rem;
+}
+
+/*------------------------mobileBox样式结束---------------------------------*/
+
+/*------------------------smallFlashMsg样式----------------------------------*/
+.smallFlashMsg-div {
+    background: #7ca6cc;
+    color: #fff;
+    font-size: 14px;
+    border-radius: 1px;
+}
+
+.smallFlashMsg-div::after {
+    content: "";
+    display: inline-block;
+    width: 0px;
+    height: 0px;
+    position: absolute;
+    left: 18px;
+    bottom: -3px;
+    border-top: 3px solid #7ca6cc;
+    border-right: 3px solid transparent;
+    border-left: 3px solid transparent;
+    border-bottom: none;
+}
+
+/* ------------------------smallFlashMsg样式结束---------------------------------- */
+
+/*-------------------------mobile按钮样式---------------------------------*/
+/*on按钮*/
+.mobileContent-onButton {
+    display: inline-block;
+    font-size: 0.75rem;
+    height: 1.3rem;
+    line-height: 1.3rem;
+    outline: none;
+    color: #6c9ddb;
+    background: url(image/true.png) right bottom no-repeat;
+    background-size: 0.7rem 0.7rem;
+    background-color: #ebebeb;
+    border-radius: 0.1rem;
+    overflow: hidden;
+    padding: 0rem 0.5rem;
+    vertical-align: middle;
+    border: none;
+    box-sizing: border-box;
+    border-bottom: 0.08rem solid #6c9ddb;
+}
+
+/*off按钮*/
+.mobileContent-offButton {
+    display: inline-block;
+    font-size: 0.75rem;
+    height: 1.3rem;
+    line-height: 1.3rem;
+    outline: none;
+    color: #999999;
+    background: url(image/false.png) right bottom no-repeat;
+    background-size: 0.7rem 0.7rem;
+    background-color: #ebebeb;
+    border-radius: 0.1rem;
+    overflow: hidden;
+    padding: 0px 0.5rem;
+    vertical-align: middle;
+    border: none;
+    box-sizing: border-box;
+}
+
+/*-------------------------mobile按钮样式结束---------------------------------*/
+
+/*-------------------------启动页样式-----------------------------------------*/
+/* 右下角的公司链接文字 */
+.mobileStart-copyright {
+    color: #fff;
+    font-size: .7rem;
+    text-align: center;
+    position: fixed;
+    bottom: 2.3%;
+    width: 100%;
+    font-family: "宋体";
+}
+
+/* 登录页背景 */
+.mobileStart-background {
+    width: 100%;
+    height: 100%;
+    background: url(image/mobilestartbg.jpg) center center no-repeat;
+}
+
+/* 登录页小图标 */
+.mobileIcon-user {
+    width: 1rem;
+    height: 1.05rem;
+    position: absolute;
+    top: 0.95rem;
+    left: 2rem;
+    background-image: url(image/app-login/account.png);
+    background-size: 100%;
+}
+
+.mobileIcon-password {
+    width: 1rem;
+    height: 1.2rem;
+    position: absolute;
+    top: 0.95rem;
+    left: 2rem;
+    background-image: url(image/app-login/lock.png);
+    background-size: 100% 98%;
+}
+
+.mobileLogin-button {
+    font-size: 0.85rem;
+    border: none;
+    background: #6c9bdf;
+    color: white;
+    border-radius: 0.3rem;
+}
+
+/*-------------------------启动页样式结束-----------------------------------------*/
+
+
+/*--------------------------mobileHelp样式---------------------------------------*/
+.mobileHelp-bottomDiv {
+    height: 2.65rem;
+    position: fixed;
+    bottom: 0rem;
+    left: 0rem;
+    border-top: 0.025rem solid #a6b7dc;
+    width: 100%;
+    background-color: #d8ecff;
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+}
+
+.mobileHelp-bottomButton {
+    width: 7.175rem;
+    height: 1.8rem;
+    outline: none;
+    -webkit-appearance: none;
+    border: none;
+    background-color: #6c9dda;
+    color: #fff;
+    border-radius: 0.1rem;
+    margin: 0 0.45rem;
+    font-size: 0.75rem;
+}
+
+.mobileHelp-div {
+    width: 100%;
+    box-sizing: border-box;
+    padding: 0 0.25rem;
+    background-color: #e6f2ff;
+    margin-bottom: 2.65rem;
+    height: 100%;
+}
+
+.mobileHelp-titleText {
+    /*新增加*/
+    line-height: 2.375rem;
+    color: #000;
+    font-family: "黑体";
+    font-size: 0.9rem;
+}
+
+.mobileHelp-title1Text {
+    /*原mobileHelp-title1重命名*/
+    font-size: 0.75rem;
+    color: #000;
+    font-family: "黑体";
+    line-height: 1.25rem;
+}
+
+.mobileHelp-text {
+    /*原mobileHelp重命名*/
+    font-size: 0.75rem;
+    font-family: "宋体";
+    line-height: 1rem;
+}
+
+.mobileLightDialog-title {
+    width: 100%;
+    text-align: center;
+    height: 2.375rem;
+}
+
+/*--------------------------mobileHelp样式---------------------------------------*/
+
+/*-------------------------------mobileObjectpicker样式--------------------------*/
+.mobileInput-div {
+    border: 1px solid transparent;
+    outline: none;
+    border-radius: 2px;
+    font-size: 0.75rem;
+    color: #000;
+    /*  line-height: 1.1rem;*/
+    background-color: transparent;
+    box-sizing: border-box;
+    position: relative;
+    min-height: 1.4rem;
+    /* min-height: 28px;*/
+    display: inline-block;
+    vertical-align: middle;
+    width: 100%;
+    overflow: hidden;
+    /* vertical-align: top; */
+    /*left: 10px;*/
+    /*margin-left: :;em;*/
+    height: 1.4rem;
+    /*min-height: unset !important;*/
+}
+
+.mobileInput-div textarea {
+    line-height: 1.4rem;
+}
+
+.mobileInput-selectedDiv {
+    border: 1px solid #6b9ed6 !important;
+    box-shadow: 2px 2px 2px #dedede;
+    box-sizing: border-box;
+    word-break: break-all;
+    z-index: 9999 !important;
+    margin-left: 0.4rem;
+    height: 1.4rem !important;
+    /*height:28px !important;*/
+    /*min-height: unset !important;*/
+}
+
+/*-------------------------------mobileObjectpicker样式结束--------------------------*/
+
+/*-------------------------------mobileList样式----------------------------*/
+.mobileList-smallDim {
+    font-size: 0.7rem;
+    line-height: 0.7rem;
+    color: #666666;
+}
+
+.mobileLargeIcon-smile {
+    background: url(image/smile.png) no-repeat;
+    display: block;
+    width: 2.6rem;
+    height: 2.6rem;
+    margin: 0 auto;
+    background-size: 100%;
+}
+
+/*-------------------------------mobileList样式结束----------------------------*/
+
+/*-----------------------------叶老大说先不改的代码------------------------*/
+.form-model {
+    position: absolute;
+    width: 98%;
+    height: 68%;
+    left: 0px;
+    top: 0px;
+    border: 1px solid #e4e4e4;
+    overflow-y: auto
+}
+
+.operate-div {
+    width: 100%;
+    z-index: 1000;
+    position: fixed;
+    _position: absolute;
+    bottom: 110px;
+}
+
+#app {
+    display: flex;
+    flex-direction: column;
+    /* position:absolute */
+    position: fixed;
+    overflow: auto;
+    top: 0px;
+    left: 0px;
+    right: 0px;
+    bottom: 0px;
+    background: rgb(255, 255, 255);
+    /* -webkit-touch-callout: none !important;
+    -webkit-user-select: ​none !important;
+    -webkit-touch-callout: none !important;
+    user-select: none !important;
+    user-select: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none; */
+}
+
+#app *::-webkit-scrollbar {
+    display: none
+}
+
+#app * {
+    user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+
+    /* -webkit-touch-callout: none; 
+	-webkit-user-select: none;
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	 user-select: none; */
+}
+
+/* #app div,input,textarea {
+		  -webkit-user-select: auto;
+		  margin: 0px;
+		  padding: 0px;
+		  outline: none;
+		} */
+
+#app iframe {
+    width: 100%;
+    min-height: 0px;
+    height: 100vh;
+    border: none;
+}
+
+/*文字输入框*/
+.cms-editor .content_edit1 {
+    min-height: 1.5rem;
+    max-height: 3.25rem;
+    display: block;
+    width: 8.3rem;
+    border-radius: 0.05rem;
+    -webkit-user-select: text;
+    -webkit-appearance: none;
+    background-color: #fafafa;
+    margin-left: 0.625rem;
+    box-sizing: border-box;
+    padding-right: 1.5rem;
+    padding-top: 0.07rem;
+    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
+    line-height: 1.5rem;
+    font-size: 1rem;
+}
+
+.cms-editor .content_edit {
+    min-height: 1.5rem;
+    max-height: 3.25rem;
+    display: block;
+    width: 12.75rem;
+    border-radius: 0.05rem;
+    -webkit-user-select: text;
+    -webkit-appearance: none;
+    background-color: #fafafa;
+    margin-left: 0.625rem;
+    box-sizing: border-box;
+    padding-right: 1.5rem;
+    padding-top: 0.07rem;
+    overflow: hidden;
+    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
+    line-height: 1.5rem;
+    font-size: 1rem;
+}
+
+.cms-editor .content_div {
+    min-height: 1.5rem;
+    max-height: 3.24rem;
+    display: block;
+    width: 13.7rem;
+    border-radius: 0.05rem;
+    -webkit-user-select: text;
+    -webkit-appearance: none;
+    background-color: #fafafa;
+    margin-left: 0.625rem;
+    box-sizing: border-box;
+    padding-right: 1.5rem;
+    overflow: hidden;
+    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
+    line-height: 1.5rem;
+    font-size: 1rem;
+    overflow: auto;
+}
+
+.cms-editor .content_start {
+    min-height: 1.5rem;
+    max-height: 3.25rem;
+    display: block;
+    width: 8.3rem;
+    border-radius: 0.05rem;
+    -webkit-user-select: text;
+    -webkit-appearance: none;
+    background-color: #fafafa;
+    margin-left: 0.625rem;
+    box-sizing: border-box;
+    padding-right: 1.5rem;
+    box-shadow: -0.05rem 0.025rem 0.025rem rgba(108, 158, 215, .4);
+    line-height: 1.5rem;
+    font-size: 1rem;
+}
+
+.itemNum {
+    display: inline-block;
+    width: 2rem;
+    height: 2rem;
+    background-color: #f2f2f2;
+    text-align: center;
+    line-height: 2rem;
+    font-size: 1.35rem;
+    color: #6c9ed7;
+    float: right;
+}
+
+[v-cloak] {
+    display: none !important;
+}
+
+.plsh-box {
+    width: calc(100% - 0.5rem);
+    border: 0.025rem solid #c2c2c2;
+    border-radius: 0.15rem;
+    height: 3.25rem;
+    margin: 0.625rem 0rem;
+    margin-left: 0.25rem;
+    overflow: hidden;
+    background-color: #fafafa;
+    box-shadow: 0rem 0.025rem 0.025rem rgba(0, 0, 0, .15);
+}
+
+.plsh-left {
+    float: left;
+    height: 100%;
+}
+
+.plsh-right {
+    float: right;
+}
+
+.plsh-icon {
+    float: left;
+    width: 1.375rem;
+    height: 100%;
+}
+
+.plsh-text {
+    width: 13.5rem;
+    height: 2.25rem;
+    line-height: 1.125rem;
+    box-sizing: border-box;
+    margin-top: 0.5rem;
+    color: #2b368f;
+    float: left;
+    overflow: hidden;
+}
+
+.plsh-right {
+    float: right;
+    height: 100%;
+    width: 3.25rem;
+}
+
+.plsh-button {
+    color: #6c9ed7;
+    width: 100%;
+    height: 3.25rem;
+    box-sizing: border-box;
+    line-height: 3.25rem;
+    box-shadow: -0.025rem 0.025rem 0.025rem rgba(0, 0, 174, .15);
+    line-height: 3.25rem;
+    background-color: #f2f2f2;
+    font-size: 0.75rem;
+    text-align: center;
+}
+
+div {
+    -webkit-user-select: text;
+}
+
+/*--------------------------------叶老大说先不改的代码----------------------*/
+
+/*--------------------------------photowripe插件样式,叶老大说先不改----------*/
+.pswp {
+    display: none;
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    left: 0;
+    top: 0;
+    overflow: hidden;
+    -ms-touch-action: none;
+    touch-action: none;
+    z-index: 1500;
+    -webkit-text-size-adjust: 100%;
+    -webkit-backface-visibility: hidden;
+    outline: none;
+}
+
+.pswp * {
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+}
+
+.pswp img {
+    max-width: none;
+}
+
+.pswp--animate_opacity {
+    opacity: 0.001;
+    will-change: opacity;
+    -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
+    transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+.pswp--open {
+    display: block;
+}
+
+.pswp--zoom-allowed .pswp__img {
+    cursor: -webkit-zoom-in;
+    cursor: -moz-zoom-in;
+    cursor: zoom-in;
+}
+
+.pswp--zoomed-in .pswp__img {
+    cursor: -webkit-grab;
+    cursor: -moz-grab;
+    cursor: grab;
+}
+
+.pswp--dragging .pswp__img {
+    cursor: -webkit-grabbing;
+    cursor: -moz-grabbing;
+    cursor: grabbing;
+}
+
+.pswp__bg {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    background: #000;
+    opacity: 0;
+    -webkit-transform: translateZ(0);
+    transform: translateZ(0);
+    -webkit-backface-visibility: hidden;
+    will-change: opacity;
+}
+
+.pswp__scroll-wrap {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+}
+
+.pswp__container,
+.pswp__zoom-wrap {
+    -ms-touch-action: none;
+    touch-action: none;
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+}
+
+.pswp__container,
+.pswp__img {
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    -webkit-tap-highlight-color: transparent;
+    -webkit-touch-callout: none;
+}
+
+.pswp__zoom-wrap {
+    position: absolute;
+    width: 100%;
+    -webkit-transform-origin: left top;
+    -ms-transform-origin: left top;
+    transform-origin: left top;
+    -webkit-transition: -webkit-transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
+    transition: transform 333ms cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+.pswp__bg {
+    will-change: opacity;
+    -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
+    transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+.pswp--animated-in .pswp__bg,
+.pswp--animated-in .pswp__zoom-wrap {
+    -webkit-transition: none;
+    transition: none;
+}
+
+.pswp__container,
+.pswp__zoom-wrap {
+    -webkit-backface-visibility: hidden;
+}
+
+.pswp__item {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    overflow: hidden;
+}
+
+.pswp__img {
+    position: absolute;
+    width: auto;
+    height: auto;
+    top: 0;
+    left: 0;
+}
+
+.pswp__img--placeholder {
+    -webkit-backface-visibility: hidden;
+}
+
+.pswp__img--placeholder--blank {
+    background: #222;
+}
+
+.pswp--ie .pswp__img {
+    width: 100% !important;
+    height: auto !important;
+    left: 0;
+    top: 0;
+}
+
+.pswp__error-msg {
+    position: absolute;
+    left: 0;
+    top: 50%;
+    width: 100%;
+    text-align: center;
+    line-height: 16px;
+    margin-top: -8px;
+    color: #CCC;
+}
+
+.pswp__error-msg a {
+    color: #CCC;
+    text-decoration: underline;
+}
+
+.pswp__button {
+    width: 44px;
+    height: 44px;
+    position: relative;
+    background: none;
+    cursor: pointer;
+    overflow: visible;
+    -webkit-appearance: none;
+    display: block;
+    border: 0;
+    padding: 0;
+    margin: 0;
+    float: right;
+    opacity: 0.75;
+    -webkit-transition: opacity 0.2s;
+    transition: opacity 0.2s;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+}
+
+.pswp__button:focus,
+.pswp__button:hover {
+    opacity: 1;
+}
+
+.pswp__button:active {
+    outline: none;
+    opacity: 0.9;
+}
+
+.pswp__button::-moz-focus-inner {
+    padding: 0;
+    border: 0;
+}
+
+.pswp__ui--over-close .pswp__button--close {
+    opacity: 1;
+}
+
+.pswp__button,
+.pswp__button--arrow--left:before,
+.pswp__button--arrow--right:before {
+    background: url(default-skin.png) 0 0 no-repeat;
+    background-size: 264px 88px;
+    width: 44px;
+    height: 44px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.1),
+(-webkit-min-device-pixel-ratio: 1.09375),
+(min-resolution: 105dpi),
+(min-resolution: 1.1dppx) {
+
+    .pswp--svg .pswp__button,
+    .pswp--svg .pswp__button--arrow--left:before,
+    .pswp--svg .pswp__button--arrow--right:before {
+        background-image: url(default-skin.svg);
+    }
+
+    .pswp--svg .pswp__button--arrow--left,
+    .pswp--svg .pswp__button--arrow--right {
+        background: none;
+    }
+}
+
+.pswp__button--close {
+    background-position: 0 -44px;
+}
+
+.pswp__button--share {
+    background-position: -44px -44px;
+}
+
+.pswp__button--fs {
+    display: none;
+}
+
+.pswp--supports-fs .pswp__button--fs {
+    display: block;
+}
+
+.pswp--fs .pswp__button--fs {
+    background-position: -44px 0;
+}
+
+.pswp__button--zoom {
+    display: none;
+    background-position: -88px 0;
+}
+
+.pswp--zoom-allowed .pswp__button--zoom {
+    display: block;
+}
+
+.pswp--zoomed-in .pswp__button--zoom {
+    background-position: -132px 0;
+}
+
+.pswp--touch .pswp__button--arrow--left,
+.pswp--touch .pswp__button--arrow--right {
+    visibility: hidden;
+}
+
+.pswp__button--arrow--left,
+.pswp__button--arrow--right {
+    background: none;
+    top: 50%;
+    margin-top: -50px;
+    width: 70px;
+    height: 100px;
+    position: absolute;
+}
+
+.pswp__button--arrow--left {
+    left: 0;
+}
+
+.pswp__button--arrow--right {
+    right: 0;
+}
+
+.pswp__button--arrow--left:before,
+.pswp__button--arrow--right:before {
+    content: '';
+    top: 35px;
+    background-color: rgba(0, 0, 0, 0.3);
+    height: 30px;
+    width: 32px;
+    position: absolute;
+}
+
+.pswp__button--arrow--left:before {
+    left: 6px;
+    background-position: -138px -44px;
+}
+
+.pswp__button--arrow--right:before {
+    right: 6px;
+    background-position: -94px -44px;
+}
+
+.pswp__counter,
+.pswp__share-modal {
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+.pswp__share-modal {
+    display: block;
+    background: rgba(0, 0, 0, 0.5);
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    padding: 10px;
+    position: absolute;
+    z-index: 1600;
+    opacity: 0;
+    -webkit-transition: opacity 0.25s ease-out;
+    transition: opacity 0.25s ease-out;
+    -webkit-backface-visibility: hidden;
+    will-change: opacity;
+}
+
+.pswp__share-modal--hidden {
+    display: none;
+}
+
+.pswp__share-tooltip {
+    z-index: 1620;
+    position: absolute;
+    background: #FFF;
+    top: 56px;
+    border-radius: 2px;
+    display: block;
+    width: auto;
+    right: 44px;
+    -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
+    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
+    -webkit-transform: translateY(6px);
+    -ms-transform: translateY(6px);
+    transform: translateY(6px);
+    -webkit-transition: -webkit-transform 0.25s;
+    transition: transform 0.25s;
+    -webkit-backface-visibility: hidden;
+    will-change: transform;
+}
+
+.pswp__share-tooltip a {
+    display: block;
+    padding: 8px 12px;
+    color: #000;
+    text-decoration: none;
+    line-height: 18px;
+}
+
+.pswp__share-tooltip a:hover {
+    text-decoration: none;
+    color: #000;
+}
+
+.pswp__share-tooltip a:first-child {
+    border-radius: 2px 2px 0 0;
+}
+
+.pswp__share-tooltip a:last-child {
+    border-radius: 0 0 2px 2px;
+}
+
+.pswp__share-modal--fade-in {
+    opacity: 1;
+}
+
+.pswp__share-modal--fade-in .pswp__share-tooltip {
+    -webkit-transform: translateY(0);
+    -ms-transform: translateY(0);
+    transform: translateY(0);
+}
+
+.pswp--touch .pswp__share-tooltip a {
+    padding: 16px 12px;
+}
+
+a.pswp__share--facebook:before {
+    content: '';
+    display: block;
+    width: 0;
+    height: 0;
+    position: absolute;
+    top: -12px;
+    right: 15px;
+    border: 6px solid transparent;
+    border-bottom-color: #FFF;
+    -webkit-pointer-events: none;
+    -moz-pointer-events: none;
+    pointer-events: none;
+}
+
+a.pswp__share--facebook:hover {
+    background: #3E5C9A;
+    color: #FFF;
+}
+
+a.pswp__share--facebook:hover:before {
+    border-bottom-color: #3E5C9A;
+}
+
+a.pswp__share--twitter:hover {
+    background: #55ACEE;
+    color: #FFF;
+}
+
+a.pswp__share--pinterest:hover {
+    background: #CCC;
+    color: #CE272D;
+}
+
+a.pswp__share--download:hover {
+    background: #DDD;
+}
+
+.pswp__counter {
+    position: absolute;
+    left: 0;
+    top: 0;
+    height: 44px;
+    line-height: 44px;
+    color: #FFF;
+    opacity: 0.75;
+    padding: 0 10px;
+}
+
+.pswp__caption {
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%;
+    min-height: 44px;
+}
+
+.pswp__caption small {
+    color: #BBB;
+}
+
+.pswp__caption__center {
+    text-align: left;
+    max-width: 420px;
+    margin: 0 auto;
+    padding: 10px;
+    line-height: 20px;
+    color: #CCC;
+}
+
+.pswp__caption--empty {
+    display: none;
+}
+
+.pswp__caption--fake {
+    visibility: hidden;
+}
+
+.pswp__preloader {
+    width: 44px;
+    height: 44px;
+    position: absolute;
+    top: 0;
+    left: 50%;
+    margin-left: -22px;
+    opacity: 0;
+    -webkit-transition: opacity 0.25s ease-out;
+    transition: opacity 0.25s ease-out;
+    will-change: opacity;
+    direction: ltr;
+}
+
+.pswp__preloader__icn {
+    width: 20px;
+    height: 20px;
+    margin: 12px;
+}
+
+.pswp__preloader--active {
+    opacity: 1;
+}
+
+.pswp__preloader--active .pswp__preloader__icn {
+    background: url(preloader.gif) 0 0 no-repeat;
+}
+
+.pswp--css_animation .pswp__preloader--active {
+    opacity: 1;
+}
+
+.pswp--css_animation .pswp__preloader--active .pswp__preloader__icn {
+    -webkit-animation: clockwise 500ms linear infinite;
+    animation: clockwise 500ms linear infinite;
+}
+
+.pswp--css_animation .pswp__preloader--active .pswp__preloader__donut {
+    -webkit-animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite;
+    animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite;
+}
+
+.pswp--css_animation .pswp__preloader__icn {
+    background: none;
+    opacity: 0.75;
+    width: 14px;
+    height: 14px;
+    position: absolute;
+    left: 15px;
+    top: 15px;
+    margin: 0;
+}
+
+.pswp--css_animation .pswp__preloader__cut {
+    position: relative;
+    width: 7px;
+    height: 14px;
+    overflow: hidden;
+}
+
+.pswp--css_animation .pswp__preloader__donut {
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+    width: 14px;
+    height: 14px;
+    border: 2px solid #FFF;
+    border-radius: 50%;
+    border-left-color: transparent;
+    border-bottom-color: transparent;
+    position: absolute;
+    top: 0;
+    left: 0;
+    background: none;
+    margin: 0;
+}
+
+@media screen and (max-width: 1024px) {
+    .pswp__preloader {
+        position: relative;
+        left: auto;
+        top: auto;
+        margin: 0;
+        float: right;
+    }
+}
+
+@-webkit-keyframes clockwise {
+    0% {
+        -webkit-transform: rotate(0deg);
+        transform: rotate(0deg);
+    }
+
+    100% {
+        -webkit-transform: rotate(360deg);
+        transform: rotate(360deg);
+    }
+}
+
+@keyframes clockwise {
+    0% {
+        -webkit-transform: rotate(0deg);
+        transform: rotate(0deg);
+    }
+
+    100% {
+        -webkit-transform: rotate(360deg);
+        transform: rotate(360deg);
+    }
+}
+
+@-webkit-keyframes donut-rotate {
+    0% {
+        -webkit-transform: rotate(0);
+        transform: rotate(0);
+    }
+
+    50% {
+        -webkit-transform: rotate(-140deg);
+        transform: rotate(-140deg);
+    }
+
+    100% {
+        -webkit-transform: rotate(0);
+        transform: rotate(0);
+    }
+}
+
+@keyframes donut-rotate {
+    0% {
+        -webkit-transform: rotate(0);
+        transform: rotate(0);
+    }
+
+    50% {
+        -webkit-transform: rotate(-140deg);
+        transform: rotate(-140deg);
+    }
+
+    100% {
+        -webkit-transform: rotate(0);
+        transform: rotate(0);
+    }
+}
+
+.pswp__ui {
+    -webkit-font-smoothing: auto;
+    visibility: visible;
+    opacity: 1;
+    z-index: 1550;
+}
+
+.pswp__top-bar {
+    position: absolute;
+    left: 0;
+    top: 0;
+    height: 44px;
+    width: 100%;
+}
+
+.pswp__caption,
+.pswp__top-bar,
+.pswp--has_mouse .pswp__button--arrow--left,
+.pswp--has_mouse .pswp__button--arrow--right {
+    -webkit-backface-visibility: hidden;
+    will-change: opacity;
+    -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
+    transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+.pswp--has_mouse .pswp__button--arrow--left,
+.pswp--has_mouse .pswp__button--arrow--right {
+    visibility: visible;
+}
+
+.pswp__top-bar,
+.pswp__caption {
+    background-color: rgba(0, 0, 0, 0.5);
+}
+
+.pswp__ui--fit .pswp__top-bar,
+.pswp__ui--fit .pswp__caption {
+    background-color: rgba(0, 0, 0, 0.3);
+}
+
+.pswp__ui--idle .pswp__top-bar {
+    opacity: 0;
+}
+
+.pswp__ui--idle .pswp__button--arrow--left,
+.pswp__ui--idle .pswp__button--arrow--right {
+    opacity: 0;
+}
+
+.pswp__ui--hidden .pswp__top-bar,
+.pswp__ui--hidden .pswp__caption,
+.pswp__ui--hidden .pswp__button--arrow--left,
+.pswp__ui--hidden .pswp__button--arrow--right {
+    opacity: 0.001;
+}
+
+.pswp__ui--one-slide .pswp__button--arrow--left,
+.pswp__ui--one-slide .pswp__button--arrow--right,
+.pswp__ui--one-slide .pswp__counter {
+    display: none;
+}
+
+.pswp__element--disabled {
+    display: none !important;
+}
+
+.pswp--minimal--dark .pswp__top-bar {
+    background: none;
+}
+
+/*---------------------------------------photowripe插件样式结束-------------------------------*/
+/***************APP报名学员临时样式(571/2019/06/11)*********************/
+#app select {
+    width: 100%;
+    height: 1.4rem;
+    border: none;
+    outline: none;
+    appearance: none;
+    -moz-appearance: none;
+    -webkit-appearance: none;
+    background: url(image/mobileIcon-down.png) no-repeat right center transparent;
+    background-size: 9%;
+    color: #333333;
+    font-size: 0.75rem;
+    padding-right: .8rem;
+}
+
+
+.mobileForm .input-selectedDiv div {
+    padding-left: 7px;
+}
+
+.mobileForm td>select {
+    vertical-align: top;
+}
+
+input[type=date] {
+    border: none;
+    background: url(image/mobileIcon-down.png) no-repeat right center transparent;
+    background-size: 9%;
+    appearance: none;
+    -moz-appearance: none;
+    -webkit-appearance: none;
+    width: 100%;
+    height: 1.4rem;
+    color: #333333;
+    font-size: 0.75rem;
+}
+
+/*****完善个人信息备用*********/
+
+.ry {
+    margin-bottom: 2.5rem;
+}
+
+.ry div input {
+    border: none;
+    height: 1.4rem;
+    vertical-align: top;
+}
+
+.content_nr {
+    display: inline-block;
+    width: 97px;
+    height: 40px;
+    float: left;
+    position: relative;
+    top: 12px;
+}
+
+/*已打钩*/
+.mobileicon-checked_new {
+    display: inline-block;
+    background: url(image/icon-checked.png) center center no-repeat;
+    width: .9rem;
+    height: .7rem;
+    background-size: 100%;
+}
+
+/*未钩*/
+.mobileicon-unchecked_new {
+    display: inline-block;
+    background: url(image/icon-unchecked.png) center center no-repeat;
+    width: .9rem;
+    height: .7rem;
+    background-size: 100%;
+}
+
+/* 2019.8.18 */
+
+/* 选中 */
+.icon-warningFull {
+    width: 17px;
+    height: 17px;
+    background-color: #ff0000;
+    border: 1px solid #6c9ddb;
+}
+
+/* 未选中    */
+.icon-empty {
+    width: 17px;
+    height: 17px;
+    background-color: #ffffff;
+    border: 1px solid #6c9ddb;
+}
+
+
+/* 2019.8.19 */
+.largeInvertIcon-save {
+    width: 25px;
+    height: 28px;
+    background: url(image/largeInvertIcon-save.png);
+    display: inline-block;
+}
+
+/* 2019.8.28 */
+/* 移动端截图 */
+/*
+ mobilePlugin-drag 裁剪图片右下角自由拖动的三角形
+mobileDialog-mask 裁剪图片遮罩层
+mobileArea-div  选区的框(裁剪图片的框)
+mobileArea-msg 选区信息(裁剪图片区域宽、高的DIV)
+ */
+.mobilePlugin-drag {
+    display: inline-block;
+    bottom: -0.1rem !important;
+    right: -0.1rem !important;
+    width: 1.25rem !important;
+    height: 1.25rem !important;
+    background: url(image/plugin-drag.png) center center no-repeat;
+    background-size: 87%;
+}
+
+.mobileDialog-mask {
+    position: absolute;
+    top: 0%;
+    left: 0%;
+    width: 100%;
+    height: 100%;
+    /* -moz-opacity: 0.2; */
+    /* opacity: .20; */
+    filter: alpha(opacity=20);
+    background-color: rgba(0, 0, 0, .2);
+}
+
+.mobileArea-div {
+    display: block;
+    height: 100%;
+    outline-color: rgba(51, 153, 255, 0.75);
+    outline: 1px solid #39f;
+    overflow: hidden;
+    width: 100%;
+}
+
+.mobileArea-msg {
+    /* display: none; */
+    background-color: #000;
+    opacity: 0.6;
+    color: #fff;
+    position: absolute;
+    z-index: 9999999999;
+}
+
+/* 2019.9.23移动端上下文菜单 */
+.mobileContextMenu-div {
+    background: rgba(0, 0, 0, 0.4);
+
+}
+
+.mobileContextMenu-button {
+    width: 2.5rem;
+    height: 2.5rem;
+    background: #6c9ed7;
+    color: white;
+    line-height: 2.5rem;
+    text-align: center;
+    border-radius: 50%;
+}
+
+/* 2019.9.23移动端刷新按钮 */
+.mobileIcon-refresh {
+    width: 2rem;
+    height: 2rem;
+    background: #d9d9d9 url(image/refresh-app.png)no-repeat center;
+    background-size: 70%;
+    border-radius: 0.25rem;
+    display: inline-block;
+    position: fixed;
+    right: 1rem;
+    top: 1rem;
+    z-index: 30000000;
+}
+
+
+/* 2019.9.24 */
+/* 移动端首页 头像框样式 */
+/* .mobilePersonalPhoto {
+    width: 4.25rem;
+    height: 4.25rem;
+    border: 0.025rem solid #cccccc;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    box-sizing: border-box;
+    border-radius: 50%;
+    background: #fff;
+    margin: 0.35rem 0.525rem 0 0.525rem;
+} */
+
+/* 移动端首页梯形 */
+.mobileProgress-button {
+    float: right;
+    background-color: rgba(237, 239, 240, 1);
+    height: 1.425rem;
+    display: inline-block;
+    line-height: 1.425rem;
+    border-top-right-radius: 0.05rem;
+    border-bottom-right-radius: 0.05rem;
+    font-size: 0.75rem;
+    color: #333;
+    position: relative;
+    text-align: center;
+    padding: 0 0.5rem;
+    box-sizing: border-box;
+    border-top-left-radius: 0.05rem;
+}
+
+/* 移动端首页梯形旁的三角形 */
+.mobileProgress-button:before {
+    content: "";
+    width: 0rem;
+    height: 0rem;
+    border-top: 1.775rem solid transparent;
+    border-bottom: 1.775rem solid rgba(237, 239, 240, 1);
+    border-left: 1.5rem solid transparent;
+    border-right: none;
+    position: absolute;
+    top: -2.12rem;
+    left: -1.2rem;
+}
+
+/* 梯形下边的蓝色线 */
+.mobileProgress-div {
+    background: #c7e2fe;
+    width: 100%;
+    height: 0.275rem;
+    border-bottom: 0.025rem solid #959595;
+}
+
+/* 移动端首页 用户名字 */
+.mobliePlugin-boldText {
+    font-size: 0.75rem;
+    color: #276ab0;
+}
+
+/* 移动端首页 用户提示语 */
+.mobilePlugin-dimText {
+    font-size: 0.75rem;
+    color: #666666;
+}
+
+/* 移动端首页 日程内容 */
+.mobilePlugin-text {
+    width: 12rem;
+    display: inline-block;
+    height: 20px;
+    position: relative;
+    padding: 0.325rem 0rem 0rem;
+    margin-top: 0.3rem;
+    float: right;
+    font-size: 15px;
+    margin-right: 1rem;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    color: #333333;
+}
+
+/* 事务的下边框 */
+.mobilePlugin-largeText {
+    border-bottom: 0.025rem solid #6c9ddb;
+
+}
+
+/* 用于移动端首页事件 右边小icon */
+.mobileIcon-num {
+    width: 0.85rem;
+    height: 0.85rem;
+    border: 0.025rem solid #6c9ddb;
+    display: inline-block;
+    text-align: center;
+    line-height: 0.85rem;
+    margin-right: 0.2rem;
+    position: absolute;
+    right: 0;
+    bottom: 0.35rem;
+    color: #6c9ddb;
+}
+
+/* 2019.9.25 */
+.mobilePlugin-boldText {
+    font-size: 0.68rem;
+    color: black;
+}
+
+/* 2019.9.26 */
+.mobileMiniIcon-start {
+    width: 19px;
+    height: 19px;
+    background: url(image/mobileMiniIcon-start.png) no-repeat;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+}
+
+.mobileMiniIcon-search {
+    width: 19px;
+    height: 19px;
+    background: url(image/mobileMiniIcon-search.png) no-repeat;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+}
+
+.mobileFilter {
+    -webkit-filter: grayscale(100%);
+    -moz-filter: grayscale(100%);
+    -ms-filter: grayscale(100%);
+    -o-filter: grayscale(100%);
+    filter: grayscale(100%);
+    filter: gray;
+    background-color: #e1e1e1;
+    /*2019.11.12 杨文俊增加*/
+
+}
+
+/* 下载页鸽子 2019.10.14 */
+.largeIcon-beacon {
+    background: url(image/gezi.png)center center no-repeat;
+    background-size: 85%;
+}
+
+/* app选择日期 */
+input[type=datetime-local] {
+    width: 100%;
+    height: 100%;
+    min-height: 1rem;
+    position: relative;
+    top: 0;
+    font-size: 0.75rem;
+
+}
+
+
+/* app悬浮菜单 */
+.mobileFloatButton {
+    width: 2rem;
+    height: 2rem;
+    background: #D8D8D8;
+    display: inline-block;
+    border-radius: 0.2rem;
+}
+
+.mobileIcon-menu {
+    width: 100%;
+    height: 100%;
+    display: inline-block;
+    background: url(image/mobileIcon-menu.png) no-repeat center center;
+    background-size: 70%;
+}
+
+/*  灰色小圆角边框 用于审批表单元格当前编辑状态的高亮边框及待办边框 */
+.mobileSmallBox-dim {
+    border: 0.05rem solid #c2c2c2;
+    background-color: #ffffff;
+    border-radius: 0.15rem;
+}
+
+/* 高亮小圆角边框 用于审批表单元格当前编辑状态的高亮边框 */
+.mobileSmallBox-highlight {
+    border: 0.05rem solid #6c9ed7;
+    background-color: #ffffff;
+    border-radius: 0.15rem;
+}
+
+/* app首页横栏蓝色按钮 2019.12.5 */
+.grxxTarbar {
+    width: 100%;
+    text-align: center;
+    height: 3.3rem;
+    font-size: 18px;
+    background: #cccccc;
+    color: #2b368f;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    position: fixed;
+    bottom: 0;
+    border-top: 0.2rem solid #6c9ddb;
+}
+
+.mobileIcon-beacon {
+    width: 1.5rem;
+    height: 1.5rem;
+    display: inline-block;
+    background: url(image/mobileIcon-beacon.png);
+    background-size: 100%;
+    margin: 0 0.3rem 0 0;
+}
+
+/* 边框(被选中) 2019.12.31 */
+.plugin-div-selected {
+    border: 1px solid #679cd9;
+    border-radius: 3px;
+    box-shadow: 5px 5px 10px 0px #a7a5a5;
+}
+
+/* 个人空间上半部分样式 2020.1.9 */
+
+/* APP属性设置页面背景色(天蓝色,位于完善个人信息所在页面的上半部分) */
+.mobileSet-div {
+    background: #ebf0f2;
+}
+
+/* APP属性设置页面行(白色,含默认字体样式) */
+.mobileSet-list {
+    background: white;
+}
+
+/* APP属性设置页面行(灰色,选中状态) */
+.mobileSet-list-selected:active {
+    background-color: #d7d7d7 !important;
+}
+
+/* APP日历样式begin*/
+
+.mobileDate-div td,
+.mobileDate-headerDiv * {
+    transition-duration: .3s;
+    -webkit-transition-duration: .3s;
+}
+
+.mobileDate-headerDiv {
+    position: relative;
+    /*line-height: 48px;
+  padding: 10px 70px 5px; */
+    /* border-bottom: 1px solid #e2e2e2; */
+    border-bottom: 0.05rem solid #e2e2e2;
+
+    line-height: 2.4rem;
+    padding: 0.25rem 3.5rem 0.25rem
+}
+
+.mobileDate-headerDiv i {
+    /* padding: 0 5px; */
+    padding: 0 0.25rem;
+    cursor: pointer;
+    position: absolute;
+    /* top: 10px; */
+    color: #999;
+    /*  font-size: 24px; */
+
+
+    top: 0.125rem;
+    font-size: 1.2rem;
+}
+
+.mobileDate-headerDiv * {
+    display: inline-block;
+    vertical-align: bottom;
+}
+
+.mobileDate-headerDiv i.mobileIcon-fastPrev {
+    /* left: 25px; */
+    left: 0.8rem;
+}
+
+.mobileDate-headerDiv i.mobileIcon-prev {
+    /*  left: 75px; */
+    left: 3rem;
+}
+
+.mobileDate-headerDiv i.mobileIcon-fastNext {
+    /* right: 23px; */
+    right: 0.8rem
+}
+
+.mobileDate-headerDiv i.mobileIcon-next {
+    /* right:75px; */
+    right: 3rem;
+}
+
+.mobileDate-headerDiv i:hover,
+.mobileDate-headerDiv span:hover {
+    color: #71a0ce;
+}
+
+
+.mobileDate-div {
+    position: relative;
+    /* padding: 10px; */
+    padding: 0.5rem;
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    border-top: none 0;
+    border-bottom: none 0;
+}
+
+.mobileDate-div table {
+    border-collapse: collapse;
+    font-family: "黑体-Regular" !important;
+    /* font-size: 18px; */
+    font-size: 0.9rem;
+    width: 100%;
+}
+
+.mobileDate-div td,
+.mobileDate-div th {
+    /* width: 55px;
+  height: 48px; */
+    width: 2.7rem;
+    height: 2.4rem;
+    text-align: center;
+    /*  border: 2px #FFF solid ; */
+    border: 0.1rem #FFF solid;
+}
+
+.mobileDate-div td {
+
+    position: relative;
+    cursor: pointer;
+    /*  line-height: 48px; */
+    line-height: 2.4rem;
+    /* border: 2px #FFF solid ; */
+    border: 0.1rem #FFF solid;
+    font-weight: bolder;
+    color: #666;
+
+}
+
+.mobileDate-div th {
+    font-weight: 400;
+    color: #333
+}
+
+
+
+.mobileDate-div td:hover {
+    background-color: #eaeaea;
+    color: #333;
+}
+
+.mobileDate-div .mobileDate-dim,
+.mobileDate-div .laydate-day-prev {
+    color: #d2d2d2;
+}
+
+.mobileDate-div .mobileDate-dim {
+    color: #d2d2d2;
+}
+
+.mobileIcon-dimTriangle::after {
+    /* border-top:8px solid #e1e1e1 !important; */
+    border-top: 0.4rem solid #e1e1e1 !important;
+    z-index: -98;
+}
+
+.laydate-selected.mobileDate-dim,
+.laydate-selected.laydate-day-prev {
+    background-color: #f8f8f8 !important;
+}
+
+.mobileDate-selected {
+    background-color: #71a0ce !important;
+    color: #fff !important;
+    font-weight: bolder !important;
+}
+
+.mobileDate-selected .mobileIcon-triangle {
+    color: #fff !important;
+}
+
+.mobileDate-highlight {
+    /* color:#71a0ce !important;*/
+    font-weight: bolder !important;
+}
+
+.mobileIcon-triangle {
+    position: absolute;
+    left: 0px;
+    top: 0px;
+    width: 100%;
+    /* height: 48px;
+  line-height: 48px; */
+    height: 2.4rem;
+    line-height: 2.4rem;
+
+    overflow: hidden;
+    font-weight: bolder;
+    justify-content: center;
+}
+
+.mobileIcon-triangle::after {
+    position: absolute;
+    content: '';
+    right: 0px;
+    top: 0px;
+    width: 0px;
+    height: 0px;
+    /* border-top:8px solid #71a0ce;*/
+    /*border-left: 8px solid  transparent; */
+    border-top: 0.4rem solid #71a0ce;
+    border-left: 0.4rem solid transparent;
+    z-index: -99;
+}
+
+.mobileIcon-dimTriangle::after {
+    border-top: 0.4rem solid #e1e1e1 !important;
+    z-index: -98;
+}
+
+layui-laydate-header .layui-icon {
+    display: none !important
+}
+
+
+/* APP日历样式end*/
+
+/* 报名缴费微信支付 */
+.icon-wechatPay {
+    width: 127px;
+    height: 51px;
+    background: url(image/wxpay.png) no-repeat;
+    display: inline-block;
+}
+
+.largeIcon-checked {
+    width: 128px;
+    height: 128px;
+    display: inline-block;
+    background: url(image/icon_success.png) no-repeat;
+}
+
+.content-warning {
+    /* color: #ff0000; */
+    color: #fa5a32;
+    font-size: 14px;
+}
+
+/*app修改密码的错误提示文字*/
+.mobileContent-warning {
+    color: FF0000;
+    font-family: SIL Hei;
+    font-size: 0.75rem;
+    text-align: center;
+    line-height: 1.2rem;
+}
+
+/*app端ueditor样式*/
+.ueditor p {
+    display: block;
+    margin-block-start: 1em;
+    margin-block-end: 1em;
+    margin-inline-start: 0px;
+    margin-inline-end: 0px;
+}
+
+.ueditor img {
+    width: 100%;
+    height: auto !important;
+    max-width: 100%;
+    max-height: 100%;
+}
+
+.ueditor video {
+    width: 100%;
+}
+
+/*pc端UEDITORFIELD样式*/
+.UEDITORFIELD p {
+    display: block;
+    margin-block-start: 1em;
+    margin-block-end: 1em;
+    margin-inline-start: 0px;
+    margin-inline-end: 0px;
+}
+
+/* 移动端个人信息页面样式 20200716 杨文俊 */
+.mobileIcon-location {
+    /* 图标定位 */
+    width: 1.5rem;
+    height: 1.5rem;
+    display: inline-block;
+    background: url(image/mobileIcon-location.png) no-repeat;
+    background-size: 100%;
+}
+
+/*  锁定按钮(显示在用户设备列表,锁定设备行的右上角)20200720 杨文俊*/
+.mobileIcon-lock {
+    width: 1.25rem;
+    height: 1.25rem;
+    display: inline-block;
+    background: url(image/mobileIcon-lock.png) no-repeat;
+    background-size: 100%;
+}
+
+/*  铃铛(显示在用户设备列表,消息提醒设备的右上角)20200720 杨文俊*/
+.mobileIcon-bell {
+    width: 1.25rem;
+    height: 1.25rem;
+    display: inline-block;
+    background: url(image/mobileIcon-bell.png) no-repeat;
+    background-size: 100%;
+}
+
+/*pc  锁定按钮(显示在用户设备列表,锁定设备行的右上角)20200721 杨文俊*/
+.smallIcon-lock {
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background: url(image/smallIcon-lock.png) no-repeat;
+    background-size: 100%;
+}
+
+/*pc  铃铛(显示在用户设备列表,消息提醒设备的右上角)20200721 杨文俊*/
+.smallIcon-bell {
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background: url(image/smallIcon-bell.png) no-repeat;
+    background-size: 100%;
+}
+
+/*  内容按钮样式    对应PC样式content-button 20200723 杨文俊*/
+.padContent-button {
+    font-size: 1rem;
+    color: #6b9fd3;
+    padding: 0rem 1rem;
+    height: 2.6rem;
+    line-height: 2.4rem;
+    box-sizing: border-box;
+    border: 1px solid #6b9fd3;
+    vertical-align: middle;
+    border-radius: 0.3rem;
+    outline: none;
+    margin-right: 0.1rem;
+    background: none;
+}
+
+.padContent-button:hover {
+    border: 0.05rem solid #6b9fd3;
+    color: #fff;
+    background-color: #6b9fd3;
+}
+
+/*.padContent-button:active {
+    border: 0.05rem solid #415e7d;
+    color: #fff;
+    background-color: #415e7d;
+}	*/
+/* 关闭    对应PC样式icon-close 20200723 杨文俊*/
+.padIcon-close {
+    width: 2rem;
+    height: 2rem;
+    display: inline-block;
+    background: url(image/help-closeButton.png) no-repeat;
+    background-size: 100%;
+}
+
+/* 平板底部按钮20200724 杨文俊*/
+.padBottom-button {
+    border: none;
+    outline: none;
+    width: calc(50% - 0.075rem);
+    height: 4rem;
+    color: #4863a4;
+    font-size: 1.8rem;
+    text-align: center;
+    box-sizing: border-box;
+    background-color: #cacbcc;
+    -webkit-appearance: none;
+    border-radius: 0rem;
+}
+
+.padBottom-button:nth-child(1) {
+    float: left;
+}
+
+.mobileContent-button {
+    font-size: 0.7rem;
+    color: #6b9fd3;
+    padding: 0rem 0.65rem;
+    height: 1.4rem;
+    line-height: 1.4rem;
+    box-sizing: border-box;
+    border: 0.05rem solid #6b9fd3;
+    vertical-align: middle;
+    border-radius: 0.15rem;
+    outline: none;
+    margin-right: 0.1rem;
+    background: none;
+
+}
+
+/* app关闭按钮 */
+.mobileIcon-close {
+    display: inline-block;
+    width: 1.2rem;
+    height: 1.2rem;
+    background: url(image/spb-close.png) center center no-repeat;
+    background-size: 100%;
+}
+
+.mobile-titleText {
+    font-size: 0.8rem;
+    line-height: 1rem;
+    color: #000;
+}
+
+.mobile-contentText {
+    font-size: 0.75rem;
+    line-height: 1rem;
+    color: #000;
+}
+
+
+/* 学阳做的flashMsg动画样式 begin*/
+@-webkit-keyframes layui-upbit {
+    from {
+        -webkit-transform: translate3d(0, 30px, 0);
+        opacity: .3
+    }
+
+    to {
+        -webkit-transform: translate3d(0, 0, 0);
+        opacity: 1
+    }
+}
+
+@keyframes layui-upbit {
+    from {
+        transform: translate3d(0, 30px, 0);
+        opacity: .3
+    }
+
+    to {
+        transform: translate3d(0, 0, 0);
+        opacity: 1
+    }
+}
+
+.wd-anim {
+    -webkit-animation-duration: .3s;
+    animation-duration: .3s;
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both
+}
+
+.wd-anim-upbit {
+    -webkit-animation-name: layui-upbit;
+    animation-name: layui-upbit
+}
+
+/* 学阳做的flashMsg动画样式 end*/
+
+/* 迎新推送按钮 */
+.icon-yxts {
+    width: 80px;
+    height: 22px;
+    line-height: 22px;
+    color: #FFF;
+    background: url(image/yx_ts.png) no-repeat;
+    display: inline-block;
+}
+
+/*裁剪*/
+.cat {
+    width: 23px !important;
+    height: 23px !important;
+    background: url(image/cat.png) no-repeat !important;
+    background-size: 100% 100% !important;
+    background-color: transparent !important;
+}
+
+/*app顺时针旋转*/
+.mobileIcon-rightRotation {
+    background-image: url(image/icon-rightRotation.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.mobileIcon-rightRotation:active {
+    background-image: url(image/icon-rightRotation-hover.png);
+}
+
+/*app逆时针旋转*/
+.mobileIcon-leftRotation {
+    background-image: url(image/icon--leftRotation.png);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.mobileIcon-leftRotation:active {
+    background-image: url(image/icon--leftRotation-hover.png);
+}
+
+/*app增加(大)*/
+.mobileIcon-bigAdd {
+    background-image: url(image/addIcon.png);
+    background-position-x: center;
+    background-repeat: no-repeat;
+}
+
+.button.mobileIcon-bigAdd:active {
+    background-image: url(image/addIcon-hover.png);
+}
+
+.button.mobileIcon-bigAdd:hover {
+    background-image: url(image/addIcon-hover.png);
+}
+
+/*正文黑色大字体*/
+.content-largeText {
+    font-family: Microsoft YaHei;
+    font-size: 36px;
+    color: #000000;
+}
+
+/*正文红色大字体*/
+.content-largeWarningText {
+    font-family: Microsoft YaHei;
+    font-size: 36px;
+    color: #FF0000;
+}
+
+.mobileSmallIcon-file {
+    width: 1.5rem;
+    height: 1.5rem;
+    background-image: url(image/mobileIcon-file.png);
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: 65%;
+    display: inline-block;
+    vertical-align: top;
+    margin-top: -0.1rem;
+}
+
+/*快捷图标左下角的个人空间小图标*/
+.miniIcon-personal {
+    position: absolute;
+    left: 0px;
+    bottom: 0px;
+    width: 19px;
+    height: 19px;
+    background: url(image/icon-personal.png) center center no-repeat;
+    z-index: 10;
+}
+
+.mobileMiniIcon-personal {
+    width: 19px;
+    height: 19px;
+    background: url(image/icon-personal.png) no-repeat;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+}
+
+/*右渐隐效果*/
+.right-fade {
+    position: absolute;
+    width: 1.5rem;
+    height: 100%;
+    background-image: linear-gradient(to right, transparent, #ebebeb 70%, #ebebeb);
+}
+
+/*左渐隐效果*/
+.left-fade {
+    position: absolute;
+    width: 1.5rem;
+    height: 100%;
+    background-image: linear-gradient(to left, transparent, #ebebeb 70%, #ebebeb);
+}
+
+/* 调分数右边的普通红色竖线*/
+.vLine-rightWarning {
+    border-right: 2px solid red !important;
+    height: 100%;
+    position: absolute;
+    left: -1px;
+    top: 0px;
+}
+
+/*调分数右边的细红色竖线 (粗细只有一像素)*/
+.vLine-smallRightWarning {
+    border-right: 1px solid red !important;
+    height: 100%;
+    position: absolute;
+    left: -1px;
+    top: 0px;
+}
+
+/*行灰色背景 */
+.list-dimBackground {
+    background-color: #e1e1e1 !important;
+}
+
+.list-background td {
+    border-bottom: 1px #f2f2f2 solid !important;
+}
+
+.smallIcon-user {
+    display: inline-block;
+    height: 51px;
+    width: 51px;
+    background: url(image/smallIcon-user.png) center center no-repeat;
+    background-size: 50%;
+}
+
+.smallIcon-dimUser {
+    display: inline-block;
+    height: 51px;
+    width: 51px;
+    background: url(image/smallIcon-dimUser.png) center center no-repeat;
+    background-size: 50%;
+}
+
+.icon-switchUser {
+    display: inline-block;
+    height: 61px;
+    width: 61px;
+    background: url(image/icon/icon-switchUser.png) center center no-repeat;
+    background-size: 50%;
+}
+
+.mobileIcon-scan {
+    width: 2.75rem;
+    height: 2.15rem;
+    background: url(image/icon/icon-scan.png) center center no-repeat;
+    background-size: 50%;
+    background-position: center center;
+    border: none;
+    outline: none;
+}
+
+.mobileIcon-add {
+    width: 2.75rem;
+    height: 2.15rem;
+    background: url(image/mobileIcon-add.png) center center no-repeat;
+    background-size: 130%;
+    background-position: center center;
+    border: none;
+    outline: none;
+}
+
+/*标题行的返回按钮图标*/
+.mobileIcon-return {
+    display: inline-block;
+    width: 1.1rem;
+    height: 1.1rem;
+    background: url(image/mobileIcon-return.png) center center no-repeat;
+    background-size: 100%;
+    border: none;
+    outline: none;
+}
+
+.mobileInvertIcon-i {
+    display: inline-block;
+    width: 2.25rem;
+    height: 2.25rem;
+    background: url(image/i_icon.png) center center no-repeat;
+    background-size: 100%;
+    border: none;
+    outline: none;
+}
+
+/*文字前面的三角形感叹号图标*/
+.icon-warning {
+    display: inline-block;
+    margin-top: -12px;
+    height: 35px;
+    width: 60px;
+    background: url(image/icon-warning.gif) center center no-repeat;
+}
+
+/* 党校班次计划图标begin*/
+.smallIcon-bed {
+    display: inline-block;
+    /*  width:15px;*/
+    height: 15px;
+    background: url(image/smallIcon-bed.png) left center no-repeat;
+    padding: 4px 0px 4px 18px;
+    border: none;
+    outline: none;
+}
+
+.smallIcon-classroom {
+    display: inline-block;
+    /*  width:15px;*/
+    height: 15px;
+    background: url(image/smallIcon-classroom.png) left center no-repeat;
+    padding: 4px 0px 4px 18px;
+    border: none;
+    outline: none;
+}
+
+.smallIcon-extraBed {
+    display: inline-block;
+    /*  width:15px;*/
+    height: 15px;
+    background: url(image/smallIcon-extraBed.png) left center no-repeat;
+    padding: 4px 0px 4px 18px;
+    border: none;
+    outline: none;
+}
+
+.smallIcon-restaurant {
+    display: inline-block;
+    /*  width:15px;*/
+    height: 15px;
+    background: url(image/smallIcon-restaurant.png) left center no-repeat;
+    padding: 4px 0px 4px 18px;
+    border: none;
+    outline: none;
+}
+
+/* 班数目*/
+.smallIcon-class {
+    display: inline-block;
+    /*  width:15px;*/
+    height: 15px;
+    background: url(image/smallIcon-class.png) left center no-repeat;
+    padding: 4px 0px 4px 18px;
+    border: none;
+    outline: none;
+}
+
+/* 党校班次计划图标end*/
+
+/* 蓝色代表开始的三角形*/
+.calendar-play-2a3493::before {
+    display: inline-block;
+    content: '';
+    border-width: 4px;
+    border-style: solid;
+    border-top-color: transparent !important;
+    border-bottom-color: transparent !important;
+    border-right-color: transparent !important;
+    position: absolute;
+    left: 0;
+    bottom: -3px;
+    border-color: #2a3493;
+}
+
+/* 蓝色横线*/
+.calendar-hLine-2a3493 {
+
+    border-bottom: 2px solid #2a3493 !important;
+}
+
+/* 蓝色代表结束的正方形*/
+.calendar-stop-2a3493::after {
+    display: inline-block;
+    content: '';
+
+    position: absolute;
+    right: 0;
+    bottom: -2px;
+    width: 6px;
+    height: 6px;
+    background-color: #2a3493;
+}
+
+/* 玫瑰红色代表开始的三角形*/
+.calendar-play-fa0cff::before {
+    display: inline-block;
+    content: '';
+    border-width: 4px;
+    border-style: solid;
+    border-top-color: transparent !important;
+    border-bottom-color: transparent !important;
+    border-right-color: transparent !important;
+    position: absolute;
+    left: 0;
+    bottom: -3px;
+    border-color: #fa0cff;
+}
+
+/* 玫瑰红色横线*/
+.calendar-hLine-fa0cff {
+
+    border-bottom: 2px solid #fa0cff !important;
+}
+
+/* 玫瑰红色代表结束的正方形*/
+.calendar-stop-fa0cff::after {
+    display: inline-block;
+    content: '';
+
+    position: absolute;
+    right: 0;
+    bottom: -2px;
+    width: 6px;
+    height: 6px;
+    background-color: #fa0cff;
+}
+
+/* 绿色代表开始的三角形*/
+.calendar-play-21a750::before {
+    display: inline-block;
+    content: '';
+    border-width: 4px;
+    border-style: solid;
+    border-top-color: transparent !important;
+    border-bottom-color: transparent !important;
+    border-right-color: transparent !important;
+    position: absolute;
+    left: 0;
+    bottom: -3px;
+    border-color: #21a750;
+}
+
+/* 绿色横线*/
+.calendar-hLine-21a750 {
+
+    border-bottom: 2px solid #21a750 !important;
+}
+
+/* 绿色代表结束的正方形*/
+.calendar-stop-21a750::after {
+    display: inline-block;
+    content: '';
+
+    position: absolute;
+    right: 0;
+    bottom: -2px;
+    width: 6px;
+    height: 6px;
+    background-color: #21a750;
+}
+
+/* 红色代表开始的三角形*/
+.calendar-play-ff0000::before {
+    display: inline-block;
+    content: '';
+    border-width: 4px;
+    border-style: solid;
+    border-top-color: transparent !important;
+    border-bottom-color: transparent !important;
+    border-right-color: transparent !important;
+    position: absolute;
+    left: 0;
+    bottom: -3px;
+    border-color: #ff0000;
+}
+
+/* 红色横线*/
+.calendar-hLine-ff0000 {
+
+    border-bottom: 2px solid #ff0000 !important;
+}
+
+/* 红色代表结束的正方形*/
+.calendar-stop-ff0000::after {
+    display: inline-block;
+    content: '';
+
+    position: absolute;
+    right: 0;
+    bottom: -2px;
+    width: 6px;
+    height: 6px;
+    background-color: #ff0000;
+}
+
+/* 橙色代表开始的三角形*/
+.calendar-play-ff9600::before {
+    display: inline-block;
+    content: '';
+    border-width: 4px;
+    border-style: solid;
+    border-top-color: transparent !important;
+    border-bottom-color: transparent !important;
+    border-right-color: transparent !important;
+    position: absolute;
+    left: 0;
+    bottom: -3px;
+    border-color: #ff9600;
+}
+
+/* 橙色横线*/
+.calendar-hLine-ff9600 {
+
+    border-bottom: 2px solid #ff9600 !important;
+}
+
+/* 橙色代表结束的正方形*/
+.calendar-stop-ff9600::after {
+    display: inline-block;
+    content: '';
+
+    position: absolute;
+    right: 0;
+    bottom: -2px;
+    width: 6px;
+    height: 6px;
+    background-color: #ff9600;
+}
+
+/*其它班次色代表开始的三角形*/
+.calendar-play-6c9ed7::before {
+    display: inline-block;
+    content: '';
+    border-width: 4px;
+    border-style: solid;
+    border-top-color: transparent !important;
+    border-bottom-color: transparent !important;
+    border-right-color: transparent !important;
+    position: absolute;
+    left: 0;
+    bottom: -3px;
+    border-color: #6c9ed7;
+}
+
+/* 其它班次色横线*/
+.calendar-hLine-6c9ed7 {
+    border-bottom: 2px solid #6c9ed7 !important;
+}
+
+/* 其它班次色代表结束的正方形*/
+.calendar-stop-6c9ed7::after {
+    display: inline-block;
+    content: '';
+    position: absolute;
+    right: 0;
+    bottom: -2px;
+    /*  border-width: 3px;
+    border-style: solid;
+    border-color:#6c9ed7;*/
+    width: 6px;
+    height: 6px;
+    background-color: #6c9ed7;
+}
+
+/*是否点名图标*/
+.icon-form {
+    display: inline-block;
+    width: 26px;
+    height: 26px;
+    background: url(image/icon-form.png) center center no-repeat;
+    background-size: 100%;
+    border: none;
+    outline: none;
+}
+
+/*移动端objectpicker相关样式*/
+
+.mobileInput-div textarea,
+.mobileInput-div textarea:disabled {
+    border: none;
+    outline: none;
+    border-radius: 0.05rem;
+    line-height: 1.3rem;
+    color: #000;
+    vertical-align: middle;
+    box-sizing: border-box;
+    resize: none;
+    width: calc(100% - 1.1rem);
+}
+
+
+.mobileSmallButton {
+    display: inline-block;
+    width: 0.55rem;
+    height: 0.55rem;
+    ;
+    background-color: #f7f7f7;
+    color: #6c9ddb;
+    text-align: center;
+    line-height: 0.55rem;
+    box-shadow: -1px 1px 1px rgba(108, 158, 215, .4);
+    border-radius: 0.05rem;
+    outline: none;
+    border: none;
+    background-position: center center;
+    background-repeat: no-repeat;
+}
+
+.mobileSmallButton:hover {
+    color: #fff;
+    background-color: #6c9ed7;
+}
+
+.mobileSmallButton:active {
+    color: #fff;
+    background-color: #415f7f;
+}
+
+.mobileSmallButton.icon-down {
+    box-shadow: none !important;
+    background-image: url(image/dialog-select-icon.png) !important;
+    background-position: center center !important;
+    z-index: 9999;
+    right: 0rem;
+    width: 1rem;
+    height: 1rem;
+}
+
+.mobileInput-div>icon-down {
+    display: inline-block;
+    vertical-align: middle;
+    width: 0.55rem;
+    height: 0.55rem;
+    background: url(image/dialog-select-icon.png) center center no-repeat;
+    position: absolute;
+    right: 0rem;
+    top: 0rem;
+
+}
+
+.mobileSmallButton.icon-down:active {
+    background-image: url(image/objectPicker-button-hover.png);
+}
+
+.mobileSmallButton.icon-down:hover {
+    background-image: url(image/objectPicker-button-hover.png);
+}
+
+.mobileInput-div-selected {
+    border: 0.025rem solid #6b9ed6 !important;
+    box-shadow: 0.05rem 0.05remx 0.05rem #dedede;
+    box-sizing: border-box;
+    word-break: break-all;
+    z-index: 9999 !important;
+}
+
+
+
+/* 车牌号录入 */
+.carNumber-items {
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.carNumber-items-box,
+.carNumber-item,
+.carNumber-item-newpower {
+    width: 35px;
+    height: 35px;
+    border: 2px solid #e9e9e9;
+    border-radius: 1px;
+    text-align: center;
+    line-height: 35px;
+    font-size: 16px;
+    cursor: pointer;
+}
+
+.carNumber-items-point {
+    width: 5px;
+    height: 5px;
+    background-color: #000;
+    border-radius: 50%;
+}
+
+.carNumber-item-newpower {
+    border: 2px solid #c4e3b9;
+    background-color: #f6f9ff;
+}
+
+.keyboard {
+    background: #d1d5d9;
+    position: fixed;
+    bottom: 0;
+    width: 100%;
+    /* padding: 10px; */
+    left: 0;
+    box-sizing: border-box;
+    z-index: 1111;
+}
+
+.keyboardClose {
+    background: #f7f7f7;
+    display: flex;
+    justify-content: space-between;
+    height: 1.5rem;
+    padding: 10px;
+    /* margin-bottom: 10px; */
+}
+
+.keyboardClose span {
+    font-size: 1rem;
+    line-height: 1.5rem;
+}
+
+.keyboard-item {
+    padding: 10px 5px;
+}
+
+.keyboard-line {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+}
+
+.keyboard-btn {
+    padding: 8px 5px;
+    margin: 3px;
+    background: #fff;
+    border-radius: 5px;
+    box-shadow: 0 2px 0px rgba(0, 0, 0, 0.2);
+    color: #000;
+    text-align: center;
+    font-size: 1.2rem;
+    cursor: pointer;
+    border: none;
+    box-sizing: border-box;
+}
+
+.keyboard-btn:active {
+    background: #e0e0e0;
+}
+
+.keyboard-delete-btn {
+
+    background: #a7b0bc url(image/keyboardDelete.png) no-repeat center;
+    background-size: 75%;
+}
+
+.keyboard-delete-btn:active {
+    background: #fff url(image/keyboardDelete.png) no-repeat center !important;
+    background-size: 75% !important;
+}
+
+/* ss暂用下拉框样式 */
+.ss-select-container {
+    position: relative;
+    width: 100%;
+    font-size: 1rem;
+}
+
+.ss-select {
+    padding: 5px 0;
+    border-radius: 5px;
+    cursor: pointer;
+    position: relative;
+}
+
+.ss-options {
+    display: none;
+    position: absolute;
+    top: 100%;
+    left: 0;
+    width: 100%;
+    background-color: #393D51;
+    z-index: 1000;
+    color: #fff;
+    border: 1px solid #393D51;
+    box-sizing: border-box;
+    border-radius: 5px;
+    overflow: hidden;
+    max-height: 30rem;
+    overflow: auto;
+}
+
+.ss-options div {
+    padding: 10px 10px 10px 23px;
+    cursor: pointer;
+    position: relative;
+}
+
+.ss-options div::after {
+    content: "";
+    position: absolute;
+
+    bottom: 0%;
+    left: 50%;
+    transform: translateX(-50%);
+    width: 80%;
+    height: 1px;
+    background-color: #303445;
+
+}
+
+.ss-options div:last-child::after,
+.ss-options div:hover::after,
+.ss-options div.selected::after {
+    display: none;
+}
+
+.ss-options div:hover {
+    background-color: #fff;
+    color: #393D51;
+}
+
+.ss-options div.selected {
+    background-color: #fff;
+    color: #393D51;
+
+}
+
+.ss-options div.selected::before {
+    content: "";
+    background: url(image/svg_icon/baocun.svg) no-repeat center;
+    position: absolute;
+    width: 15px;
+    height: 100%;
+    left: 5px;
+    top: 0;
+    color: #393D51;
+}
+
+.ss-select-container.open .ss-options {
+    display: block;
+}
+
+/* .ss-select-container.open .ss-select::after {
+    content: "▲";
+  } */
+
+.ss-select::after {
+    width: 15px;
+    height: 100%;
+    content: "";
+    background: url(image/svg_icon/xiangxiajiantou.svg) no-repeat center;
+    position: absolute;
+    right: 10px;
+    top: 50%;
+    transform: translateY(-50%);
+}
+
+/* 来访移动端提交图标 */
+/* 成功 */
+.lf-success {
+    width: 100px;
+    height: 100px;
+    background: url(image/svg_icon/tijiaochenggong.svg) no-repeat center;
+    background-size: 100%;
+}
+
+/* 失败 */
+.lf-fail {
+    width: 100px;
+    height: 100px;
+    background: url(image/svg_icon/tijiaoshibai.svg) no-repeat center;
+    background-size: 100%;
+}
+
+/* 缩略图容器样式 */
+
+.mobileFilePreview {
+    display: flex;
+    flex-wrap: wrap;
+    /* 保证多列布局 */
+    justify-content: flex-start;
+    /* padding: 10px; */
+}
+
+.mobileFilePreviewItem {
+    box-sizing: border-box;
+    /* 使宽高计算准确,包含 padding 和 border */
+    border-radius: 4px;
+    border: 1px solid #ebebeb;
+    position: relative;
+    overflow: hidden;
+}
+
+/* 缩略图样式,确保图片比例 */
+.mobileFilePreviewItem img {
+    width: 100%;
+    height: 100%;
+    /* 缩略图固定高度 */
+    object-fit: contain;
+    cursor: pointer;
+    
+}
+
+/* 遮罩层样式 */
+.mobileFilePreviewOverlay {
+    display: none;
+    /* 默认隐藏 */
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100vw;
+    height: 100vh;
+    background-color: rgba(0, 0, 0, 0.8);
+    justify-content: center;
+    align-items: center;
+    z-index: 1000;
+    overflow: hidden;
+    /* 防止图片超出时溢出 */
+}
+
+
+/* 放大图片样式,仅应用于 .mobileFilePreviewOverlay 内的图片 */
+.mobileFilePreviewOverlay img {
+    max-width: 100%;
+    /* 最大宽度 90% */
+    max-height: 100%;
+    /* 最大高度 90% */
+    object-fit: contain;
+    /* 保证图片保持原有比例 */
+    transform-origin: center center;
+    transition: transform 0.2s ease;
+    position: relative;
+}
+/* 添加附件按钮 */
+.mobileFilePreviewAddButton{
+    width: 100px;
+    height: 100px;
+    border: 2px dashed rgb(221, 221, 221);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    cursor: pointer;
+    font-size: 24px;
+    color: rgb(170, 170, 170);
+    /* margin-bottom: 18.4667px; */
+    margin-right: 0px;
+}
+/* 删除附件按钮 */
+.mobileFilePreviewDeleteButton{
+    width: 1.5rem;
+    height: 1.5rem;
+    position: absolute;
+    top: 0px;
+    right: 0px;
+    background: url(image/svg_icon/guanbi.svg) no-repeat center;
+    background-size: 70%;
+    color: rgb(255, 255, 255);
+    border: none;
+    cursor: pointer;
+}
+/* 附件文件名查看 */
+.mobileFilePreviewFile{
+    width: 100%;
+    height: 100%;
+    border-radius: 4px;
+    cursor: pointer;
+    text-align: center;
+    overflow-wrap: anywhere;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    overflow: auto;
+}
+
+/* 进度条容器 */
+.progress-container {
+    position: relative;
+    width: 150px;
+    height: 150px;
+    text-align: center;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+}
+/* SVG 进度条 */
+.progress-svg {
+    width: 100%;
+    height: 100%;
+    transform: rotate(-90deg); /* 从顶部开始 */
+    position: absolute;
+}
+
+/* 背景圆形,静态 */
+.progress-circle-bg {
+    fill: none;
+    stroke: #ddd;
+    stroke-width: 2;
+}
+
+/* 前景圆形,动态进度条 */
+.progress-circle {
+    fill: none;
+    stroke: #4caf50;
+    stroke-width: 2;
+    stroke-linecap: round;
+    stroke-dasharray: 100, 100;
+    stroke-dashoffset: 100;
+    transition: stroke-dashoffset 0.35s;
+}
+
+/* 显示百分比的文本 */
+.progress-text {
+    font-size: 24px;
+    color: #fff;
+}
+
+/* 显示动作信息的文本,例如 "上传中..." */
+.action-text {
+    font-size: 16px;
+    color: #fff;
+}
+
+/* 搜索图标 */
+.mobileIcon-qrcode{
+    background-color: #fff; /* 设置背景颜色为白色 */
+    background-image: url(image/svg_icon/qrcode.svg); /* 设置背景图像 */
+    background-repeat: no-repeat; /* 设置背景图像不重复 */
+    background-position: center; /* 设置背景图像居中显示 */
+}
+
+
+/* 来访卡片开始 */
+.mobileLf-card {
+    position: relative;
+    width: 95%;
+    margin: 0 auto 0.8rem;
+    background: #fff;
+    font-size: 1rem;
+    line-height: 1.5rem;
+    padding: 1rem;
+    box-sizing: border-box;
+    border-radius: 4px;
+    color: #333;
+    box-shadow: 0 0 5px rgba(168, 168, 168, 0.1);
+}
+
+.mobileLf-title {
+    font-size: 1.2rem;
+    font-weight: bold;
+    line-height: 2rem;
+    color: #000;
+    display: flex;
+    align-items: center;
+}
+/* 审核中 */
+.mobileLf-card-ing-tag{
+    position: absolute;
+    right: 0;
+    top: 0;
+    background: #fccb81;
+    color: white;
+    border-radius: 4px;
+    padding: 2px 5px;
+    width: 4rem;
+    text-align: center;
+    letter-spacing: 1px;
+    font-size:0.95rem;
+}
+/* 同意 */
+.mobileLf-card-agree-tag{
+    /* position: absolute;
+    right: 0;
+    top: 0; */
+    background: #fff;
+    color: #c0e0b7;
+    border: 1px solid #c0e0b7;
+    border-radius: 4px;
+    padding: 2px 5px;
+    /* width: 2.5rem; */
+    margin-left: .5rem;
+    text-align: center;
+    letter-spacing: 1px;
+    display: inline-block;
+    line-height: normal;
+    font-size:0.95rem;
+}
+/* 拒绝 */
+.mobileLf-card-refuse-tag{
+    /* position: absolute;
+    right: 0;
+    top: 0; */
+    background: #fff;
+    color: #f29149;
+    border: 1px solid #f29149;
+    border-radius: 4px;
+    padding: 2px 5px;
+    /* width: 2.5rem; */
+    margin-left: .5rem;
+    text-align: center;
+    letter-spacing: 1px;
+    display: inline-block;
+    line-height: normal;
+    font-size:0.95rem;
+}
+
+/* 失败 */
+.mobileLf-card-fail-tag{
+    /* position: absolute;
+    right: 0;
+    top: 0; */
+    background: #fff;
+    color: red;
+    border: 1px solid red;
+    border-radius: 4px;
+    padding: 2px 5px;
+    /* width: 2.5rem; */
+    margin-left: .5rem;
+    text-align: center;
+    letter-spacing: 1px;
+    display: inline-block;
+    line-height: normal;
+    font-size:0.95rem;
+}
+/* 来访卡片结束 */
+
+/* 移动端审核流程开始 */
+.mobileShList{
+    width: calc(100% - 22px);
+    margin: 0.5rem auto 0.5rem auto;
+}
+
+.mobileShList-task-title{
+    font-size: 1rem;
+    display: flex;
+    align-items: center;
+}
+
+.mobileShList-task-hollowPoint{
+    width: 1rem;
+    height: 1rem;
+    display: block;
+    background: #fff;
+    border: 1px solid #585e6c;
+    border-radius: 50%;
+    margin-right: 0.5rem;
+}
+.mobileShList-task-solidPoint{
+    width: 1rem;
+    height: 1rem;
+    display: block;
+    background: #585e6c;
+    border-radius: 50%;
+    margin-right: 0.5rem;
+}
+.mobileShList-task-content{
+    display: flex;
+    flex-direction: column;
+    align-items: flex-end;
+    padding: 0.8rem 0 1.8rem;
+    position: relative;
+}
+.mobileShList-task-content::before{
+    position: absolute;
+    content: '';
+    display: block;
+    width: 1px;
+    height: 100%;
+    background: #585e6c;
+    left: 0.5rem;
+    top: 0;
+
+}
+.mobileShList-task:last-child .mobileShList-task-content::before{
+    height: 0;
+}
+.mobileShList-task-content p{
+    background: url(image/svg_icon/yonghu02.svg) no-repeat;
+    width: calc(100% - 1.6rem);
+    font-size: 0.95rem;
+    margin-bottom: 0.7rem;
+    display: flex;
+    justify-content: space-between;
+    align-items: flex-start;
+    background-size: 1.1rem;
+    padding-left: 1.5rem;
+    box-sizing: border-box;
+    line-height: 1.25rem;
+}
+.mobileShList-task-content p:last-child{
+    margin-bottom: 0;
+}
+
+.mobileShList-task-author {
+    white-space: nowrap;
+}
+.mobileShList-task-comment {
+    flex-grow: 1;
+    
+    word-break: break-word;
+}
+.mobileShList-task-time {
+    white-space: nowrap;
+    color:#999;
+}
+/* 移动端审核流程结束 */
+/* .mobileShList-task-content p{
+    background: url(image/svg_icon/yonghu02.svg) no-repeat;
+    background-size: 1rem;
+    background-position: left top;
+    width: calc(100% - 1.3rem);
+    font-size: 0.98rem;
+    margin-bottom: 0.3rem;
+    display: flex;
+    justify-content: space-between;
+    align-items: flex-start;
+   
+    padding-left: 1.2rem;
+    box-sizing: border-box;
+} */
+
+/* 移动端搜索按钮 */
+.mobileSearch {
+    background: url(image/svg_icon/queding.svg) no-repeat;
+    background-size: 90%;
+    background-position: center;
+    color: #fff;
+}
+/* 移动端扫码按钮 */
+.mobileScan {
+    background: url(image/svg_icon/saoyisao2.svg) no-repeat;
+    background-size: 98%;
+    background-position: center;
+    color: #fff;
+}
+
+/* 统计图 */
+.mobileLfStatistics {
+    width: calc(100% - 20px);
+    margin: 0 auto;
+}
+
+.mobileLfStatistics table {
+    width: 100%;
+    border-collapse: collapse;
+    /* 边框合并 */
+    table-layout: inherit;
+}
+
+.mobileLfStatistics tr {
+    height: 47px;
+    line-height: 47px;
+}
+
+.mobileLfStatistics tr:first-child th {
+    background: white;
+}
+
+.mobileLfStatistics th {
+    display: table-cell;
+    vertical-align: middle;
+    background: #fafafa;
+    border: 1px solid #e6e6e6;
+    text-align: center;
+    font-size: 1rem;
+}
+
+.mobileLfStatistics td {
+    border: 1px solid #e6e6e6;
+    text-align: center;
+    background: #fff;
+    font-size: 0.95rem;
+}
+
+.mobileLfStatistics .mobileLfStatistics-day {
+    height: 67px;
+    line-height: unset;
+}
+
+.mobileLfStatistics .mobileLfStatistics-day th {
+    width: 4.5rem;
+}
+
+.mobileLfStatistics .mobileLfStatistics-day div {
+    margin: 1px;
+}
+
+.mobileLfStatistics .mobileLfStatistics-day div p {
+    height: 33px;
+    display: flex;
+    align-items: center;
+    width: 85%;
+    justify-content: center;
+    margin: 0 auto;
+    font-size: 0.95rem;
+}
+
+/* 过去时间*/
+.mobileLfStatistics-overTime {
+    background-color: #f0f0f0;
+}
+
+.mobileLfStatistics-overTime p {
+    color: #999999;
+}
+
+.mobileLfStatistics-overTime p:first-child {
+    border-bottom: 1px dashed #b8b8b8;
+}
+
+/* 当前时间 */
+.mobileLfStatistics-currentTime {
+    background-color: #c7ffe0;
+}
+
+.mobileLfStatistics-currentTime p {
+    color: #000;
+}
+
+.mobileLfStatistics-currentTime p:first-child {
+    border-bottom: 1px dashed #b8b8b8;
+}
+
+/* 未来时间 */
+.mobileLfStatistics-futureTime {
+    background-color: #c7e0ff;
+}
+
+.mobileLfStatistics-futureTime p {
+    color: #000;
+}
+
+.mobileLfStatistics-futureTime p:first-child {
+    border-bottom: 1px dashed #b8b8b8;
+}
+
+/* 大于100小于500人 */
+.mobileLfStatistics-orange {
+    background-color: #ffb882;
+    color: #fff !important;
+    width: 100% !important;
+}
+
+/* 大于等于500人 */
+.mobileLfStatistics-red {
+    background-color: #ff5b5b;
+    color: #fff !important;
+    width: 100% !important;
+}
+
+.mobileLfStatistics-title {
+    position: relative;
+}
+
+.mobileLfStatistics-title span {
+    position: absolute;
+    right: 1rem;
+    top: 0;
+    font-size: 0.95rem;
+}
+
+.mobileLfStatistics-Color666 {
+    color: #666666;
+}
+.mobileLfStatistics-prev {
+    width: 1.5rem;
+    height: 1.5rem;
+    transform: rotate(90deg); 
+    
+    background: url(image/svg_icon/shangyizhang.svg) no-repeat;
+    background-size: 90%;
+    background-position: center;
+    color: #fff;
+}
+.mobileLfStatistics-next {
+    width: 1.5rem;
+    height: 1.5rem;
+    transform: rotate(90deg); 
+    background: url(image/svg_icon/xiayizhang.svg) no-repeat;
+    background-size: 90%;
+    background-position: center;
+    color: #fff;
+}

+ 1133 - 0
alf/commonValidator.js

@@ -0,0 +1,1133 @@
+/**
+ * validator(校验器)文件 110613
+ *
+ *
+ */
+wd.commonValidator={};
+var lsSfzh;
+/**
+ * 非空校验器
+ */
+wd.commonValidator.notNull =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+
+		var rs = '';
+		var msgPrefix = params['msgPrfx'];//消息头
+
+		var minValue = params['minLen'];//最断数值
+		var maxValue = params['maxLen'];//最长数值
+		var length = params['len'];//长度
+		var trim =typeof params['trim']=="undefined"?true:params['trim'];//前后空格,true则不能保留空格,trim默认值为true
+		var allNull =typeof params['allNull']=="undefined"?false:params['allNull'];//允许全部为空  2022-01-10
+
+/// 增加 noZero="true",值为 0 时,也作为空 -- 默认值为 true。Lin
+ //    解决不允许为空的 码(int)、ID(long) 有默认值 0 的问题
+		var noZero = (typeof params['noZero']=="undefined")? true : params['noZero'];
+///
+
+		if(!wd.commonValidator.condition.call(this,valueArr,params))return rs;
+
+//		trim=(trim==null||trim==undefined)?true:trim;//
+		var regTrim = /(^\s+)|(\s+$)/;
+
+		var isNullCount = 0;
+		var isBlankBefore = false;//曾经有空格
+		var nullArr=[];
+		for(var i=0;i<valueArr.length;i++){
+			var value = valueArr[i];
+/* 改,增加 noZero="true",值为 0 时,也作为空 -- 默认值为 true。Lin
+			if(value==null||value==''||value==undefined){
+*/			if (value==null || value=='' || value==undefined || (noZero && value==0)) {
+				nullArr.push(i);
+			}
+			/* 在公共校验器已经校验了
+			if(value!=null&&value!=''){
+					if(minValue!=null && value.length < minValue){
+						rs += msgPrefix+'应至少'+minValue+'个字符\r\n';
+					}
+					if(maxValue!=null&&value.length> maxValue){
+						rs += msgPrefix+'应不超过'+maxValue+'个字符\r\n';
+					}
+					if(maxValue!=null&&value.length> maxValue){
+						rs += msgPrefix+'应不超过'+maxValue+'个字符\r\n';
+					}
+			}*/
+			if(trim){
+				if(value&& regTrim.test(value)&&isBlankBefore==false){
+					rs += msgPrefix+'前后不能包含空格!\r\n';
+					isBlankBefore=true;
+				}
+			}
+		}
+
+//		isNullCount==valueArr.length
+		if(nullArr.length>0){
+
+			//一个值
+			if(valueArr.length==1){
+				rs += msgPrefix+'不能为空!\r\n';
+			}else{
+				//多值
+				var pp=msgPrefix.split(/,/);
+				if(valueArr.length==nullArr.length){
+					if(!allNull){
+						rs += pp.join(",")+'不能全为空!\r\n';
+					}
+				}else{
+					for(var i=0;i<nullArr.length;i++){
+						var index=nullArr[i];
+						rs += pp[index]+'不能为空!\r\n';
+					}
+				}
+			}
+		}
+
+		rs += wd.commonValidator.validator(valueArr,params);
+		return rs;
+}
+
+
+wd.commonValidator.idCard =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+//	console.log("---------------------------------------");
+//	console.log(valueArr);
+//	console.log(params);
+//	console.log("---------------------------------------");
+	var rs = "";//返回的校验结果
+
+	var value=valueArr[0];//身份证号值
+	var sex;
+	var csdqm;
+	var birthday;
+
+
+//	value=this.getElementValue("sfzh");
+
+	birthday=this.getElementValue("csrq");
+	if(birthday)
+		birthday = birthday.replace(/-/g,'');
+
+	sex=this.getElementValue("xbm");
+
+	csdqm=this.getElementValue("csdqm");
+	//仅校验身份号码	
+	var sfzjlbm =params['sfzjlbm']||this.getElementValue(params['sfzjlbmName'])||this.getElementValue("sfzjlbm")||"1"; //valueArr[3];//身份证件类别码
+
+
+	var msgPrefix = params['msgPrfx']||"";//消息头
+/* 改,增加默认值。Lin
+	var idCardNotNull = params['idCardNotNull'];//身份证号不能为空
+*/  var idCardNotNull = (params['notBlank']? params['notBlank'] : false);
+	if (!value && idCardNotNull)
+	{
+		rs+=msgPrefix+'身份证件号不能为空!\r\n';
+	}
+
+
+
+
+	//如果证件类型为身份证,且不为空
+	//如果身份证为888开头的,就不验证
+	if(!value||sfzjlbm!=1||value.match(/^888.*/)){
+		return rs;
+	}
+
+	var getBirthdayByIdCard;
+
+	var Errors=new Array(
+	"",
+	msgPrefix+"身份证号位数不对!\r\n",
+	msgPrefix+"身份证号出生日期超出范围或含有非法字符!\r\n",
+	msgPrefix+"身份证号校验错误!(如果含X的,必须是大写半角的X!)\r\n",
+	msgPrefix+"身份证地区非法!\r\n"
+	);
+	var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
+	var Y,JYM;
+	var S,M;
+	var value_array = new Array();
+	value_array = value.split("");
+
+	switch(value.length){
+	case 15:
+		if ((parseInt(value.substr(6,2))+1900) % 4 == 0 || ((parseInt(value.substr(6,2))+1900) % 100 == 0 && (parseInt(value.substr(6,2))+1900) % 4 == 0 )){
+			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
+		} else {
+			ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
+		}
+		if(ereg.test(value)) rs+=Errors[0];
+		else rs+=Errors[2];
+		break;
+	case 18:
+		//18位身份号码检测
+		//出生日期的合法性检查
+		//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
+		//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
+		if ( parseInt(value.substr(6,4)) % 4 == 0 || (parseInt(value.substr(6,4)) % 100 == 0 && parseInt(value.substr(6,4))%4 == 0 )){
+			ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
+		} else {
+			ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
+		}
+		if(ereg.test(value)){//测试出生日期的合法性
+		//计算校验位
+			S = (parseInt(value_array[0]) + parseInt(value_array[10])) * 7
+			+ (parseInt(value_array[1]) + parseInt(value_array[11])) * 9
+			+ (parseInt(value_array[2]) + parseInt(value_array[12])) * 10
+			+ (parseInt(value_array[3]) + parseInt(value_array[13])) * 5
+			+ (parseInt(value_array[4]) + parseInt(value_array[14])) * 8
+			+ (parseInt(value_array[5]) + parseInt(value_array[15])) * 4
+			+ (parseInt(value_array[6]) + parseInt(value_array[16])) * 2
+			+ parseInt(value_array[7]) * 1
+			+ parseInt(value_array[8]) * 6
+			+ parseInt(value_array[9]) * 3 ;
+			Y = S % 11;
+			M = "F";
+			JYM = "10X98765432";
+			M = JYM.substr(Y,1);//判断校验位
+			if(M == value_array[17]) rs+=Errors[0]; //检测ID的校验位
+			else rs+=Errors[3];
+		}else
+			rs+=Errors[2];
+
+
+		break;
+	default:
+		rs+=Errors[1];
+	break;
+	}
+
+
+
+
+//	if(birthPlaceValidate&&!rs){
+//		var csdq = value.substring(0,6);
+//		if(!csdqm||csdqm!=csdq){//不存在,或者不相等,校验失败
+//			rs+=msgPrefix+'出生地区与身份证号不符!\r\n';
+//		}
+//	}
+
+
+
+
+
+	try{
+
+
+
+		var setValue = params['autoFill']?params['autoFill']:true;//自动填写性别、出生地区、出生日期
+		if(!rs&&setValue&&(value.length==15||value.length==18)&&(!birthday||!sex)){
+
+			var current_lsSfzh=lsSfzh;
+			lsSfzh =value;
+
+			var xbmVal;
+			if(value.length == 15){
+				xbmVal=(value.substring(14,15)%2==0?2:1);
+			}else{
+				xbmVal=(value.substring(16,17)%2==0?2:1);
+			}
+			this.setElementValue("xbm",xbmVal);
+
+
+			this.setElementValue("csrq",value.substring(6,10)+"-"+value.substring(10,12)+"-"+value.substring(12,14));
+			//处理出生地区
+
+			//批量录入不支持级联,下面唔改住
+//			var csdqm = value.substring(0,6);
+			var thiscsdqm= this.getElementValue("csdqm");
+			var thisjgdqm= this.getElementValue("jgdqm");
+			thishkdqm= this.getElementValue("hkdqm");
+			csdqm = value.substring(0,6);
+
+			if(current_lsSfzh!=value&&(!thiscsdqm||!thisjgdqm)){
+				$.ajax({
+					async: false,
+					type: "post",
+					url: "/service?wdService=ry_getDqm",
+					data: {
+						dqm: csdqm
+					},
+					success: function (data) {
+						var csdqm = data;
+						if(!csdqm)return;
+						if(wd.edit.cascading.getInstance("csdqm")&&!thiscsdqm){
+							wd.edit.cascading.getInstance("csdqm").setValue(csdqm);
+							if(wd.edit.objectPicker.getInstance("csxian")&&wd.edit.objectPicker.getInstance("csxian").onchange){
+								wd.edit.objectPicker.getInstance("csxian").onchange();
+							}
+						}
+						if(wd.edit.cascading.getInstance("jgdqm")&&!thisjgdqm){
+							wd.edit.cascading.getInstance("jgdqm").setValue(csdqm);
+							if(wd.edit.objectPicker.getInstance("jgxian")&&wd.edit.objectPicker.getInstance("jgxian").onchange){
+								wd.edit.objectPicker.getInstance("jgxian").onchange();
+							}
+						}
+						if(wd.edit.cascading.getInstance("hkdqm")&&!thishkdqm){
+							wd.edit.cascading.getInstance("hkdqm").setValue(csdqm);
+						}
+					},
+					error: function (data) {
+						console.log(data);
+					}
+				})
+			}
+		}
+//		lsSfzh = growHeightList["sfzh"].val();
+	}catch(e){
+		console.log(e);
+	}
+
+
+	//出生日期,性别 先自动填写,再校验
+	birthday=this.getElementValue("csrq");
+
+	if(birthday)
+		birthday = birthday.replace(/-/g,'');
+
+	sex=this.getElementValue("xbm");
+
+
+	var birthDayValidate= params["chkCsrq"]?params["chkCsrq"]:true;//是否关联校验出生日期,默认false,false校验
+	var sexValidate= params["chkXb"]?params["chkXb"]:true;//是否关联校验性别,默认false,false校验
+	var birthPlaceValidate= params["chkCsdq"]?params["chkCsdq"]:true;//是否关联校验出生地,默认false,false校验
+	if(birthDayValidate&&!rs){
+		var birthdayFromIdCard = value.substring(6,14);
+		if(!birthday){
+			//不存在,直接过
+		}else if(birthday!=birthdayFromIdCard){
+			// 不相等,校验失败
+		    rs+=msgPrefix+'出生日期与身份证号不符!\r\n';
+		}
+	}
+	if(sexValidate&&!rs){
+		var sexFromIdCard;
+		if(value.length == 15){
+		   sexFromIdCard=value.substring(14,15);
+		}else{
+		   sexFromIdCard=value.substring(16,17);
+		}
+		if(!sex||sex%2!=sexFromIdCard%2){//不存在,或者不相等,校验失败
+			rs+=msgPrefix+'性别与身份证号不符!\r\n';
+		}
+	}
+
+/// 增加。Lin
+	if(!birthPlaceValidate){
+		var csdq = value.substring(0,6);
+		if(!csdqm||csdqm!=csdq){//不存在,或者不相等,校验失败
+			rs+=msgPrefix+'出生地区与身份证号不符!\r\n';
+		}
+	}
+///
+
+	return rs;
+}
+
+
+/**
+ * 身份证号校验器
+ */
+wd.commonValidator.idCard20190625 =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+
+	var rs = "";//返回的校验结果
+
+	var value = document.querySelector("[name='sfzh']").value// valueArr[0];//身份证号值
+	var birthday = document.querySelector("[name='csrq']").value//valueArr[1];//出生日期
+	//var sex = document.querySelector("[name='xbm']").value//valueArr[2];//性别码
+	var sfzlbmInput=document.querySelector("[name='sfzjlbm']")
+	var sfzjlbm = sfzlbmInput?sfzlbmInput.value:1 //valueArr[3];//身份证件类别码
+	if(!sfzjlbm)sfzjlbm=1;
+	//var csdqm = document.querySelector("[name='csdqm']").value//valueArr[3];//身份证件类别码
+	var msgPrefix = params['msgPrefix'];//消息头
+	var idCardNotNull = params['sfzhNotNull'];//身份证号不能为空
+	//var birthDayNotNull = params['csrqNotNull'];//出生年月不能为空
+	//var sexNotNull = params['xbNotNull'];//性别不能为空
+	//var csdqmNotNull = params['csdqmNotNull'];//性别不能为空
+
+	var setValue = params['setValue'];//自动填写性别、出生地区、出生日期
+
+	if(!msgPrefix)//如果用户有输入消息头
+		msgPrefix='';
+	var msgPrefix = params['msgPrefix'];//消息头
+	if (!value && idCardNotNull)
+	{
+		rs+=msgPrefix+'身份证件号不能为空!\r\n';
+	}
+	/*if(!birthday&&birthDayNotNull)
+		rs+=msgPrefix+'出生日期不能为空!\r\n';
+	else{
+		if(birthDayNotNull){
+			birthday = birthday.replace(/-/g,'');
+		}
+	}*/
+	if(birthday)
+		birthday = birthday.replace(/-/g,'');
+	/*if(!sex&&sexNotNull)
+		rs+=msgPrefix+'性别不能为空!\r\n';
+	if(!csdqm&&csdqmNotNull){
+		rs+=msgPrefix+'出生地区不能为空!\r\n';
+	}*/
+
+	if(value&&(!sfzjlbm||sfzjlbm==1)){//如果证件类型为身份证,且不为空
+
+		if(value.match(/^888.*/)){//如果身份证为888开头的,就不验证
+
+		}else{
+
+			var Errors=new Array(
+			"",
+			msgPrefix+"身份证号位数不对!\r\n",
+			msgPrefix+"身份证号出生日期超出范围或含有非法字符!\r\n",
+			msgPrefix+"身份证号校验错误!(如果含X的,必须是大写半角的X!)\r\n",
+			msgPrefix+"身份证地区非法!\r\n"
+			);
+			var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
+			var value,Y,JYM;
+			var S,M;
+			var value_array = new Array();
+			value_array = value.split("");
+			//地区检验
+			//if(csdqm.substr(0,4)!=value.substr(0,4)/*area[parseInt(value.substr(0,2))]==null*/) rs+=Errors[4];
+			//身份号码位数及格式检验
+			switch(value.length){
+			case 15:
+				if ((parseInt(value.substr(6,2))+1900) % 4 == 0 || ((parseInt(value.substr(6,2))+1900) % 100 == 0 && (parseInt(value.substr(6,2))+1900) % 4 == 0 )){
+					ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
+				} else {
+					ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
+				}
+				if(ereg.test(value)) rs+=Errors[0];
+				else rs+=Errors[2];
+
+				//校验出生年月
+				/*if(birthday){
+					var birthdayFromIdCard = value.substring(6,12);
+					if(birthday!=birthdayFromIdCard)
+						rs+=msgPrefix+'出生日期与身份证号不符!\r\n';
+				}
+
+				//校验性别
+				if(sex){
+					var sexFromIdCard = value.substring(14,15);
+					if(sex%2!=sexFromIdCard%2)
+						rs+=msgPrefix+'性别与身份证号不符!\r\n';
+				}*/
+				break;
+			case 18:
+				//18位身份号码检测
+				//出生日期的合法性检查
+				//闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
+				//平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
+				if ( parseInt(value.substr(6,4)) % 4 == 0 || (parseInt(value.substr(6,4)) % 100 == 0 && parseInt(value.substr(6,4))%4 == 0 )){
+					ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
+				} else {
+					ereg=/^[1-9][0-9]{5}[0-9]{4}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
+				}
+				if(ereg.test(value)){//测试出生日期的合法性
+				//计算校验位
+					S = (parseInt(value_array[0]) + parseInt(value_array[10])) * 7
+					+ (parseInt(value_array[1]) + parseInt(value_array[11])) * 9
+					+ (parseInt(value_array[2]) + parseInt(value_array[12])) * 10
+					+ (parseInt(value_array[3]) + parseInt(value_array[13])) * 5
+					+ (parseInt(value_array[4]) + parseInt(value_array[14])) * 8
+					+ (parseInt(value_array[5]) + parseInt(value_array[15])) * 4
+					+ (parseInt(value_array[6]) + parseInt(value_array[16])) * 2
+					+ parseInt(value_array[7]) * 1
+					+ parseInt(value_array[8]) * 6
+					+ parseInt(value_array[9]) * 3 ;
+					Y = S % 11;
+					M = "F";
+					JYM = "10X98765432";
+					M = JYM.substr(Y,1);//判断校验位
+					if(M == value_array[17]) rs+=Errors[0]; //检测ID的校验位
+					else rs+=Errors[3];
+				}else
+					rs+=Errors[2];
+
+				//校验出生年月
+				/*if(birthday){
+					var birthdayFromIdCard = value.substring(6,14);
+					if(birthday!=birthdayFromIdCard){
+						rs+=msgPrefix+'出生日期与身份证号不符!\r\n';
+					}
+				}
+
+				//校验性别
+				if(sex){
+					var sexFromIdCard = value.substring(16,17);
+					if(sex%2!=sexFromIdCard%2)
+						rs+=msgPrefix+'性别与身份证号不符!\r\n';
+				}*/
+				break;
+			default:
+				rs+=Errors[1];
+			break;
+			}
+		}
+
+	}
+	//回显性别、出生日期、地区
+	if(!rs&&setValue){
+		if(value.length == 15){
+			wd.edit.objectPicker.getInstance("xbm").initValue(value.substring(14,15)%2==0?2:1);
+		}else{
+			wd.edit.objectPicker.getInstance("xbm").initValue(value.substring(16,17)%2==0?2:1);
+		}
+		document.querySelector("[name='csrq']").value = value.substring(6,10)+"-"+value.substring(10,12)+"-"+value.substring(12,14);
+		//处理出生地区
+		var csdqm = value.substring(0,6);
+		var csdqmstr = String(csdqm);
+
+		var csshengdqm=csdqmstr.substring(0,2)+"0000";
+		var csshidqm=csdqmstr.substring(0,4)+"00";
+		if($("input[name='csdqm']").val()){
+			return rs;
+		}
+		wd.edit.objectPicker.getInstance("cssheng").initValue(csshengdqm);
+		wd.edit.objectPicker.getInstance("csshi").initValue(csshidqm);
+		$("input[name=xbm]").click();//需要触发一次,否则级联无法生效
+		wd.edit.objectPicker.getInstance("csxian").initValue(csdqm);
+		$("input[name='csdqm']").val(csdqm);
+
+		if($("input[name='hkdqm']").val()){
+			return rs;
+		}
+		wd.edit.objectPicker.getInstance("hksheng").initValue(csshengdqm);
+		wd.edit.objectPicker.getInstance("hkshi").initValue(csshidqm);
+		//$("input[name=xbm]").click();//需要触发一次,否则级联无法生效
+		wd.edit.objectPicker.getInstance("hkxian").initValue(csdqm);
+		$("input[name='hkdqm']").val(csdqm);
+
+	}
+	return rs;
+}
+
+/**
+ * 浮点数校验器
+ */
+wd.commonValidator.float =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+			var rs = '';
+			var value = valueArr[0];
+			var msgPrefix = params['msgPrfx'];//消息头
+			var minValue = params['minVal'];//最小数值
+			var maxValue = params['maxVal'];//最大数值
+			var decimalLength = params['decLen'];//保留几位
+			var reg = new RegExp('^\\d+(\\.\\d{0,'+decimalLength+'})?$');
+			var regValue = new RegExp('^\\d+(\\.\\d+)?$');
+
+			var notNull = params['notBlank']==null?false:params['notBlank'];
+			if(notNull){
+				rs +=  wd.commonValidator.notNull(valueArr,params);
+			}else{
+				rs +=  wd.commonValidator.validator(valueArr,params);
+			}
+
+			if(value!=null&&value!=''){
+				if(!minValue)//minValue值不指定默认为0
+					minValue="0";
+//				if(!regValue.test(value)){
+				if(isNaN(value)){
+					rs += msgPrefix+'应为数字!\r\n';
+				}else{
+//					if(minValue!=null&&value<minValue){
+//						rs += msgPrefix+'应不小于'+minValue+'\r\n';
+//					}
+//					if(maxValue!=null&&value>maxValue){
+//						rs += msgPrefix+'应不大于'+maxValue+'\r\n';
+//					}
+					if(minValue!=null && (parseInt(value) < parseInt(minValue)&&minValue!="-")){
+						rs += msgPrefix+'应不小于'+minValue+'\r\n';
+					}
+					if(maxValue!=null&&(parseInt(value) > parseInt(maxValue)&&maxValue!="+")){
+						rs += msgPrefix+'应不大于'+maxValue+'\r\n';
+					}
+
+//					if(decimalLength!=null&&!reg.test(value)){
+					var arr=value.toString().split(".");
+					if(arr.length>1&&arr[1].length>parseInt(decimalLength)){
+						rs += msgPrefix+'小数部分应不多于'+decimalLength+'位。\r\n';
+					}
+				}
+
+			}
+
+			return rs;
+		}
+
+/**
+ * 整数校验器
+ */
+wd.commonValidator.int =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+			var rs = '';
+			var value = valueArr[0];
+			var msgPrefix = params['msgPrfx'];//消息头
+			var minValue = params['minVal'];//最小数值
+			var maxValue = params['maxVal'];//最大数值
+			var regValue = new RegExp('^[1-9]*[1-9][0-9]*$');
+
+			var notNull = params['notBlank']==null?false:params['notBlank'];
+			if(notNull){
+				rs +=  wd.commonValidator.notNull(valueArr,params);
+			}else{
+				rs +=  wd.commonValidator.validator(valueArr,params);
+			}
+			//minValue值不指定默认为0
+			if(!minValue){
+				minValue="0";
+			}
+			if(value!=null&&value!=''){
+//				if(value != 0 && !regValue.test(value)){
+//					rs += msgPrefix+'应为正整数!\r\n';
+//				}
+				if(isNaN(value)){
+					rs += msgPrefix+'应为整数!\r\n';
+				}
+				if(minValue!=null && (parseInt(value) < parseInt(minValue)&&minValue!="-")){
+					rs += msgPrefix+'应不小于'+minValue+'\r\n';
+				}
+				if(maxValue!=null&&(parseInt(value) > parseInt(maxValue)&&maxValue!="+")){
+					rs += msgPrefix+'应不大于'+maxValue+'\r\n';
+				}
+			}
+
+			return rs;
+		}
+/**
+ * 	2022-3-1 新加的整数校验器,isInt不知谁改成了数字校验器!!
+ */
+wd.commonValidator.isInteger =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+			var rs = '';
+			var value = valueArr[0];
+			var msgPrefix = params['msgPrfx'];//消息头
+			var minValue = params['minVal'];//最小数值
+			var maxValue = params['maxVal'];//最大数值
+			var regValue = new RegExp('^[1-9]*[1-9][0-9]*$');
+
+			var notNull = params['notBlank']==null?false:params['notBlank'];
+			if(notNull){
+				rs +=  wd.commonValidator.notNull(valueArr,params);
+			}
+			rs +=  wd.commonValidator.validator(valueArr,params);
+
+
+			if(value!=null&&value!=''){
+				if(value != 0 && !regValue.test(value)){
+					rs += msgPrefix+'应为正整数!\r\n';
+				}
+				if(!rs&&minValue&& value <minValue){
+					rs += msgPrefix+'应不小于'+minValue+'\r\n';
+				}
+				if(!rs&&maxValue&&value>maxValue){
+					rs += msgPrefix+'应不大于'+maxValue+'\r\n';
+				}
+			}
+
+			return rs;
+		}
+
+/**
+ * 金额数校验器
+ */
+wd.commonValidator.money =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+			var rs = '';
+			var value = valueArr[0];
+			var msgPrefix = params['msgPrfx'];//消息头
+			var reg = new RegExp('^\\d+(\\.\\d{0,2})?$');
+			var regValue = new RegExp('^\\d+(\\.\\d+)?$');
+
+			rs += wd.commonValidator.float(valueArr,params);
+
+
+			if(regValue.test(value)&&value!=null&&value!=''&&!reg.test(value)){
+				rs += msgPrefix+'小数部分应在两位以内。\r\n';
+			}
+
+
+			return rs;
+		}
+
+
+/**
+ * 公共校验器
+ */
+wd.commonValidator.validator =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+			var rs = '';
+			var value = valueArr[0];
+			var msgPrefix = params['msgPrfx'];//消息头
+			var noBlank = params['notBlank']==null?false:params['notBlank'];
+			var minLength = params['minLen'];
+			var maxLength = params['maxLen'];
+
+
+			var length = params['len'];
+
+			var regNoBlank = /\s/g;
+			var regMin = new RegExp("^.{"+minLength+",}$");
+			var regMax = new RegExp("^.{0,"+maxLength+"}$");
+			var regScope = new RegExp("^.{"+minLength+","+maxLength+"}$");
+			var regLength = new RegExp("^.{"+length+"}$");
+
+			if(value!=null&&value!=''){
+				if(noBlank&&regNoBlank.test(value)){
+					rs += msgPrefix+'不能含空格!\r\n';
+				}
+
+
+				if(minLength!=null&&!(value.length>=minLength)){
+					rs += msgPrefix+'应至少'+minLength+'个字符!\r\n';
+				}else if(maxLength!=null&&minLength!=null&&(value.length>=minLength&&value.length<=maxLength)){
+					//rs += msgPrefix+'必需在'+minLength+' ~'+maxLength+'!\r\n';
+				}else if(maxLength!=null&&!(value.length<=maxLength)){
+					rs += msgPrefix+'长度应不超过'+maxLength+'\r\n';
+				}
+
+				if(length!=null&&!(value.length==length)){
+					rs += msgPrefix+'必需等于'+length+'!\r\n';
+				}
+			}
+			return rs;
+		}
+
+
+
+/**
+ * 内容管理技术规范的编码规则:[a-zA-Z_0-9] 和减号 校验器
+ */
+wd.commonValidator.contentCodeRule =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+			var rs = '';
+			var value = valueArr[0];
+			var msgPrefix = params['msgPrfx'];//消息头
+			var regValue = new RegExp('^[\w-]+$');
+
+			var notNull = params['notBlank']==null?false:params['notBlank'];
+			if(notNull){
+				rs +=  wd.commonValidator.notNull(valueArr,params);
+			}else{
+				rs +=  wd.commonValidator.validator(valueArr,params);
+			}
+
+			if(value!=null&&value!=''){
+				if(value != 0 && !regValue.test(value)){
+					rs += msgPrefix+'必需由字母、数字、减号、下划线组成!\r\n';
+				}
+			}
+
+			return rs;
+}
+
+
+/**
+ * 页码,只允许字母和数字
+ */
+wd.commonValidator.pageNum =
+function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+			var rs = '';
+			var value = valueArr[0];
+			var msgPrefix = params['msgPrfx'];//消息头
+			var regValue = new RegExp('^[\\da-zA-Z]+$');
+
+			var notNull = params['notBlank']==null?false:params['notBlank'];
+			if(notNull){
+				rs +=  wd.commonValidator.notNull(valueArr,params);
+			}else{
+				rs +=  wd.commonValidator.validator(valueArr,params);
+			}
+
+			if(value!=null&&value!=''){
+				if(value != 0 && !regValue.test(value)){
+					rs += msgPrefix+'必需由字母、数字组成!\r\n';
+				}
+			}
+
+			return rs;
+}
+
+/**
+ *	英文名
+ *	由数字、字母和下划线组成,长度为2-30个字符
+ */
+wd.commonValidator.enName = function(valueArr, params){
+	var rs = '';
+	var value = valueArr[0];
+	var msgPrefix = params['msgPrfx'];
+	var regValue = new RegExp('^\\w{2,30}$');
+
+	var notNull = params['notBlank'] == null ? false : params['notBlank'];
+	if(notNull){
+		rs += wd.commonValidator.notNull(valueArr, params);
+	}
+
+	if(value != null && value != ''){
+		if(!regValue.test(value)){
+			rs += msgPrefix + '只能由数字、字母和下划线组成,长度为2-30个字符!\r\n';
+		}
+//		var ryid =$('#ryid').val()||$('input[name=ryid]').val();
+		var ryid=this.getElementValue("ryid");
+		var cb = $.ajax({type: "post",
+			url: "/service?&wdService=ry_yzywm",
+			data:{'userywm':valueArr.toString(), 'ryid': ryid},
+			cache:false,
+			async:false,
+			dataType: "json" });
+
+		if(cb.status==404){
+			rs+="服务器连接失败!刷新页面";
+		}else{
+			var queryData = cb.responseJSON;
+			if(queryData.isFind != "false"){
+				rs+="英文名已存在!";
+			}
+		}
+	}
+	return rs;
+}
+
+wd.commonValidator.csenName = function(valueArr, params){
+	var rs = '';
+	var value = valueArr[0];
+	var msgPrefix = params['msgPrfx'];
+	var regValue = new RegExp('^\\w{2,30}$');
+
+	var notNull = params['notBlank'] == null ? false : params['notBlank'];
+	if(notNull){
+		rs += wd.commonValidator.notNull(valueArr, params);
+	}
+
+	if(value != null && value != ''){
+		if(!regValue.test(value)){
+			rs += msgPrefix + '只能由数字、字母和下划线组成,长度为2-30个字符!\r\n';
+		}
+//		var ryid =$('#ryid').val()||$('input[name=ryid]').val();
+		var ryid=this.getElementValue("ryid");
+		var cb = $.ajax({type: "post",
+			url: "/service?&wdService=csry_yzywm",
+			data:{'userywm':valueArr.toString(), 'ryid': ryid},
+			cache:false,
+			async:false,
+			dataType: "json" });
+
+		if(cb.status==404){
+			rs+="服务器连接失败!刷新页面";
+		}else{
+			var queryData = cb.responseJSON;
+			if(queryData.isFind != "false"){
+				rs+="英文名已存在!";
+			}
+		}
+	}
+	return rs;
+}
+
+/**
+ *	域名唯一
+ *
+ */
+wd.commonValidator.ymwy = function(valueArr, params){
+	var rs = '';
+	var value = valueArr[0];
+	var msgPrefix = params['msgPrfx'];//消息头
+	var regValue = new RegExp('^[\w-]+$');
+
+	var notNull = params['notBlank']==null?false:params['notBlank'];
+	if(notNull){
+		rs += wd.commonValidator.notNull(valueArr, params);
+	}
+
+	if(value!=null&&value!=''){
+//		var wangzid = ($('input[name="wangzid"]') != undefined ? $('input[name="wangzid"]').val() : $('#wangzid').val());
+		var wangzid=this.getElementValue("wangzid");
+		var cb = $.ajax({
+			type:'post' ,
+			url:"/service?wdService=grwzbj_wz_ym_wy",
+			data:{
+				ym:value,
+				wangzid:wangzid
+			},
+			dataType:"json",
+			async:false,
+
+		});
+		if(cb.status==404){
+			rs+="服务器连接失败!刷新页面";
+		}else{
+			var queryData = cb.responseJSON;
+			if(queryData.isFind != false){
+				rs+="域名已存在!";
+			}
+		}
+	}
+
+	return rs;
+}
+
+/**
+ * 附件是否为空校验
+ * @param {*} valueArr
+ * @param {*} params
+ * @returns
+ */
+wd.commonValidator.fjNotNull =
+	function(valueArr,//保存所有被校验的表单值的数组
+		params//校验器的其余参数
+		){
+
+		var rs = '';
+		var msgPrefix = params['msgPrfx'];//消息头
+
+		//var nrid = this.getElementValue("fjid");
+		var nrid=valueArr[0];
+		if (!nrid) {
+			rs += msgPrefix+'不能为空!\r\n';
+		} else {
+			$.ajax({
+				async: false,
+				type: "post",
+				url: "/service?wdService=getSubNrCount",
+				data: {
+					nrid: "T-" + nrid,
+					jlztm:1
+				},
+				success: function (data) {
+					var names = JSON.parse(data);
+					var isArray = $.isArray(names);
+					if (!isArray || names.length <= 0) {
+						rs += msgPrefix+'不能为空!\r\n';
+					}
+				},
+				error: function (data) {
+					console.log(data);
+				}
+			})
+		}
+
+
+		rs += wd.commonValidator.validator(valueArr,params);
+		return rs;
+}
+
+
+/**
+ * 大于
+ * @param {Object} valueArr
+ * @param {Object} params
+ */
+wd.commonValidator.greater = function(valueArr, params){
+	var rs = '';
+	var msgPrefix = params['msgPrfx'];//消息头
+	var pp=msgPrefix.split(/,/);
+	msgPrefix=pp[0]+"大于"+pp[1]+"! \r\n";
+	if(valueArr.length<2){
+		return rs;
+	}
+	var leftValue=valueArr[0];
+	var rightValue=valueArr[1];
+	if(!leftValue||!rightValue){
+		return rs;
+	}
+
+	var eq =typeof params['equal']=="undefined"?false:params['equal'];//包括大小相等
+	if(!!parseFloat(leftValue)&&!!parseFloat(rightValue) ){
+		if(eq){
+			if(parseFloat(leftValue)<parseFloat(rightValue)){
+//				 console.log(arguments);
+				 rs += msgPrefix;
+			}
+		}else{
+			if(parseFloat(leftValue)<=parseFloat(rightValue)){
+//				 console.log(arguments);
+				 rs += msgPrefix;
+			}
+		}
+	}
+	return rs;
+}
+
+/**
+ * 小于
+ * @param {Object} valueArr
+ * @param {Object} params
+ */
+wd.commonValidator.less = function(valueArr, params){
+	var rs = '';
+	var msgPrefix = params['msgPrfx'];//消息头
+	var pp=msgPrefix.split(/,/);
+	msgPrefix=pp[0]+"小于"+pp[1]+"! \r\n";
+	var eq =typeof params['equal']=="undefined"?false:params['equal'];//包括大小相等
+
+	if(valueArr.length>=2&&!!parseFloat(valueArr[0])&&!!parseFloat(valueArr[1]) ){
+		if(eq){
+			if(parseFloat(valueArr[0])>parseFloat(valueArr[1])){
+//				 console.log(arguments);
+				 rs += msgPrefix;
+			}
+		}else{
+			if(parseFloat(valueArr[0])>=parseFloat(valueArr[1])){
+//				console.log(arguments);
+				 rs += msgPrefix;
+			}
+		}
+
+	}
+	return rs;
+}
+
+
+/**
+ * 不等于
+ * @param {Object} valueArr
+ * @param {Object} params
+ */
+wd.commonValidator.notEqual = function(valueArr, params){
+	var rs = '';
+	var msgPrefix = params['msgPrfx'];//消息头
+	var pp=msgPrefix.split(/,/);
+	console.log(valueArr);
+	for(var i=0;i<valueArr.length;i++){
+		if(!valueArr[i])continue;
+		var index=valueArr.indexOf(valueArr[i],i+1);
+		if(index!=-1){
+			rs+=pp[i]+"和"+pp[index]+"不能相同!\r\n";
+			break;
+		}
+	}
+
+
+
+
+
+	return rs;
+}
+
+
+wd.commonValidator.condition=function(valueArr, params){
+
+	//满足条件才会校验
+	if(params['condition']){
+			try{
+				//xybalxm:["51"]
+				var condition=eval("({"+params['condition']+"})");
+				for(var key in condition){
+					var n=this.getElementValue(key);
+					if(condition[key].indexOf(n)==-1){
+						return false;
+					}
+				}
+			}catch(e){
+				console.log(e);
+			}
+	}
+
+	return true;
+}
+
+/**
+ * 数值是否已存在校验
+ * @param {*} valueArr
+ * @param {*} params
+ * @returns
+ */
+wd.commonValidator.exists = function(valueArr, params){
+	var rs = '';
+	//表名
+	var table = params['tab'];	// ['table']。Lin
+	//字段名
+	var field = params['field'];
+	//数值
+	var value = valueArr[0];
+	//主键
+/* 改为改用 对象ID。Lin
+	var id = this.getElementValue("validationId");;
+*/
+/* 再改,ID 字段名由上层决定。Lin
+	var id = this.getElementValue(table+"id");
+*/
+	var idName = params['id'];
+	var id = this.getElementValue(idName);
+
+	if(value!=null&&value!=''){
+		var cb = $.ajax({type: "post",
+				url: "/service?&wdService=chkDup",
+/* 再改,增加 "idName" -- ID 字段名由上层决定。Lin
+				data:{'table':table, 'field': field, 'value': value, 'id': id},
+*/				data:{'table':table, 'field': field, 'value': value, 'id': id, 'idName': idName},
+				cache:false,
+				async:false,
+				dataType: "json" });
+		var queryData = cb.responseJSON;
+		if(queryData.isFind != "false"){
+		  rs= params['msg'];
+		}
+	}
+	return rs;
+}
+
+
+// 增加,多个字段值是否匹配。Lin
+// <notMatch field="jfrxm,jfrgrdh" parm="{relField:'jfrxm,jfrgrdh',srcTab:'ry',srcField:['xm','grdh']}"/>
+wd.commonValidator.chkMatch = function(valueArr, params){
+	var rs = '';
+	//表名
+	var table = params['srcTab'];	// "ry"(人员)。Lin
+	//字段名
+	var field = params['srcField'];	// "xm,grdh"(姓名,个人电话)。Lin
+	//数值
+/* 增加 parm="{relField:'jfrxm,jfrgrdh', -- 相关的页面字段。Lin
+ *    去掉原来的 <ichker defField="['sfzh','csrq','xbm']
+ * value,串成 "张三,12345"
+	var value = valueArr[0];
+*/
+	var relField = params['relField'];	// "jfrxm,jfrgrdh"(接访人姓名,接访人个人电话)。Lin
+	if (relField == null || relField == "")
+		return rs;
+	var value = "";
+	var fieldArr = relField.split(",");
+	for(var i = 0; i < fieldArr.length; i++) {
+		var v = this.getElementValue(fieldArr[i]);
+		if (v == null || v == "") {
+			value = "";
+			break;
+		}
+		if (value != "")
+			value += ",";
+		value += v.trim();
+	}
+	if (value == "")
+		return rs;
+	var cb = $.ajax({type: "post",
+			url: "/service?&wdService=chkMatch",
+			data:{'table':table, 'field': field, 'value': value},
+			cache:false,
+			async:false,
+			dataType: "json" });
+	var queryData = cb.responseJSON;
+	if (queryData.isMatch == "false") {
+		rs= params['msg'];
+	}
+	return rs;
+}

+ 1462 - 0
alf/ext_lf_inp.jsp

@@ -0,0 +1,1462 @@
+<%@ page language="java" pageEncoding="UTF-8" %>
+	<%@ taglib uri="/ssTag" prefix="ss" %>
+
+		<!DOCTYPE html>
+		<html lang="en" style="font-size: 16px;">
+
+		<head>
+			<title>录入来访信息</title>
+			<meta charset="UTF-8">
+			<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+			<link rel="stylesheet" href="/skin/easy/Main.css">
+			<link rel="stylesheet" href="/skin/easy/mobiscroll.custom.css">
+			<script type="text/javascript" src="/ss/jquery/jquery-1.7.2.min.js"></script>
+			<script type="text/javascript" src="/ss/js/base.js"></script>
+			<script type="text/javascript" src="/ss/js/common.js"></script>
+			<script type="text/javascript" src="/ss/js/display.js"></script>
+			<script type="text/javascript" src="/ss/js/edit.js"></script>
+			<script type="text/javascript" src="/ss/js/mobiscroll.custom.js"></script>
+			<script type="text/javascript" src="/ss/js/file.js"></script>
+			<!-- <script type="text/javascript" src="/ss/js/objectPicker.js"></script> -->
+
+			<style>
+				th,
+				td {
+					border: 1px solid black;
+					border-collapse: collapse;
+				}
+
+				table {
+					table-layout: fixed;
+					width: 100%;
+					/* 确保表格占满容器宽度 */
+				}
+
+				.mobileForm table th {
+					width: 8rem;
+				}
+
+				.mobileForm table td {
+					font-size: 1rem;
+				}
+
+				.mobileDelete-button,
+				.mobileAdd-button {
+					margin-right: 5px;
+				}
+
+				.carNumberAdd {
+					position: absolute;
+					right: 0;
+					top: 50%;
+					transform: translateY(-50%);
+				}
+
+				.carNumberTd {
+					padding: 5px !important;
+				}
+
+				.carNumberTd>div {
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.carNumberTd>div>div {
+					flex: 1;
+				}
+
+				.carNumberTd .mobileDelete-button {
+					margin: 0 0 0 5px !important;
+				}
+
+				input[type='text'] {
+					width: 100%;
+				}
+
+				.hidden {
+					display: none;
+				}
+			</style>
+		</head>
+
+		<body>
+		<%--
+		来访对象:<%=request.getAttribute("lf")  %>
+		姓名:<%=((base.po.LfPo)(request.getAttribute("lf"))).getXm() %>
+		姓别码:${lf.xbm}
+		--%>
+		
+			<!-- lfid - ${lf.lfid}
+			1. lflbm - ${lf.lflbm}         // 来访类别
+			2. jfrxm - ${lf.jfrxm}         // 受访人姓名
+			3. jfrgrdh - ${lf.jfrgrdh}     // 个人电话
+			4. jfxiaoqid - ${lf.jfxiaoqid} // 到访校区
+			5. dwmc - ${lf.dwmc}           // 来访人单位
+			6. jfbmid - ${lf.jfbmid}       // 酒店名
+			7. rs - ${lf.rs}               // 来访人数
+			8. yykssj - ${lf.yykssj}       // 预约开始时间
+			9. yyjssj - ${lf.yyjssj}       // 预约结束时间
+			10. jfryid - ${lf.jfryid}      // 受访人ID
+
+			xm - ${lf.xm}
+			xbm - ${lf.xbm}
+			sfzjlbm - ${lf.sfzjlbm}
+			sfzh - ${lf.sfzh}
+			grdh - ${lf.grdh}
+			clh - ${lf.clh} -->
+		
+		
+			<div style="height: calc(100% - 3.5rem); overflow: auto" class="mobileForm">
+				 
+				<form action="/extRoot?type=3&token=${token}" method="post" id="myForm">
+					<table>
+						<tr>
+							<th>来访类别</th>
+							<td>
+								<div class="ss-select-container" id="lflbm" value="${lf.lflbm}">
+									<div class="ss-select">请选择</div>
+									<div class="ss-options">
+									</div>
+									<input type="hidden" name="lflbm">
+								</div>
+							</td>
+						</tr>
+					</table>
+
+					<table id="formSection2" class="hidden">
+						<tr id="tr-jfrxm" class="hidden">
+							<th>接访人姓名</th>
+							<td>
+								
+								<input name="jfrxm" type="text" value="${lf.jfrxm}" />
+							</td>
+						</tr>
+						
+						<tr id="tr-jfrgrdh" class="hidden">
+							<th>个人电话</th>
+							<td>
+								
+								<input name="jfrgrdh" type="text"  value="${lf.jfrgrdh}"/>
+							</td>
+						</tr>
+					</table>
+
+					<div class="mobileForm-title hidden">来访信息</div>
+					<table id="formSection3" class="hidden">
+						<tr id="tr-jfxiaoqid" class="hidden">
+							<th>到访校区</th>
+							<td>
+								<div class="ss-select-container" id="jfxiaoqid" value="${lf.jfxiaoqid}">
+									<div class="ss-select">请选择校区</div>
+									<div class="ss-options">
+
+									</div>
+									<input type="hidden" name="jfxiaoqid">
+								</div>
+							</td>
+						</tr>
+						
+						
+						<tr id="tr-jfbmid" class="hidden">
+							<th>酒店名</th>
+							<td>
+								<div class="ss-select-container" id="jfbmid" value="${lf.jfbmid}">
+									<div class="ss-select">请选择</div>
+									<div class="ss-options">
+
+									</div>
+									<input type="hidden" name="jfbmid">
+								</div>
+
+							</td>
+						</tr>
+						<tr id="tr-dwmc" class="hidden">
+							<th>来访人单位</th>
+							<td>
+								
+								<input name="dwmc" type="text"  value="${lf.dwmc}"/>
+							</td>
+						</tr>
+						<tr id="tr-sy" class="hidden">
+							<th>事由</th>
+							<td>
+								
+								<input name="sy" type="text"  value="${lf.sy}"/>
+							</td>
+						</tr>
+						<tr id="tr-rs" class="hidden">
+							<th>来访人数</th>
+							<td>
+								<input name="rs" type="text"  value="${lf.rs}"/>
+							</td>
+						</tr>
+						<tr id="tr-yykssj" class="hidden">
+							<th>预约日期</th>
+							<td>
+								<input name="yykssj" type="text" id="yykssj"  value="${lf.yykssj}"/>
+							</td>
+						</tr>
+						<tr id="tr-yyjssj" class="hidden" style="display: none;">
+							<th>预约结束时间</th>
+							<td>
+								<input name="yyjssj" type="text" id="yyjssj"  value="${lf.yyjssj}"/>
+							</td>
+						</tr>
+
+					</table>
+
+
+					<div class="mobileForm-title hidden">
+						<span></span> <span class="mobileAdd-button" id="visitorAdd"></span>
+					</div>
+					<p style="margin: 1rem 0.5rem 0;">
+						<span>申请入校免责声明</span>
+						<br />
+						<span>来访人员进校需申请报备,不得携带管制刀具、危化品、毒品等违法危险品进校,并如实声明所携带物品清单及合法性,若未如实告知,来访者和受访者需承担相关法律责任。</span>
+					</p>
+					<input type="hidden" id="sxry_num" name="sxry_num" value="" />
+					<input type="hidden" name="lfsxry">
+					<input type="hidden" name="jfryid" value="${lf.jfryid}">
+				</form>
+			</div>
+			<div class="mobileBottom-div hidden">
+				<div class="mobileBottom-down-div">
+					<button class="mobileBottom-button" onclick="closePage()">取消</button>
+					<button class="mobileBottom-button" onclick="submitForm()">
+						保存并提交
+					</button>
+				</div>
+			</div>
+		</body>
+		<script type="text/javascript" src="/ss/validation/validation.js"></script>
+		<script type="text/javascript" src="/ss/js/licensePlateNumInp.js"></script>
+		<script type="text/javascript" src="/ss/validator/commonValidator.js"></script>
+		<script>
+			let carNumberInstances = {}; // 以随行人员编号为键,存储每个随行人员的车牌号实例数组
+			let uniqueVisitorIdCounter = 1; // 用于生成唯一的随行人员 ID
+			let visitorCount = 0; // 当前有效随行人员计数
+			let sxry_num = [];
+			let initSelectData; // 用于存储初始的 select 数据
+			// 校验器
+			var wdVm = window.wdVm || new ValidationManager();
+			wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+			wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+			wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+			wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
+			// 通用的日期格式化函数
+			function formatDateTime(date) {
+				return (
+					date.getFullYear() +
+					"-" +
+					("0" + (date.getMonth() + 1)).slice(-2) +
+					"-" +
+					("0" + date.getDate()).slice(-2) 
+					//" " +
+					// ("0" + date.getHours()).slice(-2) +
+					// ":" +
+					// ("0" + date.getMinutes()).slice(-2) +
+					// ":" +
+					// ("0" + date.getSeconds()).slice(-2)
+				);
+			}
+			
+			// 带时间的日期格式化函数
+			function formatDateTimeWithTime(date, withTime) {
+				const datePart = date.getFullYear() +
+					"-" +
+					("0" + (date.getMonth() + 1)).slice(-2) +
+					"-" +
+					("0" + date.getDate()).slice(-2);
+					
+				if (withTime) {
+					return datePart + " " +
+						("0" + date.getHours()).slice(-2) +
+						":" +
+						("0" + date.getMinutes()).slice(-2) +
+						":" +
+						("0" + date.getSeconds()).slice(-2);
+				}
+				
+				return datePart;
+			}
+			// 创建分隔线和错误提示的函数
+			function createValidation(container) {
+				const parent = container.parentNode;
+
+				// 生成分隔线
+				let lineSpan = document.getElementById(container.id + 'Span');
+				if (!lineSpan) {
+					lineSpan = document.createElement('span'); // 创建线的 span
+					lineSpan.id = container.id + 'Span'; // 使用指定格式的 id
+					lineSpan.className = 'border-input-error vLine-leftWarning'; // 设置样式
+					lineSpan.style.display = 'block'; // 初始状态隐藏分隔线
+					parent.insertBefore(lineSpan, container.nextSibling); // 插入到 container 之后
+				}
+
+				// 生成错误提示
+				let errorDiv = document.getElementById(container.id + 'ErrorDiv');
+				if (!errorDiv) {
+					errorDiv = document.createElement('div'); // 创建错误提示的 div
+					errorDiv.id = container.id + 'ErrorDiv'; // 使用指定格式的 id
+					errorDiv.className = 'error-message'; // 设置样式
+					errorDiv.style.position = 'absolute';
+					errorDiv.style.left = '0px';
+					errorDiv.style.bottom = '0px';
+					errorDiv.style.color = 'red';
+					errorDiv.style.fontSize = '12px';
+					errorDiv.style.width = '100%';
+					errorDiv.style.textAlign = 'right';
+					errorDiv.style.lineHeight = '18px';
+					errorDiv.style.height = '18px';
+					errorDiv.style.display = 'none'; // 初始状态隐藏
+					parent.insertBefore(errorDiv, lineSpan ? lineSpan.nextSibling : container.nextSibling); // 插入到分隔线之后
+				}
+			}
+			// 移除校验元素的函数
+			function removeValidation(container) {
+				const lineSpan = document.getElementById(container.id + 'Span');
+				const errorDiv = document.getElementById(container.id + 'ErrorDiv');
+
+				if (lineSpan) {
+					lineSpan.remove(); // 删除分隔线
+				}
+
+				if (errorDiv) {
+					errorDiv.remove(); // 删除错误提示
+				}
+			}
+			// 更新错误提示信息的函数
+			function updateMsg(container, msg) {
+				let errorDiv = document.getElementById(container.id + 'ErrorDiv');
+				// 如果未找到 errorDiv,先调用 createValidation 创建它
+				if (!errorDiv) {
+					createValidation(container);
+					errorDiv = document.getElementById(container.id + 'ErrorDiv');
+				}
+				if (errorDiv) {
+					errorDiv.textContent = msg; // 设置错误提示信息
+					errorDiv.style.display = 'block'; // 显示错误提示
+				}
+			}
+			
+			let isValidStartTime = true;
+			// let isValidEndTime = true;
+			// 动态设置开始和结束时间
+			function setInitialTime() {
+				const yykssj = document.querySelector('#yykssj');
+				const yyjssj = document.querySelector('#yyjssj');
+				// 初始化开始时间
+				var now = new Date();
+				var oneHourLater = formatDateTime(new Date(now.getTime() + 3600 * 1000));
+				
+				// 设置结束时间为开始时间的 23:59:59
+				var endDate = new Date(now.getTime() + 3600 * 1000);
+				var endDateFormatted = endDate + ' 23:59:59';
+				console.log('初始化的结束时间:',endDateFormatted)
+				$("#yykssj")
+					.mobiscroll()
+					.datetime({
+						display: "modal", // 弹出框显示
+						dateFormat: "yy-mm-dd", // 日期格式:年-月-日
+						dateOrder: "yyMMdd", // 设置为年-月-日顺序
+						timeFormat: "", // 不显示时间选择器
+						timeWheels: "", // 不显示时间滚轮
+						lang: "zh", // 设置为中文
+						onSelect:function(event,inst){
+							console.log(event)
+							// 解析 event 为 Date 对象
+							// const selectedDate = new Date(event);
+							// 设置时分秒为0:0:0
+							// selectedDate.setHours(0, 0, 0, 0);
+							removeValidation(yykssj);
+							// isValidStartTime = true;
+							yykssj.value = event;
+							const endDate = event + ' 23:59:59';
+							yyjssj.value = endDate; 
+							// 获取当前时间
+							// const currentDate = new Date();
+							// currentDate.setHours(0,0,0,0);
+							// if (selectedDate.getTime() >= currentDate.getTime()) {
+							// 	console.log('selectedDate:',selectedDate.getTime())
+							// 	console.log('currentDate:',currentDate.getTime())
+							// 	console.log('selectedDate.getTime() >= currentDate.getTime():',selectedDate.getTime() >= currentDate.getTime())
+							// 	removeValidation(yykssj);
+							// 	isValidStartTime = true;
+
+							// 	// 获取结束时间
+							// 	const endTime = new Date(yyjssj.value);
+
+							// 	// 设置开始时间的值为不带时间的日期格式,用于显示
+							// 	yykssj.value = formatDateTime(selectedDate);
+								
+							// 	// 设置结束时间为当天的 23:59:59
+							// 	const endDate = selectedDate + ' 23:59:59';
+							// 	yyjssj.value = endDate; 
+							// } else {
+							// 	updateMsg(yykssj, "预约日期不能早于当前日期");
+							// 	// yykssj.value = formatDateTime(new Date(now.getTime() + 3600 * 1000));
+							// 	isValidStartTime = false;
+							// }
+						}
+					}).val(oneHourLater);
+				// 设置开始时间的显示格式(不带时间)
+				yykssj.value = oneHourLater;
+				// 设置结束时间的初始值为开始时间的 23:59:59
+				yyjssj.value = endDateFormatted;
+			}
+			function closePage() {
+
+				// 定义关闭页面的函数
+				function closeWindow() {
+					if (typeof WeixinJSBridge == "undefined") {
+						// 监听WeixinJSBridgeReady事件
+						document.addEventListener('WeixinJSBridgeReady', function () {
+							WeixinJSBridge.call('closeWindow');
+						}, false);
+					} else {
+						// 如果是微信浏览器,直接调用
+						WeixinJSBridge.call('closeWindow');
+					}
+				}
+
+				// 调用关闭页面函数
+				closeWindow();
+				
+				// 如果不是微信浏览器,尝试使用window.close()关闭
+				if (!/MicroMessenger/i.test(navigator.userAgent)) {
+					window.close();
+					window.history.back();
+					
+				}
+			}
+			var submitCount = 0;
+			// 提交表单
+			function submitForm() {
+				// 处理开始时间,添加 00:00:00
+				if(submitCount){
+					alert('请勿重复提交')
+					return false
+				}
+				const form = $("#myForm");
+				const lflbm = $("input[name='lflbm']").val();
+				let valid = false;
+				const jfbmid = $("input[name='jfbmid']").val();
+				const jfxiaoqid = $("input[name='jfxiaoqid']").val();
+				const jfryid = $("input[name='jfryid']").val();
+				const xbm = $("input[name='xbm']").val();
+				const yykssj = document.querySelector('#yykssj');
+				const yyjssj = document.querySelector('#yyjssj');
+				if (!form[0].checkOnly(false)) { // 获取原生DOM元素并调用checkOnly
+					// alert('原来的校验器,checkOnly不通过')
+					valid = true;
+				}
+				// if (yykssj && yykssj.value) {
+				// 	const newYykssj = yykssj.value + ' 00:00:00';
+				// 	console.log('提交的时候一开始获取到的newYykssj:',newYykssj)
+				// 	yykssj.value = newYykssj;
+				// }
+				// 
+				
+				// 校验时间是否有效
+				if (!isValidStartTime) {
+					alert("预约日期不能早于当前日期")
+					valid = true;
+				}
+				if (xbm === '') {
+					valid = true;
+				}
+				if(((lflbm!='61')&&(lflbm!='161')&&(lflbm!='71'))&&jfryid === '' ) {
+					valid = true;
+					alert('未查询到该受访人信息,请重新输入!');
+				}
+				// 校验校区
+				if (jfxiaoqid === '' ) {
+					valid = true;
+				}
+				
+				// 如果随行人员不为0
+				if (sxry_num.length > 0) {
+					$("input[name='sxry_num']").val(sxry_num.join(','));
+					// 用来存储所有对象
+					var dataArray = [];
+					// 遍历数组
+					sxry_num.forEach(function(num) {
+						if($('input[name="xbm_' + num + '"]').val() === ''){
+							valid = true;
+							alert("请选择随行人员"+ num +"的性别")
+							return false;
+						}
+
+						// 获取每个字段的值,如果为空则赋值为 ""
+						var entry = {
+							xbm: $('input[name="xbm_' + num + '"]').val() || "",
+							sfzjlbm: $('input[name="sfzjlbm_' + num + '"]').val() || "",
+							xm: $('input[name="xm_' + num + '"]').val() || "",
+							sfzh: $('input[name="sfzh_' + num + '"]').val() || "",
+							grdh: $('input[name="grdh_' + num + '"]').val() || "",
+							clh: $('input[name="clh_' + num + '"]').val() || "", // 车辆号
+							// syfjid: $('input[name="syfjid_' + num + '"]').val() || ""
+						};
+					
+						// 将每个对象添加到数组中
+						dataArray.push(entry);
+					});
+					$('input[name="lfsxry"]').val(JSON.stringify(dataArray));
+				}
+
+				if (valid){
+					console.log('提交的校验不通过')
+					return;
+				}
+				if (yykssj && yykssj.value) {
+					const newYykssj = yykssj.value + ' 00:00:00';
+					console.log('yykssj.value:',newYykssj)
+					yykssj.value = newYykssj;
+				}
+				yyjssj.value = yykssj.value.replace(' 00:00:00', ' 23:59:59');
+				console.log(yykssj.value,yyjssj.value)
+				submitCount = 1;
+
+				// alert('预约结束时间yyjssj:'+yyjssj.value);
+				// return ;
+				form.submit();
+
+			}
+
+
+			// 生成随行人员
+			function addVisitor(visitorId, visitorNumber, title) {
+				// console.log(`当前访客id是` + visitorId, `当前访客编号是` + visitorNumber);
+				const inputNum = (visitorId === 1 ? '' : '_' + (visitorId - 1)) // 提交给后端的后缀,如果是第一个证明是访客 不用加后缀;第二个开始变随行人员,加后缀1开始
+				// console.log(`当前随行人员编号是` + (!inputNum ? ':访客不需要编号' : '_' + (visitorId - 1)));
+				carNumberInstances[visitorId] = []; // 初始化新随行人员的车牌号实例数组
+				let newFormHtml = `
+			<div class="mobileForm-container" data-visitor-id="` + visitorId + `">
+				<div class="mobileForm-title">
+					<span>` + (title ? title : '随行人员' + visitorNumber) + `</span>
+					<span class="mobileDelete-button"></span>
+				</div>
+				<table>
+					
+					<tr>
+						<th>姓名</th>
+						<td><input name="xm`+ inputNum + `" value="" type="text"/></td>
+					</tr>
+					<tr>
+						<th>性别</th>
+						<td>
+
+							<div class="ss-select-container" id="xbm`+ inputNum + `" value="">
+								<div class="ss-select">请选择</div>
+								<div class="ss-options">
+									<div data-value="1">男</div>
+									<div data-value="2">女</div>
+								</div>
+								<input type="hidden" name="xbm`+ inputNum + `" >
+							</div>
+						<%--
+						<input name="xbmName" style="width:90px;" type="text" />
+						<ss:objp name='xbm' inp='false' cb='xb'/>
+						--%>
+						</td>
+					</tr>
+					
+					<tr>
+						<th>证件类别</th>
+						<td>
+							<div class="ss-select-container" id="sfzjlbm`+ inputNum + `" value="1">
+								<div class="ss-select">请选择</div>
+								<div class="ss-options">
+									<div data-value="1">身份证</div>
+								</div>
+								<input type="hidden" name="sfzjlbm`+ inputNum + `" >
+							</div>
+						</td>
+					</tr>
+					<tr>
+						<th>证件号</th>
+						<td><input name="sfzh`+ inputNum + `" value="" type="text"/></td>
+					</tr>
+					<tr>
+						<th>个人电话</th>
+						<td><input name="grdh`+ inputNum + `" type="text"/></td>
+					</tr>`
+					+
+					(visitorNumber === 0 ? `<tr><th>附件</th><td><div id="sywjlp"></div></td></tr>`:``) 
+					+
+					`
+					<tr>
+						<td colspan="2" style="text-align: center">
+							车辆号
+							<!-- <span class="mobileAdd-button carNumberAdd"></span> -->
+						</td>
+					</tr>
+					<tr>
+						<td colspan="2" class="carNumberTd">
+							<div>
+								<div id="carNumberInput` + visitorId + `-1"></div>
+								<span class="mobileDelete-button carNumberDelete" style="visibility: hidden"></span>
+							</div>
+						</td>
+					</tr>
+				</table>
+			</div>
+		`;
+
+
+				// 如果是第一个随行人员,访客
+				if (visitorNumber === 0) {
+
+					newFormHtml = `
+			<div class="mobileForm-container" data-visitor-id="` + visitorId + `">
+				<div class="mobileForm-title">
+					<span>` + (title ? title : '随行人员' + visitorNumber) + `</span>
+					<span class="mobileDelete-button"></span>
+				</div>
+				<table>
+					
+					<tr>
+						<th>姓名</th>
+						<td><input name="xm" value="${lf.xm}" type="text"/></td>
+					</tr>
+					<tr>
+						<th>性别</th>
+						<td>
+
+							<div class="ss-select-container" id="xbm" value="${lf.xbm}">
+								<div class="ss-select">请选择</div>
+								<div class="ss-options">
+									<div data-value="1">男</div>
+									<div data-value="2">女</div>
+								</div>
+								<input type="hidden" name="xbm" >
+							</div>
+						<%--
+						<input name="xbmName" style="width:90px;" type="text" />
+						<ss:objp name='xbm' inp='false' cb='xb'/>
+						--%>
+						</td>
+					</tr>
+					
+					<tr>
+						<th>证件类别</th>
+						<td>
+							<div class="ss-select-container" id="sfzjlbm" value="${lf.sfzjlbm}">
+								<div class="ss-select">请选择</div>
+								<div class="ss-options">
+									<div data-value="1">身份证</div>
+								</div>
+								<input type="hidden" name="sfzjlbm" >
+							</div>
+						</td>
+					</tr>
+					<tr>
+						<th>证件号</th>
+						<td><input name="sfzh" value="${lf.sfzh}" type="text"/></td>
+					</tr>
+					<tr>
+						<th>个人电话</th>
+						<td><input name="grdh" value="${lf.grdh}" type="text"/></td>
+					</tr>`
+					+
+					(visitorNumber === 0 ? `<tr><th>附件</th><td><div id="sywjlp"></div></td></tr>`:``) 
+					+
+					`
+					<tr>
+						<td colspan="2" style="text-align: center">
+							车辆号
+							<!-- <span class="mobileAdd-button carNumberAdd"></span> -->
+						</td>
+					</tr>
+					<tr>
+						<td colspan="2" class="carNumberTd">
+							<div>
+								<div id="carNumberInput1-1"></div>
+								<span class="mobileDelete-button carNumberDelete" style="visibility: hidden"></span>
+							</div>
+						</td>
+					</tr>
+				</table>
+			</div>
+		`;
+
+
+
+					newFormHtml = newFormHtml.replace(
+						'class="mobileDelete-button"',
+						'class="mobileDelete-button" style="visibility: hidden"'
+					);
+					$(".mobileForm .mobileForm-title").last().before(newFormHtml);
+					const uploadUrl = '<ss:serv name="lf_uploadFile"/>';
+					const loadUrl = "<ss:serv name='lf_loadFile'/>";
+					// 选择并上传文件,并生成预览
+					mobileFileUpload('sywjlp', {
+						uploadUrl,
+						loadUrl,
+						maxSize: 1, // 
+						acceptedFileTypes: ['jpg', 'jpeg', 'png', 'gif', 'pdf','xlsx', 'docx', 'pptx', 'doc', 'ppt', 'xls','zip', 'rar', '7z'], // 限制文件类型
+						maxFileSize: 20 * 1024 * 1024 // 单个文件最大为 5 MB
+					});
+
+				} else {
+					// 新增随行人员时,追加到最后一个随行人员后面
+					$(".mobileForm-container").last().after(newFormHtml);
+				}
+				// 初始化对应的随行人员的下拉信息
+				const xbm = initSSSelect(`#xbm` + inputNum, initSelectData.XB, { text: 'mc', value: 'xbm' }, { enable: true });
+				const sfzjlbm = initSSSelect('#sfzjlbm' + inputNum, initSelectData.SFZJLB, { text: 'mc', value: 'sfzjlbm' }, { enable: true });
+				// 初始化对应的随行人员的校验
+				wdVm.add("wd.commonValidator.notNull", [`xm` + inputNum], { msgPrfx: "姓名" }, 1);
+				wdVm.add('wd.commonValidator.notNull', [`sfzjlbm` + inputNum], { 'msgPrfx': '身份证件类别' }, 1);
+				// wdVm.add('wd.commonValidator.idCard',[`sfzh`+ inputNum],{'relField':`sfzh`+ inputNum+`,`+`sfzjlbm`+ inputNum,'msgPrfx':'身份证号'},1);
+				wdVm.add("wd.commonValidator.idCard", ["sfzh" + inputNum], { msgPrfx: "证件号", notBlank: true, sfzjlbmName: `sfzjlbm` + inputNum }, 1);
+				wdVm.add("wd.commonValidator.int", [`grdh` + inputNum], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+
+				let carInput;
+				// 处理第一个访客
+				if (visitorId === 1) {
+					carInput = new CarNumberInput('carNumberInput' + visitorId + '-1', 'clh', '粤')
+					xbm.setValue('${lf.xbm}')
+					sfzjlbm.setValue('${lf.sfzjlbm}')
+				} else {
+					carInput = new CarNumberInput('carNumberInput' + visitorId + '-1', 'clh' + inputNum, '粤')
+				}
+				carNumberInstances[visitorId].push(carInput);
+				
+			}
+			/**
+			 * 初始化自定义下拉框,支持设置默认值、回调函数、自定义选项数组和校验功能
+			 * @param {string} containerSelector - 下拉框容器的CSS选择器
+			 * @param {Array} optionsArray - 包含选项的数组对象 [{...}](可选)
+			 * @param {object} mapping - 映射对象,定义选项中用于显示文本和作为值的字段名 {text: '字段名', value: '字段名'}(可选)
+			 * @param {object} validation - 校验对象,包含校验设置 {enable: true/false, message: '报错信息'}(可选)
+			 * @param {function|null} callback - 选中后的回调函数(可选)
+			 */
+			function initSSSelect(containerSelector, optionsArray = [], mapping = { text: 'n', value: 'v' }, validation = { enable: false, message: '' }, callback = null) {
+				
+				const container = document.querySelector(containerSelector); // 获取容器
+				if (!container) {
+					console.error('容器未找到');
+					return;
+				}
+
+				const ssSelect = container.querySelector('.ss-select'); // 获取显示区域
+				const optionsContainer = container.querySelector('.ss-options'); // 获取选项容器
+				const hiddenInput = container.querySelector('input[type="hidden"]'); // 隐藏的输入框
+
+				// 获取容器的父级元素,以便插入错误提示
+				const parent = container.parentNode;
+
+				// 创建并插入分隔线 span
+				let lineSpan = document.getElementById(containerSelector.replace(/[#.]/g, '') + 'Span');
+				if (!lineSpan) {
+					lineSpan = document.createElement('span'); // 创建线的 span
+					lineSpan.id = containerSelector.replace(/[#.]/g, '') + 'Span'; // 使用指定格式的 id
+					lineSpan.className = 'border-input-error vLine-leftWarning'; // 设置样式
+					lineSpan.style.display = 'none'; // 显示分隔线
+					parent.insertBefore(lineSpan, container.nextSibling); // 插入到 container 之后
+				}
+				if (validation.enable) {
+					lineSpan.style.display = 'block'; // 显示分隔线
+				}
+
+				// 创建并插入错误提示的 div
+				let errorDiv = document.getElementById(containerSelector.replace(/[#.]/g, '') + 'ErrorDiv');
+				if (!errorDiv) {
+					errorDiv = document.createElement('div'); // 创建错误提示的 div
+					errorDiv.id = containerSelector.replace(/[#.]/g, '') + 'ErrorDiv'; // 使用指定格式的 id
+					errorDiv.className = 'error-message'; // 设置样式
+					errorDiv.style.position = 'absolute';
+					errorDiv.style.left = '0px';
+					errorDiv.style.bottom = '0px';
+					errorDiv.style.color = 'red';
+					errorDiv.style.fontSize = '12px';
+					errorDiv.style.width = '100%';
+					errorDiv.style.textAlign = 'right';
+					errorDiv.style.lineHeight = '18px';
+					errorDiv.style.height = '18px';
+					errorDiv.style.display = 'none'; // 初始状态隐藏
+					parent.insertBefore(errorDiv, lineSpan ? lineSpan.nextSibling : container.nextSibling); // 插入到分隔线之后
+				}
+
+				
+				
+				// 如果传入了选项数组,动态生成选项 DOM
+				if (optionsArray.length > 0) {
+					optionsContainer.innerHTML = ''; // 清空原有选项
+					optionsArray.forEach(option => {
+						const optionDiv = document.createElement('div');
+						optionDiv.setAttribute('data-value', option[mapping.value]); // 使用映射的 value 作为选项值
+						optionDiv.textContent = option[mapping.text]; // 使用映射的 text 作为显示文本
+						optionsContainer.appendChild(optionDiv);
+					});
+				}else {
+				    optionsContainer.innerHTML = '<div class="padding">无选项</div>';
+				}
+
+				// 点击下拉框时,打开或关闭选项列表
+				ssSelect.addEventListener('click', function (event) {
+					// 关闭其他所有下拉框
+					document.querySelectorAll('.ss-select-container').forEach(cont => {
+						if (cont !== container) {
+							cont.classList.remove('open');
+						}
+					});
+
+					// 切换当前下拉框的状态
+					container.classList.add('open');
+					event.stopPropagation(); // 阻止事件冒泡,防止点击下拉框时触发 document 的点击事件
+
+					// 如果启用了校验且没有选中内容,则显示错误提示
+					if (validation.enable && (!hiddenInput.value || hiddenInput.value === "")) {
+						errorDiv.textContent = validation.message || ''; // 设置错误提示文字
+						errorDiv.style.display = 'block'; // 显示错误提示
+					}
+				});
+
+				// 处理选项点击事件
+				optionsContainer.querySelectorAll('div').forEach(option => {
+					option.addEventListener('click', function () {
+						const value = this.getAttribute('data-value'); // 获取选项的值
+						const text = this.textContent; // 获取选项的文本
+
+						// 设置下拉框显示文本和隐藏输入框的值
+						ssSelect.textContent = text;
+						hiddenInput.value = value;
+
+						// 移除所有其他选项的选中状态
+						optionsContainer.querySelectorAll('div').forEach(opt => opt.classList.remove('selected'));
+
+						// 为当前选中的选项添加选中状态
+						this.classList.add('selected');
+
+						// 关闭下拉框
+						container.classList.remove('open');
+
+						// 隐藏错误提示
+						errorDiv.style.display = 'none';
+						// 隐藏分隔线
+						lineSpan.style.display = 'none';
+						// parent.style.borderBottom = 'none';
+						// 如果有回调函数,调用并传递选中的值
+						if (callback && typeof callback === 'function') {
+							callback(value);
+						}
+					});
+				});
+
+				// 从容器的 value 属性获取默认值
+				const defaultValue = container.getAttribute('value');
+
+				// 设置默认选中值
+				if (defaultValue !== null && defaultValue !== "") {
+					const defaultOption = optionsContainer.querySelector(`div[data-value="`+defaultValue+`"]`);
+					if (defaultOption) {
+						console.log('defaultOption',defaultOption.textContent)
+						ssSelect.textContent = defaultOption.textContent; // 设置下拉框的默认文本
+						hiddenInput.value = defaultOption.getAttribute('data-value'); // 设置隐藏输入框的默认值
+						defaultOption.classList.add('selected'); // 设置选中状态
+						// 隐藏错误提示
+						errorDiv.style.display = 'none';
+						// 隐藏分隔线
+						lineSpan.style.display = 'none';
+						
+						// 如果有回调函数,执行回调
+						if (callback && typeof callback === 'function') {
+							callback(defaultValue);
+						}
+					}
+				}
+
+				// 点击其他地方关闭所有下拉框
+				document.addEventListener('click', function () {
+					container.classList.remove('open');
+					// 如果启用了校验功能且没有选中项,显示错误提示
+					if (validation.enable && (!hiddenInput.value || hiddenInput.value === "")) {
+						errorDiv.textContent = validation.message; // 设置错误提示文字
+						errorDiv.style.display = 'block'; // 显示校验错误信息
+						// parent.style.borderBottom = '1px solid red';
+					}
+				});
+
+				// 防止点击容器内部时触发 document 的点击事件
+				container.addEventListener('click', function (event) {
+					event.stopPropagation();
+				});
+
+				// 如果启用了校验功能且没有默认选中项,显示错误提示
+				// if (validation.enable && (!defaultValue || defaultValue === "")) {
+				// 	errorDiv.textContent = validation.message; // 设置错误提示文字
+				// 	errorDiv.style.display = 'block'; // 显示校验错误信息
+				// }
+				return {
+					setValue: function(value) {
+						if (!value) {
+							// 恢复到初始状态
+							ssSelect.textContent = '请选择';
+							hiddenInput.value = '';
+							
+							// 移除所有选中状态
+							optionsContainer.querySelectorAll('div').forEach(opt => 
+								opt.classList.remove('selected')
+							);
+							
+							// 如果启用了校验,显示错误提示和分隔线
+							if (validation.enable) {
+								errorDiv.textContent = validation.message || '';
+								errorDiv.style.display = 'block';
+								lineSpan.style.display = 'block';
+							}
+							
+							return true;
+						}
+
+						const option = optionsContainer.querySelector(`div[data-value="${value}"]`);
+						if (option) {
+							// 更新显示文本和隐藏输入框的值
+							ssSelect.textContent = option.textContent;
+							hiddenInput.value = value;
+							
+							// 更新选中状态
+							optionsContainer.querySelectorAll('div').forEach(opt => opt.classList.remove('selected'));
+							option.classList.add('selected');
+							
+							// 隐藏错误提示和分隔线
+							errorDiv.style.display = 'none';
+							lineSpan.style.display = 'none';
+							
+							// 如果有回调函数,执行回调
+							if (callback && typeof callback === 'function') {
+								callback(value);
+							}
+							
+							return true;
+						}
+						return false;
+					}
+				};
+			}
+			// 清除所有表单部分的显示
+			function hideAllSections() {
+				// 隐藏所有部分
+				$('#formSection2, #formSection2 tr').addClass('hidden');
+				$('#formSection3, #formSection3 tr').addClass('hidden');
+
+				
+				// 清第二部分校验
+				wdVm.remove("wd.commonValidator.notNull", ["jfrxm"]);
+				wdVm.remove("wd.commonValidator.int", ["jfrgrdh"]);
+				wdVm.remove("wd.commonValidator.notNull", ["zy"]);
+				wdVm.remove("wd.commonValidator.notNull", ["bj"]);
+				wdVm.remove("wd.commonValidator.int", ["rs"]);
+				wdVm.remove("wd.commonValidator.notNull", ["dwmc"]);
+				wdVm.remove("wd.commonValidator.notNull", ["sy"]);
+			}
+
+			/** 
+			 * 处理 "探访学生" 的表单显示 
+			 * 受访人信息显示:姓名、专业、班级、个人电话
+			 * 来访信息显示:人数、预约开始时间、预约结束时间
+			 */
+			function handleStudentVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection2').removeClass('hidden'); // 显示表单部分2
+				$('#tr-jfrxm, #tr-zy, #tr-bj, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
+				// 加第二部分校验
+				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+				wdVm.add("wd.commonValidator.notNull", ["zy"], { msgPrfx: "专业" }, 1);
+				wdVm.add("wd.commonValidator.notNull", ["bj"], { msgPrfx: "班级" }, 1);
+				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+				$('#formSection3').removeClass('hidden');
+				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+			}
+
+
+			/** 
+			 * 处理 "探访教职工" 的表单显示 
+			 * 受访人信息显示:姓名、个人电话
+			 * 来访信息显示:人数、预约开始时间、预约结束时间
+			 */
+			function handleStaffVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection2').removeClass('hidden'); // 显示表单部分2
+				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
+				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+				$('#formSection3').removeClass('hidden');
+				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+				
+			}
+
+			/** 
+			 * 处理 "物流配送" 的表单显示 
+			 * 受访人信息显示:姓名、个人电话
+			 * 来访信息显示:人数、预约开始时间、预约结束时间
+			 */
+			function handleLogisticsVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection2').removeClass('hidden'); // 显示表单部分2
+				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
+				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+				$('#formSection3').removeClass('hidden');
+				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+				
+			}
+
+			/** 
+			 * 处理 "公务" 的表单显示 
+			 * 受访人信息显示:姓名、个人电话
+			 * 来访信息显示:单位、人数、预约开始时间、预约结束时间
+			 */
+			function handleOfficialVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection2').removeClass('hidden'); // 显示表单部分2
+				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
+				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+				$('#formSection3').removeClass('hidden'); // 显示表单部分3
+				$('#tr-dwmc, #tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); // 显示公务相关字段
+				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+				
+			}
+
+			/** 
+			 * 处理 "工作学习" 的表单显示 
+			 * 受访人信息显示:姓名、个人电话
+			 * 来访信息显示:人数、预约开始时间、预约结束时间
+			 */
+			function handleWorkStudyVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection2').removeClass('hidden'); // 显示表单部分2
+				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
+				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+				$('#formSection3').removeClass('hidden');
+				$('#tr-dwmc,#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); 
+				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+				
+			}
+
+			/** 
+			 * 处理 "其他" 的表单显示 
+			 * 受访人信息显示:姓名、个人电话
+			 * 来访信息显示:人数、预约开始时间、预约结束时间
+			 */
+			function handleOtherVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection2').removeClass('hidden'); // 显示表单部分2
+				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
+				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+				$('#formSection3').removeClass('hidden');
+				$('#tr-jfxiaoqid,#tr-rs, #tr-yykssj,#tr-sy, #tr-dwmc').removeClass('hidden');
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+				wdVm.add("wd.commonValidator.notNull", ["sy"], { msgPrfx: "事由", notBlank: true }, 1);
+				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
+				
+			}
+
+			/** 
+			 * 处理 "酒店餐饮" 的表单显示 
+			 * 受访人信息显示:无
+			 * 来访信息显示:酒店名【下拉】、人数、预约开始时间、预约结束时间
+			 */
+			function handleHotelVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection3').removeClass('hidden');
+				$('#tr-jfbmid, #tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); // 显示酒店相关字段
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+			}
+			
+			/** 
+			 * 处理 "培训会议" 的表单显示 
+			 * 受访人信息显示:无
+			 * 来访信息显示:名称【下拉】、人数、预约开始时间、预约结束时间
+			 */
+			function handleTrainingVisit() {
+				hideAllSections(); // 先隐藏所有部分
+				$('#formSection2').removeClass('hidden'); // 显示表单部分2
+				$('#tr-jfrxm, #tr-jfrgrdh').removeClass('hidden'); // 显示相关字段
+				wdVm.add("wd.commonValidator.notNull", ["jfrxm"], { msgPrfx: "受访人姓名" }, 1);
+				wdVm.add("wd.commonValidator.int", ["jfrgrdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+				$('#formSection3').removeClass('hidden');
+				$('#tr-dwmc,#tr-jfxiaoqid,#tr-rs, #tr-yykssj').removeClass('hidden'); // 显示会议相关字段
+				wdVm.add("wd.commonValidator.notNull", ["dwmc"], { msgPrfx: "单位名称", notBlank: true }, 1);
+				wdVm.add("wd.commonValidator.int", ["rs"], { minLen: 1, maxLen: 10000, msgPrfx: "人数", notBlank: true }, 1);
+
+			}
+
+			let firstVisitor = true;
+			let xqInstance ;
+			let jfbmInstance ;
+			// 选择类别后
+			function selectLflbm(value) {
+				// 初始化开始事件结束时间
+				setInitialTime()
+				// 清空已输入的数据
+				function clearInput() {
+					console.log('清除已输入的数据')
+				    $('input[name="jfrxm"]').val('')
+					$('input[name="jfrgrdh"]').val('')
+					$('input[name="jfryid"]').val('')
+					$('input[name="jfxiaoqid"]').val('')
+					$('#jfxiaoqid .ss-select').text('请选择校区');
+					$("input[name='jfbmid']").val('')
+					
+					$('#jfbmid .ss-options div').remove();
+					$('input[name="dwmc"]').val('')
+					
+				}
+				clearInput()
+				
+				if (firstVisitor) {
+					xqInstance = initSSSelect('#jfxiaoqid', initSelectData.XIAOQ, { text: 'mc', value: 'xiaoqid' }, { enable: true }, selectXq);// 初始化校区下拉
+					console.log(xqInstance)
+					
+
+					// 初始化第一个随行人员
+					addVisitor(uniqueVisitorIdCounter, visitorCount, '访客');
+					
+					const jfrxm = $("input[name='jfrxm']").val('${lf.jfrxm}')
+					const jfrgrdh = $("input[name='jfrgrdh']").val('${lf.jfrgrdh}')
+					const jfryid = $("input[name='jfryid']").val('${lf.jfryid}')
+					const dwmc = $("input[name='dwmc']").val('${lf.dwmc}')
+					
+					// const xbm = $("input[name='xbm']").val(${lf.xbm});
+					// const sfzjlbm = $("input[name='sfzjlbm']").val(${lf.sfzjlbm});
+					const xm = $("input[name='xm']").val('${lf.xm}');
+					const sfzh = $("input[name='sfzh']").val('${lf.sfzh}');
+					const grdh = $("input[name='grdh']").val('${lf.grdh}');
+					
+					carNumberInstances['1'][0].setCarNumber('${lf.clh}')
+					
+
+					// wdVm.add("wd.commonValidator.notNull", ["xm"], { msgPrfx: "姓名" }, 1);
+					// wdVm.add("wd.commonValidator.idCard", ["sfzh"], { msgPrfx: "证件号", notBlank: true, chkCsrq: false, chkXb: false, chkCsdq: false }, 1);
+					// wdVm.add("wd.commonValidator.int", ["grdh"], { minLen: 11, maxLen: 11, msgPrfx: "个人电话", notBlank: true }, 1);
+
+					firstVisitor = false;
+				}else{
+					xqInstance.setValue()
+					$('#jfbmid .ss-select').text('请选择酒店');
+				}
+
+				switch (value) {
+					case '1': // 探访学生
+						handleStudentVisit();
+						break;
+					case '5': // 探访教职工
+						handleStaffVisit();
+						break;
+					case '11': // 公务
+						handleOfficialVisit();
+						break;
+					case '21': // 培训会议
+						handleTrainingVisit();
+						break;
+					case '31': // 工作学习
+						handleWorkStudyVisit();
+						break;
+					case '51': // 物流配送
+						handleLogisticsVisit();
+						break;
+					case '61': // 酒店餐饮
+						handleHotelVisit();
+						$('#tr-jfbmid th').text('酒店名');
+						break;
+					case '71': // 场地预约
+						handleHotelVisit();
+						$('#tr-jfbmid th').text('场地');
+						break;
+					case '91': // 其他
+						handleOtherVisit();
+						break;
+					case '99': // 测试
+						handleOfficialVisit();
+						break;
+				}
+				// 选择后出现标题和底部按钮
+				$('.mobileForm-title,.mobileBottom-div').removeClass('hidden');
+			}
+			function initBm(value){
+				const lflbm = $("input[name='lflbm']").val();
+				// 过滤得到 xiaoqid 等于传入值的酒店对象数组
+				let filteredData ;
+				if(lflbm==61){filteredData = initSelectData.JD.filter(hotel => hotel.xiaoqid == value);}
+				if(lflbm==71){filteredData = initSelectData.CGHD.filter(hotel => hotel.xiaoqid == value);}
+				// 打印过滤后的数据
+				jfbmInstance = initSSSelect('#jfbmid', filteredData, { text: 'mc', value: 'bmid' }, { enable: true });// 初始化酒店下拉
+				if('${lf.jfbmid}' == ''){
+					$('#jfbmid .ss-select').text('请选择');
+					console.log(jfbmInstance)
+					jfbmInstance.setValue()
+				}
+			}
+			// 选择了校区
+			function selectXq(value) {
+				const lflbm = $("input[name='lflbm']").val();
+				//如果是酒店餐饮,则根据校区初始选择酒店
+				
+				initBm(value)
+				
+				
+			}
+			$(document).ready(function () {
+				const warnMsg = '${warnMsg}';
+				if (warnMsg) {
+				    alert(warnMsg);
+				}
+				$.ajax({
+					type: 'post',
+					async: false,
+					url: "<ss:serv name='lf_initExtLfInp' parm='{"param1":"abc123"}'/>",
+					data: { param2: 'def456' },
+					success: function (result) {
+						initSelectData = result;
+					}
+				});
+				// 初始化自定义下拉框,传入回调函数
+				initSSSelect('#lflbm', initSelectData.LFLB, { text: 'mc', value: 'lflbm' }, { enable: true, message: '请选择来访类别!' }, selectLflbm);
+				
+				// 绑定新增随行人员事件
+				$("#visitorAdd").click(function () {
+					visitorCount++; // 增加有效随行人员计数
+					// 把新增的随行人员ID存入数组
+					sxry_num.push(uniqueVisitorIdCounter);
+					console.log(sxry_num)
+					uniqueVisitorIdCounter++; // 增加唯一随行人员 ID
+
+					// 新增随行人员
+					addVisitor(uniqueVisitorIdCounter, visitorCount, '');
+				});
+
+				// 点击删除随行人员
+				$(document).on("click", ".mobileDelete-button", function () {
+					const currentVisitorId = $(this)
+						.closest(".mobileForm-container")
+						.data("visitor-id");
+
+					delete carNumberInstances[currentVisitorId];
+					// 从随行人员数组中删除对应ID
+					sxry_num = sxry_num.filter(item => item !== (currentVisitorId - 1));
+					console.log(sxry_num)
+					// 删除对应校验
+					wdVm.remove("wd.commonValidator.notNull", [`xm_` + (currentVisitorId - 1)]);
+					wdVm.remove("wd.commonValidator.idCard", [`sfzh_` + (currentVisitorId - 1)]);
+					wdVm.remove("wd.commonValidator.int", [`grdh_` + (currentVisitorId - 1)]);
+					wdVm.remove('wd.commonValidator.notNull', [`sfzjlbm_` + (currentVisitorId - 1)]);
+
+					// 删除元素
+					$(this).closest(".mobileForm-container").remove();
+
+					updateVisitorNumbers();
+				});
+				function updateVisitorNumbers() {
+					$(".mobileForm-container").each(function (index) {
+						const newVisitorNumber = index;
+						if (!index) {
+							$(this).find(".mobileForm-title span:first-child").text("访客");
+						} else {
+							$(this).find(".mobileForm-title span:first-child").text("随行人员" + newVisitorNumber);
+						}
+					});
+					visitorCount = $(".mobileForm-container").length - 1;//减1是为了不把访客算进去
+					console.log("删除后当前访客数量", visitorCount)
+				}
+
+				// 新增车牌号
+				$(document).on("click", ".carNumberAdd", function () {
+					const currentVisitorId = $(this)
+						.closest(".mobileForm-container")
+						.data("visitor-id");
+					console.log("当前随行人员的ID", currentVisitorId);
+					if (!carNumberInstances[currentVisitorId]) {
+						carNumberInstances[currentVisitorId] = []; // 初始化当前随行人员的实例数组
+					}
+
+					const currentCarNumberCounter =
+						carNumberInstances[currentVisitorId].length + 1;
+
+					const newId = `carNumberInput` + currentVisitorId + `-` + currentCarNumberCounter;
+
+
+					console.log("主动点击随行人员的车牌号", newId);
+
+					const newRow = `
+				<tr class="carNumberRow">
+					<td colspan="2" class="carNumberTd">
+						<div>
+							<div id="`+ newId + `"></div>
+							<span class="mobileDelete-button carNumberDelete"></span>
+						</div>
+					</td>
+				</tr>`;
+
+					$(this).closest("table").find("tr").last().after(newRow);
+
+
+					const carInput = new CarNumberInput(newId, 'clh', '粤');
+					carNumberInstances[currentVisitorId].push(carInput);
+				});
+
+				// 删除车牌号行
+				$(document).on("click", ".carNumberDelete", function () {
+					const currentVisitorId = $(this)
+						.closest(".mobileForm-container")
+						.data("visitor-id");
+
+					// 找到当前随行人员下的所有车牌号行(根据容器和行数查找)
+					const carNumberRows = $(this)
+						.closest(".mobileForm-container")
+						.find("tr.carNumberRow");
+
+					// 找到当前点击的删除按钮所在的tr元素
+					const currentRow = $(this).closest("tr.carNumberRow");
+
+					// 获取当前删除按钮对应的车牌号索引
+					const rowIndex = carNumberRows.index(currentRow) + 1;
+
+					// 确保carNumberRows和carNumberInstances数组的一致性
+					if (rowIndex !== -1 && carNumberInstances[currentVisitorId]) {
+						// 删除对应的实例
+						carNumberInstances[currentVisitorId].splice(rowIndex, 1);
+						console.log(
+							`删除随行人员${currentVisitorId}里面的第${rowIndex}个车牌号后,实例数组:`,
+							carNumberInstances[currentVisitorId]
+						);
+					}
+
+					// 删除DOM中的对应行
+					currentRow.remove();
+				});
+			});
+
+		</script>
+		<script>
+			// 定义监听的逻辑,添加防抖处理
+			var debounceTimer; // 用于防抖的定时器
+
+			function checkInputsAndSendRequest() {
+				// 清除之前的定时器,防止过于频繁地发起请求
+				clearTimeout(debounceTimer);
+
+				// 设置一个新的定时器,延迟执行校验
+				debounceTimer = setTimeout(function() {
+					var jfrxmValue = $('input[name="jfrxm"]').val();  // 获取 jfrxm 的值
+					var jfrgrdhValue = $('input[name="jfrgrdh"]').val();  // 获取 jfrgrdh 的值
+					var lflbm = $('input[name="lflbm"]').val();  // 获取 lflbm 的值
+					// 如果两个输入框都有值,再发起 AJAX 请求
+					if (jfrxmValue && jfrgrdhValue) {
+						// 发起 AJAX 请求
+						$.ajax({
+							type: 'post',
+							async: false,
+							url: "<ss:serv name='lf_loadRyidByXmGrdh'/>",
+							data: {
+								xm: jfrxmValue,
+								grdh: jfrgrdhValue,
+								lflbm: lflbm
+							},
+							success: function(result) {
+
+								// 如果有错误消息
+								if (result && result.msg) {
+									$('input[name="jfryid"]').val('');
+									showErrorMessages(result.msg); // 显示错误信息
+								} else if (result && result.ryid){
+									$('input[name="jfryid"]').val(result.ryid);
+									removeErrorMessages(); // 清除错误信息
+								}
+
+								<%--
+								// 如果有结果,赋值
+								if (result && result.length > 0) {
+									$('input[name="jfryid"]').val(result[0].ryid);
+									removeErrorMessages(); // 清除错误信息
+								} else {
+									$('input[name="jfryid"]').val('');
+									showErrorMessages(); // 显示错误信息
+								}
+								--%>
+							}
+						});
+					} else {
+						$('input[name="jfryid"]').val('');
+						// 如果输入不全,清除错误信息
+						removeErrorMessages();
+					}
+				}, 500); // 防抖延迟500ms
+			}
+
+			// 显示错误信息
+			function showErrorMessages(msg) {
+				var jfrxmTd = $('input[name="jfrxm"]').closest('td');
+				var jfrgrdhTd = $('input[name="jfrgrdh"]').closest('td');
+
+				// 检查是否已经存在错误提示
+				if (!jfrxmTd.find('.error-message').length) {
+					jfrxmTd.css("border-bottom", "1px solid red")
+						.append('<span class="border-input-error vLine-leftWarning jfrxmSpan"></span>')
+						.append('<div class="error-message" style="position: absolute; left: 0px; bottom: 0px; color: red; font-size: 12px; width: 100%; text-align: right; line-height: 18px; height: 18px;">'+msg+'</div>');
+				}
+
+				if (!jfrgrdhTd.find('.error-message').length) {
+					jfrgrdhTd.css("border-bottom", "1px solid red")
+						.append('<span class="border-input-error vLine-leftWarning jfrgrdhSpan"></span>')
+						.append('<div class="error-message" style="position: absolute; left: 0px; bottom: 0px; color: red; font-size: 12px; width: 100%; text-align: right; line-height: 18px; height: 18px;">'+msg+'</div>');
+				}
+			}
+
+			// 清除错误信息
+			function removeErrorMessages() {
+				var jfrxmTd = $('input[name="jfrxm"]').closest('td');
+				var jfrgrdhTd = $('input[name="jfrgrdh"]').closest('td');
+				jfrxmTd.css("border-bottom", ""); // 恢复边框样式
+				jfrgrdhTd.css("border-bottom", ""); // 恢复边框样式
+				jfrxmTd.find('.error-message').remove(); // 移除所有错误提示
+				jfrgrdhTd.find('.error-message').remove(); // 移除所有错误提示
+				jfrxmTd.find('.jfrxmSpan').remove(); // 移除所有错误提示
+				jfrgrdhTd.find('.jfrgrdhSpan').remove(); // 移除所有错误提示
+
+			}
+
+			// 监听两个 input 的输入事件
+			$('input[name="jfrxm"], input[name="jfrgrdh"]').on('input blur', function() {
+				checkInputsAndSendRequest();
+			});
+			
+			if('${lf.jfrxm}' && '${lf.jfrgrdh}'){
+				checkInputsAndSendRequest();
+			}
+		</script>
+		<script>
+			 // 使用事件委托绑定 td 的点击事件
+			$('table').on('click', 'td', function() {
+			console.log("td clicked");
+			focusTextInput($(this));
+			});
+
+			// 使用事件委托绑定 .error-message 的点击事件
+			$('body').on('click', '.error-message', function() {
+			focusTextInput($(this));
+			});
+
+			// 公共方法,用于查找并聚焦 input[type="text"]
+			function focusTextInput($element) {
+				const $input = $element.find('input[type="text"]').length 
+								? $element.find('input[type="text"]') 
+								: $element.siblings('input[type="text"]');
+
+				if ($input.length) {
+					$input.focus();
+				}
+			}
+		</script>
+		</html>

+ 338 - 0
alf/mp_excelRcXcdjl_edit.ss.jsp

@@ -0,0 +1,338 @@
+<html>
+<head>
+<style type="text/css">
+.left-div, .right-div {
+	float: left;
+	/*width: 48%;*/
+	height: 94%;
+	box-sizing: border-box;
+	position: relative;
+}
+.left-div {
+	width: 37%;
+}
+.right-div {
+	width: 62.7%;
+}
+table.list {
+	margin-left: 0px !important;
+}
+table.list th{
+	 /*   width: 158px;*/
+}
+table.list td{
+	/* width: 158px;*/
+}
+.list-div tr {
+	border-bottom: 1px solid #e4e4e4;
+	background-color: #f0f0f0;
+}
+.list-div tr:hover {
+	border-bottom: 1px solid #e4e4e4;
+	background-color: #c7e3fc;
+}
+.list tr:nth-child(even):hover {
+	background-color:#c7e3fc;
+}
+.list-div td {
+	/*max-width: 140px !important;*/
+	padding: 0px 12px 0px 12px !important;
+}
+.list-div th {
+	padding: 0px 12px 0px 12px !important;
+}
+.left-button {
+	width: 100%;
+	float: left;
+	text-align: center;
+	position: absolute;
+	bottom: 0;
+}
+.left-div {
+	margin-right: 1px;
+}
+.times {
+	width: 80px !important;
+}
+.form-text {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+.cjfs {
+	width: 60px !important;
+}
+.list tr td {
+	padding-right: 28px;
+}
+input::-webkit-outer-spin-button, input::-webkit-inner-spin-button {
+	-webkit-appearance: none;
+}
+input[type="text"] {
+	-moz-appearance: textfield;
+	width: 65px;
+	text-align: right;
+}
+.content-div {
+	padding-right:15px!important;
+}
+.xylist {
+	display: block;
+	height: 630px;
+	overflow-y: auto;
+}
+.list tr{
+	display: table;
+	width: 100%;
+	table-layout: fixed;
+}
+.list-highlight {
+	color: #2b368f!important;
+	font-size: 14px!important;
+}
+</style>
+<script type="text/javascript">
+	console.log("start!!!");
+	window.onload = function () {	// 加载数据服务,统一为 ByA。Lin
+		loadXsCj();
+	}
+
+	function loadXsCj(e){
+console.log("loadXsCj");
+		var rcid = ${rcid};
+		$.ajax({
+			url : "<serv.ss name='rcXcdjl_initZxxzEdit'/>",
+			type : 'post',
+			async : false,
+			dataType: "json",	// 增加。Lin
+			data : {
+				'rcid' : rcid
+			},
+			success : function(result) {
+/* 改。Lin
+ * 增加 dataType: "json", 了
+ * 只有一组数据
+				var data = eval("(" + result + ")");
+				//学员信息
+				var stuData = data.stulist;
+*/			var stuData = result;
+//			var stuStr = "";	// 去掉,没用到。Lin
+				var jlztmBoolean=true;
+				for (var i in stuData) {
+					console.log(stuData[i]);
+					var stu = stuData[i];
+					var str = "";
+					if(stu.jlztm && stu.jlztm == 51){//加灰色样式
+						str += "<tr class='filter'>";
+					}else{//不加
+						str += "<tr>";
+					}
+					str += "<input type='hidden' value='" + stu.xcdid + "' name='xcdid' />";
+					str += "<input type='hidden' value='";
+					if ("xcdjlid" in stu)
+						str += stu.xcdjlid;
+					else
+						str += "null";
+					str += "' name='xcdjlid' />";	// + stu.ryid + "' name='xyid' />"。Lin
+					str += "<td style='width:85px;' class='list-highlight'>" + stu.xcdmc + "</td>";	// + stu.xm +。Lin
+					var jyfs="";
+					if(stu.jlztm==51){
+						jyfs=" readonly='true' ";
+					}
+					// 情况描述。Lin
+					str += "<td style='width:120px;text-align: right;'>" +
+							"<input "+ jyfs +" type='text' value='"+ stu.qkms +"' name='qkms' tab='tabField'"+
+							" onfocus='keydown_to_tab(this)' onkeypress='if(event.keyCode==13) focusNextInput(this);'/>" +
+							"</td>";
+					// 处理描述。Lin
+					str += "<td style='width:120px;text-align: right;'>" +
+							"<input "+ jyfs +" type='text' value='"+ stu.clms +"' name='clms' tab='tabField'"+
+							" onfocus='keydown_to_tab(this)' onkeypress='if(event.keyCode==13) focusNextInput(this);'/>" +
+							"</td>";
+					// 责任人。Lin
+					str += "<td style='width:50px;text-align: right;'>" +
+							"<input "+ jyfs +" type='text' value='"+ stu.zrr +"' name='zrr' tab='tabField'"+
+							" onfocus='keydown_to_tab(this)' onkeypress='if(event.keyCode==13) focusNextInput(this);'/>" +
+							"</td>";
+					str += "</tr>";
+					$('.xylist').append($(str));
+					if(stu.jlztm==1||!stu.jlztm)
+						jlztmBoolean=false;
+				}
+				//if (stuData[0].jlztm && stuData[0].jlztm != 1) {
+				if(jlztmBoolean){
+					$('.xylist input').attr("disabled", "disabled");
+					$('input[name="save"]').attr('disabled', 'disabled');
+					$('input[name="subm"]').attr('disabled', 'disabled');
+					$('input[name="save"]').css("color", "#aaa");
+					$('input[name="subm"]').css("color", "#aaa");
+				} else {
+					$('input[name="save"]').attr('disabled', false);
+					$('input[name="subm"]').attr('disabled', false);
+					$('input[name="save"]').css("color", "");
+					$('input[name="subm"]').css("color", "");
+				}
+			}
+		});
+	}
+</script>
+</head>
+<body>
+<!-- 查询 -->
+<%-- 再改,点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
+<form action="" name="cjform" method="post"> --%>
+<form action="<serv.ss name='rcXcdjl_submZxxzEdit' dest='info' parm='{requestParentViewObject:"${requestParentViewObject}"}'/>" method="post">
+	<input type="hidden" name="xxx" value="${dataType}" />
+	<input type="hidden" name="rcid" value="${rcid}" />
+	<div class="list-div list-search-div right-div content-div "
+		style="height: 90% overflow-x:hidden; min-height:80%;">
+		<table class="list aa" style=" float:right;width:100%!important;">
+		<thead style="width: 100%">
+			<tr style="border:none;">
+				<th style="padding: 0 0 0 12px;width: 140px;">巡查点</th>
+				<th style="width:85px;">情况描述</th>
+				<th style="width: 275px;">处理描述</th>
+				<th style="width:120px;">责任人</th>
+			</tr>
+		</thead>
+		<tbody ssOddClazz="list-odd" ssEvenClazz="list-even" ssHovClazz="list-hover" class="xylist scrollbar" ssFith="{list:true,rowHeight:35}" >
+			<rpt.ss name="ssList" id="item">
+				<tr class="list-dim" >
+					<td style='width: 205px;'></td>
+					<td></td>
+					<td style='width: 275px;'>
+						<onoff.ss name="qxfs" val="1,2" mode="play" />
+					</td>
+					<td></td>
+					<td></td>
+				</tr>
+			</rpt.ss>
+		</tbody>
+		</table>
+	</div>
+	<div class="bottom-div">
+		<equal.ss val='${dataType=="play"}' val2="false">
+			<div class="bottom-down-div">
+<%-- 改,二级对象的保存就是提交,新的提交只是放到二级对象草稿箱(不需要确认)。Lin
+				<in@put type="button" name="save" value="保存" class="bottom-button"
+						onclick="submitForm(1);" style="display: inline-block !important;">
+		 再改,解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=
+		 直接用标准的 <form 的提交。直接写到 <form action= 里
+				<in@put type="button" name="save" value="保存" class="bottom-button"
+						onclick="submitForm();" style="display: inline-block !important;"> --%>
+				<input type="submit" value="保存" class="bottom-button"/>
+<%-- 去掉,界面上(业务上),二级对象没有提交 -- 二级对象的保存就是提交。Lin
+				<in@put type="button" name="subm"  value="提交" class="bottom-button"
+						onclick="tjConfirm();" style="display: inline-block !important;">
+--%>
+				<input type="button" value="取消" class="bottom-button"
+						onclick="wd.display.closeDialog();">
+			</div>
+		</equal.ss>
+	</div>
+</form>
+
+</body>
+<script type="text/javascript">
+// <%-- 去掉,界面上(业务上),二级对象没有提交 -- 二级对象的保存就是提交。Lin
+// 	function tjConfirm(){
+// 		wd.display.confirm(" ","请确认成绩已全部录完,提交后不能在此页面修改!",function(){submitForm(2)},function(){return;});
+// 	}
+// --%>
+
+// <%-- 改,去掉 type,只有一个提交了 -- 二级对象的保存就是提交,新的提交只是放到二级对象草稿箱(不需要确认)。Lin
+// 	function submitForm(type) { --%>
+// <%-- 再去掉,直接写到 <form action= 里 -- 解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
+// 	function submitForm() {
+// 		//若是 保存更新,就不提交表单
+// 		var f = $('form[name="cjform"]');
+// --%>
+// <%-- 去掉,去掉 type,只有一个提交了 -- 二级对象的保存就是提交,新的提交只是放到二级对象草稿箱(不需要确认)。Lin
+// 		if (type == 1) {
+// 			$.ajax({
+// 				url : "<serv.ss name='rcXcdjl_submZxxzEdit'/>",	// :"m_xy_gl_djcj_bc"。Lin
+// 				type : "post",
+// 				data : f.serialize(),
+// 				beforeSend : function(result) {
+// 					//将 保存 提交按钮改为 不可用
+// 					$('input[name="save"]').attr('disabled', 'disabled');
+// 					$('input[name="subm"]').attr('disabled', 'disabled');
+// 					$('input[name="save"]').css("color", "#aaa");
+// 					$('input[name="subm"]').css("color", "#aaa");
+// 				},
+// 				success : function(result) {
+// 					var data = eval("(" + result + ")");
+// 					if (data.result)
+// 							//eval('@service{dest:"sys_info",show:"wdDialog",param:{"msg":"保存成功"}}@');
+// 						wd.display.alert("保存成功");
+// 					else
+// 							//eval('@service{dest:"sys_info",show:"wdDialog",param:{"msg":"保存失败"}}@');
+// 						wd.display.alert("保存失败");
+// 				},
+// 				error : function(result) {
+// 					//eval('@service{dest:"sys_info",show:"wdDialog",param:{"msg":"保存失败"}}@');
+// 					wd.display.alert("保存失败");
+// 				},
+// 				complete : function(result) {
+// 					afterSelectPlan(1);
+// 					/*$('input[name="save"]').attr('disabled', false);
+// 					$('input[name="subm"]').attr('disabled', false);
+// 					$('input[name="save"]').css("color", "#015a31");
+// 					$('input[name="subm"]').css("color", "#015a31");*/
+// 				}
+// 			});
+// 		}
+// 		if (type == 2) {
+// --%>
+// <%-- 改,续传变量,BpmU.saveSq( 需要用到 -- 增加写 二级对象草稿箱。Lin
+// 			f.attr('action', '@service{name:"m_xy_gl_djcj_tj",dest:"sys_info"}@'); --%>
+// <%-- 再去掉,直接写到 <form action= 里 -- 解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
+// 			f.attr('action', "<serv.ss name='rcXcdjl_submZxxzEdit' parm='{requestParentViewObject:"${requestParentViewObject}"}'/>");
+// 			f.submit();
+// --%>
+// //	}	// 去掉,去掉 type,只有一个提交了。Lin
+// <%-- 再去掉,直接写到 <form action= 里 -- 解决点击 保存 按钮后不能关闭弹出窗口的问题 -- <form action= 里增加 dest=。Lin
+// 	}
+// --%>
+
+	// 回车下一个获取焦点
+	function focusNextInput(thisInput) {
+		var inputs = $("input[tab='tabField']");	// = $("input[name='cjfs']")。Lin
+		for (var i = 0; i < inputs.length; i++) {
+			// 如果是最后一个,则焦点回到第一个
+			if (i == (inputs.length - 1)) {
+				inputs[0].focus(); break;
+			} else if (thisInput == inputs[i]) {
+				inputs[i + 1].focus(); break;
+			}
+		}
+	}
+
+	// 上一个获取焦点
+	function focusUpInput(thisInput) {
+		// console.log(11111);
+		var inputs = $("input[tab='tabField']");	// = $("input[name='cjfs']")。Lin
+		for (var i = 0; i < inputs.length; i++) {
+			// 如果是第一个,则焦点回到最后一个
+			if (thisInput == inputs[i]) {
+				inputs[i - 1].focus(); break;
+			} else if (thisInput == inputs[0]) {
+				inputs[inputs.length - 1].focus(); break;
+			}
+		}
+	}
+
+	function keydown_to_tab($input) { //聚焦
+		// console.log($input)
+		$($input).bind("keydown", function(e) {
+//		var n = $('.cjfs').length;	// 去掉,没用到。Lin
+			// console.log(n,e.keyCode)
+			if (e.keyCode == 40) { //键盘按下
+				focusNextInput($input)
+			} else if (e.keyCode == 38) { //键盘按上
+				focusUpInput($input)
+			}
+		});
+	}
+</script>
+</html>

+ 1562 - 0
alf/validation.js

@@ -0,0 +1,1562 @@
+/**
+ * 用于处理表单验证的JS文件 110609 注意:iframe默认是有最大的宽高限制的,要想iframe加载的页面较大时
+ * 也能自动调整大小,应该为iframe的css样式增加:width: 100%;height: 100%; 否则iframe大到一定程序就不能再大了
+ */
+
+//var validationManagerPath = '/wd/js/validation';
+function isMobile() {
+  const screenWidth = (window !== window.top ? window.top : window).innerWidth <= 768;
+
+  const userAgent = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
+  
+  // 检测触摸支持
+  const hasTouchScreen = (
+    'ontouchstart' in window || 
+    navigator.maxTouchPoints > 0 ||
+    navigator.msMaxTouchPoints > 0
+  );
+
+  
+  return hasTouchScreen && (userAgent || screenWidth);
+
+}
+
+
+// 为真,则在用户输入数据时实现进行检查
+var realTimeCheck = true;
+
+var chartDiv;
+var validationTimeOutId = null;
+
+if (realTimeCheck) {
+  // 如果需要在用户输入数据时实现进行检查,则把相应的iframe写入页面
+  /*
+   * var divStr = '<div style="position: absolute; z-index: 19701; top:
+   * -500px" id="msgDiv"><div id="validationDiv"><iframe name="msgIframe"
+   * id="msgIframe" src="'+validationManagerPath+ '/validationMsg.html"
+   * scrolling="no" frameborder="0" style="visibility: visible;position:
+   * absolute; width: 100%; height: 100%;"></iframe></div></div>'; var
+   * topBody = top.document.getElementsByTagName('BODY')[0]; topBody.innerHTML =
+   * divStr;
+   */
+
+  // alert(window.top.document.getElementsByTagName("body")[0]);
+
+  // document.write('<div style="position: absolute; z-index: 65535; top:
+  // -500px" id="msgDiv"><div id="validationDiv"><iframe name="msgIframe"
+  // id="msgIframe" src="'+validationManagerPath+
+  // '/validationMsg.html" scrolling="no" frameborder="0"
+  // style="visibility: visible;position: absolute; width: 100%; height:
+  // 100%;"></iframe></div></div>');
+
+  var topDoc = top.document;
+  chartDiv = topDoc.getElementById("msgDiv");
+  if (chartDiv == null || typeof chartDiv == "undefined") {
+    chartDiv = topDoc.createElement("div");
+    topDoc.body.appendChild(chartDiv);
+    chartDiv.id = "msgDiv";
+    chartDiv.innerHTML +=
+      '<div id="validationDiv" class="flashMsg-div" ><span class="msgDiv-content"></span><div class="msgDiv-tail"></div></div>';
+    // chartDiv.innerHTML = '<img
+    // src="<%=request.getContextPath()%>/images/kpiUp.jpg" />';//错误的
+    with (chartDiv.style) {
+      zIndex = 65535;
+      position = "absolute";
+      // background = '#F5F5F5';
+      width = "auto";
+      height = 0;
+      top = -500;
+      left = 0;
+      // border = "1px solid";
+      display = "block";
+      style = "position:absolute;border-radius:3px;overflow:hidden;";
+    }
+  }
+}
+
+// 保存校验结果的变量
+var message = "";
+
+function ValidationManager() {
+  // 用于处理表单验证的工具类构造器
+
+  /** 保存所有要校验的信息的集合* */
+  this.validationInfos = [];
+}
+
+ValidationManager.MSG_TYPE_SUCCESS = 0; // 消息类型――正确
+ValidationManager.MSG_TYPE_ERROR = 1; // 消息类型――错误
+ValidationManager.MSG_TYPE_WARNING = 2; // 消息类型――警告
+
+ValidationManager.prototype = {
+  /** 用于显示表单验证结果的Div* */
+  MsgDiv: chartDiv,
+
+  /** 如果为真,则如果代码报错会alert出来,在实际项目中应设为false* */
+  debug: true,
+
+  /** 通过NAME或ID获得页面元素的通用方法* */
+  getElement: function (nameOrId) {
+    var rs = document.getElementById(nameOrId);
+    if (!rs) {
+      // 如果上面的方法失败,则采用下面的方法取得对象实例
+      var arr = document.getElementsByName(nameOrId);
+      if (arr != null) rs = arr[0];
+    }
+    console.log(rs);
+    return rs;
+  },
+  getElements: function (nameOrId) {
+    var rs = new Array();
+    var ele = document.getElementById(nameOrId);
+    if (!ele) {
+      // 如果上面的方法失败,则采用下面的方法取得对象实例
+      var arr = document.getElementsByName(nameOrId);
+
+      if (arr != null) {
+        for (var i = 0; i < arr.length; i++) {
+          rs.push(arr[i]);
+        }
+      }
+    } else {
+      rs.push(ele);
+    }
+    //			console.log(rs)
+    return rs;
+  },
+  /** 获取参数s指定的方法引用* */
+  getFunRef: function (s) {
+    if (!s) return null;
+
+    try {
+      var r = eval(s);
+    } catch (e) {
+      //alert("方法不存在 :"+s)
+      console.log("方法不存在 :" + s);
+    }
+
+    return r;
+  },
+
+  /**
+   * 为DOM元素targetElem的evenName事件追加事件触发时回调函数activeFun
+   * 通过此函数为DOM元素绑定监听事件的好处在于:可以把新添加的监听函数与DOM元素
+   * 已绑定的旧的监听函数合并成为新的监听函数,而不会覆盖DOM元素旧的同名监听函数。
+   */
+  addEventListener: function (
+    targetElem, // 需绑定监听事件的DOM元素
+    eventName, // 事件名称,如:onclick
+    activeFun
+  ) {
+    // 事件触发的回调函数
+
+    // DOM元素原来的监听事件
+    var oriListener = targetElem[eventName];
+    if (oriListener) {
+      // 如果原来已经存在同名的监听事件了
+      targetElem[eventName] = function () {
+        oriListener.call(targetElem); // 调用原来已经存在监听方法
+        activeFun.call(targetElem); // 调用新添加的监听方法
+      };
+    } else {
+      targetElem[eventName] = function () {
+        activeFun.call(targetElem); // 调用新添加的监听方法
+      };
+    }
+  },
+
+  /** 当前页面的第一个FORM元素* */
+  form: null,
+
+  /** 用于显示表单验证结果的iframe的Id或Name* */
+  MsgIframeIdorName: "msgIframe",
+
+  /** 用于显示表单验证结果的div的Id或Name* */
+  MsgDivIdorName: "msgDiv",
+
+  /** 用于显示表单验证结果的iframe* */
+  MsgIframe: null,
+
+  /** 已经初始化成功* */
+  initOk: false,
+
+  /**
+   * 如果表单存在,则为表单绑定onsubmit校验事件
+   *
+   * @param {}
+   *            targetForm 需要校验的FORM的name或者ID
+   * @return {Boolean} 返回校验结果,为真则校验通过
+   */
+  checkForm: function (targetForm) {
+    try {
+      var THIS = this;
+
+      if (!targetForm) {
+        // 如果目标form不存在
+        //alert('checkForm方法执行出错,参数不能为空!');
+        console.log("checkForm方法执行出错,参数不能为空!");
+        return;
+      }
+
+      if ((typeof targetForm).toUpperCase() == "STRING")
+        // 如果输入的是FORM的name或者ID
+        var targetForm = this.getElement(targetForm);
+
+      if (!targetForm.validationManager) {
+        // 如果FORM中没校验器,则添加一个校验器
+        targetForm.validationManager = this;
+
+        var activeFun = function (showerror) {
+          // 为表单绑定onsubmit事件
+
+          try {
+            if (window.beforeBatchSubmit) {
+              window.beforeBatchSubmit();
+            }
+          } catch (e) {
+            console.log(e);
+          }
+
+          var rsArr = targetForm.validationManager.checkAll(
+            targetForm.validationManager.validationInfos
+          );
+          console.log(rsArr)
+          var totalMsg = ""; // 保存校验显示的消息
+
+          for (var i = 0; i < rsArr.length; i++) {
+            var rs = rsArr[i];
+            var msg = rs.msg;
+
+            var regExp = /[\n\r]+$/; // 测试校验结果结尾有没有换行符的正则表达式
+            var hasLineBreak; // 有换行符
+            hasLineBreak = regExp.test(msg);
+
+            // if(hasLineBreak)//如果有换行符
+            // totalMsg+=msg;
+            // else
+            totalMsg += msg + "<br>";
+          }
+
+          if (totalMsg) {
+            // 如果校验不通过
+            if (showerror == false) return false; //如果不显示错误
+            try {
+              var windowId = new Date().getTime();
+              var width = 400;
+              var high = 400;
+
+              // wd.topWindow.dhxWins.enableAutoViewport(true);//让窗口大小自动适应内容
+
+              var w = wd.topWindow.dhxWins.createWindow(
+                windowId,
+                0,
+                0,
+                width,
+                high
+              );
+
+              //----------------加遮罩层开始  ----------------
+              if (!wd.topWindow.wd.display.wdDialogOpeners) {
+                wd.topWindow.wd.display.wdDialogOpeners = {};
+              }
+              var wdDialogId = windowId;
+              wd.topWindow.wd.display.wdDialogOpeners[wdDialogId] = window;
+              var containerObj = wd.topWindow.wd.display;
+
+              if (wd.topWindow.document.querySelector("#validationTotalMsg")) {
+                wd.topWindow.document
+                  .querySelector("#validationTotalMsg")
+                  .close();
+              }
+
+              //----------------加遮罩层结束  ----------------
+
+              w.keepInViewport(true); // 保持在窗口内
+              w.center(); // 居中
+
+              var title =
+                "<span style=\"font-size: 18px; '宋体';line-height:30px; color: #333;margin-left: 5px;\" >录入数据错误</span>";
+              w.setText(title); // 设置窗口标题
+              w.setModal(true); // 设置模式窗口
+              w.bringToTop(); // 置顶
+
+              // 隐藏不需要的按钮
+              // alert(document.getElementById("mainContainer")==wd.topWindow.document.body);
+
+              if (w.button("help")) w.button("help").hide();
+              if (w.button("stick")) w.button("stick").hide();
+              if (w.button("sticked")) w.button("sticked").hide();
+              if (w.button("park")) w.button("park").hide();
+              if (w.button("minmax1"))
+              // 隐藏最大化按钮
+              w.button("minmax1").hide();
+              w.denyResize(); // 不允许改变大小
+              var innerDiv =
+                '<div id="innerFrame" class="scrollbar" style="width: ' +
+                (width - 5) +
+                ';height:calc(100% - 53px);display:flex;align-items:center;justify-content: space-around;overflow:auto;line-height:30px;font-size:16px;color:red;box-sizing:border-box;padding-left:15px;" >' +
+                totalMsg +
+                '</div><div class="bottom-div" style="position:absolute;"><div class="bottom-down-div"><input type="button" value="关闭" class="bottom-button" id="closeButton" style="letter-spacing: 6px;"></div></div></div>';
+              w.attachHTMLString(innerDiv);
+
+              w.setAttribute("id", "validationTotalMsg");
+
+              var currentDialogZIndex = w.zi; // 弹出窗口的z-index
+              wd.display.dxwindowsCreateMaskDiv(currentDialogZIndex);
+
+              w.attachEvent("onClose", function (win) {
+                wd.display.dxwindowsCloseMaskDiv(); //关闭wddialog时,移除遮罩层
+                return true;
+              });
+              try {
+                wd.display.initStyleWdButtons();
+
+                $(w).on("click", "#closeButton", function () {
+                  w.close();
+                });
+              } catch (e) {
+                console.log(e);
+              }
+
+              var divArr =
+                wd.topWindow.document.querySelectorAll("[ida=dhxMainCont]");
+              for (var i = 0; i < divArr.length; i++) {
+                divArr[i].style.backgroundColor = "";
+              }
+            } catch (e) {
+              //alert(totalMsg);// 弹出校验结果
+            }
+            THIS.hideMsgDiv();
+            return false;
+          } else return true;
+        }; //end function
+
+        //如果用户直接调用form的submit方法,则校验不会生效。因此,这里覆盖原来form的submit方法\
+
+        targetForm.oriSubmit = targetForm.submit;
+        targetForm.checkOnly = function (boo) {
+          boo = typeof boo == "undefined" ? true : boo;
+          //					!(boo == null ? true : boo);
+          return activeFun(boo);
+        };
+        targetForm.submit = function () {
+          if (activeFun()) targetForm.oriSubmit();
+        };
+        wd.c.addEventListener(
+          targetForm, //需绑定监听事件的DOM元素
+          "onsubmit", //事件名称,如:onclick
+          activeFun
+        );
+      }
+    } catch (e) {
+      if (this.debug)
+        //alert('方法checkForm执行异常:'+e);
+        console.log("方法checkForm执行异常:" + e);
+    }
+  },
+
+  /** 如果为真则自动为当前页面的第一个表单绑定onsubmit校验事件* */
+  formAutoCheck: true,
+
+  /** 初始化变量的方法,只需执行一次* */
+  init: function () {
+    try {
+      if (this.initOk) return; // 如果已经初始化过了,就返回。
+
+      if (!this.MsgIframe)
+        this.MsgIframe = this.getElement(this.MsgIframeIdorName);
+
+      if (!this.MsgDiv) this.MsgDiv = this.getElement(this.MsgDivIdorName);
+
+      if (this.formAutoCheck) {
+        //              var forms = document.getElementsByTagName('form');
+        var forms = $("form:visible"); //过滤隐藏form
+        this.form = forms[forms.length - 1]; // 当前页面的第一个FORM元素
+
+        if (this.form) {
+          // 如果表单存在,则为表单绑定onsubmit事件
+          this.checkForm(this.form);
+        }
+      }
+
+      this.initOk = true;
+    } catch (e) {
+      if (this.debug)
+        //alert('方法init执行异常:'+e);
+        console.log("方法init执行异常:" + e);
+    }
+  },
+
+  /** 设定显示表单验证结果的iframe的显示内容* */
+  setMsg: function (rsArr) {
+    // try{
+    // 调用iframe中的方法,设置表单验证结果的iframe的显示内容
+
+    if (!rsArr || rsArr.length == 0) return;
+
+    //  console.log(rsArr)
+    //this.MsgDiv.firstChild.innerHTML = rsArr[0].msg + "<div class=\"flashMsg-up warningFlashMsg-up\"></div>";
+    this.MsgDiv.querySelector(".msgDiv-content").innerHTML = rsArr[0].msg;
+    // 暂时隐藏20181128
+    // window.top.frames[this.MsgIframeIdorName].setMsg(rsArr);
+
+    // alert(document.frames.length);
+
+    // }catch(e){
+    // if(this.debug)
+    // alert('方法setMsg执行异常:'+e.message);
+    // }
+  },
+
+  /**
+   * 返回传入对象e的绝对坐标,并作为一个对象返回
+   *
+   * @param {}
+   *            e
+   * @return {"x": x, "y": y}
+   */
+  getAbsPoint: function (e) {
+    try {
+      var x = e.offsetLeft;
+      var y = e.offsetTop;
+      var w = e.offsetWidth;
+      var h = e.offsetHeight;
+
+      /**
+       * OffsetParent为从中计算偏移量的元素。 如果某个元素的父级或此元素层次结构中的其他元素使用相对或绝对定位, 则 OffsetParent
+       * 将成为当前元素嵌套到的第一个相对或绝对定位元素。如果当前元素以上的任何元素都不是绝对 或相对定位的,则 OffsetParent 将是文档的
+       * BODY 标记。
+       *
+       * obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素。 obj.offsetLeft 指 obj
+       * 距离左方或上层控件的位置,整型,单位像素。
+       *
+       * offsetTop与offsetLeft均为相对偏移量,但是下面不断地拿offsetParent的偏移量来累加,
+       * 直至拿到offsetParent为body之后,就没有offsetParent了,此时循环才终止。
+       * 最终计算出来的x,y为e相对body的绝对坐标。
+       */
+      while ((e = e.offsetParent)) {
+        // 只要对象的offsetParent存在,则继续累加XY,
+
+        x += e.offsetLeft;
+        y += e.offsetTop;
+      }
+
+      return {
+        x: x,
+        y: y,
+        w: w,
+        h: h,
+      };
+    } catch (e) {
+      if (this.debug)
+        //alert('方法getAbsPoint执行异常:'+e);
+        console.log("方法getAbsPoint执行异常:" + e);
+    }
+  },
+
+  /**
+   * refleshIframeFun:function(){ if(!this.hasRefleshedIframe){
+   * document.getElementById("validationDiv").innerHTML='<iframe name="msgIframe"
+   * id="msgIframe" src="'+validationManagerPath+ '/validationMsg.html"
+   * scrolling="no" frameborder="0" style="visibility: visible;position: absolute;
+   * width: 100%; height: 100%;"></iframe>'; this.hasRefleshedIframe = true; } },
+   */
+  /**
+   * MsgDiv定位于要校验的目标input元素的上方
+   *
+   * @param {}
+   *            targetInput 要校验的目标input元素
+   */
+  showMsgDiv: function (targetInput, msg) {
+    try {
+      wd.flashMsg.show({
+        el: targetInput, // 吸附的元素
+        msg: msg, // 内容
+        animate: false,
+      });
+    } catch (e) {
+      console.log(e);
+    }
+
+    if (true) return;
+    // try{
+
+    // this.refleshIframeFun();
+
+    var win = window;
+    var xy = this.recursionIframe(win);
+    //		var inputElem = document.getElementsByName(targetInput.name)[0];
+    var offset = this.getInputOffset(targetInput, true);
+    var height = this.MsgDiv.offsetHeight;
+    this.MsgDiv.style.left = xy.x + offset.left + "px";
+    var tailDiv = this.MsgDiv.querySelector(".msgDiv-tail");
+    var msgtop;
+    if (offset.top < window.innerHeight / 2) {
+      //录入框下方,尾巴向上
+      msgtop = xy.y + offset.top + 38 + "px";
+      tailDiv.setAttribute("class", "msgDiv-tail flashMsg-up");
+    } else {
+      //录入框上方,尾巴向下
+      msgtop = xy.y + offset.top - height - 38 + "px";
+      tailDiv.setAttribute("class", "msgDiv-tail flashMsg-down");
+    }
+    this.MsgDiv.style.top = msgtop;
+
+    // 调用隐藏的方法,让tips在3s后隐藏
+    var dom = this.MsgDiv;
+    function hideDom(dom) {
+      dom.style.top = "-500px";
+    }
+    if (validationTimeOutId) clearTimeout(validationTimeOutId);
+
+    validationTimeOutId = setTimeout(function () {
+      hideDom(dom);
+    }, 3000);
+
+    /**
+     * }catch(e){ if(this.debug) alert('方法执行异常:'+e); }
+     */
+  },
+
+  /**
+   * 获取输入光标在页面中的坐标 【..】
+   *
+   * @param {HTMLElement}
+   *            输入框元素
+   * @param {Boolean}
+   *            返回焦点光标顶部的top值(默认false)
+   * @return {Object} 返回left和top
+   */
+  getInputOffset: function (elem, focusTop) {
+    var that = this,
+      cloneDiv = "{$clone_div}",
+      cloneLeft = "{$cloneLeft}",
+      cloneFocus = "{$cloneFocus}",
+      cloneRight = "{$cloneRight}",
+      none = '<span style="white-space:pre-wrap;"> </span>',
+      div = elem[cloneDiv] || document.createElement("div"),
+      left = elem[cloneLeft] || document.createElement("span"),
+      focus = elem[cloneFocus] || document.createElement("span"),
+      right = elem[cloneRight] || document.createElement("span"),
+      offset = that._offset(elem),
+      index = this._getFocus(elem),
+      focusOffset = {
+        left: 0,
+        top: 0,
+      };
+
+    div.style.width = this._getStyle(elem, "width");
+    div.style.height = this._getStyle(elem, "height");
+
+    try {
+      div.scrollLeft = elem.scrollLeft;
+      div.scrollTop = elem.scrollTop;
+    } catch (e) {} // IE8
+
+    left.innerHTML = ((elem.value && elem.value.substring(0, index)) || "")
+      .replace(/</g, "&lt;")
+      .replace(/>/g, "&gt;")
+      .replace(/\n/g, "<br/>")
+      .replace(/\s/g, none);
+    right.innerHTML = (
+      (elem.value && elem.value.substring(index, elem.value.length)) ||
+      ""
+    )
+      .replace(/</g, "&lt;")
+      .replace(/>/g, "&gt;")
+      .replace(/\n/g, "<br/>")
+      .replace(/\s/g, none);
+
+    focus.style.display = "inline-block";
+    try {
+      focusOffset = this._offset(focus);
+    } catch (e) {}
+    focus.style.display = "none";
+
+    return {
+      left: offset.left + focusOffset.left,
+      top: offset.top + focusOffset.top + (focusTop ? focus.offsetHeight : 0),
+    };
+  },
+
+  // 获取元素在页面中位置
+  _offset: function (elem) {
+    var box = elem.getBoundingClientRect();
+    var doc = elem.ownerDocument;
+    var body = doc.body;
+    var docElem = doc.documentElement;
+    var clientTop = docElem.clientTop || body.clientTop || 0;
+    var clientLeft = docElem.clientLeft || body.clientLeft || 0;
+    var top = box.top + (self.pageYOffset || docElem.scrollTop) - clientTop;
+    var left = box.left + (self.pageXOffset || docElem.scrollLeft) - clientLeft;
+
+    return {
+      left: left,
+      top: top,
+    };
+  },
+
+  // 获取光标在文本框的位置
+  _getFocus: function (elem) {
+    var index = 0;
+    if (elem.nodeName === "TEXTAREA") {
+      if (document.selection) {
+        // IE Support
+        elem.focus();
+        var Sel = document.selection.createRange();
+        var Sel2 = Sel.duplicate();
+        Sel2.moveToElementText(elem);
+        var index = -1;
+        while (Sel2.inRange(Sel)) {
+          Sel2.moveStart("character");
+          index++;
+        }
+      } else if (elem.selectionStart || elem.selectionStart == "0") {
+        // Firefox
+        // support
+        index = elem.selectionStart;
+      }
+      return index;
+    } else {
+      // input
+      if (document.selection) {
+        // IE Support
+        elem.focus();
+        var Sel = document.selection.createRange();
+        Sel.moveStart("character", -elem.value.length);
+        index = Sel.text.length;
+      } else if (elem.selectionStart || elem.selectionStart == "0") {
+        // Firefox
+        // support
+        index = elem.selectionStart;
+      }
+      return index;
+    }
+  },
+
+  // 获取最终样式
+  _getStyle:
+    "getComputedStyle" in window
+      ? function (elem, name) {
+          return getComputedStyle(elem, null)[name];
+        }
+      : function (elem, name) {
+          return elem.currentStyle[name];
+        },
+
+  /** 隐藏MsgDiv的方法* */
+  hideMsgDiv: function () {
+    // try{
+
+    //      this.MsgDiv.style.top = "-500px";
+    /**
+     * }catch(e){ if(this.debug) alert('方法showMsgD\niv执行异常:'+e); }
+     */
+
+    try {
+      wd.flashMsg.clear();
+    } catch (e) {
+      console.log(e);
+    }
+  },
+
+  /**
+   * 为指定的input元素绑定校验方法的公共方法
+   */
+  initInput: function (validationInfo) {
+    try {
+      this.init(); // 初始化变量的方法
+
+      this.validationInfos.push(validationInfo);
+
+      for (var i = 0; i < validationInfo.formElems.length; i++) {
+        // 被校验的表单元素
+        var targetInput = validationInfo.formElems[i];
+
+        // 保存校验信息到表单元素中
+        if (!targetInput.validationInfos) {
+          targetInput.validationInfos = [];
+        }
+
+        targetInput.validationInfos.push(validationInfo);
+
+        //				console.log(targetInput.validationInfos)
+        /** 保存原来的borderBottomColor* */
+        if (targetInput.style.borderBottomColor)
+          targetInput.oldBorderColor = targetInput.style.borderBottomColor;
+        else targetInput.oldBorderColor = "default";
+
+        targetInput.validationManager = this;
+
+        //				$(targetInput).addClass("validation-"+targetInput.tagName.toLowerCase());
+        $(targetInput).addClass("border-" + targetInput.tagName.toLowerCase());
+
+        if (realTimeCheck) {
+          // 如果要进行实时检查
+
+          var activeFun = function () {
+            //if(this.value!==''&&this.value!==null){
+            this.validationManager.checkForRealTime(this); // 检查目标input元素的值
+            /*
+                        }else{
+                        this.style.borderBottomColor='';//清空则去掉红框
+                        this.validationManager.hideMsgDiv();// 隐藏MsgDiv
+                        }
+                         */
+            //						targetInput.style.borderBottomColor="blue"
+          };
+
+          /** 为要校验的input元素绑定获得焦点事件* */
+          this.addEventListener(
+            targetInput, // 需绑定监听事件的DOM元素
+            "onfocus", // 事件名称,如:onclick
+            activeFun
+          ); // 事件触发的回调函数
+
+          this.mouseoverEvent(targetInput, activeFun);
+
+          /** 为要校验的input元素绑定失去焦点事件* */
+          var onblurFun = function () {
+            // 隐藏MsgDiv   暂时去掉20181128
+            //	this.validationManager.hideMsgDiv();
+            //						targetInput.style.borderBottomColor=""
+          };
+          this.addEventListener(
+            targetInput, // 需绑定监听事件的DOM元素
+            "onblur", // 事件名称,如:onclick
+            onblurFun
+          ); // 事件触发的回调函数
+          //初始化ueditor的校验事件
+          if (
+            typeof EditorManager != "undefined" &&
+            EditorManager &&
+            (validationInfo.argsObj.isUeditor == true ||
+              validationInfo.argsObj.isUeditor == "true")
+          ) {
+            var vmr = this;
+            window.ueCallback = window.ueCallback || [];
+            var name = validationInfo.argsObj.editorName;
+            window.ueCallback[name] = window.ueCallback[name] || [];
+            window.ueCallback[name].push(function () {
+              EditorManager.getWDEditor(validationInfo.argsObj.editorName)
+                .getUeditor()
+                .addListener("selectionchange", function () {
+                  // vmr.addEventListener(targetInput, // 需绑定监听事件的DOM元素
+                  // 'onblur', // 事件名称,如:onclick
+                  // onblurFun);
+                  // vmr.addEventListener(targetInput, // 需绑定监听事件的DOM元素
+                  // 'onfocus', // 事件名称,如:onclick
+                  // activeFun); // 事件触发的回调函数
+                  var iframe_ = EditorManager.getEditorFrame(name);
+                  iframe_.validationInfo = targetInput.validationInfo;
+                  iframe_.validationInfos = targetInput.validationInfos;
+                  iframe_.validationManager = targetInput.validationManager;
+                  onblurFun.call(iframe_);
+                  activeFun.call(iframe_);
+                });
+            });
+          }
+          //				if(targetInput.tagName.toUpperCase()=='SELECT'){// 如果要校验的不是select元素
+          //					/** 为要校验的input元素绑定键盘点击事件* */
+          //					this.addEventListener(targetInput,// 需绑定监听事件的DOM元素
+          //	 							'onkeyup',// 事件名称,如:onclick
+          //	 							activeFun);// 事件触发的回调函数
+          //				}else{
+          //
+          //					/** 为要校验的input元素绑定键盘点击事件* */
+          //					this.addEventListener(targetInput,// 需绑定监听事件的DOM元素
+          //	 							'onchange',// 事件名称,如:onclick
+          //	 							activeFun);// 事件触发的回调函数
+          //				}
+
+          var eventType = null;
+          //选择合适的时间为元素绑定
+          //select
+          if (targetInput.tagName == "SELECT") {
+            eventType = "onchange";
+            //input
+          } else if (
+            targetInput.tagName == "INPUT" ||
+            targetInput.tagName == "TEXTAREA"
+          ) {
+            eventType = "onkeyup";
+            if (targetInput.type == "button") {
+              eventType = "onclick";
+            }
+            //button
+          } else if (targetInput.tagName == "button") {
+            eventType = "onclick";
+          }
+
+          if (eventType == null) {
+            console.log(targetInput);
+            console.log("元素不支检验");
+            //alert("元素不支检验")
+            return;
+          }
+
+          //为元素绑定即时校验事件
+          this.addEventListener(
+            targetInput, // 需绑定监听事件的DOM元素
+            eventType, // 事件名称,如:onclick
+            activeFun
+          ); // 事件触发的回调函数
+        }
+      } // for
+
+      //预校验,不用等到提交表单才校验  By Rd 2015-11-12
+      this.checkAll(targetInput.validationInfos);
+
+      //          this.MsgDiv.style.top = "-500px"
+      this.hideMsgDiv();
+    } catch (e) {
+      console.log(e);
+      if (this.debug)
+        //alert('方法initInput执行异常:'+e);
+        console.error("方法initInput执行异常:" + e);
+    }
+  },
+
+  /**
+   * 为指定的表单元素绑定校验方法
+   */
+  add: function (
+    validatorStr, // 内容为校验方法全路径的字符串
+    formElems, // 被校验的表单元素的name或id
+    argsObj, // 内容为当前校验器使用的参数组成的关联数组
+    type
+  ) {
+    // 校验结果严重等级
+    try {
+      if (!type) type = ValidationManager.MSG_TYPE_ERROR;
+
+      var validationInfo = {}; // 保存一次校验所需信息的集合
+
+      validationInfo.funRef = this.getFunRef(validatorStr); // 校验器方法引用
+      validationInfo.argsObj = argsObj; // 内容为当前校验器使用的参数组成的关联数组
+      validationInfo.type = type; // 校验结果严重等级
+
+      validationInfo.formElems = []; // 被校验的表单元素
+
+      validationInfo.isNull = function () {
+        return this.formElems[0].value ? false : true;
+      };
+
+      //	validationInfo.formElems=this.getElements(eName);
+      //查找表单元素
+      for (var i = 0; i < formElems.length; i++) {
+        var eName = formElems[i];
+        if (window.growHeightList && window.growHeightList[eName]) {
+          var gh = window.growHeightList[eName];
+          var elems = [gh.getInputElement()];
+          if (elems)
+            validationInfo.formElems = validationInfo.formElems.concat(elems);
+        } else {
+          var elems = this.getElements(eName);
+          if (elems)
+            validationInfo.formElems = validationInfo.formElems.concat(elems);
+        }
+      }
+
+      //bmxy1.xy
+      //批量录入
+      if (formElems[0].split(/\./).length == 2) {
+        argsObj["namePrefix"] = formElems[0].split(/\./)[0] + ".";
+      } else {
+        argsObj["namePrefix"] = "";
+      }
+      validationInfo.name = formElems[0];
+
+      //	console.log(validationInfo)
+      //只有找到对应表单元素时才绑定校验方法 张敏聪2015-10-30
+      if (validationInfo.formElems.length > 0) {
+        // 为指定的input元素绑定校验方法的公共方法
+        this.initInput(validationInfo);
+      }
+    } catch (e) {
+      if (this.debug) console.log("方法add执行异常:" + e);
+      //alert('方法add执行异常:'+e);
+    }
+  },
+  remove: function (
+    validatorStr, // 校验器方法的全路径字符串
+    formElems // 需要移除校验的表单元素的 name 或 id
+  ) {
+    try {
+      // 获取校验方法引用
+      var validationInfo = {
+        funRef: this.getFunRef(validatorStr),
+        formElems: []
+      };
+  
+      // 查找表单元素
+      for (var i = 0; i < formElems.length; i++) {
+        var eName = formElems[i];
+        var elems = this.getElements(eName);
+        if (elems) {
+          validationInfo.formElems = validationInfo.formElems.concat(elems);
+        }
+      }
+  
+      // 如果找到了对应的表单元素
+      if (validationInfo.formElems.length > 0) {
+        for (var j = 0; j < validationInfo.formElems.length; j++) {
+          var elem = validationInfo.formElems[j];
+  
+          // 1. 移除所有校验相关事件绑定
+          $(elem).off('input.validation keyup.validation change.validation focus.validation blur.validation');
+  
+          // 2. 移除校验提示信息(如错误消息)
+          $(elem).removeClass('validation-error'); // 移除错误样式
+          $(elem).next('.validation-error-msg').remove(); // 移除错误提示信息
+  
+          // 3. 恢复原始样式(例如,边框颜色)
+          if (elem.oldBorderColor) {
+            elem.style.borderBottomColor = elem.oldBorderColor;
+          } else {
+            elem.style.borderBottomColor = ''; // 如果没有保存原始样式,使用默认样式
+          }
+  
+          // 4. 移除与必填项标记 `span` 无关的样式
+          var spanId = elem.name + "Span"; // 拼接出对应的 span id,例如 "jfrxmSpan"
+          var spanElem = document.getElementById(spanId);
+          if (spanElem) {
+            spanElem.remove(); // 直接删除这个 span 元素
+          }
+  
+          // 5. 移除校验信息缓存
+          this.validationInfos = this.validationInfos.filter(function(info) {
+            return info.funRef !== validationInfo.funRef || 
+                  !info.formElems.some(elem => validationInfo.formElems.includes(elem));
+          });
+
+          // 6. 清理校验信息缓存
+          if (elem.validationInfos) {
+            elem.validationInfos = elem.validationInfos.filter(function(info) {
+              return info.funRef !== validationInfo.funRef;
+            });
+          }
+
+        }
+      }
+    } catch (e) {
+      if (this.debug) console.log("方法 remove 执行异常: " + e);
+    }
+  }
+  ,
+  
+  /**
+   * 执行一次校验
+   *
+   * @param {}
+   *            validationInfo 保存一次校验的配置的对象
+   * 				单个校验
+   */
+  check: function (validationInfo, targetinput) {
+    var rs = {}; // 保存校验结果的对象
+    var funRef = validationInfo.funRef; // 校验器方法引用
+    var argsObj = validationInfo.argsObj; // 内容为当前校验器使用的参数组成的关联数组
+    var type = validationInfo.type; // 校验结果严重等级
+    //	console.log(targetinput.validationInfos)
+    var funArgs = [];
+    //2017-12-4 zhangmincong radio判断
+    //      if (targetinput.type && 'radio|checkbox'.indexOf(targetinput.type.toLowerCase()) > -1) {
+    //          var rdos = document.querySelectorAll("[type='" + targetinput.type + "'][name='" + targetinput.name + "']"),
+    //          value;
+    //          console.log(rdos)
+    //          for (var i = 0; i < rdos.length; i++) {
+    //              console.log(rdos[i].checked)
+    //              if (rdos[i].checked == true) {
+    //                  value = rdos[i].value;
+    //                  break;
+    //              }
+    //          }
+    //          funArgs.push([value]);
+    //      } else if ((typeof EditorManager != "undefined") && (argsObj.isUeditor == true || argsObj.isUeditor == "true")) {
+    //          if (EditorManager.getWDEditor(argsObj.editorName)) {
+    //              var value = EditorManager.getWDEditor(argsObj.editorName).getUeditor().getContent();
+    //              value = wd.display.toPlainText(value);
+    //              // console.log("ueditorValue:"+value);
+    //              funArgs.push([value]);
+    //          }
+    //      } else if (targetinput.tagName == "DIV") {
+    //          funArgs.push([targetinput.innerHTML])
+    //      } else if (targetinput.GrowHeight) {
+    //          funArgs.push([targetinput.GrowHeight.val()]);
+    //      } else {
+    //          funArgs.push([targetinput.value])
+    //      }
+    //		console.log(targetinput);
+    //      funArgs.push(argsObj)
+    // var win = window;
+    // var xy = this.recursionIframe(win);
+
+    // 调用校验器进行校验
+    var msg;
+    try {
+      //          msg = funRef.apply(window, funArgs);
+
+      //校验器获取根据name获得其他录入
+      var environment = {
+        argsObj: argsObj,
+        getElementValue: function (name) {
+          //单个或 批量 取值
+          var n = this.argsObj.namePrefix + name;
+          //id查找
+          var ele = document.querySelector("input[id='" + n + "']");
+          if (ele) return ele.value;
+          //name查找
+          var box = wd.display.getInputBox(n, true);
+          return box ? box.getValue() : null;
+        },
+        setElementValue: function (name, value) {
+          //单个或 批量 设值.....自动填写性别、出生地区、出生日期
+          var n = this.argsObj.namePrefix + name;
+          //name查找
+          var box = wd.display.getInputBox(n, true);
+          if (!box) {
+            console.log("set value fail:" + n);
+            return;
+          }
+          box.setValue(value);
+        },
+        modify: function (names, canModify) {
+          //names:["xm","xbm"]  录入可修改,不可修改
+
+          for (var i = 0; i < names.length; i++) {
+            var n = this.argsObj.namePrefix + names[i];
+            var box = wd.display.getInputBox(n);
+            if (box) {
+              box.modify(canModify);
+            }
+          }
+        },
+      };
+      var vbox = wd.display.getInputBox(validationInfo.name, true);
+      var vv = vbox ? vbox.getValue() : "";
+      funArgs.push([vv]);
+      funArgs.push(argsObj);
+      msg = funRef.apply(environment, funArgs);
+    } catch (e) {
+      console.error(e);
+      msg = "校验方法错误:" + validationInfo.funRef;
+    }
+    // 保存校验信息
+    rs.msg = msg;
+    rs.formElems = [targetinput];
+
+    if (msg)
+      // 如果校验不通过
+      rs.type = type;
+    else rs.type = ValidationManager.MSG_TYPE_SUCCESS;
+
+    //		console.log(rs);
+    return rs;
+  },
+  checks: function (validationInfo, targetInput) {
+    var result = [];
+    if (targetInput) {
+      var elem = targetInput;
+      var rs = this.check(validationInfo, elem);
+      //校验未通过
+      if (rs.msg && rs.msg.length > 0) {
+        result.push(rs);
+        elem.style.borderBottomColor = "red";
+      } else {
+        //通过
+        this.hideMsgDiv();
+        // 如果运行到这里证明校验通过
+        if (elem.oldBorderColor == "default") elem.style.borderBottomColor = "";
+        else elem.style.borderBottomColor = elem.oldBorderColor;
+      }
+    } else {
+      for (var i = 0; i < validationInfo.formElems.length; i++) {
+        var elem = validationInfo.formElems[i];
+        var rs = this.check(validationInfo, elem);
+        //			console.log(rs.msg)
+        //校验未通过
+        if (rs.msg && rs.msg.length > 0) {
+          result.push(rs);
+          elem.style.borderBottomColor = "red";
+        } else {
+          //通过
+          this.hideMsgDiv();
+          // 如果运行到这里证明校验通过
+          if (elem.oldBorderColor == "default")
+            elem.style.borderBottomColor = "";
+          else elem.style.borderBottomColor = elem.oldBorderColor;
+        }
+      }
+    }
+
+    return result;
+  },
+  checkInput: function (targetinput) {
+    var result = [];
+
+    //	targetinput里存有校验器
+    if (targetinput.validationInfos) {
+      var validationInfos = targetinput.validationInfos;
+      for (var i = 0; i < validationInfos.length; i++) {
+        var elem = targetinput;
+
+        var rs = this.check(validationInfos[i], elem);
+
+        //校验未通过
+        if (rs.msg && rs.msg.length > 0) {
+          result.push(rs);
+
+          //				elem.style.borderBottomColor='red';
+        } else {
+          //通过
+          //				this.hideMsgDiv()
+          //				// 如果运行到这里证明校验通过
+          //				if(elem.oldBorderColor=='default')
+          //					elem.style.borderBottomColor='';
+          //				else
+          //					elem.style.borderBottomColor=elem.oldBorderColor;
+        }
+      }
+    }
+
+    return result;
+  },
+  /**
+   * 对数组中消息进行排序。
+   */
+  sortRs: function (a, b) {
+    if (!a || !b) return -1;
+
+    var typeA = a.type;
+    var typeB = b.type;
+
+    if (typeB == ValidationManager.MSG_TYPE_ERROR) {
+      return 1;
+    } else return -1;
+  },
+
+  /**
+   * 获取表单元素的名字或ID
+   */
+  getNameOrId: function (formElem) {
+    if (formElem.name) return formElem.name;
+    else return formElem.id;
+  },
+
+  /**
+   * 为保存到数组rsArr的消息,添加前缀。
+   */
+  addMsgPrefix: function (rsArr) {
+    for (var i = 0; i < rsArr.length; i++) {
+      var rs = rsArr[i];
+
+      var prefix;
+
+      if (rs.type == ValidationManager.MSG_TYPE_SUCCESS) {
+        prefix = "正确:";
+      } else if (rs.type == ValidationManager.MSG_TYPE_ERROR) {
+        prefix = "错误:";
+      } else if (rs.type == ValidationManager.MSG_TYPE_WARNING) {
+        prefix = "警告:";
+      }
+
+      rs.msg = prefix + rs.msg;
+      console.log(rs);
+    }
+  },
+
+  /**
+   * 检查所有要校验的input元素,并返回校验失败的结果
+   */
+  checkAll: function (validationInfos, targetInput) {
+    var rsArr = []; // 返回的校验结果
+
+    var allFormElems = []; // 保存所有要校验的表单元素
+    var errFormElems = {}; // 所有校验不通过的表单元素
+
+    for (var i = 0; i < validationInfos.length; i++) {
+      // 一个校验信息
+      var validationInfo = validationInfos[i];
+      /**
+       * 校验并获得校验结果 rs.msg = msg; rs.type = type; rs.formElems = formElems;
+       */
+      for (var j = 0; j < validationInfo.formElems.length; j++) {
+        var elem = validationInfo.formElems[j];
+        var rs = this.check(validationInfo, elem);
+        //				console.log(rs.msg)
+        //校验未通过
+        if (rs.msg && rs.msg.length > 0) rsArr.push(rs);
+
+        this.via(elem, rs.msg);
+
+        //				if (rs.msg && rs.msg.length > 0) {
+        //					rsArr.push(rs)
+        //					elem.style.borderBottomColor = 'red';
+        //					this.checkObjectPicker(elem,rs.msg);
+        //				} else { //通过
+        //
+        //					// 如果运行到这里证明校验通过
+        //					if (elem.oldBorderColor == 'default')
+        //						elem.style.borderBottomColor = '';
+        //					else
+        //						elem.style.borderBottomColor = elem.oldBorderColor;
+        //
+        //					this.checkObjectPicker(elem);
+        //					this.hideMsgDiv()
+        //				}
+      }
+    }
+
+    // 对消息进行排序
+    // rsArr.sort(this.sortRs);
+
+    // 为保存到数组rsArr的消息,添加前缀。
+    // this.addMsgPrefix(rsArr);
+    //  console.log(rsArr)
+    return rsArr;
+  },
+
+  /**
+   * 如果校验通过,返回true
+   */
+  passValidation: function (rsArr) {
+    var rs = true;
+    if (rsArr && rsArr.length > 0) rs = false;
+    return rs;
+  },
+
+  /**
+   * 实时校验的方法
+   *
+   * @param {}
+   *            targetInput目标input元素
+   */
+  checkForRealTime: function (targetInput) {
+    // try{
+    if (window.event && "focus" == window.event.type) {
+      //          this.MsgDiv.style.top = "-500px"
+      this.hideMsgDiv();
+      return;
+    }
+
+    // 获得当前表单元素校验不通过的消息集
+    var rsArr = this.checkInput(targetInput);
+
+    var isnullFunction = false;
+
+    //		if(targetInput.validationInfos&&targetInput.validationInfos.length==1){
+    ////			console.log(targetInput.validationInfos[0].funRef==wd.commonValidator.notNull)
+    //			isnullFunction=(targetInput.validationInfos[0].funRef==wd.commonValidator.notNull)
+    //		}
+    //        isnullFunction = !$(targetInput).val()    // 去掉,导致鼠标进入时不显示错误信息 -- 不知干啥用???Lin
+
+    //		console.log(targetInput.validationInfos);
+    if (window.event) {
+      if (window.event.type == "keyup") isnullFunction = false;
+    }
+
+    if (!isnullFunction) this.setMsg(rsArr); // 设定显示表单验证结果的iframe的显示内容
+    //		console.log(rsArr);
+    this.via(targetInput, rsArr, isnullFunction);
+    //console.log(targetInput)
+    // 校验不通过,显示校验信息
+    //		if (!this.passValidation(rsArr)) {
+    ////			this.checkObjectPicker(targetInput,rsArr);
+    ////			targetInput.style.borderBottomColor = "red"
+    //			this.showMsgDiv(targetInput); // MsgDiv定位于要校验的目标input元素的上方
+    //		} else { // 校验通过
+    ////			this.checkObjectPicker(targetInput);
+    //
+    ////			if (targetInput.oldBorderColor == 'default') {
+    ////				targetInput.style.borderBottomColor = '';
+    ////			} else {
+    ////				targetInput.style.borderBottomColor = targetInput.oldBorderColor;
+    ////			}
+    //			this.hideMsgDiv(); // 隐藏MsgDiv
+    //		}
+
+    return rsArr;
+
+    /*
+     * }catch(e){ if(this.debug) alert('方法checkForRealTime执行异常:'+e.message); }
+     */
+  },
+
+  recursionIframe: function (win) {
+    if (win.parent == top && win.parent == win) {
+      // var xy = this.getAbsPoint(win);
+
+      return {
+        x: 0,
+        y: 0,
+        w: 0,
+        h: 0,
+      };
+    }
+    var winPar = win.parent; // .opener
+    var iframeArr = winPar.document.getElementsByTagName("IFRAME");
+    var targetIframe;
+    for (var i = 0; i < iframeArr.length; i++) {
+      var iframeElem = iframeArr[i];
+      if (iframeElem.contentWindow == win) {
+        targetIframe = iframeElem;
+        break;
+      }
+    }
+    // alert(targetIframe==null)
+    var xy = this.getAbsPoint(targetIframe);
+
+    if (winPar.parent != winPar) {
+      var xy2 = this.recursionIframe(winPar);
+      xy.x += xy2.x;
+      xy.y += xy2.y;
+    }
+
+    return xy;
+  },
+  findObjectPickerInputer: function (target) {
+    var name = target.getAttribute("name");
+    if (!name) return;
+    var inputer = document.querySelector("[name=" + name + "Name]");
+    if (!inputer) {
+      inputer = document.querySelector("[name=" + name + "Input]");
+      if (!inputer && /id$/.test(name)) {
+        var inputName = name.replace(/id$/, "Name");
+        inputer = document.querySelector("[name=" + inputName + "]");
+      }
+      if (!inputer && /m$/.test(name)) {
+        var inputName = name.replace(/m$/, "Name");
+
+        inputer = document.querySelector("[name=" + inputName + "]");
+      }
+    }
+    return inputer;
+  },
+  checkObjectPicker: function (target, msg) {
+    var name = target.getAttribute("name");
+
+    var obj = wd.edit.objectPicker.getInstance(name);
+    if (!obj) return;
+    if (msg) {
+      obj.failValidation();
+    } else {
+      obj.passValidation();
+    }
+
+    //		var inputer=this.findObjectPickerInputer(target);
+    //		if(!inputer)return;
+    //		if(msg){
+    //			inputer.style.border="red 1px solid";
+    //		}else{
+    //			inputer.style.border="";
+    //
+    //		}
+  },
+  via: function (targetInput, msg, isnullFunction) {
+    var gh = targetInput.GrowHeight;
+    var name = targetInput.getAttribute("name");
+    if (gh != null) {
+      name = targetInput.GrowHeight.getName();
+    }
+    if (!name || !wd.edit) return;
+
+    var leftSpan = document.getElementById(name + "Span");
+
+    if (!leftSpan) {
+      leftSpan = document.createElement("span");
+      leftSpan.setAttribute("id", name + "Span");
+      //			leftSpan.setAttribute("class","validation-span");
+      leftSpan.setAttribute("class", "border-input-error vLine-leftWarning");
+      //			leftSpan.style.borderLeft=" 1px solid red",
+      //			leftSpan.style.height="100%";
+      //  		leftSpan.style.display= "none";
+      //  		leftSpan.style.position="absolute";
+      //  		leftSpan.style.left="0px";
+    }
+
+    if (gh != null) {
+      var growHeightElement = gh.getElement();
+      growHeightElement.parentNode.insertBefore(leftSpan, growHeightElement);
+    } else {
+      targetInput.parentNode.insertBefore(leftSpan, targetInput);
+    }
+    var obj;
+    try {
+      obj = wd.edit.objectPicker
+        ? wd.edit.objectPicker.getInstance(name)
+        : null;
+    } catch (e) {
+      console.log(e);
+    }
+
+    // // 获取或创建错误提示容器
+    // function getErrorContainer() {
+    //   let errorContainer = document.getElementById("error-container");
+    //   if (!errorContainer) {
+    //     errorContainer = document.createElement("div");
+    //     errorContainer.id = "error-container"; // 设置唯一ID
+    //     errorContainer.style.cssText = `
+    //         position: fixed;
+    //         left: 0;
+    //         right: 0;
+    //         bottom: 0;
+    //         text-align: center;
+    //         background-color: #fff;
+    //         padding: 10px;
+    //         z-index: 1000;
+    //         display: flex;
+    //         font-size:1rem;
+    //         color: red;
+    //         justify-content: center;
+    //         align-items: center;
+    //         flex-direction: column;
+    //         min-height: 50px; /* 限制为五条信息的高度 */
+    //         overflow-y: auto; /* 超过五条信息时出现滚动条 */
+    //         `;
+    //     document.body.appendChild(errorContainer);
+    // }
+    // return errorContainer;
+    // }
+
+    // // 添加错误信息
+    // function addErrorMessage(name, msg) {
+    //   const errorContainer = getErrorContainer();
+    //   const errorId = `${name}-error`; // 基于 name 属性生成唯一的错误消息 ID
+
+    //   let errorMessage = document.getElementById(errorId);
+    //   if (!errorMessage) {
+    //     // 如果不存在,创建新的错误消息
+    //     errorMessage = document.createElement("div");
+    //     errorMessage.id = errorId; // 给错误消息设置唯一 ID
+    //     errorContainer.appendChild(errorMessage);
+    //   }
+    //   // 更新错误消息内容
+    //   errorMessage.textContent = msg;
+    // }
+
+    // // 移除特定错误信息
+    // function removeErrorMessage(name) {
+    //   const errorId = `${name}-error`;
+    //   const errorMessage = document.getElementById(errorId);
+    //   if (errorMessage) {
+    //     errorMessage.remove(); // 删除对应的错误消息
+    //   }
+    // }
+
+    // // 检查并移除错误容器
+    // function removeErrorContainerIfEmpty() {
+    //   const errorContainer = document.getElementById("error-container");
+    //   if (errorContainer && errorContainer.children.length === 0) {
+    //     errorContainer.remove(); // 容器中无内容时移除
+    //   }
+    // }
+
+    // 添加错误信息到指定的td元素中
+    function addErrorMessage(name, msg) {
+      const element = document.getElementsByName(name)[0]; // 获取 name 对应的元素
+      if (element) {
+        const tdElement = element.closest('td'); // 查找最近的父级 td 元素
+        if (tdElement) {
+          let errorMessage = tdElement.querySelector('.error-message'); // 查找是否已有错误信息元素
+          if (!errorMessage) {
+            // 如果不存在,创建一个新的错误信息元素
+            errorMessage = document.createElement("div");
+            errorMessage.className = "error-message"; // 设置一个类名,方便样式管理
+            errorMessage.style.cssText = `
+              position: absolute;
+              left: 0;
+              bottom: 0;
+              text-align: center;
+              color: red;
+              font-size:12px;
+              width: 100%;
+              text-align: right;
+              line-height: 18px;
+              height: 18px;
+            `;
+            tdElement.appendChild(errorMessage); // 将错误信息添加到 td 中
+            tdElement.style.borderBottom = "1px solid red";
+          }
+          errorMessage.textContent = msg; // 更新错误信息内容
+        }
+      }
+    }
+
+    // 移除特定错误信息
+    function removeErrorMessage(name) {
+      const element = document.getElementsByName(name)[0]; // 获取 name 对应的元素
+      if (element) {
+        const tdElement = element.closest('td'); // 查找最近的父级 td 元素
+        if (tdElement) {
+          const errorMessage = tdElement.querySelector('.error-message'); // 查找错误信息元素
+          if (errorMessage) {
+            errorMessage.remove(); // 删除错误信息元素
+          }
+        }
+        tdElement.style.borderBottom = "";
+      }
+    }
+
+    if (!this.passValidation(msg)) {
+      
+      leftSpan.style.display = "";
+      if (msg && msg.length > 0 && msg[0].msg) {
+        if (!isnullFunction) {
+          
+          if (obj) {
+            if(isMobile()){
+              addErrorMessage(obj, msg[0].msg); // 添加或更新错误消息
+            }else{
+              this.showMsgDiv(obj.getDisplayElement(), msg[0].msg);
+            }
+          } else {
+            // 如果是移动端,在底部显示错误信息,否则在气泡
+            if(isMobile()){
+              addErrorMessage(name, msg[0].msg); // 添加或更新错误消息
+            }else{
+              this.showMsgDiv(targetInput, msg[0].msg);
+            }
+          }
+        }
+      }
+    } else {
+      // 校验通过
+      removeErrorMessage(name); // 移除当前 name 对应的错误消息
+      //removeErrorContainerIfEmpty(); // 如果没有错误信息,移除容器
+      //			this.checkObjectPicker(targetInput);
+      leftSpan.style.display = "none";
+      //			targetInput.style.borderColor = '';
+      this.hideMsgDiv(); //隐藏MsgDiv;
+    }
+  },
+  mouseoverEvent: function (targetInput, activeFun) {
+    var THIS = this;
+    var target = targetInput;
+    var name = targetInput.getAttribute("name");
+
+    if (name && wd.edit && wd.edit.objectPicker) {
+      var obj = wd.edit.objectPicker.getInstance(name);
+      if (obj) {
+        target = obj.getDisplayElement();
+      }
+    }
+    var f = function () {
+      activeFun.call(targetInput);
+    };
+
+    $(target)
+      .on("mouseenter", f)
+      .on("mouseout", function () {
+        //			console.log(window.event)
+        //			if(window.event.srcElement!=target)return false
+        if ($(target).find(window.event.relatedTarget).length == 1)
+          return false;
+        //			console.log(window.event.srcElement)
+        //          THIS.MsgDiv.style.top = "-500px"
+        THIS.hideMsgDiv();
+      });
+    //		this.addEventListener(target, // 需绑定监听事件的DOM元素
+    //		'onmouseenter', // 事件名称,如:onclick
+    //		f); // 事件触发的回调函数
+  },
+};

+ 68 - 0
api/user.js

@@ -0,0 +1,68 @@
+import request from "@/utils/request";
+
+export const userApi = {
+  // 账号密码登录 - 显示自定义 loading 文字
+  accountLogin(data, onComplete) {
+    // 在第一次登录的时候拿到旧的设备信息,deviceId改为用户名+设备型号
+    const deviceInfo = uni.getStorageSync("deviceInfo");
+    const newDeviceInfo = {
+      ...deviceInfo,
+      deviceId: `(${data.yhm})${deviceInfo.model}`,
+    }
+    uni.setStorageSync("deviceInfo", newDeviceInfo)
+
+    const promise = request.post(
+      `/service?ssServ=ss.login&yhm=${data.yhm}&mm=${data.mm}&wdConfirmationCaptchaService=0&wechatCode=${data.wechatCode}`,
+      data,
+      {
+        loading: false, // 禁用全局 loading,由登录页面自己控制
+        request: {
+          timeout: 15000 // 登录请求 15 秒超时
+        }
+      }
+    );
+
+    // 无论成功还是失败,都调用完成回调
+    if (onComplete) {
+      promise.finally(() => {
+        onComplete()
+      })
+    }
+
+    return promise;
+  },
+
+  // 自动登录 - 静默登录,不显示 loading
+  autoLogin(data) {
+    return request.post(
+      `/service?ssServ=ss.login&wdConfirmationCaptchaService=0&mdToken=${data.mdToken}`,
+      data,
+      {
+        loading: false // 自动登录不显示 loading,避免打扰用户
+      }
+    );
+  },
+
+  // 微信登录 - 自定义 loading
+  wechatLogin(data, onComplete) {
+    const promise = request.post(
+      `/service?ssServ=ss.login&wdConfirmationCaptchaService=0`,
+      data,
+      {
+        loading: false, // 禁用全局 loading,由登录页面自己控制
+        request: {
+          timeout: 15000 // 微信登录请求 15 秒超时
+        }
+      }
+    );
+
+    // 无论成功还是失败,都调用完成回调
+    if (onComplete) {
+      promise.finally(() => {
+        onComplete()
+      })
+    }
+
+    return promise;
+  }
+};

+ 35 - 0
api/xuncha.js

@@ -0,0 +1,35 @@
+import request from "@/utils/request";
+
+export const xunchaApi = {
+  // 初始化巡查编辑数据 - 获取巡查点列表和记录
+  initZxxzEdit(data) {
+    return request.post(
+      `/service?ssServ=rcXcdjl_initZxxzEdit&ssDest=init&rcid=${data.rcid}`,
+      data,
+      {
+        loading: true
+      }
+    );
+  },
+
+  // 提交巡查编辑数据 - 保存巡查记录(使用表单格式)
+  submZxxzEdit(data, onComplete) {
+    const promise = request.post(
+      `/service?ssServ=rcXcdjl_submZxxzEdit&ssDest=info`,
+      data,
+      {
+        loading: true,
+        formData: true  // 使用表单格式提交
+      }
+    );
+
+    // 如果有完成回调,无论成功还是失败都调用
+    if (onComplete) {
+      promise.finally(() => {
+        onComplete()
+      })
+    }
+
+    return promise;
+  }
+};

BIN=BIN
components/.DS_Store


+ 97 - 0
components/Form/index.vue

@@ -0,0 +1,97 @@
+<template>
+  <!-- 
+    Form 智能表单组件
+    
+    功能:
+    1. 封装所有校验逻辑
+    2. 自动provide校验函数给子组件
+    3. 支持v-model双向绑定
+    4. 极简使用方式
+    
+    使用方式:
+    <Form :rules="fieldConfigs" v-model="formData">
+      <up-table>
+        <up-tr>
+          <up-th>事由</up-th>
+          <ValidatedTd field="reason">
+            <up-input placeholder="请输入事由" />
+          </ValidatedTd>
+        </up-tr>
+      </up-table>
+    </Form>
+  -->
+  <view class="smart-form">
+    <!-- 直接渲染子内容,不使用插槽参数 -->
+    <slot></slot>
+  </view>
+</template>
+
+<script setup>
+import { computed, provide, watch } from 'vue'
+import { useFormValidation } from '@/composables/useFormValidation'
+
+const props = defineProps({
+  // 表单数据 - 支持v-model
+  modelValue: {
+    type: Object,
+    default: () => ({})
+  },
+  // 校验规则配置
+  rules: {
+    type: Object,
+    default: () => ({})
+  }
+})
+
+const emit = defineEmits(['update:modelValue'])
+
+// 直接使用外部传入的formData,避免双向绑定的复杂性
+const formData = computed({
+  get: () => props.modelValue,
+  set: (value) => emit('update:modelValue', value)
+})
+
+// 表单校验
+const { validateField, validateForm, errors, clearErrors, getFieldConfig, setFieldConfigs } = useFormValidation(props.rules)
+
+// 监听 props.rules 的变化,同步更新内部配置
+watch(() => props.rules, (newRules) => {
+  console.log('Form组件检测到rules变化:', newRules)
+  setFieldConfigs(newRules)
+}, { deep: true, immediate: true })
+
+// Form组件初始化完成
+
+// 计算是否有错误
+const hasErrors = computed(() => {
+  return Object.keys(errors.value).some(key => 
+    errors.value[key] && errors.value[key].length > 0
+  )
+})
+
+// 向子组件提供校验函数和数据
+provide('validateField', validateField)
+provide('errors', errors)
+provide('clearErrors', clearErrors)
+provide('formData', formData)
+provide('getFieldConfig', getFieldConfig)
+provide('validateForm', validateForm) // 添加这个,供外部使用
+
+// 移除初始化校验,让Td组件自己处理
+
+// Form组件provide完成
+
+// 暴露方法给父组件
+defineExpose({
+  validateForm,
+  validateField,
+  errors,
+  clearErrors
+})
+</script>
+
+<style lang="scss" scoped>
+.smart-form {
+  width: 100%;
+}
+</style>

+ 112 - 0
components/SsBottom/index.vue

@@ -0,0 +1,112 @@
+<template>
+    <view class="bottom">
+		<view class="bottom-top-div" v-if="showShyj">
+			<up-table style="margin: 0 !important;width: 100% !important;height: 100rpx !important;">
+				<up-tr style="height: 100%;">
+					<up-th style="background-color: #e6e6e6 !important;color: #333333;padding: 0 32rpx;align-items: center;border: none !important;">{{ shyjTitle }}</up-th>
+					<Td style="height: 100%;border: 1px solid #e6e6e6 !important;"><SsInput :placeholder="shyjPlaceholder" v-model="reason" @input="handleShyjInput"/></Td>
+				</up-tr>
+			</up-table>
+		</view>
+		<view class="bottom-button-div" :style="showShyj ? '' : 'border-top: 1rpx solid #e6e6e6;'">
+			<template v-for="(button, index) in buttons" :key="index">
+				<view
+					class="bottom-button"
+					@click="handleButtonClick(button, index)"
+				>
+					{{ button.text }}
+				</view>
+				<!-- 分割线,最后一个按钮不显示 -->
+				<view v-if="index < buttons.length - 1" class="button-divider"></view>
+			</template>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+import SsInput from '@/components/SsInput/index.vue'
+import Td from '@/components/Td/index.vue'
+const reason = ref('')
+
+const props = defineProps({
+    // 是否显示审核意见
+    showShyj: {
+        type: Boolean,
+        default: false
+    },
+    // 审核意见标题
+    shyjTitle: {
+        type: String,
+        default: '审核意见'
+    },
+    // 审核意见占位符
+    shyjPlaceholder: {
+        type: String,
+        default: '请输入审核意见'
+    },
+    // 按钮配置
+    buttons: {
+        type: Array,
+        default: () => [
+            { text: '取消', action: 'cancel', },
+            { text: '保存并提交', action: 'submit', }
+        ]
+    }
+})
+
+const emit = defineEmits(['button-click', 'update:shyjValue'])
+
+
+
+
+// 处理按钮点击
+const handleButtonClick = (button, index) => {
+    emit('button-click', {
+        action: button.action,
+        button: button,
+        index: index,
+        shyjValue: reason.value // 传递审核意见
+    })
+}
+
+// 监听审核意见变化
+const handleShyjInput = (value) => {
+    emit('update:shyjValue', value)
+}
+</script>
+
+<style scoped lang="scss">
+.bottom {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    z-index: 999;
+}
+.bottom-button-div{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background-color: #fff;
+    height: 100rpx;
+}
+.bottom-button{
+    flex: 1;
+    height: 100%;
+    line-height: 100rpx;
+    text-align: center;
+    font-size: 32rpx;
+    color: #333;
+    background-color: #fafafb;
+}
+.button-divider {
+    width: 1rpx;
+    height: 80%;
+    background-color: #e0e0e0;
+}
+.bottom-button:active{
+    background-color: #585e6e;
+    color: #fff;
+}
+</style>

+ 337 - 0
components/SsDatetimePicker/index.vue

@@ -0,0 +1,337 @@
+<template>
+  <!-- 
+    ss-datetime-picker 智能日期时间选择组件
+    基于 uview-plus 的 datetime-picker
+    自动绑定ValidatedTd的事件处理函数
+  -->
+  <view class="smart-datetime-picker">
+    <up-datetime-picker
+      ref="datetimePicker"
+      :show="show"
+      v-model="innerValue"
+      :mode="mode"
+      :min-date="minDate"
+      :max-date="maxDate"
+      :formatter="formatter"
+      :filter="filter"
+      :default-index="defaultIndex"
+      :item-height="itemHeight"
+      :cancel-text="cancelText"
+      :confirm-text="confirmText"
+      :cancel-color="cancelColor"
+      :confirm-color="confirmColor"
+      :visible-item-count="visibleItemCount"
+      :close-on-click-overlay="closeOnClickOverlay"
+      :safe-area-inset-bottom="safeAreaInsetBottom"
+      @confirm="handleConfirm"
+      @cancel="handleCancel"
+      @close="handleClose"
+    />
+    
+    <!-- 显示区域 -->
+    <view 
+      class="smart-datetime-picker__display"
+      @click="openPicker"
+    >
+      <text 
+        v-if="displayValue" 
+        class="smart-datetime-picker__value"
+      >
+        {{ displayValue }}
+      </text>
+      <text 
+        v-else 
+        class="smart-datetime-picker__placeholder"
+      >
+        {{ placeholder }}
+      </text>
+      <Icon name="icon-xiangxiajiantou" size="32" color="#999"/>
+
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, inject, watch } from 'vue'
+import Icon from '@/components/icon/index.vue';
+import dayjs from 'dayjs'
+
+const props = defineProps({
+  modelValue: {
+    type: [String, Number, Date],
+    default: ''
+  },
+  // 选择器模式:date-日期,time-时间,datetime-日期时间
+  mode: {
+    type: String,
+    default: 'date',
+    validator: (value) => ['date', 'time', 'datetime'].includes(value)
+  },
+  // 最小日期
+  minDate: {
+    type: [String, Number, Date],
+    default: () => dayjs().subtract(10, 'year').valueOf()
+  },
+  // 最大日期
+  maxDate: {
+    type: [String, Number, Date],
+    default: () => dayjs().add(10, 'year').valueOf()
+  },
+  // 占位符
+  placeholder: {
+    type: String,
+    default: '请选择'
+  },
+  // 格式化函数
+  formatter: {
+    type: Function,
+    default: null
+  },
+  // 过滤函数
+  filter: {
+    type: Function,
+    default: null
+  },
+  // 默认选中的索引
+  defaultIndex: {
+    type: Array,
+    default: () => []
+  },
+  // 选项高度
+  itemHeight: {
+    type: [String, Number],
+    default: 44
+  },
+  // 取消按钮文字
+  cancelText: {
+    type: String,
+    default: '取消'
+  },
+  // 确认按钮文字
+  confirmText: {
+    type: String,
+    default: '确认'
+  },
+  // 取消按钮颜色
+  cancelColor: {
+    type: String,
+    default: '#909193'
+  },
+  // 确认按钮颜色
+  confirmColor: {
+    type: String,
+    default: '#3c9cff'
+  },
+  // 可见选项数量
+  visibleItemCount: {
+    type: [String, Number],
+    default: 5
+  },
+  // 点击遮罩是否关闭
+  closeOnClickOverlay: {
+    type: Boolean,
+    default: true
+  },
+  // 是否开启底部安全区适配
+  safeAreaInsetBottom: {
+    type: Boolean,
+    default: false
+  },
+  // 显示格式
+  displayFormat: {
+    type: String,
+    default: ''
+  }
+})
+
+const emit = defineEmits(['update:modelValue', 'confirm', 'cancel', 'change'])
+
+// 从ValidatedTd注入事件处理函数(兼容旧方式)
+const onInput = inject('onInput', null)
+const onBlur = inject('onBlur', null)
+
+// 控制选择器显示
+const show = ref(false)
+
+// 内部值
+const innerValue = ref(Date.now())
+
+// 日期选择器引用
+const datetimePicker = ref(null)
+
+// 初始化内部值
+const initInnerValue = () => {
+  if (props.mode === 'time') {
+    // 时间模式下,直接使用时间字符串
+    if (props.modelValue) {
+      innerValue.value = props.modelValue
+    } else {
+      // 如果没有值,使用当前时间
+      const now = new Date()
+      const hours = now.getHours().toString().padStart(2, '0')
+      const minutes = now.getMinutes().toString().padStart(2, '0')
+      innerValue.value = `${hours}:${minutes}`
+    }
+  } else {
+    // 日期和日期时间模式
+    if (props.modelValue) {
+      if (typeof props.modelValue === 'string') {
+        innerValue.value = dayjs(props.modelValue).valueOf()
+      } else if (typeof props.modelValue === 'number') {
+        innerValue.value = props.modelValue
+      } else if (props.modelValue instanceof Date) {
+        innerValue.value = props.modelValue.getTime()
+      }
+    } else {
+      innerValue.value = dayjs().valueOf()
+    }
+  }
+}
+
+// 监听 modelValue 变化
+watch(() => props.modelValue, () => {
+  initInnerValue()
+}, { immediate: true })
+
+// 计算显示值
+const displayValue = computed(() => {
+  if (!props.modelValue) return ''
+  
+  if (props.mode === 'time') {
+    // 时间模式下直接显示值
+    return props.modelValue
+  }
+  
+  let format = props.displayFormat
+  if (!format) {
+    switch (props.mode) {
+      case 'date':
+        format = 'YYYY-MM-DD'
+        break
+      case 'datetime':
+        format = 'YYYY-MM-DD HH:mm'
+        break
+      default:
+        format = 'YYYY-MM-DD'
+    }
+  }
+  
+  const date = dayjs(props.modelValue)
+  return date.isValid() ? date.format(format) : props.modelValue
+})
+
+// 打开选择器
+const openPicker = () => {
+  show.value = true
+  console.log('打开日期选择器', show.value)
+}
+
+// 确认选择
+const handleConfirm = (value) => {
+  console.log('原始值:', value)
+  let formattedValue = ''
+  
+  try {
+    if (props.mode === 'time') {
+      // 时间模式下,value.value 已经是 "HH:mm" 格式
+      formattedValue = value.value
+      
+      console.log('处理后的时间值:', formattedValue)
+    } else {
+      // 日期和日期时间模式
+      const date = dayjs(value.value)
+      switch (props.mode) {
+        case 'date':
+          formattedValue = date.format('YYYY-MM-DD')
+          break
+        case 'datetime':
+          formattedValue = date.format('YYYY-MM-DD HH:mm')
+          break
+        default:
+          formattedValue = date.format('YYYY-MM-DD')
+      }
+    }
+    
+    // 1. 支持v-model
+    emit('update:modelValue', formattedValue)
+    
+    // 2. 兼容旧的inject方式
+    if (onInput) {
+      onInput({ detail: { value: formattedValue } })
+    }
+    
+    // 3. 触发确认事件
+    emit('confirm', { value: formattedValue, timestamp: value.value })
+    emit('change', formattedValue)
+    
+  } catch (error) {
+    console.error('时间处理错误:', error)
+    formattedValue = ''
+  }
+  
+  show.value = false
+  console.log(`SsDatetimePicker handleConfirm: ${formattedValue}`)
+}
+
+// 取消选择
+const handleCancel = () => {
+  show.value = false
+  emit('cancel')
+}
+
+// 关闭选择器
+const handleClose = () => {
+  show.value = false
+  
+  // 触发失焦事件
+  if (onBlur) {
+    onBlur()
+  }
+}
+
+// 初始化
+initInnerValue()
+</script>
+
+<style lang="scss" scoped>
+.smart-datetime-picker {
+  width: 100%;
+  
+  &__display {
+    width: 100%;
+    height: 60rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 32rpx;
+    line-height: 60rpx;
+    color: #333;
+    background-color: transparent;
+    border: none;
+    outline: none;
+    box-sizing: border-box;
+    cursor: pointer;
+  }
+  
+  &__value {
+    flex: 1;
+    color: #333;
+    font-size: 32rpx;
+  }
+  
+  &__placeholder {
+    flex: 1;
+    color: #999;
+    font-size: 32rpx;
+  }
+  
+  &__icon {
+    margin-left: 16rpx;
+    transition: transform 0.3s ease;
+  }
+  
+  &__display:active &__icon {
+    transform: rotate(180deg);
+  }
+}
+</style>

+ 85 - 0
components/SsInput/index.vue

@@ -0,0 +1,85 @@
+<template>
+  <!-- 
+    ss-input 智能输入组件
+    自动绑定ValidatedTd的事件处理函数
+  -->
+  <view class="smart-input">
+    <input
+      class="smart-input__field"
+      :placeholder="$attrs.placeholder || '请输入'"
+      :value="modelValue"
+      @input="handleInput"
+      @blur="handleBlur"
+      @change="handleInput"
+    />
+  </view>
+</template>
+
+<script setup>
+import { inject } from 'vue'
+
+const props = defineProps({
+  modelValue: {
+    type: String,
+    default: ''
+  }
+})
+
+const emit = defineEmits(['update:modelValue'])
+
+// 从ValidatedTd注入事件处理函数(兼容旧方式)
+const onInput = inject('onInput', null)
+const onBlur = inject('onBlur', null)
+
+// ss-input初始化完成
+
+const handleInput = (event) => {
+  const value = event.detail?.value || event.target?.value || ''
+
+  // 1. 支持v-model
+  emit('update:modelValue', value)
+
+  // 2. 兼容旧的inject方式
+  if (onInput) {
+    onInput(event)
+  }
+
+  console.log(`SsInput handleInput: ${value}`)
+}
+
+const handleBlur = (event) => {
+  // 调用ValidatedTd的处理函数
+  if (onBlur) {
+    onBlur(event)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.smart-input {
+  width: 100%;
+  
+  &__field {
+    width: 100%;
+    height: 60rpx;
+    // padding: 0 20rpx;
+    font-size: 32rpx;
+    line-height: 60rpx;
+    color: #333;
+    background-color: transparent;
+    border: none;
+    outline: none;
+    box-sizing: border-box;
+    
+    &::placeholder {
+      color: #999;
+      font-size: 32rpx;
+    }
+    
+    &:focus {
+      color: #333;
+      border: 1px solid #ccc;
+    }
+  }
+}
+</style>

+ 352 - 0
components/SsSelect/index.vue

@@ -0,0 +1,352 @@
+<template>
+  <view class="ss-select-container" :class="{ open: isOpen }" @click.stop="toggleDropdown">
+    <!-- 显示区域 -->
+    <view class="ss-select" :class="{ disabled: disabled }">
+      <text class="select-text" :class="{ placeholder: !selectedValue }">{{ displayText }}</text>
+      <view class="select-arrow" :class="{ rotate: isOpen }">
+        <Icon name="icon-xiangxiajiantou" size="32" :color="disabled ? '#ccc' : '#999'"/>
+      </view>
+    </view>
+    
+    <!-- 选项列表 -->
+    <view class="ss-options" v-show="isOpen">
+      <!-- 加载状态 -->
+      <view
+        v-if="loading"
+        class="option-item loading-item"
+      >
+        <text class="loading-text">加载中...</text>
+      </view>
+      <!-- 无选项 -->
+      <view
+        v-else-if="optionsList.length === 0"
+        class="option-item no-options"
+      >
+        无选项
+      </view>
+      <!-- 选项列表 -->
+      <view
+        v-else
+        v-for="(option, index) in optionsList"
+        :key="index"
+        class="option-item"
+        :class="{ selected: option[mapping.value] === selectedValue }"
+        @click.stop="selectOption(option)"
+      >
+        {{ option[mapping.text] }}
+      </view>
+    </view>
+    
+
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, watch, onMounted, onUnmounted } from 'vue'
+import Icon from '@/components/icon/index.vue';
+// Props 定义
+const props = defineProps({
+  // 选项数组
+  options: {
+    type: Array,
+    default: () => []
+  },
+  // 字段映射
+  mapping: {
+    type: Object,
+    default: () => ({ text: 'n', value: 'v' })
+  },
+  // 默认值
+  modelValue: {
+    type: [String, Number],
+    default: ''
+  },
+  // 占位符
+  placeholder: {
+    type: String,
+    default: '请选择'
+  },
+  // 校验配置
+  validation: {
+    type: Object,
+    default: () => ({ enable: false, message: '' })
+  },
+  // 是否禁用
+  disabled: {
+    type: Boolean,
+    default: false
+  },
+  // 是否支持搜索
+  searchable: {
+    type: Boolean,
+    default: false
+  },
+  // 是否支持清空
+  clearable: {
+    type: Boolean,
+    default: false
+  },
+  // 加载状态
+  loading: {
+    type: Boolean,
+    default: false
+  },
+  // 宽度设置
+  width: {
+    type: String,
+    default: '100%'
+  }
+})
+
+// Emits 定义
+const emit = defineEmits(['update:modelValue', 'change', 'search', 'clear'])
+
+// 响应式数据
+const isOpen = ref(false)
+const selectedValue = ref(props.modelValue)
+const searchKeyword = ref('')
+
+// 计算属性
+const optionsList = computed(() => props.options || [])
+
+const displayText = computed(() => {
+  if (!selectedValue.value) return props.placeholder
+  
+  const selectedOption = optionsList.value.find(
+    option => option[props.mapping.value] === selectedValue.value
+  )
+  return selectedOption ? selectedOption[props.mapping.text] : props.placeholder
+})
+
+
+
+// 方法
+const toggleDropdown = () => {
+  if (props.disabled) return
+
+  if (!isOpen.value) {
+    // 关闭其他下拉框
+    uni.$emit('closeAllSelects')
+  }
+
+  isOpen.value = !isOpen.value
+}
+
+const selectOption = (option) => {
+  const value = option[props.mapping.value]
+  selectedValue.value = value
+  isOpen.value = false
+  
+  // 触发事件
+  emit('update:modelValue', value)
+  emit('change', value, option)
+}
+
+const closeDropdown = () => {
+  isOpen.value = false
+}
+
+// 设置值的方法(供外部调用)
+const setValue = (value) => {
+  if (!value) {
+    selectedValue.value = ''
+    emit('update:modelValue', '')
+    return true
+  }
+  
+  const option = optionsList.value.find(
+    opt => opt[props.mapping.value] === value
+  )
+  
+  if (option) {
+    selectedValue.value = value
+    emit('update:modelValue', value)
+    emit('change', value, option)
+    return true
+  }
+  
+  return false
+}
+
+// 监听外部值变化
+watch(() => props.modelValue, (newValue) => {
+  selectedValue.value = newValue
+})
+
+// 监听全局关闭事件
+const handleGlobalClose = () => {
+  closeDropdown()
+}
+
+onMounted(() => {
+  uni.$on('closeAllSelects', handleGlobalClose)
+  
+  // 点击页面其他地方关闭下拉框
+  uni.$on('pageClick', closeDropdown)
+})
+
+onUnmounted(() => {
+  uni.$off('closeAllSelects', handleGlobalClose)
+  uni.$off('pageClick', closeDropdown)
+})
+
+// 暴露方法给父组件
+defineExpose({
+  setValue,
+  getValue: () => selectedValue.value,
+  getSelectedOption: () => {
+    return optionsList.value.find(
+      option => option[props.mapping.value] === selectedValue.value
+    )
+  }
+})
+</script>
+
+<style lang="scss" scoped>
+/* ss暂用下拉框样式 */
+.ss-select-container {
+  position: relative;
+  width: v-bind(width);
+  font-size: 32rpx;
+
+}
+
+.ss-select {
+  padding: 10rpx 0;
+  border-radius: 10rpx;
+  cursor: pointer;
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-height: 80rpx;
+  box-sizing: border-box;
+
+  &.disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+
+    .select-text {
+      color: #ccc;
+    }
+  }
+}
+
+.select-text {
+  flex: 1;
+  color: #333;
+
+  &.placeholder {
+    color: #999;
+  }
+}
+
+.select-arrow {
+  display: flex;
+  align-items: center;
+  transition: transform 0.3s ease;
+  margin-left: 20rpx;
+
+  &.rotate {
+    transform: rotate(180deg);
+  }
+}
+
+.ss-options {
+  display: none;
+  position: absolute;
+  top: 100%;
+  left: 0;
+  width: 100%;
+  background-color: #393D51;
+  z-index: 1000;
+  color: #fff;
+  border: 2rpx solid #393D51;
+  box-sizing: border-box;
+  border-radius: 10rpx;
+  overflow: hidden;
+  max-height: 600rpx;
+  overflow: auto;
+}
+
+.ss-select-container.open .ss-options {
+  display: block;
+}
+
+.option-item {
+  padding: 20rpx 20rpx 20rpx 46rpx;
+  cursor: pointer;
+  position: relative;
+
+  &::after {
+    content: "";
+    position: absolute;
+    bottom: 0%;
+    left: 50%;
+    transform: translateX(-50%);
+    width: 80%;
+    height: 2rpx;
+    background-color: #303445;
+  }
+
+  &:last-child::after,
+  &:hover::after,
+  &.selected::after {
+    display: none;
+  }
+
+  &:hover {
+    background-color: #fff;
+    color: #393D51;
+  }
+
+  &.selected {
+    background-color: #fff;
+    color: #393D51;
+
+    &::before {
+      content: "";
+      background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23393D51"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>') no-repeat center;
+      position: absolute;
+      width: 30rpx;
+      height: 100%;
+      left: 10rpx;
+      top: 0;
+      color: #393D51;
+    }
+  }
+
+  &.no-options {
+    text-align: center;
+    color: #999;
+    cursor: default;
+
+    &:hover {
+      background-color: #393D51;
+      color: #999;
+    }
+  }
+
+  &.loading-item {
+    text-align: center;
+    color: #999;
+    cursor: default;
+
+    &:hover {
+      background-color: #393D51;
+      color: #999;
+    }
+
+    .loading-text {
+      animation: loading-pulse 1.5s ease-in-out infinite;
+    }
+  }
+}
+
+@keyframes loading-pulse {
+  0%, 100% { opacity: 0.6; }
+  50% { opacity: 1; }
+}
+
+
+</style>

+ 18 - 0
components/SsTableTitle/index.vue

@@ -0,0 +1,18 @@
+<template>
+    <view class="table-title">
+        <slot></slot>
+    </view>
+</template>
+
+<script>
+
+</script>
+
+<style scoped lang="scss">
+.table-title {
+    width: calc(100% - 32rpx);
+    margin:16rpx auto ;
+    font-size: 32rpx;
+    color: #333;
+}
+</style>

+ 245 - 0
components/Td/index.vue

@@ -0,0 +1,245 @@
+<template>
+  <view
+    class="validated-td"
+    style="
+      flex: 1;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      padding: 13rpx 24rpx 13rpx 32rpx;
+      background-color: #fff;
+      color: #000000;
+      font-size: 32rpx;
+      line-height: 38rpx;
+      border-bottom: 1rpx solid #e6e6e6;
+      border-right: 1rpx solid #e6e6e6;
+      position: relative;
+      box-sizing: border-box;
+      min-width: 0;
+      width: 100%;
+    "
+  >
+    <!-- 必填红线 - 只在输入模式下显示 -->
+    <view v-if="!isReadonly && showRequiredLine" class="required-line"></view>
+
+    <!-- 错误红线 - 只在输入模式下显示 -->
+    <view v-if="!isReadonly && hasError" class="error-left-line"></view>
+
+    <!-- 插槽内容包装器 -->
+    <view class="slot-wrapper">
+      <!-- 只读模式 -->
+      <slot v-if="isReadonly"></slot>
+
+      <!-- 输入模式 -->
+      <slot v-else></slot>
+    </view>
+
+    <!-- 错误提示 - 只在输入模式下显示 -->
+    <view v-if="!isReadonly && hasError" class="error-message">
+      {{ errorMessage }}
+    </view>
+  </view>
+</template>
+
+<!--
+  微信小程序组件配置
+  设置样式隔离为shared,允许外部样式影响组件
+-->
+<script module="config">
+export default {
+  styleIsolation: 'shared'
+}
+</script>
+
+<script setup>
+import { computed, inject, ref, provide, watch } from 'vue'
+
+const props = defineProps({
+  field: {
+    type: String,
+    required: false
+  },
+  rules: {
+    type: Array,
+    default: () => []
+  }
+})
+
+// 自动判断模式:有field属性就是输入模式,没有就是只读模式
+const isReadonly = computed(() => !props.field)
+
+// 从父组件注入校验相关功能
+const validateField = inject('validateField', () => {})
+const errors = inject('errors', ref({}))
+const formData = inject('formData', ref({}))
+const getFieldConfig = inject('getFieldConfig', () => ({}))
+
+
+// 事件处理函数需要在这里定义,然后再provide
+
+// 获取字段配置
+const fieldConfig = computed(() => {
+  if (isReadonly.value || !props.field) return {}
+  return getFieldConfig(props.field) || {}
+})
+
+// 合并规则:props传入的规则优先级更高
+const finalRules = computed(() => {
+  if (isReadonly.value) return []
+  return props.rules.length > 0 ? props.rules : (fieldConfig.value.rules || [])
+})
+
+// 移除hasValidated,改为直接校验
+
+const hasError = computed(() => {
+  return props.field && errors.value[props.field] && errors.value[props.field].length > 0
+})
+
+const errorMessage = computed(() => {
+  return hasError.value ? errors.value[props.field][0] : ''
+})
+
+// 检查是否为必填字段
+const isRequired = computed(() => {
+  return finalRules.value.some(rule => rule.required)
+})
+
+// 获取当前字段值的辅助函数
+const getCurrentFieldValue = () => {
+  if (!formData.value || !props.field) return undefined
+
+  const fieldPath = props.field.split('.')
+  let value = formData.value
+  for (const key of fieldPath) {
+    value = value?.[key]
+  }
+  return value
+}
+
+// 必填红线显示逻辑
+const showRequiredLine = computed(() => {
+  if (!isRequired.value) return false  // 非必填字段不显示
+  if (hasError.value) return false     // 有错误时不显示(错误红线优先)
+
+  const fieldValue = getCurrentFieldValue()
+
+  // 如果有值,不显示必填红线
+  if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {
+    return false
+  }
+
+  // 如果没有值,显示必填红线
+  return true
+})
+
+// 事件处理函数 - 现在主要用于兼容旧的inject方式
+const handleInput = () => {
+  // 现在由watch自动处理校验,这里不需要做什么
+  console.log(`用户输入 ${props.field}`)
+}
+
+const handleBlur = () => {
+  // 现在由watch自动处理校验,这里不需要做什么
+  console.log(`用户失焦 ${props.field}`)
+}
+
+// 为子组件提供事件处理函数和字段名
+if (!isReadonly.value && props.field) {
+  provide('onInput', handleInput)
+  provide('onBlur', handleBlur)
+  provide('fieldName', props.field)
+}
+
+// 监听formData变化,自动校验(支持v-model模式)
+watch(() => getCurrentFieldValue(), (newValue, oldValue) => {
+  if (isReadonly.value || !props.field) return
+
+  console.log(`watch触发 ${props.field}:`, { newValue, oldValue })
+  console.log(`finalRules.value:`, finalRules.value)
+  console.log(`fieldConfig.value:`, fieldConfig.value)
+
+  // 只有在值真正发生变化时才校验(避免初始化时的无意义校验)
+  if (oldValue !== undefined && newValue !== oldValue) {
+    if (finalRules.value.length > 0) {
+      console.log(`执行校验 ${props.field}:`, newValue)
+      validateField(props.field, newValue, finalRules.value)
+    } else {
+      console.log(`没有校验规则 ${props.field}`)
+    }
+  }
+}, { flush: 'post' })
+</script>
+
+<style lang="scss" scoped>
+/**
+ * ValidatedTd 组件样式
+ *
+ * 设计说明:
+ * 1. 宽度问题已通过页面CSS解决(validated-td选择器)
+ * 2. 必填红线:显示在td左侧,提示用户该字段为必填
+ * 3. 错误红线:显示在td左侧,提示用户校验失败
+ * 4. 错误提示:显示在td右下角,显示具体错误信息
+ * 5. 所有校验相关样式只在非只读模式下生效
+ */
+
+/* 主容器样式 */
+.validated-td {
+  position: relative;
+  display: flex;
+  align-items: center;
+  flex: 1;
+  min-width: 0;
+  width: 100%;
+}
+
+/* 必填红线 - 显示在td左侧,表示该字段为必填项 */
+.required-line {
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  width: 6rpx; /* 红线宽度 */
+  background-color: #f56c6c; /* 红色 */
+  z-index: 1; /* 层级较低,会被错误红线覆盖 */
+}
+
+/* 校验错误左侧红线 - 显示在td左侧,表示校验失败 */
+.error-left-line {
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  width: 6rpx; /* 红线宽度 */
+  background-color: #f56c6c; /* 红色 */
+  z-index: 2; /* 层级较高,会覆盖必填红线 */
+}
+
+/* 错误提示文字 - 显示在td右下角,显示具体的错误信息 */
+.error-message {
+  position: absolute;
+  right: 0; /* 靠右对齐 */
+  bottom: 0rpx; /* 贴底显示 */
+  color: #f56c6c; /* 红色文字 */
+  font-size: 24rpx; /* 较小的字体 */
+  line-height: 32rpx;
+  height: 32rpx;
+  padding: 0 8rpx; /* 左右内边距 */
+  box-sizing: border-box;
+  z-index: 10; /* 最高层级,确保显示在最上层 */
+  white-space: nowrap; /* 不换行 */
+  width: 100%; /* 占满宽度 */
+  display: flex;
+  justify-content: flex-end; /* 右对齐 */
+  border-bottom: 1px solid #f56c6c; /* 底部红线 */
+}
+
+/* 插槽包装器 - 确保内容正确显示 */
+.slot-wrapper {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  flex: 1;
+  min-width: 0;
+}
+</style>

+ 226 - 0
components/agreement/AgreementPopup.vue

@@ -0,0 +1,226 @@
+<template>
+  <view class="agreement-popup" :class="{ 'show': visible }">
+    <view class="mask" @tap="handleClose"></view>
+    <view class="popup-content">
+      <!-- 头部 -->
+      <view class="popup-header">
+        <text class="title">{{ title }}</text>
+        <text class="close-btn" @tap="handleClose">×</text>
+      </view>
+      
+      <!-- 内容区域 -->
+      <scroll-view class="content" scroll-y>
+        <template v-if="type === 'user'">
+          <view class="agreement-text">
+            <view class="section">
+              <view class="section-title">一、服务说明</view>
+              <view class="paragraph">1.1 本平台是面向学生家长的智慧校园服务平台,旨在为家长提供便捷的教育信息服务。</view>
+              <view class="paragraph">1.2 通过本平台,家长可以查看学生在校情况、与教师沟通、接收学校通知等。</view>
+            </view>
+            <view class="section">
+              <view class="section-title">二、账号管理</view>
+              <view class="paragraph">2.1 家长需要使用真实身份信息进行注册和认证,确保与学生的关系真实有效。</view>
+              <view class="paragraph">2.2 每个账号仅限本人使用,请勿将账号信息泄露或转借他人。</view>
+            </view>
+            <view class="section">
+              <view class="section-title">三、使用规范</view>
+              <view class="paragraph">3.1 请遵守平台规则,文明发言,不得发布不当言论或有害信息。</view>
+              <view class="paragraph">3.2 尊重教师和其他家长的隐私,未经允许不得传播他人信息。</view>
+            </view>
+            <view class="section">
+              <view class="section-title">四、服务变更</view>
+              <view class="paragraph">4.1 平台将持续优化服务内容,以提供更好的使用体验。</view>
+              <view class="paragraph">4.2 如遇重大更新,平台会及时通知用户。</view>
+            </view>
+          </view>
+        </template>
+        
+        <template v-else>
+          <view class="agreement-text">
+            <view class="section">
+              <view class="section-title">非繁数智校园 小程序隐私保护指引</view>
+              <view class="paragraph">本指引是非繁数智校园小程序开发者 非繁软件(广州)有限公司(以下简称"开发者")为处理你的个人信息而制定。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">开发者处理的信息</view>
+              <view class="paragraph">根据法律规定,开发者仅处理实现小程序功能所必要的信息。</view>
+              <view class="paragraph">为了确定用户的真实性,便于用户关联自己的小孩,开发者将在获取你的明示同意后,收集你的微信昵称、头像。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">第三方插件信息/SDK信息</view>
+              <view class="paragraph">为实现特定功能,开发者可能会接入由第三方提供的插件/SDK。第三方插件/SDK的个人信息处理规则,请以其公示的官方说明为准。非繁数智校园小程序接入的第三方插件信息/SDK信息如下:</view>
+              <view class="paragraph">插件名称:VOIP通话</view>
+              <view class="paragraph">插件提供方名称: 深圳市腾讯计算机系统有限公司</view>
+              <view class="paragraph">为了音视频通话,开发者将在获得你的明示同意后,访问你的摄像头。</view>
+              <view class="paragraph">为了音视频通话,开发者将在获得你的明示同意后,访问你的麦克风。</view>
+              <view class="paragraph">为了保存组件截图,开发者将在获得你的明示同意后,使用你的相册(仅写入)权限。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">你的权益</view>
+              <view class="paragraph">关于你的个人信息,你可以通过以下方式与开发者联系,行使查阅、复制、更正、删除等法定权利。</view>
+              <view class="paragraph">若你在小程序中注册了账号,你可以通过以下方式与开发者联系,申请注销你在小程序中使用的账号。在受理你的申请后,开发者承诺在十五个工作日内完成核查和处理,并按照法律法规要求处理你的相关信息。</view>
+              <view class="paragraph">邮箱:1612356478@qq.com</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">开发者对信息的存储</view>
+              <view class="paragraph">开发者承诺,除法律法规另有规定外,开发者对你的信息的保存期限应当为实现处理目的所必要的最短时间。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">信息的使用规则</view>
+              <view class="paragraph">开发者将会在本指引所明示的用途内使用收集的信息</view>
+              <view class="paragraph">如开发者使用你的信息超出本指引目的或合理范围,开发者必须在变更使用目的或范围前,再次以小程序通知方式告知并征得你的明示同意。</view>
+            </view>
+
+            <view class="section">
+              <view class="section-title">信息对外提供</view>
+              <view class="paragraph">开发者承诺,不会主动共享或转让你的信息至任何第三方,如存在确需共享或转让时,开发者应当直接征得或确认第三方征得你的单独同意。</view>
+              <view class="paragraph">开发者承诺,不会对外公开披露你的信息,如必须公开披露时,开发者应当向你告知公开披露的目的、披露信息的类型及可能涉及的信息,并征得你的单独同意。</view>
+            </view>
+
+            <view class="section">
+              <view class="paragraph">你认为开发者未遵守上述约定,或有其他的投诉建议、或未成年人个人信息保护相关问题,可通过以下方式与开发者联系;或者向微信进行投诉。</view>
+              <view class="paragraph">邮箱 : 1612356478@qq.com</view>
+            </view>
+
+            <view class="section">
+              <view class="paragraph">更新日期:2025-05-07</view>
+              <view class="paragraph">生效日期:2025-05-07</view>
+            </view>
+
+           
+          </view>
+        </template>
+      </scroll-view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue'
+
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  type: {
+    type: String,
+    default: 'user' // 'user' 或 'privacy'
+  }
+})
+
+const emit = defineEmits(['update:visible'])
+
+const title = computed(() => {
+  return props.type === 'user' ? '用户服务协议' : '隐私政策'
+})
+
+const handleClose = () => {
+  emit('update:visible', false)
+}
+</script>
+
+<style scoped>
+.agreement-popup {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  z-index: 99999;
+  visibility: hidden;
+}
+
+.agreement-popup.show {
+  visibility: visible;
+}
+
+.agreement-popup.show .popup-content {
+  transform: translateY(0);
+}
+
+.mask {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.6);
+}
+
+.popup-content {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: #fff;
+  border-radius: 24rpx 24rpx 0 0;
+  padding: 40rpx 30rpx;
+  transform: translateY(100%);
+  transition: transform 0.3s ease-out;
+  max-height: 80vh;
+  display: flex;
+  flex-direction: column;
+}
+
+.popup-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 40rpx;
+}
+
+.title {
+  font-size: 36rpx;
+  font-weight: bold;
+  color: #333;
+}
+
+.close-btn {
+  font-size: 48rpx;
+  color: #999;
+  padding: 20rpx;
+  margin: -20rpx;
+}
+
+.content {
+  flex: 1;
+  overflow: auto;
+}
+
+.agreement-text {
+  padding-bottom: 40rpx;
+}
+
+.section {
+  margin-bottom: 40rpx;
+}
+
+.section-title {
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #333;
+  margin-bottom: 20rpx;
+}
+
+.paragraph {
+  font-size: 28rpx;
+  color: #666;
+  line-height: 1.8;
+  margin-bottom: 16rpx;
+  text-align: justify;
+}
+
+/* 隐藏滚动条 */
+::-webkit-scrollbar {
+  display: none;
+  width: 0;
+  height: 0;
+  color: transparent;
+}
+</style>

+ 53 - 0
components/icon/index.vue

@@ -0,0 +1,53 @@
+<template>
+  <text 
+    :class="['iconfont', iconClass]" 
+    :style="{ color: color, fontSize: size + 'rpx',verticalAlign: 'middle'}"
+    @click="handleClick"
+  ></text>
+</template>
+
+<script setup>
+/**
+ * 图标组件
+ * 基于iconfont图标库
+ */
+import { computed } from 'vue';
+
+// 组件属性定义
+const props = defineProps({
+  // 图标名称,对应iconfont中的类名,如'icon-home'
+  name: {
+    type: String,
+    required: true
+  },
+  // 图标颜色
+  color: {
+    type: String,
+    default: '#000'
+  },
+  // 图标大小,单位rpx
+  size: {
+    type: [Number, String],
+    default: 32
+  }
+});
+
+// 事件
+const emit = defineEmits(['click']);
+
+// 计算完整的图标类名
+const iconClass = computed(() => {
+  return props.name;
+});
+
+// 点击事件处理
+const handleClick = (event) => {
+  emit('click', event);
+};
+</script>
+
+<style>
+
+/* 引入iconfont样式 */
+@import '../../static/iconfont/iconfont.css';
+</style> 

+ 471 - 0
components/login/LoginPopup.vue

@@ -0,0 +1,471 @@
+<template>
+
+    <view class="login-popup" :class="{ 'show': loginPopupVisible }">
+        <view class="mask" @tap="handleClose"></view>
+        <view class="popup-content">
+            <view class="popup-header">
+                <text class="title">登录</text>
+                <text class="close-btn" @tap="handleClose">×</text>
+            </view>
+
+            <!-- 微信登录按钮 -->
+            <!-- <button class="wechat-btn" @tap="handleWechatLogin">
+                <image src="/static/icon/wechat.png" mode="aspectFit" class="wechat-icon"></image>
+                微信一键登录
+            </button> -->
+
+            <!-- 分割线 -->
+            <!-- <view class="divider">
+                <text class="divider-text">或</text>
+            </view> -->
+
+            <!-- 账号密码登录 -->
+            <view class="account-login">
+                <view class="input-item">
+                    <input type="text" v-model="form.username" placeholder="用户名" placeholder-class="placeholder"
+                        />
+                </view>
+                <view class="input-item">
+                    <input :password="!showPassword" type="text" v-model="form.password" placeholder="密码"
+                        placeholder-class="placeholder" />
+
+                    <view class="eye-icon" @tap.stop="showPassword = !showPassword">
+                        <image :src="showPassword ? '/static/icon/eye-open.png' : '/static/icon/eye-close.png'"
+                            mode="aspectFit" class="eye-image"></image>
+                    </view>
+                </view>
+                <button
+                    class="account-btn"
+                    :class="{ 'disabled': isLogging }"
+                    :disabled="isLogging"
+                    @tap="handleAccountLogin"
+                >
+                    {{ isLogging ? '登录中...' : '登录' }}
+                </button>
+            </view>
+
+            <!-- 用户协议 -->
+            <view class="agreement">
+                <checkbox :checked="agreed" @tap="handleAgreementConfirm" color="#40ac6d" />
+                <text class="agreement-text">
+                    我已阅读并同意
+                    <text class="link" @tap="openAgreement('user')">《用户协议》</text>
+                    与
+                    <text class="link" @tap="openAgreement('privacy')">《隐私协议》</text>
+                </text>
+            </view>
+        </view>
+    </view>
+
+    <agreement-popup v-model:visible="showAgreement" :type="agreementType" />
+</template>
+
+<script setup>
+import AgreementPopup from '../agreement/AgreementPopup.vue'
+
+import { ref } from 'vue'
+import { useUserStore } from '@/store/modules/user'
+import { storeToRefs } from 'pinia'
+import { userApi } from '@/api/user'
+
+const userStore = useUserStore()
+const { loginPopupVisible } = storeToRefs(userStore)
+
+const loginType = ref('wechat')
+const form = ref({
+    username: '',
+    password: ''
+})
+const showPassword = ref(false)
+const agreed = ref(false)
+const showAgreement = ref(false)
+const agreementType = ref('user')
+
+// 防重复点击状态
+const isLogging = ref(false)
+
+// 点击协议链接
+const openAgreement = (type) => {
+    agreementType.value = type
+    showAgreement.value = true
+}
+
+// 确认阅读协议
+const handleAgreementConfirm = () => {
+    agreed.value = true
+}
+const handleClose = () => {
+    userStore.hideLoginPopup()
+    form.value.username = ''
+    form.value.password = ''
+    agreed.value = false
+    isLogging.value = false // 重置登录状态
+    uni.hideLoading() // 确保隐藏 loading
+}
+// 微信登录
+const handleWechatLogin = async () => {
+    if (isLogging.value) {
+        console.log('正在登录中,请勿重复点击')
+        return
+    }
+
+    if (!agreed.value) {
+        uni.showToast({
+            title: '请先同意用户协议和隐私协议',
+            icon: 'none'
+        })
+        return
+    }
+
+    try {
+        isLogging.value = true
+
+        // 显示获取微信授权的提示
+        uni.showLoading({
+            title: '获取微信授权...',
+            mask: true
+        })
+
+        const loginRes = await uni.login()
+
+        // 切换到登录中的 loading
+        uni.showLoading({
+            title: '微信登录中...',
+            mask: true
+        })
+
+        const res = await userApi.wechatLogin({
+            code: loginRes.code
+        }, () => {
+            // 请求完成回调,无论成功失败都会执行
+            isLogging.value = false
+            uni.hideLoading() // 隐藏 loading
+        })
+
+        console.log("登录成功", res.data)
+        userStore.setUserInfo(res.data)
+        uni.$emit('login', res.data)
+        handleClose()
+
+    } catch (e) {
+        console.error('登录失败:', e)
+        uni.showToast({
+            title: '登录失败',
+            icon: 'none'
+        })
+        // 确保隐藏 loading 和重置状态
+        isLogging.value = false
+        uni.hideLoading()
+    }
+}
+
+// 账号密码登录
+const handleAccountLogin = async () => {
+    if (isLogging.value) {
+        console.log('正在登录中,请勿重复点击')
+        return
+    }
+
+    if (!agreed.value) {
+        uni.showToast({
+            title: '请先同意用户协议和隐私协议',
+            icon: 'none'
+        })
+        return
+    }
+    if (!form.value.username || !form.value.password) {
+        uni.showToast({
+            title: '请输入用户名和密码',
+            icon: 'none'
+        })
+        return
+    }
+
+    try {
+        isLogging.value = true
+
+        // 显示获取微信授权的提示
+        uni.showLoading({
+            title: '获取微信授权...',
+            mask: true
+        })
+
+        uni.login({
+            provider: 'weixin',
+            success: async function (loginRes) {
+                try {
+                    console.log("wxcode", loginRes.code);
+
+                    // 切换到登录中的 loading
+                    uni.showLoading({
+                        title: '登录中...',
+                        mask: true
+                    })
+
+                    try {
+                        const res = await userApi.accountLogin({
+                            yhm: form.value.username,
+                            mm: form.value.password,
+                            wdConfirmationCaptchaService: "0",
+                            wechatCode: loginRes.code
+                        })
+
+                        uni.hideLoading()
+                        console.log("account登录成功", res.data)
+                        uni.$emit('login', res.data)
+                        userStore.setUserInfo(res.data)
+                        
+                        handleClose()
+
+                    } catch (error) {
+                        console.error('登录失败:', error)
+                        uni.showToast({
+                            title: '登录失败',
+                            icon: 'none'
+                        })
+                    } finally {
+                        // 无论成功失败,都重置状态
+                        isLogging.value = false
+                        uni.hideLoading()
+                    }
+                } catch (outerError) {
+                    console.error('登录过程出错:', outerError)
+                    uni.showToast({
+                        title: '登录失败',
+                        icon: 'none'
+                    })
+                    isLogging.value = false
+                    uni.hideLoading()
+                }
+            },
+            fail: function (error) {
+                console.error('获取微信授权失败:', error)
+                uni.showToast({
+                    title: '获取微信授权失败',
+                    icon: 'none'
+                })
+                isLogging.value = false
+                uni.hideLoading()
+            }
+        });
+
+    } catch (e) {
+        console.error('登录过程出错:', e)
+        uni.showToast({
+            title: '登录失败',
+            icon: 'none'
+        })
+        isLogging.value = false
+        uni.hideLoading()
+    }
+}
+const handleImageError = (e) => {
+    console.error('图片加载失败:', e)
+}
+</script>
+
+<style scoped>
+.login-popup {
+    position: fixed;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    z-index: 9999;
+    visibility: hidden;
+}
+
+.login-popup.show {
+    visibility: visible;
+}
+
+.login-popup.show .popup-content {
+    transform: translateY(0);
+}
+
+.mask {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    background: rgba(0, 0, 0, 0.6);
+}
+
+.popup-content {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: #fff;
+    border-radius: 12rpx 12rpx 0 0;
+    padding: 40rpx 30rpx;
+    transform: translateY(100%);
+    transition: transform 0.3s ease-out;
+}
+
+.popup-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 40rpx;
+}
+
+.title {
+    font-size: 36rpx;
+    font-weight: bold;
+    color: #333;
+}
+
+.close-btn {
+    font-size: 48rpx;
+    color: #999;
+    padding: 20rpx;
+    margin: -20rpx;
+}
+
+/* 微信登录按钮 */
+.wechat-btn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    height: 88rpx;
+    background: #40ac6d;
+    color: #fff;
+    border-radius: 44rpx;
+    font-size: 32rpx;
+    border: none;
+}
+
+.wechat-icon {
+    width: 48rpx;
+    height: 48rpx;
+    margin-right: 16rpx;
+}
+
+/* 分割线 */
+.divider {
+    position: relative;
+    text-align: center;
+    margin: 40rpx 0;
+}
+
+.divider::before,
+.divider::after {
+    content: '';
+    position: absolute;
+    top: 50%;
+    width: calc(50% - 40rpx);
+    height: 1px;
+    background: #eee;
+}
+
+.divider::before {
+    left: 0;
+}
+
+.divider::after {
+    right: 0;
+}
+
+.divider-text {
+    display: inline-block;
+    padding: 0 20rpx;
+    color: #999;
+    font-size: 28rpx;
+    background: #fff;
+    position: relative;
+    z-index: 1;
+}
+
+/* 账号密码登录 */
+.account-login {
+    margin-bottom: 30rpx;
+}
+
+.input-item {
+    position: relative;
+    margin-bottom: 20rpx;
+}
+
+.input-item input {
+    width: 100%;
+    height: 88rpx;
+    background: #f5f5f5;
+    border-radius: 44rpx;
+    padding: 0 40rpx;
+    font-size: 28rpx;
+    box-sizing: border-box;
+}
+
+.eye-icon {
+    position: absolute;
+    right: 20rpx;
+    /* 调整位置 */
+    top: 50%;
+    transform: translateY(-50%);
+    padding: 20rpx;
+    /* 增加点击区域 */
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    z-index: 1000;
+}
+
+.eye-image {
+    width: 40rpx;
+    height: 40rpx;
+    display: block;
+    pointer-events: none;
+
+}
+
+.placeholder {
+    color: #999;
+}
+
+.account-btn {
+    width: 100%;
+    height: 88rpx;
+    line-height: 88rpx;
+    background: #666666;
+    color: #fff;
+    border-radius: 44rpx;
+    font-size: 32rpx;
+    border: none;
+    margin-top: 30rpx;
+    transition: all 0.3s ease;
+}
+
+.account-btn.disabled {
+    background: #cccccc !important;
+    color: #999999 !important;
+    opacity: 0.6;
+    cursor: not-allowed;
+}
+
+/* 用户协议 */
+.agreement {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-top: 30rpx;
+}
+
+.agreement-text {
+    font-size: 24rpx;
+    color: #999;
+    margin-left: 8rpx;
+}
+
+.link {
+    color: #40ac6d;
+}
+
+/* 按钮点击效果 */
+.wechat-btn:active,
+.account-btn:active {
+    opacity: 0.8;
+}
+</style>

+ 133 - 0
components/tabbar/index.vue

@@ -0,0 +1,133 @@
+<template>
+  <view class="custom-tabbar" :class="{ 'safe-area-inset-bottom': true }">
+    <view 
+      v-for="(item, index) in tabList" 
+      :key="index" 
+      class="tabbar-item" 
+      :class="{ active: currentPath === item.pagePath }"
+      @click="switchTab(item, index)"
+    >
+      <view class="icon-box">
+        <Icon 
+          v-if="item.iconName" 
+          :name="item.iconName" 
+          :size="48" 
+          :color="currentPath === item.pagePath ? activeColor : inactiveColor"
+        />
+      </view>
+      <text 
+        class="text" 
+        :style="{ color: currentPath === item.pagePath ? activeColor : inactiveColor }"
+      >{{ item.text }}</text>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import Icon from '@/components/icon/index.vue';
+
+// 固定的导航配置
+const tabList = [
+  {
+    iconName: 'icon-shouye',
+    text: '首页',
+    pagePath: 'pages/index/index'
+  },
+  {
+    iconName: 'icon-zuanshi',
+    text: '产品',
+    pagePath: 'pages/product/index'
+  },
+  {
+    iconName: 'icon-zhifeiji',
+    text: '活动',
+    pagePath: 'pages/activity/index'
+  },
+  {
+    iconName: 'icon-qizhi',
+    text: '基(营)地',
+    pagePath: 'pages/base/index'
+  },
+  {
+    iconName: 'icon-renyuan',
+    text: '我的',
+    pagePath: 'pages/my/index'
+  }
+];
+
+// 颜色配置
+const activeColor = '#1d2089';
+const inactiveColor = '#999';
+
+// 当前路径
+const currentPath = ref('');
+
+// 更新当前路径
+const updateCurrentPath = () => {
+  const pages = getCurrentPages();
+  const currentPage = pages[pages.length - 1];
+  currentPath.value = currentPage ? currentPage.route : '';
+};
+
+// 切换页面
+const switchTab = (item) => {
+  if (currentPath.value === item.pagePath) return;
+  
+  uni.switchTab({
+    url: `/${item.pagePath}`
+  });
+};
+
+// 监听路由变化
+uni.$on('onShow', () => {
+  updateCurrentPath();
+});
+
+// 组件挂载时更新路径
+onMounted(() => {
+  updateCurrentPath();
+});
+
+// 组件销毁时移除监听
+onUnmounted(() => {
+  uni.$off('onShow');
+});
+</script>
+
+<style lang="scss" scoped>
+.custom-tabbar {
+  position: fixed;
+  left: 0;
+  bottom: 0;
+  width: 100%;
+  height: 120rpx;
+  align-items: center;
+  background-color: #fff;
+  display: flex;
+  border-top: 1rpx solid #dcdcdc;
+  z-index: 999;
+  
+  &.safe-area-inset-bottom {
+    padding-bottom: constant(safe-area-inset-bottom);
+    padding-bottom: env(safe-area-inset-bottom);
+  }
+  
+  .tabbar-item {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    
+    .icon-box {
+      margin-bottom: 6rpx;
+    }
+    
+    .text {
+      font-size: 24rpx;
+      line-height: 1;
+    }
+  }
+}
+</style> 

+ 143 - 0
composables/useFormValidation.js

@@ -0,0 +1,143 @@
+import { ref, provide } from 'vue'
+
+export function useFormValidation(fieldConfigs = {}) {
+  const errors = ref({})
+
+  // 字段配置管理
+  const configs = ref(fieldConfigs)
+
+  // 获取字段配置
+  const getFieldConfig = (fieldName) => {
+    return configs.value[fieldName] || {}
+  }
+
+  // 设置字段配置
+  const setFieldConfig = (fieldName, config) => {
+    configs.value[fieldName] = config
+  }
+
+  // 批量设置字段配置
+  const setFieldConfigs = (newConfigs) => {
+    configs.value = { ...configs.value, ...newConfigs }
+  }
+
+  // 提供给子组件使用
+  provide('errors', errors)
+  provide('getFieldConfig', getFieldConfig)
+  
+  // 校验单个字段
+  const validateField = (fieldName, value, rules) => {
+    if (!rules || !Array.isArray(rules)) {
+      return true
+    }
+    
+    const fieldErrors = []
+    
+    for (const rule of rules) {
+      // 必填校验
+      if (rule.required && (!value || value === '')) {
+        fieldErrors.push(rule.message || '此字段为必填项')
+        break
+      }
+
+      // 如果值为空且不是必填,跳过其他校验
+      if (!value || value === '') {
+        continue
+      }
+
+      // 最小长度校验
+      if (rule.min && value.length < rule.min) {
+        fieldErrors.push(rule.message || `最少输入${rule.min}个字符`)
+        break
+      }
+
+      // 最大长度校验
+      if (rule.max && value.length > rule.max) {
+        fieldErrors.push(rule.message || `最多输入${rule.max}个字符`)
+        break
+      }
+
+      // 正则校验
+      if (rule.pattern && !rule.pattern.test(value)) {
+        fieldErrors.push(rule.message || '格式不正确')
+        break
+      }
+      
+      // 自定义校验函数
+      if (rule.validator && typeof rule.validator === 'function') {
+        const result = rule.validator(value)
+        if (result !== true) {
+          fieldErrors.push(result || rule.message || '校验失败')
+          break
+        }
+      }
+    }
+
+    // 更新错误信息
+    if (fieldErrors.length > 0) {
+      errors.value[fieldName] = fieldErrors
+      return false
+    } else {
+      delete errors.value[fieldName]
+      return true
+    }
+  }
+  
+  // 提供给子组件使用
+  provide('validateField', validateField)
+  
+  // 获取嵌套字段值的辅助函数
+  const getNestedFieldValue = (formData, fieldPath) => {
+    const pathArray = fieldPath.split('.')
+    let value = formData
+    for (const key of pathArray) {
+      value = value?.[key]
+    }
+    return value
+  }
+
+  // 校验整个表单
+  const validateForm = (formData, formRules) => {
+    console.log('validateForm开始:', { formData, formRules })
+    let isValid = true
+
+    for (const fieldName in formRules) {
+      // 支持嵌套字段路径(如 "xcd_0.qkms")
+      const fieldValue = getNestedFieldValue(formData, fieldName)
+      const fieldRules = formRules[fieldName].rules || formRules[fieldName]
+
+      console.log(`校验字段 ${fieldName}:`, { fieldValue, fieldRules })
+      const fieldValid = validateField(fieldName, fieldValue, fieldRules)
+      console.log(`字段 ${fieldName} 校验结果:`, fieldValid)
+
+      if (!fieldValid) {
+        isValid = false
+      }
+    }
+
+    console.log('validateForm结束:', isValid)
+    return isValid
+  }
+  
+  // 清除所有错误
+  const clearErrors = () => {
+    errors.value = {}
+  }
+
+  // 清除指定字段错误
+  const clearFieldError = (fieldName) => {
+    delete errors.value[fieldName]
+  }
+
+  return {
+    errors,
+    validateField,
+    validateForm,
+    clearErrors,
+    clearFieldError,
+    getFieldConfig,
+    setFieldConfig,
+    setFieldConfigs,
+    configs
+  }
+}

+ 3 - 0
config/env.js

@@ -0,0 +1,3 @@
+export default {
+  baseUrl: 'https://yx.newfeifan.cn'
+}

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 13 - 0
main.js

@@ -0,0 +1,13 @@
+import App from './App'
+import { createSSRApp } from 'vue'
+import pinia from './store/index.js'
+import uviewPlus from 'uview-plus'
+
+export function createApp() {
+  const app = createSSRApp(App)
+  app.use(pinia)
+  app.use(uviewPlus)
+  return {
+    app
+  }
+}

+ 73 - 0
manifest.json

@@ -0,0 +1,73 @@
+{
+    "name" : "DigitalCampusMiniProgram",
+    "appid" : "__UNI__FBB3E10",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wxddbefe871c9ac785",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "mergeVirtualHostAttributes" : true,
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "3"
+}

+ 17 - 0
node_modules/.bin/lessc

@@ -0,0 +1,17 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -z "$NODE_PATH" ]; then
+  export NODE_PATH="/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/less@4.4.0/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/node_modules"
+else
+  export NODE_PATH="/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/less@4.4.0/node_modules/less/bin/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/less@4.4.0/node_modules/less/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/less@4.4.0/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/node_modules:$NODE_PATH"
+fi
+if [ -x "$basedir/node" ]; then
+  exec "$basedir/node"  "$basedir/../less/bin/lessc" "$@"
+else
+  exec node  "$basedir/../less/bin/lessc" "$@"
+fi

+ 126 - 0
node_modules/.modules.yaml

@@ -0,0 +1,126 @@
+hoistPattern:
+  - '*'
+hoistedDependencies:
+  '@babel/helper-string-parser@7.27.1':
+    '@babel/helper-string-parser': private
+  '@babel/helper-validator-identifier@7.27.1':
+    '@babel/helper-validator-identifier': private
+  '@babel/parser@7.28.0':
+    '@babel/parser': private
+  '@babel/types@7.28.1':
+    '@babel/types': private
+  '@jridgewell/sourcemap-codec@1.5.4':
+    '@jridgewell/sourcemap-codec': private
+  '@vue/compiler-core@3.5.18':
+    '@vue/compiler-core': private
+  '@vue/compiler-dom@3.5.18':
+    '@vue/compiler-dom': private
+  '@vue/compiler-sfc@3.5.18':
+    '@vue/compiler-sfc': private
+  '@vue/compiler-ssr@3.5.18':
+    '@vue/compiler-ssr': private
+  '@vue/devtools-api@7.7.7':
+    '@vue/devtools-api': private
+  '@vue/devtools-kit@7.7.7':
+    '@vue/devtools-kit': private
+  '@vue/devtools-shared@7.7.7':
+    '@vue/devtools-shared': private
+  '@vue/reactivity@3.5.18':
+    '@vue/reactivity': private
+  '@vue/runtime-dom@3.5.18':
+    '@vue/runtime-dom': private
+  '@vue/server-renderer@3.5.18(vue@3.5.18)':
+    '@vue/server-renderer': private
+  '@vue/shared@3.5.18':
+    '@vue/shared': private
+  birpc@2.5.0:
+    birpc: private
+  copy-anything@2.0.6:
+    copy-anything: private
+  csstype@3.1.3:
+    csstype: private
+  delegate@3.2.0:
+    delegate: private
+  entities@4.5.0:
+    entities: private
+  errno@0.1.8:
+    errno: private
+  estree-walker@2.0.2:
+    estree-walker: private
+  good-listener@1.2.2:
+    good-listener: private
+  graceful-fs@4.2.11:
+    graceful-fs: private
+  hookable@5.5.3:
+    hookable: private
+  iconv-lite@0.6.3:
+    iconv-lite: private
+  image-size@0.5.5:
+    image-size: private
+  is-what@3.14.1:
+    is-what: private
+  magic-string@0.30.17:
+    magic-string: private
+  make-dir@2.1.0:
+    make-dir: private
+  mime@1.6.0:
+    mime: private
+  mitt@3.0.1:
+    mitt: private
+  nanoid@3.3.11:
+    nanoid: private
+  needle@3.3.1:
+    needle: private
+  parse-node-version@1.0.1:
+    parse-node-version: private
+  perfect-debounce@1.0.0:
+    perfect-debounce: private
+  picocolors@1.1.1:
+    picocolors: private
+  pify@4.0.1:
+    pify: private
+  postcss@8.5.6:
+    postcss: private
+  prr@1.0.1:
+    prr: private
+  rfdc@1.4.1:
+    rfdc: private
+  safer-buffer@2.1.2:
+    safer-buffer: private
+  sax@1.4.1:
+    sax: private
+  select@1.1.2:
+    select: private
+  semver@5.7.2:
+    semver: private
+  source-map-js@1.2.1:
+    source-map-js: private
+  source-map@0.6.1:
+    source-map: private
+  speakingurl@14.0.1:
+    speakingurl: private
+  superjson@2.2.2:
+    superjson: private
+  tiny-emitter@2.1.0:
+    tiny-emitter: private
+  tslib@2.8.1:
+    tslib: private
+included:
+  dependencies: true
+  devDependencies: true
+  optionalDependencies: true
+injectedDeps: {}
+layoutVersion: 5
+nodeLinker: isolated
+packageManager: pnpm@9.12.3
+pendingBuilds: []
+prunedAt: Mon, 04 Aug 2025 07:17:21 GMT
+publicHoistPattern:
+  - '*eslint*'
+  - '*prettier*'
+registries:
+  default: https://registry.npmmirror.com/
+skipped: []
+storeDir: /Users/xuruhua/Library/pnpm/store/v3
+virtualStoreDir: .pnpm
+virtualStoreDirMaxLength: 120

+ 22 - 0
node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/LICENSE

@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2014-present Sebastian McKenzie and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 19 - 0
node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/README.md

@@ -0,0 +1,19 @@
+# @babel/helper-string-parser
+
+> A utility package to parse strings
+
+See our website [@babel/helper-string-parser](https://babeljs.io/docs/babel-helper-string-parser) for more information.
+
+## Install
+
+Using npm:
+
+```sh
+npm install --save @babel/helper-string-parser
+```
+
+or using yarn:
+
+```sh
+yarn add @babel/helper-string-parser
+```

+ 295 - 0
node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/lib/index.js

@@ -0,0 +1,295 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.readCodePoint = readCodePoint;
+exports.readInt = readInt;
+exports.readStringContents = readStringContents;
+var _isDigit = function isDigit(code) {
+  return code >= 48 && code <= 57;
+};
+const forbiddenNumericSeparatorSiblings = {
+  decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]),
+  hex: new Set([46, 88, 95, 120])
+};
+const isAllowedNumericSeparatorSibling = {
+  bin: ch => ch === 48 || ch === 49,
+  oct: ch => ch >= 48 && ch <= 55,
+  dec: ch => ch >= 48 && ch <= 57,
+  hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102
+};
+function readStringContents(type, input, pos, lineStart, curLine, errors) {
+  const initialPos = pos;
+  const initialLineStart = lineStart;
+  const initialCurLine = curLine;
+  let out = "";
+  let firstInvalidLoc = null;
+  let chunkStart = pos;
+  const {
+    length
+  } = input;
+  for (;;) {
+    if (pos >= length) {
+      errors.unterminated(initialPos, initialLineStart, initialCurLine);
+      out += input.slice(chunkStart, pos);
+      break;
+    }
+    const ch = input.charCodeAt(pos);
+    if (isStringEnd(type, ch, input, pos)) {
+      out += input.slice(chunkStart, pos);
+      break;
+    }
+    if (ch === 92) {
+      out += input.slice(chunkStart, pos);
+      const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors);
+      if (res.ch === null && !firstInvalidLoc) {
+        firstInvalidLoc = {
+          pos,
+          lineStart,
+          curLine
+        };
+      } else {
+        out += res.ch;
+      }
+      ({
+        pos,
+        lineStart,
+        curLine
+      } = res);
+      chunkStart = pos;
+    } else if (ch === 8232 || ch === 8233) {
+      ++pos;
+      ++curLine;
+      lineStart = pos;
+    } else if (ch === 10 || ch === 13) {
+      if (type === "template") {
+        out += input.slice(chunkStart, pos) + "\n";
+        ++pos;
+        if (ch === 13 && input.charCodeAt(pos) === 10) {
+          ++pos;
+        }
+        ++curLine;
+        chunkStart = lineStart = pos;
+      } else {
+        errors.unterminated(initialPos, initialLineStart, initialCurLine);
+      }
+    } else {
+      ++pos;
+    }
+  }
+  return {
+    pos,
+    str: out,
+    firstInvalidLoc,
+    lineStart,
+    curLine,
+    containsInvalid: !!firstInvalidLoc
+  };
+}
+function isStringEnd(type, ch, input, pos) {
+  if (type === "template") {
+    return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123;
+  }
+  return ch === (type === "double" ? 34 : 39);
+}
+function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) {
+  const throwOnInvalid = !inTemplate;
+  pos++;
+  const res = ch => ({
+    pos,
+    ch,
+    lineStart,
+    curLine
+  });
+  const ch = input.charCodeAt(pos++);
+  switch (ch) {
+    case 110:
+      return res("\n");
+    case 114:
+      return res("\r");
+    case 120:
+      {
+        let code;
+        ({
+          code,
+          pos
+        } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors));
+        return res(code === null ? null : String.fromCharCode(code));
+      }
+    case 117:
+      {
+        let code;
+        ({
+          code,
+          pos
+        } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors));
+        return res(code === null ? null : String.fromCodePoint(code));
+      }
+    case 116:
+      return res("\t");
+    case 98:
+      return res("\b");
+    case 118:
+      return res("\u000b");
+    case 102:
+      return res("\f");
+    case 13:
+      if (input.charCodeAt(pos) === 10) {
+        ++pos;
+      }
+    case 10:
+      lineStart = pos;
+      ++curLine;
+    case 8232:
+    case 8233:
+      return res("");
+    case 56:
+    case 57:
+      if (inTemplate) {
+        return res(null);
+      } else {
+        errors.strictNumericEscape(pos - 1, lineStart, curLine);
+      }
+    default:
+      if (ch >= 48 && ch <= 55) {
+        const startPos = pos - 1;
+        const match = /^[0-7]+/.exec(input.slice(startPos, pos + 2));
+        let octalStr = match[0];
+        let octal = parseInt(octalStr, 8);
+        if (octal > 255) {
+          octalStr = octalStr.slice(0, -1);
+          octal = parseInt(octalStr, 8);
+        }
+        pos += octalStr.length - 1;
+        const next = input.charCodeAt(pos);
+        if (octalStr !== "0" || next === 56 || next === 57) {
+          if (inTemplate) {
+            return res(null);
+          } else {
+            errors.strictNumericEscape(startPos, lineStart, curLine);
+          }
+        }
+        return res(String.fromCharCode(octal));
+      }
+      return res(String.fromCharCode(ch));
+  }
+}
+function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) {
+  const initialPos = pos;
+  let n;
+  ({
+    n,
+    pos
+  } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid));
+  if (n === null) {
+    if (throwOnInvalid) {
+      errors.invalidEscapeSequence(initialPos, lineStart, curLine);
+    } else {
+      pos = initialPos - 1;
+    }
+  }
+  return {
+    code: n,
+    pos
+  };
+}
+function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) {
+  const start = pos;
+  const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct;
+  const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin;
+  let invalid = false;
+  let total = 0;
+  for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) {
+    const code = input.charCodeAt(pos);
+    let val;
+    if (code === 95 && allowNumSeparator !== "bail") {
+      const prev = input.charCodeAt(pos - 1);
+      const next = input.charCodeAt(pos + 1);
+      if (!allowNumSeparator) {
+        if (bailOnError) return {
+          n: null,
+          pos
+        };
+        errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine);
+      } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) {
+        if (bailOnError) return {
+          n: null,
+          pos
+        };
+        errors.unexpectedNumericSeparator(pos, lineStart, curLine);
+      }
+      ++pos;
+      continue;
+    }
+    if (code >= 97) {
+      val = code - 97 + 10;
+    } else if (code >= 65) {
+      val = code - 65 + 10;
+    } else if (_isDigit(code)) {
+      val = code - 48;
+    } else {
+      val = Infinity;
+    }
+    if (val >= radix) {
+      if (val <= 9 && bailOnError) {
+        return {
+          n: null,
+          pos
+        };
+      } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) {
+        val = 0;
+      } else if (forceLen) {
+        val = 0;
+        invalid = true;
+      } else {
+        break;
+      }
+    }
+    ++pos;
+    total = total * radix + val;
+  }
+  if (pos === start || len != null && pos - start !== len || invalid) {
+    return {
+      n: null,
+      pos
+    };
+  }
+  return {
+    n: total,
+    pos
+  };
+}
+function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) {
+  const ch = input.charCodeAt(pos);
+  let code;
+  if (ch === 123) {
+    ++pos;
+    ({
+      code,
+      pos
+    } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors));
+    ++pos;
+    if (code !== null && code > 0x10ffff) {
+      if (throwOnInvalid) {
+        errors.invalidCodePoint(pos, lineStart, curLine);
+      } else {
+        return {
+          code: null,
+          pos
+        };
+      }
+    }
+  } else {
+    ({
+      code,
+      pos
+    } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors));
+  }
+  return {
+    code,
+    pos
+  };
+}
+
+//# sourceMappingURL=index.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/lib/index.js.map


+ 31 - 0
node_modules/.pnpm/@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser/package.json

@@ -0,0 +1,31 @@
+{
+  "name": "@babel/helper-string-parser",
+  "version": "7.27.1",
+  "description": "A utility package to parse strings",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/babel/babel.git",
+    "directory": "packages/babel-helper-string-parser"
+  },
+  "homepage": "https://babel.dev/docs/en/next/babel-helper-string-parser",
+  "license": "MIT",
+  "publishConfig": {
+    "access": "public"
+  },
+  "main": "./lib/index.js",
+  "devDependencies": {
+    "charcodes": "^0.2.0"
+  },
+  "engines": {
+    "node": ">=6.9.0"
+  },
+  "author": "The Babel Team (https://babel.dev/team)",
+  "exports": {
+    ".": {
+      "types": "./lib/index.d.ts",
+      "default": "./lib/index.js"
+    },
+    "./package.json": "./package.json"
+  },
+  "type": "commonjs"
+}

+ 22 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/LICENSE

@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2014-present Sebastian McKenzie and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 19 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/README.md

@@ -0,0 +1,19 @@
+# @babel/helper-validator-identifier
+
+> Validate identifier/keywords name
+
+See our website [@babel/helper-validator-identifier](https://babeljs.io/docs/babel-helper-validator-identifier) for more information.
+
+## Install
+
+Using npm:
+
+```sh
+npm install --save @babel/helper-validator-identifier
+```
+
+or using yarn:
+
+```sh
+yarn add @babel/helper-validator-identifier
+```

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 8 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/identifier.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map


+ 57 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/index.js

@@ -0,0 +1,57 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+Object.defineProperty(exports, "isIdentifierChar", {
+  enumerable: true,
+  get: function () {
+    return _identifier.isIdentifierChar;
+  }
+});
+Object.defineProperty(exports, "isIdentifierName", {
+  enumerable: true,
+  get: function () {
+    return _identifier.isIdentifierName;
+  }
+});
+Object.defineProperty(exports, "isIdentifierStart", {
+  enumerable: true,
+  get: function () {
+    return _identifier.isIdentifierStart;
+  }
+});
+Object.defineProperty(exports, "isKeyword", {
+  enumerable: true,
+  get: function () {
+    return _keyword.isKeyword;
+  }
+});
+Object.defineProperty(exports, "isReservedWord", {
+  enumerable: true,
+  get: function () {
+    return _keyword.isReservedWord;
+  }
+});
+Object.defineProperty(exports, "isStrictBindOnlyReservedWord", {
+  enumerable: true,
+  get: function () {
+    return _keyword.isStrictBindOnlyReservedWord;
+  }
+});
+Object.defineProperty(exports, "isStrictBindReservedWord", {
+  enumerable: true,
+  get: function () {
+    return _keyword.isStrictBindReservedWord;
+  }
+});
+Object.defineProperty(exports, "isStrictReservedWord", {
+  enumerable: true,
+  get: function () {
+    return _keyword.isStrictReservedWord;
+  }
+});
+var _identifier = require("./identifier.js");
+var _keyword = require("./keyword.js");
+
+//# sourceMappingURL=index.js.map

+ 1 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/index.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_identifier","require","_keyword"],"sources":["../src/index.ts"],"sourcesContent":["export {\n  isIdentifierName,\n  isIdentifierChar,\n  isIdentifierStart,\n} from \"./identifier.ts\";\nexport {\n  isReservedWord,\n  isStrictBindOnlyReservedWord,\n  isStrictBindReservedWord,\n  isStrictReservedWord,\n  isKeyword,\n} from \"./keyword.ts\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAKA,IAAAC,QAAA,GAAAD,OAAA","ignoreList":[]}

+ 35 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/keyword.js

@@ -0,0 +1,35 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.isKeyword = isKeyword;
+exports.isReservedWord = isReservedWord;
+exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord;
+exports.isStrictBindReservedWord = isStrictBindReservedWord;
+exports.isStrictReservedWord = isStrictReservedWord;
+const reservedWords = {
+  keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
+  strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
+  strictBind: ["eval", "arguments"]
+};
+const keywords = new Set(reservedWords.keyword);
+const reservedWordsStrictSet = new Set(reservedWords.strict);
+const reservedWordsStrictBindSet = new Set(reservedWords.strictBind);
+function isReservedWord(word, inModule) {
+  return inModule && word === "await" || word === "enum";
+}
+function isStrictReservedWord(word, inModule) {
+  return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);
+}
+function isStrictBindOnlyReservedWord(word) {
+  return reservedWordsStrictBindSet.has(word);
+}
+function isStrictBindReservedWord(word, inModule) {
+  return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word);
+}
+function isKeyword(word) {
+  return keywords.has(word);
+}
+
+//# sourceMappingURL=keyword.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/lib/keyword.js.map


+ 31 - 0
node_modules/.pnpm/@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier/package.json

@@ -0,0 +1,31 @@
+{
+  "name": "@babel/helper-validator-identifier",
+  "version": "7.27.1",
+  "description": "Validate identifier/keywords name",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/babel/babel.git",
+    "directory": "packages/babel-helper-validator-identifier"
+  },
+  "license": "MIT",
+  "publishConfig": {
+    "access": "public"
+  },
+  "main": "./lib/index.js",
+  "exports": {
+    ".": {
+      "types": "./lib/index.d.ts",
+      "default": "./lib/index.js"
+    },
+    "./package.json": "./package.json"
+  },
+  "devDependencies": {
+    "@unicode/unicode-16.0.0": "^1.0.0",
+    "charcodes": "^0.2.0"
+  },
+  "engines": {
+    "node": ">=6.9.0"
+  },
+  "author": "The Babel Team (https://babel.dev/team)",
+  "type": "commonjs"
+}

+ 1073 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/CHANGELOG.md

@@ -0,0 +1,1073 @@
+# Changelog
+
+> **Tags:**
+> - :boom:       [Breaking Change]
+> - :eyeglasses: [Spec Compliance]
+> - :rocket:     [New Feature]
+> - :bug:        [Bug Fix]
+> - :memo:       [Documentation]
+> - :house:      [Internal]
+> - :nail_care:  [Polish]
+
+> Semver Policy: https://github.com/babel/babel/tree/main/packages/babel-parser#semver
+
+_Note: Gaps between patch versions are faulty, broken or test releases._
+
+See the [Babel Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) for the pre-6.8.0 version Changelog.
+
+## 6.17.1 (2017-05-10)
+
+### :bug: Bug Fix
+ * Fix typo in flow spread operator error (Brian Ng)
+ * Fixed invalid number literal parsing ([#473](https://github.com/babel/babylon/pull/473)) (Alex Kuzmenko)
+ * Fix number parser ([#433](https://github.com/babel/babylon/pull/433)) (Alex Kuzmenko)
+ * Ensure non pattern shorthand props are checked for reserved words ([#479](https://github.com/babel/babylon/pull/479)) (Brian Ng)
+ * Remove jsx context when parsing arrow functions ([#475](https://github.com/babel/babylon/pull/475)) (Brian Ng)
+ * Allow super in class properties ([#499](https://github.com/babel/babylon/pull/499)) (Brian Ng)
+ * Allow flow class field to be named constructor ([#510](https://github.com/babel/babylon/pull/510)) (Brian Ng)
+
+## 6.17.0 (2017-04-20)
+
+### :bug: Bug Fix
+ * Cherry-pick #418 to 6.x ([#476](https://github.com/babel/babylon/pull/476)) (Sebastian McKenzie)
+ * Add support for invalid escapes in tagged templates ([#274](https://github.com/babel/babylon/pull/274)) (Kevin Gibbons)
+ * Throw error if new.target is used outside of a function ([#402](https://github.com/babel/babylon/pull/402)) (Brian Ng)
+ * Fix parsing of class properties ([#351](https://github.com/babel/babylon/pull/351)) (Kevin Gibbons)
+ * Fix parsing yield with dynamicImport ([#383](https://github.com/babel/babylon/pull/383)) (Brian Ng)
+ * Ensure consistent start args for parseParenItem ([#386](https://github.com/babel/babylon/pull/386)) (Brian Ng)
+
+## 7.0.0-beta.8 (2017-04-04)
+
+### New Feature
+* Add support for flow type spread (#418) (Conrad Buck)
+* Allow statics in flow interfaces (#427) (Brian Ng)
+
+### Bug Fix
+* Fix predicate attachment to match flow parser (#428) (Brian Ng)
+* Add extra.raw back to JSXText and JSXAttribute (#344) (Alex Rattray)
+* Fix rest parameters with array and objects (#424) (Brian Ng)
+* Fix number parser (#433) (Alex Kuzmenko)
+
+### Docs
+* Fix CONTRIBUTING.md [skip ci] (#432) (Alex Kuzmenko)
+
+### Internal
+* Use babel-register script when running babel smoke tests (#442) (Brian Ng)
+
+## 7.0.0-beta.7 (2017-03-22)
+
+### Spec Compliance
+* Remove babylon plugin for template revision since it's stage-4 (#426) (Henry Zhu)
+
+### Bug Fix
+
+* Fix push-pop logic in flow (#405) (Daniel Tschinder)
+
+## 7.0.0-beta.6 (2017-03-21)
+
+### New Feature
+* Add support for invalid escapes in tagged templates (#274) (Kevin Gibbons)
+
+### Polish
+* Improves error message when super is called outside of constructor (#408) (Arshabh Kumar Agarwal)
+
+### Docs
+
+* [7.0] Moved value field in spec from ObjectMember to ObjectProperty as ObjectMethod's don't have it (#415) [skip ci] (James Browning)
+
+## 7.0.0-beta.5 (2017-03-21)
+
+### Bug Fix
+* Throw error if new.target is used outside of a function (#402) (Brian Ng)
+* Fix parsing of class properties (#351) (Kevin Gibbons)
+
+### Other
+ * Test runner: Detect extra property in 'actual' but not in 'expected'. (#407) (Andy)
+ * Optimize travis builds (#419) (Daniel Tschinder)
+ * Update codecov to 2.0 (#412) (Daniel Tschinder)
+ * Fix spec for ClassMethod: It doesn't have a function, it *is* a function. (#406) [skip ci] (Andy)
+ * Changed Non-existent RestPattern to RestElement which is what is actually parsed (#409) [skip ci] (James Browning)
+ * Upgrade flow to 0.41 (Daniel Tschinder)
+ * Fix watch command (#403) (Brian Ng)
+ * Update yarn lock (Daniel Tschinder)
+ * Fix watch command (#403) (Brian Ng)
+ * chore(package): update flow-bin to version 0.41.0 (#395) (greenkeeper[bot])
+ * Add estree test for correct order of directives (Daniel Tschinder)
+ * Add DoExpression to spec (#364) (Alex Kuzmenko)
+ * Mention cloning of repository in CONTRIBUTING.md (#391) [skip ci] (Sumedh Nimkarde)
+ * Explain how to run only one test (#389) [skip ci] (Aaron Ang)
+
+ ## 7.0.0-beta.4 (2017-03-01)
+
+* Don't consume async when checking for async func decl (#377) (Brian Ng)
+* add `ranges` option [skip ci] (Henry Zhu)
+* Don't parse class properties without initializers when classProperties is disabled and Flow is enabled (#300) (Andrew Levine)
+
+## 7.0.0-beta.3 (2017-02-28)
+
+- [7.0] Change RestProperty/SpreadProperty to RestElement/SpreadElement (#384)
+- Merge changes from 6.x
+
+## 7.0.0-beta.2 (2017-02-20)
+
+- estree: correctly change literals in all cases (#368) (Daniel Tschinder)
+
+## 7.0.0-beta.1 (2017-02-20)
+
+- Fix negative number literal typeannotations (#366) (Daniel Tschinder)
+- Update contributing with more test info [skip ci] (#355) (Brian Ng)
+
+## 7.0.0-beta.0 (2017-02-15)
+
+- Reintroduce Variance node (#333) (Daniel Tschinder)
+- Rename NumericLiteralTypeAnnotation to NumberLiteralTypeAnnotation (#332) (Charles Pick)
+- [7.0] Remove ForAwaitStatement, add await flag to ForOfStatement (#349) (Brandon Dail)
+- chore(package): update ava to version 0.18.0 (#345) (greenkeeper[bot])
+- chore(package): update babel-plugin-istanbul to version 4.0.0 (#350) (greenkeeper[bot])
+- Change location of ObjectTypeIndexer to match flow (#228) (Daniel Tschinder)
+- Rename flow AST Type ExistentialTypeParam to ExistsTypeAnnotation (#322) (Toru Kobayashi)
+- Revert "Temporary rollback for erroring on trailing comma with spread (#154)" (#290) (Daniel Tschinder)
+- Remove classConstructorCall plugin (#291) (Brian Ng)
+- Update yarn.lock (Daniel Tschinder)
+- Update cross-env to 3.x (Daniel Tschinder)
+- [7.0] Remove node 0.10, 0.12 and 5 from Travis (#284) (Sergey Rubanov)
+- Remove `String.fromCodePoint` shim (#279) (Mathias Bynens)
+
+## 6.16.1 (2017-02-23)
+
+### :bug: Regression
+
+- Revert "Fix export default async function to be FunctionDeclaration" ([#375](https://github.com/babel/babylon/pull/375))
+
+Need to modify Babel for this AST node change, so moving to 7.0.
+
+- Revert "Don't parse class properties without initializers when classProperties plugin is disabled, and Flow is enabled" ([#376](https://github.com/babel/babylon/pull/376))
+
+[react-native](https://github.com/facebook/react-native/issues/12542) broke with this so we reverted.
+
+## 6.16.0 (2017-02-23)
+
+### :rocket: New Feature
+
+***ESTree*** compatibility as plugin ([#277](https://github.com/babel/babylon/pull/277)) (Daniel Tschinder)
+
+We finally introduce a new compatibility layer for ESTree. To put babylon into ESTree-compatible mode the new plugin `estree` can be enabled. In this mode the parser will output an AST that is compliant to the specs of [ESTree](https://github.com/estree/estree/)
+
+We highly recommend everyone who uses babylon outside of babel to use this plugin. This will make it much easier for users to switch between different ESTree-compatible parsers. We so far tested several projects with different parsers and exchanged their parser to babylon and in nearly all cases it worked out of the box. Some other estree-compatible parsers include `acorn`, `esprima`, `espree`, `flow-parser`, etc.
+
+To enable `estree` mode simply add the plugin in the config:
+```json
+{
+  "plugins": [ "estree" ]
+}
+```
+
+If you want to migrate your project from non-ESTree mode to ESTree, have a look at our [Readme](https://github.com/babel/babylon/#output), where all deviations are mentioned.
+
+Add a parseExpression public method ([#213](https://github.com/babel/babylon/pull/213)) (jeromew)
+
+Babylon exports a new function to parse a single expression
+
+```js
+import { parseExpression } from 'babylon';
+
+const ast = parseExpression('x || y && z', options);
+```
+
+The returned AST will only consist of the expression. The options are the same as for `parse()`
+
+Add startLine option ([#346](https://github.com/babel/babylon/pull/346)) (Raphael Mu)
+
+A new option was added to babylon allowing to change the initial linenumber for the first line which is usually `1`.
+Changing this for example to `100` will make line `1` of the input source to be marked as line `100`, line `2` as `101`, line `3` as `102`, ...
+
+Function predicate declaration ([#103](https://github.com/babel/babylon/pull/103)) (Panagiotis Vekris)
+
+Added support for function predicates which flow introduced in version 0.33.0
+
+```js
+declare function is_number(x: mixed): boolean %checks(typeof x === "number");
+```
+
+Allow imports in declare module ([#315](https://github.com/babel/babylon/pull/315)) (Daniel Tschinder)
+
+Added support for imports within module declarations which flow introduced in version 0.37.0
+
+```js
+declare module "C" {
+  import type { DT } from "D";
+  declare export type CT = { D: DT };
+}
+```
+
+### :eyeglasses: Spec Compliance
+
+Forbid semicolons after decorators in classes ([#352](https://github.com/babel/babylon/pull/352)) (Kevin Gibbons)
+
+This example now correctly throws an error when there is a semicolon after the decorator:
+
+```js
+class A {
+@a;
+foo(){}
+}
+```
+
+Keywords are not allowed as local specifier ([#307](https://github.com/babel/babylon/pull/307)) (Daniel Tschinder)
+
+Using keywords in imports is not allowed anymore:
+
+```js
+import { default } from "foo";
+import { a as debugger } from "foo";
+```
+
+Do not allow overwritting of primitive types ([#314](https://github.com/babel/babylon/pull/314)) (Daniel Tschinder)
+
+In flow it is now forbidden to overwrite the primitive types `"any"`, `"mixed"`, `"empty"`, `"bool"`, `"boolean"`, `"number"`, `"string"`, `"void"` and `"null"` with your own type declaration.
+
+Disallow import type { type a } from … ([#305](https://github.com/babel/babylon/pull/305)) (Daniel Tschinder)
+
+The following code now correctly throws an error
+
+```js
+import type { type a } from "foo";
+```
+
+Don't parse class properties without initializers when classProperties is disabled and Flow is enabled ([#300](https://github.com/babel/babylon/pull/300)) (Andrew Levine)
+
+Ensure that you enable the `classProperties` plugin in order to enable correct parsing of class properties. Prior to this version it was possible to parse them by enabling the `flow` plugin but this was not intended the behaviour.
+
+If you enable the flow plugin you can only define the type of the class properties, but not initialize them.
+
+Fix export default async function to be FunctionDeclaration ([#324](https://github.com/babel/babylon/pull/324)) (Daniel Tschinder)
+
+Parsing the following code now returns a `FunctionDeclaration` AST node instead of `FunctionExpression`.
+
+```js
+export default async function bar() {};
+```
+
+### :nail_care: Polish
+
+Improve error message on attempt to destructure named import ([#288](https://github.com/babel/babylon/pull/288)) (Brian Ng)
+
+### :bug: Bug Fix
+
+Fix negative number literal typeannotations ([#366](https://github.com/babel/babylon/pull/366)) (Daniel Tschinder)
+
+Ensure takeDecorators is called on exported class ([#358](https://github.com/babel/babylon/pull/358)) (Brian Ng)
+
+ESTree: correctly change literals in all cases ([#368](https://github.com/babel/babylon/pull/368)) (Daniel Tschinder)
+
+Correctly convert RestProperty to Assignable ([#339](https://github.com/babel/babylon/pull/339)) (Daniel Tschinder)
+
+Fix #321 by allowing question marks in type params ([#338](https://github.com/babel/babylon/pull/338)) (Daniel Tschinder)
+
+Fix #336 by correctly setting arrow-param ([#337](https://github.com/babel/babylon/pull/337)) (Daniel Tschinder)
+
+Fix parse error when destructuring `set` with default value ([#317](https://github.com/babel/babylon/pull/317)) (Brian Ng)
+
+Fix ObjectTypeCallProperty static ([#298](https://github.com/babel/babylon/pull/298)) (Dan Harper)
+
+
+### :house: Internal
+
+Fix generator-method-with-computed-name spec ([#360](https://github.com/babel/babylon/pull/360)) (Alex Rattray)
+
+Fix flow type-parameter-declaration test with unintended semantic ([#361](https://github.com/babel/babylon/pull/361)) (Alex Rattray)
+
+Cleanup and splitup parser functions ([#295](https://github.com/babel/babylon/pull/295)) (Daniel Tschinder)
+
+chore(package): update flow-bin to version 0.38.0 ([#313](https://github.com/babel/babylon/pull/313)) (greenkeeper[bot])
+
+Call inner function instead of 1:1 copy to plugin ([#294](https://github.com/babel/babylon/pull/294)) (Daniel Tschinder)
+
+Update eslint-config-babel to the latest version 🚀 ([#299](https://github.com/babel/babylon/pull/299)) (greenkeeper[bot])
+
+Update eslint-config-babel to the latest version 🚀 ([#293](https://github.com/babel/babylon/pull/293)) (greenkeeper[bot])
+
+devDeps: remove eslint-plugin-babel ([#292](https://github.com/babel/babylon/pull/292)) (Kai Cataldo)
+
+Correct indent eslint rule config ([#276](https://github.com/babel/babylon/pull/276)) (Daniel Tschinder)
+
+Fail tests that have expected.json and throws-option ([#285](https://github.com/babel/babylon/pull/285)) (Daniel Tschinder)
+
+### :memo: Documentation
+
+Update contributing with more test info [skip ci] ([#355](https://github.com/babel/babylon/pull/355)) (Brian Ng)
+
+Update API documentation ([#330](https://github.com/babel/babylon/pull/330)) (Timothy Gu)
+
+Added keywords to package.json ([#323](https://github.com/babel/babylon/pull/323)) (Dmytro)
+
+AST spec: fix casing of `RegExpLiteral` ([#318](https://github.com/babel/babylon/pull/318)) (Mathias Bynens)
+
+## 6.15.0 (2017-01-10)
+
+### :eyeglasses: Spec Compliance
+
+Add support for Flow shorthand import type ([#267](https://github.com/babel/babylon/pull/267)) (Jeff Morrison)
+
+This change implements flows new shorthand import syntax
+and where previously you had to write this code:
+
+```js
+import {someValue} from "blah";
+import type {someType} from "blah";
+import typeof {someOtherValue} from "blah";
+```
+
+you can now write it like this:
+
+```js
+import {
+  someValue,
+  type someType,
+  typeof someOtherValue,
+} from "blah";
+```
+
+For more information look at [this](https://github.com/facebook/flow/pull/2890) pull request.
+
+flow: allow leading pipes in all positions ([#256](https://github.com/babel/babylon/pull/256)) (Vladimir Kurchatkin)
+
+This change now allows a leading pipe everywhere types can be used:
+```js
+var f = (x): | 1 | 2 => 1;
+```
+
+Throw error when exporting non-declaration ([#241](https://github.com/babel/babylon/pull/241)) (Kai Cataldo)
+
+Previously babylon parsed the following exports, although they are not valid:
+```js
+export typeof foo;
+export new Foo();
+export function() {};
+export for (;;);
+export while(foo);
+```
+
+### :bug: Bug Fix
+
+Don't set inType flag when parsing property names ([#266](https://github.com/babel/babylon/pull/266)) (Vladimir Kurchatkin)
+
+This fixes parsing of this case:
+
+```js
+const map = {
+  [age <= 17] : 'Too young'
+};
+```
+
+Fix source location for JSXEmptyExpression nodes (fixes #248) ([#249](https://github.com/babel/babylon/pull/249)) (James Long)
+
+The following case produced an invalid AST
+```js
+<div>{/* foo */}</div>
+```
+
+Use fromCodePoint to convert high value unicode entities ([#243](https://github.com/babel/babylon/pull/243)) (Ryan Duffy)
+
+When high value unicode entities (e.g. 💩) were used in the input source code they are now correctly encoded in the resulting AST.
+
+Rename folder to avoid Windows-illegal characters ([#281](https://github.com/babel/babylon/pull/281)) (Ryan Plant)
+
+Allow this.state.clone() when parsing decorators ([#262](https://github.com/babel/babylon/pull/262)) (Alex Rattray)
+
+### :house: Internal
+
+User external-helpers ([#254](https://github.com/babel/babylon/pull/254)) (Daniel Tschinder)
+
+Add watch script for dev ([#234](https://github.com/babel/babylon/pull/234)) (Kai Cataldo)
+
+Freeze current plugins list for "*" option, and remove from README.md ([#245](https://github.com/babel/babylon/pull/245)) (Andrew Levine)
+
+Prepare tests for multiple fixture runners. ([#240](https://github.com/babel/babylon/pull/240)) (Daniel Tschinder)
+
+Add some test coverage for decorators stage-0 plugin ([#250](https://github.com/babel/babylon/pull/250)) (Andrew Levine)
+
+Refactor tokenizer types file ([#263](https://github.com/babel/babylon/pull/263)) (Sven SAULEAU)
+
+Update eslint-config-babel to the latest version 🚀 ([#273](https://github.com/babel/babylon/pull/273)) (greenkeeper[bot])
+
+chore(package): update rollup to version 0.41.0 ([#272](https://github.com/babel/babylon/pull/272)) (greenkeeper[bot])
+
+chore(package): update flow-bin to version 0.37.0 ([#255](https://github.com/babel/babylon/pull/255)) (greenkeeper[bot])
+
+## 6.14.1 (2016-11-17)
+
+### :bug: Bug Fix
+
+Allow `"plugins": ["*"]` ([#229](https://github.com/babel/babylon/pull/229)) (Daniel Tschinder)
+
+```js
+{
+  "plugins": ["*"]
+}
+```
+
+Will include all parser plugins instead of specifying each one individually. Useful for tools like babel-eslint, jscodeshift, and ast-explorer.
+
+## 6.14.0 (2016-11-16)
+
+### :eyeglasses: Spec Compliance
+
+Throw error for reserved words `enum` and `await` ([#195](https://github.com/babel/babylon/pull/195)) (Kai Cataldo)
+
+[11.6.2.2 Future Reserved Words](http://www.ecma-international.org/ecma-262/6.0/#sec-future-reserved-words)
+
+Babylon will throw for more reserved words such as `enum` or `await` (in strict mode).
+
+```
+class enum {} // throws
+class await {} // throws in strict mode (module)
+```
+
+Optional names for function types and object type indexers ([#197](https://github.com/babel/babylon/pull/197)) (Gabe Levi)
+
+So where you used to have to write
+
+```js
+type A = (x: string, y: boolean) => number;
+type B = (z: string) => number;
+type C = { [key: string]: number };
+```
+
+you can now write (with flow 0.34.0)
+
+```js
+type A = (string, boolean) => number;
+type B = string => number;
+type C = { [string]: number };
+```
+
+Parse flow nested array type annotations like `number[][]` ([#219](https://github.com/babel/babylon/pull/219)) (Bernhard Häussner)
+
+Supports these form now of specifying array types:
+
+```js
+var a: number[][][][];
+var b: string[][];
+```
+
+### :bug: Bug Fix
+
+Correctly eat semicolon at the end of `DelcareModuleExports` ([#223](https://github.com/babel/babylon/pull/223))  (Daniel Tschinder)
+
+```
+declare module "foo" { declare module.exports: number }
+declare module "foo" { declare module.exports: number; }  // also allowed now
+```
+
+### :house: Internal
+
+ * Count Babel tests towards Babylon code coverage ([#182](https://github.com/babel/babylon/pull/182)) (Moti Zilberman)
+ * Fix strange line endings ([#214](https://github.com/babel/babylon/pull/214)) (Thomas Grainger)
+ * Add node 7 (Daniel Tschinder)
+ * chore(package): update flow-bin to version 0.34.0 ([#204](https://github.com/babel/babylon/pull/204)) (Greenkeeper)
+
+## v6.13.1 (2016-10-26)
+
+### :nail_care: Polish
+
+- Use rollup for bundling to speed up startup time ([#190](https://github.com/babel/babylon/pull/190)) ([@drewml](https://github.com/DrewML))
+
+```js
+const babylon = require('babylon');
+const ast = babylon.parse('var foo = "lol";');
+```
+
+With that test case, there was a ~95ms savings by removing the need for node to build/traverse the dependency graph.
+
+**Without bundling**
+![image](https://cloud.githubusercontent.com/assets/5233399/19420264/3133497e-93ad-11e6-9a6a-2da59c4f5c13.png)
+
+**With bundling**
+![image](https://cloud.githubusercontent.com/assets/5233399/19420267/388f556e-93ad-11e6-813e-7c5c396be322.png)
+
+- add clean command [skip ci] ([#201](https://github.com/babel/babylon/pull/201)) (Henry Zhu)
+- add ForAwaitStatement (async generator already added) [skip ci] ([#196](https://github.com/babel/babylon/pull/196)) (Henry Zhu)
+
+## v6.13.0 (2016-10-21)
+
+### :eyeglasses: Spec Compliance
+
+Property variance type annotations for Flow plugin ([#161](https://github.com/babel/babylon/pull/161)) (Sam Goldman)
+
+> See https://flowtype.org/docs/variance.html for more information
+
+```js
+type T = { +p: T };
+interface T { -p: T };
+declare class T { +[k:K]: V };
+class T { -[k:K]: V };
+class C2 { +p: T = e };
+```
+
+Raise error on duplicate definition of __proto__ ([#183](https://github.com/babel/babylon/pull/183)) (Moti Zilberman)
+
+```js
+({ __proto__: 1, __proto__: 2 }) // Throws an error now
+```
+
+### :bug: Bug Fix
+
+Flow: Allow class properties to be named `static` ([#184](https://github.com/babel/babylon/pull/184)) (Moti Zilberman)
+
+```js
+declare class A {
+  static: T;
+}
+```
+
+Allow "async" as identifier for object literal property shorthand ([#187](https://github.com/babel/babylon/pull/187)) (Andrew Levine)
+
+```js
+var foo = { async, bar };
+```
+
+### :nail_care: Polish
+
+Fix flowtype and add inType to state ([#189](https://github.com/babel/babylon/pull/189)) (Daniel Tschinder)
+
+> This improves the performance slightly (because of hidden classes)
+
+### :house: Internal
+
+Fix .gitattributes line ending setting ([#191](https://github.com/babel/babylon/pull/191)) (Moti Zilberman)
+
+Increase test coverage ([#175](https://github.com/babel/babylon/pull/175) (Moti Zilberman)
+
+Readd missin .eslinignore for IDEs (Daniel Tschinder)
+
+Error on missing expected.json fixture in CI ([#188](https://github.com/babel/babylon/pull/188)) (Moti Zilberman)
+
+Add .gitattributes and .editorconfig for LF line endings ([#179](https://github.com/babel/babylon/pull/179)) (Moti Zilberman)
+
+Fixes two tests that are failing after the merge of #172 ([#177](https://github.com/babel/babylon/pull/177)) (Moti Zilberman)
+
+## v6.12.0 (2016-10-14)
+
+### :eyeglasses: Spec Compliance
+
+Implement import() syntax ([#163](https://github.com/babel/babylon/pull/163)) (Jordan Gensler)
+
+#### Dynamic Import
+
+- Proposal Repo: https://github.com/domenic/proposal-dynamic-import
+- Championed by [@domenic](https://github.com/domenic)
+- stage-2
+- [sept-28 tc39 notes](https://github.com/rwaldron/tc39-notes/blob/master/es7/2016-09/sept-28.md#113a-import)
+
+> This repository contains a proposal for adding a "function-like" import() module loading syntactic form to JavaScript
+
+```js
+import(`./section-modules/${link.dataset.entryModule}.js`)
+.then(module => {
+  module.loadPageInto(main);
+})
+```
+
+Add EmptyTypeAnnotation ([#171](https://github.com/babel/babylon/pull/171)) (Sam Goldman)
+
+#### EmptyTypeAnnotation
+
+Just wasn't covered before.
+
+```js
+type T = empty;
+```
+
+### :bug: Bug Fix
+
+Fix crash when exporting with destructuring and sparse array ([#170](https://github.com/babel/babylon/pull/170)) (Jeroen Engels)
+
+```js
+// was failing due to sparse array
+export const { foo: [ ,, qux7 ] } = bar;
+```
+
+Allow keyword in Flow object declaration property names with type parameters ([#146](https://github.com/babel/babylon/pull/146)) (Dan Harper)
+
+```js
+declare class X {
+  foobar<T>(): void;
+  static foobar<T>(): void;
+}
+```
+
+Allow keyword in object/class property names with Flow type parameters ([#145](https://github.com/babel/babylon/pull/145)) (Dan Harper)
+
+```js
+class Foo {
+  delete<T>(item: T): T {
+    return item;
+  }
+}
+```
+
+Allow typeAnnotations for yield expressions ([#174](https://github.com/babel/babylon/pull/174))) (Daniel Tschinder)
+
+```js
+function *foo() {
+  const x = (yield 5: any);
+}
+```
+
+### :nail_care: Polish
+
+Annotate more errors with expected token ([#172](https://github.com/babel/babylon/pull/172))) (Moti Zilberman)
+
+```js
+// Unexpected token, expected ; (1:6)
+{ set 1 }
+```
+
+### :house: Internal
+
+Remove kcheck ([#173](https://github.com/babel/babylon/pull/173)))  (Daniel Tschinder)
+
+Also run flow, linting, babel tests on separate instances (add back node 0.10)
+
+## v6.11.6 (2016-10-12)
+
+### :bug: Bug Fix/Regression
+
+Fix crash when exporting with destructuring and sparse array ([#170](https://github.com/babel/babylon/pull/170)) (Jeroen Engels)
+
+```js
+// was failing with `Cannot read property 'type' of null` because of null identifiers
+export const { foo: [ ,, qux7 ] } = bar;
+```
+
+## v6.11.5 (2016-10-12)
+
+### :eyeglasses: Spec Compliance
+
+Fix: Check for duplicate named exports in exported destructuring assignments ([#144](https://github.com/babel/babylon/pull/144)) (Kai Cataldo)
+
+```js
+// `foo` has already been exported. Exported identifiers must be unique. (2:20)
+export function foo() {};
+export const { a: [{foo}] } = bar;
+```
+
+Fix: Check for duplicate named exports in exported rest elements/properties ([#164](https://github.com/babel/babylon/pull/164)) (Kai Cataldo)
+
+```js
+// `foo` has already been exported. Exported identifiers must be unique. (2:22)
+export const foo = 1;
+export const [bar, ...foo] = baz;
+```
+
+### :bug: Bug Fix
+
+Fix: Allow identifier `async` for default param in arrow expression ([#165](https://github.com/babel/babylon/pull/165)) (Kai Cataldo)
+
+```js
+// this is ok now
+const test = ({async = true}) => {};
+```
+
+### :nail_care: Polish
+
+Babylon will now print out the token it's expecting if there's a `SyntaxError` ([#150](https://github.com/babel/babylon/pull/150)) (Daniel Tschinder)
+
+```bash
+# So in the case of a missing ending curly (`}`)
+Module build failed: SyntaxError: Unexpected token, expected } (30:0)
+  28 |   }
+  29 |
+> 30 |
+     | ^
+```
+
+## v6.11.4 (2016-10-03)
+
+Temporary rollback for erroring on trailing comma with spread (#154) (Henry Zhu)
+
+## v6.11.3 (2016-10-01)
+
+### :eyeglasses: Spec Compliance
+
+Add static errors for object rest (#149) ([@danez](https://github.com/danez))
+
+> https://github.com/sebmarkbage/ecmascript-rest-spread
+
+Object rest copies the *rest* of properties from the right hand side `obj` starting from the left to right.
+
+```js
+let { x, y, ...z } =  { x: 1, y: 2, z: 3 };
+// x = 1
+// y = 2
+// z = { z: 3 }
+```
+
+#### New Syntax Errors:
+
+**SyntaxError**: The rest element has to be the last element when destructuring (1:10)
+```bash
+> 1 | let { ...x, y, z } = { x: 1, y: 2, z: 3};
+    |           ^
+# Previous behavior:
+# x = { x: 1, y: 2, z: 3 }
+# y = 2
+# z = 3
+```
+
+Before, this was just a more verbose way of shallow copying `obj` since it doesn't actually do what you think.
+
+**SyntaxError**: Cannot have multiple rest elements when destructuring (1:13)
+
+```bash
+> 1 | let { x, ...y, ...z } = { x: 1, y: 2, z: 3};
+    |              ^
+# Previous behavior:
+# x = 1
+# y = { y: 2, z: 3 }
+# z = { y: 2, z: 3 }
+```
+
+Before y and z would just be the same value anyway so there is no reason to need to have both.
+
+**SyntaxError**: A trailing comma is not permitted after the rest element (1:16)
+
+```js
+let { x, y, ...z, } = obj;
+```
+
+The rationale for this is that the use case for trailing comma is that you can add something at the end without affecting the line above. Since a RestProperty always has to be the last property it doesn't make sense.
+
+---
+
+get / set are valid property names in default assignment (#142) ([@jezell](https://github.com/jezell))
+
+```js
+// valid
+function something({ set = null, get = null }) {}
+```
+
+## v6.11.2 (2016-09-23)
+
+### Bug Fix
+
+- [#139](https://github.com/babel/babylon/issues/139) Don't do the duplicate check if not an identifier (#140) @hzoo
+
+```js
+// regression with duplicate export check
+SyntaxError: ./typography.js: `undefined` has already been exported. Exported identifiers must be unique. (22:13)
+  20 |
+  21 | export const { rhythm } = typography;
+> 22 | export const { TypographyStyle } = typography
+```
+
+Bail out for now, and make a change to account for destructuring in the next release.
+
+## 6.11.1 (2016-09-22)
+
+### Bug Fix
+- [#137](https://github.com/babel/babylon/pull/137) - Fix a regression with duplicate exports - it was erroring on all keys in `Object.prototype`. @danez
+
+```javascript
+export toString from './toString';
+```
+
+```bash
+`toString` has already been exported. Exported identifiers must be unique. (1:7)
+> 1 | export toString from './toString';
+    |        ^
+  2 |
+```
+
+## 6.11.0 (2016-09-22)
+
+### Spec Compliance (will break CI)
+
+- Disallow duplicate named exports ([#107](https://github.com/babel/babylon/pull/107)) @kaicataldo
+
+```js
+// Only one default export allowed per module. (2:9)
+export default function() {};
+export { foo as default };
+
+// Only one default export allowed per module. (2:0)
+export default {};
+export default function() {};
+
+// `Foo` has already been exported. Exported identifiers must be unique. (2:0)
+export { Foo };
+export class Foo {};
+```
+
+### New Feature (Syntax)
+
+- Add support for computed class property names ([#121](https://github.com/babel/babylon/pull/121)) @motiz88
+
+```js
+// AST
+interface ClassProperty <: Node {
+  type: "ClassProperty";
+  key: Identifier;
+  value: Expression;
+  computed: boolean; // added
+}
+```
+
+```js
+// with "plugins": ["classProperties"]
+class Foo {
+  [x]
+  ['y']
+}
+
+class Bar {
+  [p]
+  [m] () {}
+}
+ ```
+
+### Bug Fix
+
+- Fix `static` property falling through in the declare class Flow AST ([#135](https://github.com/babel/babylon/pull/135)) @danharper
+
+```js
+declare class X {
+    a: number;
+    static b: number; // static
+    c: number; // this was being marked as static in the AST as well
+}
+```
+
+### Polish
+
+- Rephrase "assigning/binding to rvalue" errors to include context ([#119](https://github.com/babel/babylon/pull/119)) @motiz88
+
+```js
+// Used to error with:
+// SyntaxError: Assigning to rvalue (1:0)
+
+// Now:
+// Invalid left-hand side in assignment expression (1:0)
+3 = 4
+
+// Invalid left-hand side in for-in statement (1:5)
+for (+i in {});
+```
+
+### Internal
+
+- Fix call to `this.parseMaybeAssign` with correct arguments ([#133](https://github.com/babel/babylon/pull/133)) @danez
+- Add semver note to changelog ([#131](https://github.com/babel/babylon/pull/131)) @hzoo
+
+## 6.10.0 (2016-09-19)
+
+> We plan to include some spec compliance bugs in patch versions. An example was the multiple default exports issue.
+
+### Spec Compliance
+
+* Implement ES2016 check for simple parameter list in strict mode ([#106](https://github.com/babel/babylon/pull/106)) (Timothy Gu)
+
+> It is a Syntax Error if ContainsUseStrict of FunctionBody is true and IsSimpleParameterList of FormalParameters is false. https://tc39.github.io/ecma262/2016/#sec-function-definitions-static-semantics-early-errors
+
+More Context: [tc39-notes](https://github.com/rwaldron/tc39-notes/blob/master/es7/2015-07/july-29.md#611-the-scope-of-use-strict-with-respect-to-destructuring-in-parameter-lists)
+
+For example:
+
+```js
+// this errors because it uses destructuring and default parameters
+// in a function with a "use strict" directive
+function a([ option1, option2 ] = []) {
+  "use strict";
+}
+ ```
+
+The solution would be to use a top level "use strict" or to remove the destructuring or default parameters when using a function + "use strict" or to.
+
+### New Feature
+
+* Exact object type annotations for Flow plugin ([#104](https://github.com/babel/babylon/pull/104)) (Basil Hosmer)
+
+Added to flow in https://github.com/facebook/flow/commit/c710c40aa2a115435098d6c0dfeaadb023cd39b8
+
+Looks like:
+
+```js
+var a : {| x: number, y: string |} = { x: 0, y: 'foo' };
+```
+
+### Bug Fixes
+
+* Include `typeParameter` location in `ArrowFunctionExpression` ([#126](https://github.com/babel/babylon/pull/126)) (Daniel Tschinder)
+* Error on invalid flow type annotation with default assignment ([#122](https://github.com/babel/babylon/pull/122)) (Dan Harper)
+* Fix Flow return types on arrow functions ([#124](https://github.com/babel/babylon/pull/124)) (Dan Harper)
+
+### Misc
+
+* Add tests for export extensions ([#127](https://github.com/babel/babylon/pull/127)) (Daniel Tschinder)
+* Fix Contributing guidelines [skip ci] (Daniel Tschinder)
+
+## 6.9.2 (2016-09-09)
+
+The only change is to remove the `babel-runtime` dependency by compiling with Babel's ES2015 loose mode. So using babylon standalone should be smaller.
+
+## 6.9.1 (2016-08-23)
+
+This release contains mainly small bugfixes but also updates babylons default mode to es2017. The features for `exponentiationOperator`, `asyncFunctions` and `trailingFunctionCommas` which previously needed to be activated via plugin are now enabled by default and the plugins are now no-ops.
+
+### Bug Fixes
+
+- Fix issues with default object params in async functions ([#96](https://github.com/babel/babylon/pull/96)) @danez
+- Fix issues with flow-types and async function ([#95](https://github.com/babel/babylon/pull/95)) @danez
+- Fix arrow functions with destructuring, types & default value ([#94](https://github.com/babel/babylon/pull/94)) @danharper
+- Fix declare class with qualified type identifier ([#97](https://github.com/babel/babylon/pull/97)) @danez
+- Remove exponentiationOperator, asyncFunctions, trailingFunctionCommas plugins and enable them by default ([#98](https://github.com/babel/babylon/pull/98)) @danez
+
+## 6.9.0 (2016-08-16)
+
+### New syntax support
+
+- Add JSX spread children ([#42](https://github.com/babel/babylon/pull/42)) @calebmer
+
+(Be aware that React is not going to support this syntax)
+
+```js
+<div>
+  {...todos.map(todo => <Todo key={todo.id} todo={todo}/>)}
+</div>
+```
+
+- Add support for declare module.exports ([#72](https://github.com/babel/babylon/pull/72)) @danez
+
+```js
+declare module "foo" {
+  declare module.exports: {}
+}
+```
+
+### New Features
+
+- If supplied, attach filename property to comment node loc. ([#80](https://github.com/babel/babylon/pull/80)) @divmain
+- Add identifier name to node loc field ([#90](https://github.com/babel/babylon/pull/90)) @kittens
+
+### Bug Fixes
+
+- Fix exponential operator to behave according to spec ([#75](https://github.com/babel/babylon/pull/75)) @danez
+- Fix lookahead to not add comments to arrays which are not cloned ([#76](https://github.com/babel/babylon/pull/76)) @danez
+- Fix accidental fall-through in Flow type parsing. ([#82](https://github.com/babel/babylon/pull/82)) @xiemaisi
+- Only allow declares inside declare module ([#73](https://github.com/babel/babylon/pull/73)) @danez
+- Small fix for parsing type parameter declarations ([#83](https://github.com/babel/babylon/pull/83)) @gabelevi
+- Fix arrow param locations with flow types ([#57](https://github.com/babel/babylon/pull/57)) @danez
+- Fixes SyntaxError position with flow optional type ([#65](https://github.com/babel/babylon/pull/65)) @danez
+
+### Internal
+
+- Add codecoverage to tests @danez
+- Fix tests to not save expected output if we expect the test to fail @danez
+- Make a shallow clone of babel for testing @danez
+- chore(package): update cross-env to version 2.0.0 ([#77](https://github.com/babel/babylon/pull/77)) @greenkeeperio-bot
+- chore(package): update ava to version 0.16.0 ([#86](https://github.com/babel/babylon/pull/86)) @greenkeeperio-bot
+- chore(package): update babel-plugin-istanbul to version 2.0.0 ([#89](https://github.com/babel/babylon/pull/89)) @greenkeeperio-bot
+- chore(package): update nyc to version 8.0.0 ([#88](https://github.com/babel/babylon/pull/88)) @greenkeeperio-bot
+
+## 6.8.4 (2016-07-06)
+
+### Bug Fixes
+
+- Fix the location of params, when flow and default value used ([#68](https://github.com/babel/babylon/pull/68)) @danez
+
+## 6.8.3 (2016-07-02)
+
+### Bug Fixes
+
+- Fix performance regression introduced in 6.8.2 with conditionals ([#63](https://github.com/babel/babylon/pull/63)) @danez
+
+## 6.8.2 (2016-06-24)
+
+### Bug Fixes
+
+- Fix parse error with yielding jsx elements in generators `function* it() { yield <a></a>; }` ([#31](https://github.com/babel/babylon/pull/31)) @eldereal
+- When cloning nodes do not clone its comments ([#24](https://github.com/babel/babylon/pull/24)) @danez
+- Fix parse errors when using arrow functions with an spread element and return type `(...props): void => {}` ([#10](https://github.com/babel/babylon/pull/10)) @danez
+- Fix leading comments added from previous node ([#23](https://github.com/babel/babylon/pull/23)) @danez
+- Fix parse errors with flow's optional arguments `(arg?) => {}` ([#19](https://github.com/babel/babylon/pull/19)) @danez
+- Support negative numeric type literals @kittens
+- Remove line terminator restriction after await keyword @kittens
+- Remove grouped type arrow restriction as it seems flow no longer has it @kittens
+- Fix parse error with generic methods that have the name `get` or `set` `class foo { get() {} }` ([#55](https://github.com/babel/babylon/pull/55)) @vkurchatkin
+- Fix parse error with arrow functions that have flow type parameter declarations `<T>(x: T): T => x;` ([#54](https://github.com/babel/babylon/pull/54)) @gabelevi
+
+### Documentation
+
+- Document AST differences from ESTree ([#41](https://github.com/babel/babylon/pull/41)) @nene
+- Move ast spec from babel/babel ([#46](https://github.com/babel/babylon/pull/46)) @hzoo
+
+### Internal
+
+- Enable skipped tests ([#16](https://github.com/babel/babylon/pull/16)) @danez
+- Add script to test latest version of babylon with babel ([#21](https://github.com/babel/babylon/pull/21)) @danez
+- Upgrade test runner ava @kittens
+- Add missing generate-identifier-regex script @kittens
+- Rename parser context types @kittens
+- Add node v6 to travis testing @hzoo
+- Update to Unicode v9 ([#45](https://github.com/babel/babylon/pull/45)) @mathiasbynens
+
+## 6.8.1 (2016-06-06)
+
+### New Feature
+
+- Parse type parameter declarations with defaults like `type Foo<T = string> = T`
+
+### Bug Fixes
+- Type parameter declarations need 1 or more type parameters.
+- The existential type `*` is not a valid type parameter.
+- The existential type `*` is a primary type
+
+### Spec Compliance
+- The param list for type parameter declarations now consists of `TypeParameter` nodes
+- New `TypeParameter` AST Node (replaces using the `Identifier` node before)
+
+```
+interface TypeParameter <: Node {
+  bound: TypeAnnotation;
+  default: TypeAnnotation;
+  name: string;
+  variance: "plus" | "minus";
+}
+```
+
+## 6.8.0 (2016-05-02)
+
+#### New Feature
+
+##### Parse Method Parameter Decorators ([#12](https://github.com/babel/babylon/pull/12))
+
+> [Method Parameter Decorators](https://goo.gl/8MmCMG) is now a TC39 [stage 0 proposal](https://github.com/tc39/ecma262/blob/master/stage0.md).
+
+Examples:
+
+```js
+class Foo {
+  constructor(@foo() x, @bar({ a: 123 }) @baz() y) {}
+}
+
+export default function func(@foo() x, @bar({ a: 123 }) @baz() y) {}
+
+var obj = {
+  method(@foo() x, @bar({ a: 123 }) @baz() y) {}
+};
+```
+
+##### Parse for-await statements (w/ `asyncGenerators` plugin) ([#17](https://github.com/babel/babylon/pull/17))
+
+There is also a new node type, `ForAwaitStatement`.
+
+> [Async generators and for-await](https://github.com/tc39/proposal-async-iteration) are now a [stage 2 proposal](https://github.com/tc39/ecma262#current-proposals).
+
+Example:
+
+```js
+async function f() {
+  for await (let x of y);
+}
+```

+ 19 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/LICENSE

@@ -0,0 +1,19 @@
+Copyright (C) 2012-2014 by various contributors (see AUTHORS)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 19 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/README.md

@@ -0,0 +1,19 @@
+# @babel/parser
+
+> A JavaScript parser
+
+See our website [@babel/parser](https://babeljs.io/docs/babel-parser) for more information or the [issues](https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A%20parser%22+is%3Aopen) associated with this package.
+
+## Install
+
+Using npm:
+
+```sh
+npm install --save-dev @babel/parser
+```
+
+or using yarn:
+
+```sh
+yarn add @babel/parser --dev
+```

+ 15 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/babel-parser.js

@@ -0,0 +1,15 @@
+#!/usr/bin/env node
+/* eslint-disable no-var, unicorn/prefer-node-protocol */
+
+var parser = require("..");
+var fs = require("fs");
+
+var filename = process.argv[2];
+if (!filename) {
+  console.error("no filename specified");
+} else {
+  var file = fs.readFileSync(filename, "utf8");
+  var ast = parser.parse(file);
+
+  console.log(JSON.stringify(ast, null, "  "));
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1463 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/lib/index.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/lib/index.js.map


+ 17 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules/.bin/parser

@@ -0,0 +1,17 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -z "$NODE_PATH" ]; then
+  export NODE_PATH="/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/node_modules"
+else
+  export NODE_PATH="/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/bin/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/@babel+parser@7.28.0/node_modules:/Users/xuruhua/Desktop/DigitalCampusMiniProgram/node_modules/.pnpm/node_modules:$NODE_PATH"
+fi
+if [ -x "$basedir/node" ]; then
+  exec "$basedir/node"  "$basedir/../../bin/babel-parser.js" "$@"
+else
+  exec node  "$basedir/../../bin/babel-parser.js" "$@"
+fi

+ 50 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/package.json

@@ -0,0 +1,50 @@
+{
+  "name": "@babel/parser",
+  "version": "7.28.0",
+  "description": "A JavaScript parser",
+  "author": "The Babel Team (https://babel.dev/team)",
+  "homepage": "https://babel.dev/docs/en/next/babel-parser",
+  "bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A+parser+%28babylon%29%22+is%3Aopen",
+  "license": "MIT",
+  "publishConfig": {
+    "access": "public"
+  },
+  "keywords": [
+    "babel",
+    "javascript",
+    "parser",
+    "tc39",
+    "ecmascript",
+    "@babel/parser"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/babel/babel.git",
+    "directory": "packages/babel-parser"
+  },
+  "main": "./lib/index.js",
+  "types": "./typings/babel-parser.d.ts",
+  "files": [
+    "bin",
+    "lib",
+    "typings/babel-parser.d.ts",
+    "index.cjs"
+  ],
+  "engines": {
+    "node": ">=6.0.0"
+  },
+  "# dependencies": "This package doesn't actually have runtime dependencies. @babel/types is only needed for type definitions.",
+  "dependencies": {
+    "@babel/types": "^7.28.0"
+  },
+  "devDependencies": {
+    "@babel/code-frame": "^7.27.1",
+    "@babel/helper-check-duplicate-nodes": "^7.27.1",
+    "@babel/helper-fixtures": "^7.28.0",
+    "@babel/helper-string-parser": "^7.27.1",
+    "@babel/helper-validator-identifier": "^7.27.1",
+    "charcodes": "^0.2.0"
+  },
+  "bin": "./bin/babel-parser.js",
+  "type": "commonjs"
+}

+ 239 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/parser/typings/babel-parser.d.ts

@@ -0,0 +1,239 @@
+// This file is auto-generated! Do not modify it directly.
+// Run `yarn gulp bundle-dts` to re-generate it.
+/* eslint-disable @typescript-eslint/consistent-type-imports, @typescript-eslint/no-redundant-type-constituents */
+import { File, Expression } from '@babel/types';
+
+type BABEL_8_BREAKING = false;
+type IF_BABEL_7<V> = false extends BABEL_8_BREAKING ? V : never;
+
+type Plugin$1 =
+  | "asyncDoExpressions"
+  | IF_BABEL_7<"asyncGenerators">
+  | IF_BABEL_7<"bigInt">
+  | IF_BABEL_7<"classPrivateMethods">
+  | IF_BABEL_7<"classPrivateProperties">
+  | IF_BABEL_7<"classProperties">
+  | IF_BABEL_7<"classStaticBlock">
+  | IF_BABEL_7<"decimal">
+  | "decorators-legacy"
+  | "deferredImportEvaluation"
+  | "decoratorAutoAccessors"
+  | "destructuringPrivate"
+  | "deprecatedImportAssert"
+  | "doExpressions"
+  | IF_BABEL_7<"dynamicImport">
+  | IF_BABEL_7<"explicitResourceManagement">
+  | "exportDefaultFrom"
+  | IF_BABEL_7<"exportNamespaceFrom">
+  | "flow"
+  | "flowComments"
+  | "functionBind"
+  | "functionSent"
+  | "importMeta"
+  | "jsx"
+  | IF_BABEL_7<"jsonStrings">
+  | IF_BABEL_7<"logicalAssignment">
+  | IF_BABEL_7<"importAssertions">
+  | IF_BABEL_7<"importReflection">
+  | "moduleBlocks"
+  | IF_BABEL_7<"moduleStringNames">
+  | IF_BABEL_7<"nullishCoalescingOperator">
+  | IF_BABEL_7<"numericSeparator">
+  | IF_BABEL_7<"objectRestSpread">
+  | IF_BABEL_7<"optionalCatchBinding">
+  | IF_BABEL_7<"optionalChaining">
+  | "partialApplication"
+  | "placeholders"
+  | IF_BABEL_7<"privateIn">
+  | IF_BABEL_7<"regexpUnicodeSets">
+  | "sourcePhaseImports"
+  | "throwExpressions"
+  | IF_BABEL_7<"topLevelAwait">
+  | "v8intrinsic"
+  | ParserPluginWithOptions[0];
+
+type ParserPluginWithOptions =
+  | ["decorators", DecoratorsPluginOptions]
+  | ["discardBinding", { syntaxType: "void" }]
+  | ["estree", { classFeatures?: boolean }]
+  | IF_BABEL_7<["importAttributes", { deprecatedAssertSyntax: boolean }]>
+  | IF_BABEL_7<["moduleAttributes", { version: "may-2020" }]>
+  | ["optionalChainingAssign", { version: "2023-07" }]
+  | ["pipelineOperator", PipelineOperatorPluginOptions]
+  | ["recordAndTuple", RecordAndTuplePluginOptions]
+  | ["flow", FlowPluginOptions]
+  | ["typescript", TypeScriptPluginOptions];
+
+type PluginConfig = Plugin$1 | ParserPluginWithOptions;
+
+interface DecoratorsPluginOptions {
+  decoratorsBeforeExport?: boolean;
+  allowCallParenthesized?: boolean;
+}
+
+interface PipelineOperatorPluginOptions {
+  proposal: BABEL_8_BREAKING extends false
+    ? "minimal" | "fsharp" | "hack" | "smart"
+    : "fsharp" | "hack";
+  topicToken?: "%" | "#" | "@@" | "^^" | "^";
+}
+
+interface RecordAndTuplePluginOptions {
+  syntaxType: "bar" | "hash";
+}
+
+type FlowPluginOptions = BABEL_8_BREAKING extends true
+  ? {
+      all?: boolean;
+      enums?: boolean;
+    }
+  : {
+      all?: boolean;
+    };
+
+interface TypeScriptPluginOptions {
+  dts?: boolean;
+  disallowAmbiguousJSXLike?: boolean;
+}
+
+type Plugin = PluginConfig;
+
+type SourceType = "script" | "commonjs" | "module" | "unambiguous";
+interface Options {
+    /**
+     * By default, import and export declarations can only appear at a program's top level.
+     * Setting this option to true allows them anywhere where a statement is allowed.
+     */
+    allowImportExportEverywhere?: boolean;
+    /**
+     * By default, await use is not allowed outside of an async function.
+     * Set this to true to accept such code.
+     */
+    allowAwaitOutsideFunction?: boolean;
+    /**
+     * By default, a return statement at the top level raises an error.
+     * Set this to true to accept such code.
+     */
+    allowReturnOutsideFunction?: boolean;
+    /**
+     * By default, new.target use is not allowed outside of a function or class.
+     * Set this to true to accept such code.
+     */
+    allowNewTargetOutsideFunction?: boolean;
+    allowSuperOutsideMethod?: boolean;
+    /**
+     * By default, exported identifiers must refer to a declared variable.
+     * Set this to true to allow export statements to reference undeclared variables.
+     */
+    allowUndeclaredExports?: boolean;
+    /**
+     * By default, yield use is not allowed outside of a generator function.
+     * Set this to true to accept such code.
+     */
+    allowYieldOutsideFunction?: boolean;
+    /**
+     * By default, Babel parser JavaScript code according to Annex B syntax.
+     * Set this to `false` to disable such behavior.
+     */
+    annexB?: boolean;
+    /**
+     * By default, Babel attaches comments to adjacent AST nodes.
+     * When this option is set to false, comments are not attached.
+     * It can provide up to 30% performance improvement when the input code has many comments.
+     * @babel/eslint-parser will set it for you.
+     * It is not recommended to use attachComment: false with Babel transform,
+     * as doing so removes all the comments in output code, and renders annotations such as
+     * /* istanbul ignore next *\/ nonfunctional.
+     */
+    attachComment?: boolean;
+    /**
+     * By default, Babel always throws an error when it finds some invalid code.
+     * When this option is set to true, it will store the parsing error and
+     * try to continue parsing the invalid input file.
+     */
+    errorRecovery?: boolean;
+    /**
+     * Indicate the mode the code should be parsed in.
+     * Can be one of "script", "commonjs", "module", or "unambiguous". Defaults to "script".
+     * "unambiguous" will make @babel/parser attempt to guess, based on the presence
+     * of ES6 import or export statements.
+     * Files with ES6 imports and exports are considered "module" and are otherwise "script".
+     *
+     * Use "commonjs" to parse code that is intended to be run in a CommonJS environment such as Node.js.
+     */
+    sourceType?: SourceType;
+    /**
+     * Correlate output AST nodes with their source filename.
+     * Useful when generating code and source maps from the ASTs of multiple input files.
+     */
+    sourceFilename?: string;
+    /**
+     * By default, all source indexes start from 0.
+     * You can provide a start index to alternatively start with.
+     * Useful for integration with other source tools.
+     */
+    startIndex?: number;
+    /**
+     * By default, the first line of code parsed is treated as line 1.
+     * You can provide a line number to alternatively start with.
+     * Useful for integration with other source tools.
+     */
+    startLine?: number;
+    /**
+     * By default, the parsed code is treated as if it starts from line 1, column 0.
+     * You can provide a column number to alternatively start with.
+     * Useful for integration with other source tools.
+     */
+    startColumn?: number;
+    /**
+     * Array containing the plugins that you want to enable.
+     */
+    plugins?: Plugin[];
+    /**
+     * Should the parser work in strict mode.
+     * Defaults to true if sourceType === 'module'. Otherwise, false.
+     */
+    strictMode?: boolean;
+    /**
+     * Adds a ranges property to each node: [node.start, node.end]
+     */
+    ranges?: boolean;
+    /**
+     * Adds all parsed tokens to a tokens property on the File node.
+     */
+    tokens?: boolean;
+    /**
+     * By default, the parser adds information about parentheses by setting
+     * `extra.parenthesized` to `true` as needed.
+     * When this option is `true` the parser creates `ParenthesizedExpression`
+     * AST nodes instead of using the `extra` property.
+     */
+    createParenthesizedExpressions?: boolean;
+    /**
+     * The default is false in Babel 7 and true in Babel 8
+     * Set this to true to parse it as an `ImportExpression` node.
+     * Otherwise `import(foo)` is parsed as `CallExpression(Import, [Identifier(foo)])`.
+     */
+    createImportExpressions?: boolean;
+}
+
+type ParserOptions = Partial<Options>;
+interface ParseError {
+    code: string;
+    reasonCode: string;
+}
+type ParseResult<Result extends File | Expression = File> = Result & {
+    errors: null | ParseError[];
+};
+/**
+ * Parse the provided code as an entire ECMAScript program.
+ */
+declare function parse(input: string, options?: ParserOptions): ParseResult<File>;
+declare function parseExpression(input: string, options?: ParserOptions): ParseResult<Expression>;
+
+declare const tokTypes: {
+  // todo(flow->ts) real token type
+  [name: string]: any;
+};
+
+export { DecoratorsPluginOptions, FlowPluginOptions, ParseError, ParseResult, ParserOptions, PluginConfig as ParserPlugin, ParserPluginWithOptions, PipelineOperatorPluginOptions, RecordAndTuplePluginOptions, TypeScriptPluginOptions, parse, parseExpression, tokTypes };

+ 1 - 0
node_modules/.pnpm/@babel+parser@7.28.0/node_modules/@babel/types

@@ -0,0 +1 @@
+../../../@babel+types@7.28.1/node_modules/@babel/types

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/helper-string-parser

@@ -0,0 +1 @@
+../../../@babel+helper-string-parser@7.27.1/node_modules/@babel/helper-string-parser

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/helper-validator-identifier

@@ -0,0 +1 @@
+../../../@babel+helper-validator-identifier@7.27.1/node_modules/@babel/helper-validator-identifier

+ 22 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/LICENSE

@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2014-present Sebastian McKenzie and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 19 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/README.md

@@ -0,0 +1,19 @@
+# @babel/types
+
+> Babel Types is a Lodash-esque utility library for AST nodes
+
+See our website [@babel/types](https://babeljs.io/docs/babel-types) for more information or the [issues](https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A%20types%22+is%3Aopen) associated with this package.
+
+## Install
+
+Using npm:
+
+```sh
+npm install --save-dev @babel/types
+```
+
+or using yarn:
+
+```sh
+yarn add @babel/types --dev
+```

+ 16 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/assertNode.js

@@ -0,0 +1,16 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = assertNode;
+var _isNode = require("../validators/isNode.js");
+function assertNode(node) {
+  if (!(0, _isNode.default)(node)) {
+    var _node$type;
+    const type = (_node$type = node == null ? void 0 : node.type) != null ? _node$type : JSON.stringify(node);
+    throw new TypeError(`Not a valid node of type "${type}"`);
+  }
+}
+
+//# sourceMappingURL=assertNode.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/assertNode.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_isNode","require","assertNode","node","isNode","_node$type","type","JSON","stringify","TypeError"],"sources":["../../src/asserts/assertNode.ts"],"sourcesContent":["import isNode from \"../validators/isNode.ts\";\nimport type * as t from \"../index.ts\";\n\nexport default function assertNode(node?: any): asserts node is t.Node {\n  if (!isNode(node)) {\n    const type = node?.type ?? JSON.stringify(node);\n    throw new TypeError(`Not a valid node of type \"${type}\"`);\n  }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAGe,SAASC,UAAUA,CAACC,IAAU,EAA0B;EACrE,IAAI,CAAC,IAAAC,eAAM,EAACD,IAAI,CAAC,EAAE;IAAA,IAAAE,UAAA;IACjB,MAAMC,IAAI,IAAAD,UAAA,GAAGF,IAAI,oBAAJA,IAAI,CAAEG,IAAI,YAAAD,UAAA,GAAIE,IAAI,CAACC,SAAS,CAACL,IAAI,CAAC;IAC/C,MAAM,IAAIM,SAAS,CAAC,6BAA6BH,IAAI,GAAG,CAAC;EAC3D;AACF","ignoreList":[]}

+ 1251 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/generated/index.js

@@ -0,0 +1,1251 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.assertAccessor = assertAccessor;
+exports.assertAnyTypeAnnotation = assertAnyTypeAnnotation;
+exports.assertArgumentPlaceholder = assertArgumentPlaceholder;
+exports.assertArrayExpression = assertArrayExpression;
+exports.assertArrayPattern = assertArrayPattern;
+exports.assertArrayTypeAnnotation = assertArrayTypeAnnotation;
+exports.assertArrowFunctionExpression = assertArrowFunctionExpression;
+exports.assertAssignmentExpression = assertAssignmentExpression;
+exports.assertAssignmentPattern = assertAssignmentPattern;
+exports.assertAwaitExpression = assertAwaitExpression;
+exports.assertBigIntLiteral = assertBigIntLiteral;
+exports.assertBinary = assertBinary;
+exports.assertBinaryExpression = assertBinaryExpression;
+exports.assertBindExpression = assertBindExpression;
+exports.assertBlock = assertBlock;
+exports.assertBlockParent = assertBlockParent;
+exports.assertBlockStatement = assertBlockStatement;
+exports.assertBooleanLiteral = assertBooleanLiteral;
+exports.assertBooleanLiteralTypeAnnotation = assertBooleanLiteralTypeAnnotation;
+exports.assertBooleanTypeAnnotation = assertBooleanTypeAnnotation;
+exports.assertBreakStatement = assertBreakStatement;
+exports.assertCallExpression = assertCallExpression;
+exports.assertCatchClause = assertCatchClause;
+exports.assertClass = assertClass;
+exports.assertClassAccessorProperty = assertClassAccessorProperty;
+exports.assertClassBody = assertClassBody;
+exports.assertClassDeclaration = assertClassDeclaration;
+exports.assertClassExpression = assertClassExpression;
+exports.assertClassImplements = assertClassImplements;
+exports.assertClassMethod = assertClassMethod;
+exports.assertClassPrivateMethod = assertClassPrivateMethod;
+exports.assertClassPrivateProperty = assertClassPrivateProperty;
+exports.assertClassProperty = assertClassProperty;
+exports.assertCompletionStatement = assertCompletionStatement;
+exports.assertConditional = assertConditional;
+exports.assertConditionalExpression = assertConditionalExpression;
+exports.assertContinueStatement = assertContinueStatement;
+exports.assertDebuggerStatement = assertDebuggerStatement;
+exports.assertDecimalLiteral = assertDecimalLiteral;
+exports.assertDeclaration = assertDeclaration;
+exports.assertDeclareClass = assertDeclareClass;
+exports.assertDeclareExportAllDeclaration = assertDeclareExportAllDeclaration;
+exports.assertDeclareExportDeclaration = assertDeclareExportDeclaration;
+exports.assertDeclareFunction = assertDeclareFunction;
+exports.assertDeclareInterface = assertDeclareInterface;
+exports.assertDeclareModule = assertDeclareModule;
+exports.assertDeclareModuleExports = assertDeclareModuleExports;
+exports.assertDeclareOpaqueType = assertDeclareOpaqueType;
+exports.assertDeclareTypeAlias = assertDeclareTypeAlias;
+exports.assertDeclareVariable = assertDeclareVariable;
+exports.assertDeclaredPredicate = assertDeclaredPredicate;
+exports.assertDecorator = assertDecorator;
+exports.assertDirective = assertDirective;
+exports.assertDirectiveLiteral = assertDirectiveLiteral;
+exports.assertDoExpression = assertDoExpression;
+exports.assertDoWhileStatement = assertDoWhileStatement;
+exports.assertEmptyStatement = assertEmptyStatement;
+exports.assertEmptyTypeAnnotation = assertEmptyTypeAnnotation;
+exports.assertEnumBody = assertEnumBody;
+exports.assertEnumBooleanBody = assertEnumBooleanBody;
+exports.assertEnumBooleanMember = assertEnumBooleanMember;
+exports.assertEnumDeclaration = assertEnumDeclaration;
+exports.assertEnumDefaultedMember = assertEnumDefaultedMember;
+exports.assertEnumMember = assertEnumMember;
+exports.assertEnumNumberBody = assertEnumNumberBody;
+exports.assertEnumNumberMember = assertEnumNumberMember;
+exports.assertEnumStringBody = assertEnumStringBody;
+exports.assertEnumStringMember = assertEnumStringMember;
+exports.assertEnumSymbolBody = assertEnumSymbolBody;
+exports.assertExistsTypeAnnotation = assertExistsTypeAnnotation;
+exports.assertExportAllDeclaration = assertExportAllDeclaration;
+exports.assertExportDeclaration = assertExportDeclaration;
+exports.assertExportDefaultDeclaration = assertExportDefaultDeclaration;
+exports.assertExportDefaultSpecifier = assertExportDefaultSpecifier;
+exports.assertExportNamedDeclaration = assertExportNamedDeclaration;
+exports.assertExportNamespaceSpecifier = assertExportNamespaceSpecifier;
+exports.assertExportSpecifier = assertExportSpecifier;
+exports.assertExpression = assertExpression;
+exports.assertExpressionStatement = assertExpressionStatement;
+exports.assertExpressionWrapper = assertExpressionWrapper;
+exports.assertFile = assertFile;
+exports.assertFlow = assertFlow;
+exports.assertFlowBaseAnnotation = assertFlowBaseAnnotation;
+exports.assertFlowDeclaration = assertFlowDeclaration;
+exports.assertFlowPredicate = assertFlowPredicate;
+exports.assertFlowType = assertFlowType;
+exports.assertFor = assertFor;
+exports.assertForInStatement = assertForInStatement;
+exports.assertForOfStatement = assertForOfStatement;
+exports.assertForStatement = assertForStatement;
+exports.assertForXStatement = assertForXStatement;
+exports.assertFunction = assertFunction;
+exports.assertFunctionDeclaration = assertFunctionDeclaration;
+exports.assertFunctionExpression = assertFunctionExpression;
+exports.assertFunctionParameter = assertFunctionParameter;
+exports.assertFunctionParent = assertFunctionParent;
+exports.assertFunctionTypeAnnotation = assertFunctionTypeAnnotation;
+exports.assertFunctionTypeParam = assertFunctionTypeParam;
+exports.assertGenericTypeAnnotation = assertGenericTypeAnnotation;
+exports.assertIdentifier = assertIdentifier;
+exports.assertIfStatement = assertIfStatement;
+exports.assertImmutable = assertImmutable;
+exports.assertImport = assertImport;
+exports.assertImportAttribute = assertImportAttribute;
+exports.assertImportDeclaration = assertImportDeclaration;
+exports.assertImportDefaultSpecifier = assertImportDefaultSpecifier;
+exports.assertImportExpression = assertImportExpression;
+exports.assertImportNamespaceSpecifier = assertImportNamespaceSpecifier;
+exports.assertImportOrExportDeclaration = assertImportOrExportDeclaration;
+exports.assertImportSpecifier = assertImportSpecifier;
+exports.assertIndexedAccessType = assertIndexedAccessType;
+exports.assertInferredPredicate = assertInferredPredicate;
+exports.assertInterfaceDeclaration = assertInterfaceDeclaration;
+exports.assertInterfaceExtends = assertInterfaceExtends;
+exports.assertInterfaceTypeAnnotation = assertInterfaceTypeAnnotation;
+exports.assertInterpreterDirective = assertInterpreterDirective;
+exports.assertIntersectionTypeAnnotation = assertIntersectionTypeAnnotation;
+exports.assertJSX = assertJSX;
+exports.assertJSXAttribute = assertJSXAttribute;
+exports.assertJSXClosingElement = assertJSXClosingElement;
+exports.assertJSXClosingFragment = assertJSXClosingFragment;
+exports.assertJSXElement = assertJSXElement;
+exports.assertJSXEmptyExpression = assertJSXEmptyExpression;
+exports.assertJSXExpressionContainer = assertJSXExpressionContainer;
+exports.assertJSXFragment = assertJSXFragment;
+exports.assertJSXIdentifier = assertJSXIdentifier;
+exports.assertJSXMemberExpression = assertJSXMemberExpression;
+exports.assertJSXNamespacedName = assertJSXNamespacedName;
+exports.assertJSXOpeningElement = assertJSXOpeningElement;
+exports.assertJSXOpeningFragment = assertJSXOpeningFragment;
+exports.assertJSXSpreadAttribute = assertJSXSpreadAttribute;
+exports.assertJSXSpreadChild = assertJSXSpreadChild;
+exports.assertJSXText = assertJSXText;
+exports.assertLVal = assertLVal;
+exports.assertLabeledStatement = assertLabeledStatement;
+exports.assertLiteral = assertLiteral;
+exports.assertLogicalExpression = assertLogicalExpression;
+exports.assertLoop = assertLoop;
+exports.assertMemberExpression = assertMemberExpression;
+exports.assertMetaProperty = assertMetaProperty;
+exports.assertMethod = assertMethod;
+exports.assertMiscellaneous = assertMiscellaneous;
+exports.assertMixedTypeAnnotation = assertMixedTypeAnnotation;
+exports.assertModuleDeclaration = assertModuleDeclaration;
+exports.assertModuleExpression = assertModuleExpression;
+exports.assertModuleSpecifier = assertModuleSpecifier;
+exports.assertNewExpression = assertNewExpression;
+exports.assertNoop = assertNoop;
+exports.assertNullLiteral = assertNullLiteral;
+exports.assertNullLiteralTypeAnnotation = assertNullLiteralTypeAnnotation;
+exports.assertNullableTypeAnnotation = assertNullableTypeAnnotation;
+exports.assertNumberLiteral = assertNumberLiteral;
+exports.assertNumberLiteralTypeAnnotation = assertNumberLiteralTypeAnnotation;
+exports.assertNumberTypeAnnotation = assertNumberTypeAnnotation;
+exports.assertNumericLiteral = assertNumericLiteral;
+exports.assertObjectExpression = assertObjectExpression;
+exports.assertObjectMember = assertObjectMember;
+exports.assertObjectMethod = assertObjectMethod;
+exports.assertObjectPattern = assertObjectPattern;
+exports.assertObjectProperty = assertObjectProperty;
+exports.assertObjectTypeAnnotation = assertObjectTypeAnnotation;
+exports.assertObjectTypeCallProperty = assertObjectTypeCallProperty;
+exports.assertObjectTypeIndexer = assertObjectTypeIndexer;
+exports.assertObjectTypeInternalSlot = assertObjectTypeInternalSlot;
+exports.assertObjectTypeProperty = assertObjectTypeProperty;
+exports.assertObjectTypeSpreadProperty = assertObjectTypeSpreadProperty;
+exports.assertOpaqueType = assertOpaqueType;
+exports.assertOptionalCallExpression = assertOptionalCallExpression;
+exports.assertOptionalIndexedAccessType = assertOptionalIndexedAccessType;
+exports.assertOptionalMemberExpression = assertOptionalMemberExpression;
+exports.assertParenthesizedExpression = assertParenthesizedExpression;
+exports.assertPattern = assertPattern;
+exports.assertPatternLike = assertPatternLike;
+exports.assertPipelineBareFunction = assertPipelineBareFunction;
+exports.assertPipelinePrimaryTopicReference = assertPipelinePrimaryTopicReference;
+exports.assertPipelineTopicExpression = assertPipelineTopicExpression;
+exports.assertPlaceholder = assertPlaceholder;
+exports.assertPrivate = assertPrivate;
+exports.assertPrivateName = assertPrivateName;
+exports.assertProgram = assertProgram;
+exports.assertProperty = assertProperty;
+exports.assertPureish = assertPureish;
+exports.assertQualifiedTypeIdentifier = assertQualifiedTypeIdentifier;
+exports.assertRecordExpression = assertRecordExpression;
+exports.assertRegExpLiteral = assertRegExpLiteral;
+exports.assertRegexLiteral = assertRegexLiteral;
+exports.assertRestElement = assertRestElement;
+exports.assertRestProperty = assertRestProperty;
+exports.assertReturnStatement = assertReturnStatement;
+exports.assertScopable = assertScopable;
+exports.assertSequenceExpression = assertSequenceExpression;
+exports.assertSpreadElement = assertSpreadElement;
+exports.assertSpreadProperty = assertSpreadProperty;
+exports.assertStandardized = assertStandardized;
+exports.assertStatement = assertStatement;
+exports.assertStaticBlock = assertStaticBlock;
+exports.assertStringLiteral = assertStringLiteral;
+exports.assertStringLiteralTypeAnnotation = assertStringLiteralTypeAnnotation;
+exports.assertStringTypeAnnotation = assertStringTypeAnnotation;
+exports.assertSuper = assertSuper;
+exports.assertSwitchCase = assertSwitchCase;
+exports.assertSwitchStatement = assertSwitchStatement;
+exports.assertSymbolTypeAnnotation = assertSymbolTypeAnnotation;
+exports.assertTSAnyKeyword = assertTSAnyKeyword;
+exports.assertTSArrayType = assertTSArrayType;
+exports.assertTSAsExpression = assertTSAsExpression;
+exports.assertTSBaseType = assertTSBaseType;
+exports.assertTSBigIntKeyword = assertTSBigIntKeyword;
+exports.assertTSBooleanKeyword = assertTSBooleanKeyword;
+exports.assertTSCallSignatureDeclaration = assertTSCallSignatureDeclaration;
+exports.assertTSConditionalType = assertTSConditionalType;
+exports.assertTSConstructSignatureDeclaration = assertTSConstructSignatureDeclaration;
+exports.assertTSConstructorType = assertTSConstructorType;
+exports.assertTSDeclareFunction = assertTSDeclareFunction;
+exports.assertTSDeclareMethod = assertTSDeclareMethod;
+exports.assertTSEntityName = assertTSEntityName;
+exports.assertTSEnumBody = assertTSEnumBody;
+exports.assertTSEnumDeclaration = assertTSEnumDeclaration;
+exports.assertTSEnumMember = assertTSEnumMember;
+exports.assertTSExportAssignment = assertTSExportAssignment;
+exports.assertTSExpressionWithTypeArguments = assertTSExpressionWithTypeArguments;
+exports.assertTSExternalModuleReference = assertTSExternalModuleReference;
+exports.assertTSFunctionType = assertTSFunctionType;
+exports.assertTSImportEqualsDeclaration = assertTSImportEqualsDeclaration;
+exports.assertTSImportType = assertTSImportType;
+exports.assertTSIndexSignature = assertTSIndexSignature;
+exports.assertTSIndexedAccessType = assertTSIndexedAccessType;
+exports.assertTSInferType = assertTSInferType;
+exports.assertTSInstantiationExpression = assertTSInstantiationExpression;
+exports.assertTSInterfaceBody = assertTSInterfaceBody;
+exports.assertTSInterfaceDeclaration = assertTSInterfaceDeclaration;
+exports.assertTSIntersectionType = assertTSIntersectionType;
+exports.assertTSIntrinsicKeyword = assertTSIntrinsicKeyword;
+exports.assertTSLiteralType = assertTSLiteralType;
+exports.assertTSMappedType = assertTSMappedType;
+exports.assertTSMethodSignature = assertTSMethodSignature;
+exports.assertTSModuleBlock = assertTSModuleBlock;
+exports.assertTSModuleDeclaration = assertTSModuleDeclaration;
+exports.assertTSNamedTupleMember = assertTSNamedTupleMember;
+exports.assertTSNamespaceExportDeclaration = assertTSNamespaceExportDeclaration;
+exports.assertTSNeverKeyword = assertTSNeverKeyword;
+exports.assertTSNonNullExpression = assertTSNonNullExpression;
+exports.assertTSNullKeyword = assertTSNullKeyword;
+exports.assertTSNumberKeyword = assertTSNumberKeyword;
+exports.assertTSObjectKeyword = assertTSObjectKeyword;
+exports.assertTSOptionalType = assertTSOptionalType;
+exports.assertTSParameterProperty = assertTSParameterProperty;
+exports.assertTSParenthesizedType = assertTSParenthesizedType;
+exports.assertTSPropertySignature = assertTSPropertySignature;
+exports.assertTSQualifiedName = assertTSQualifiedName;
+exports.assertTSRestType = assertTSRestType;
+exports.assertTSSatisfiesExpression = assertTSSatisfiesExpression;
+exports.assertTSStringKeyword = assertTSStringKeyword;
+exports.assertTSSymbolKeyword = assertTSSymbolKeyword;
+exports.assertTSTemplateLiteralType = assertTSTemplateLiteralType;
+exports.assertTSThisType = assertTSThisType;
+exports.assertTSTupleType = assertTSTupleType;
+exports.assertTSType = assertTSType;
+exports.assertTSTypeAliasDeclaration = assertTSTypeAliasDeclaration;
+exports.assertTSTypeAnnotation = assertTSTypeAnnotation;
+exports.assertTSTypeAssertion = assertTSTypeAssertion;
+exports.assertTSTypeElement = assertTSTypeElement;
+exports.assertTSTypeLiteral = assertTSTypeLiteral;
+exports.assertTSTypeOperator = assertTSTypeOperator;
+exports.assertTSTypeParameter = assertTSTypeParameter;
+exports.assertTSTypeParameterDeclaration = assertTSTypeParameterDeclaration;
+exports.assertTSTypeParameterInstantiation = assertTSTypeParameterInstantiation;
+exports.assertTSTypePredicate = assertTSTypePredicate;
+exports.assertTSTypeQuery = assertTSTypeQuery;
+exports.assertTSTypeReference = assertTSTypeReference;
+exports.assertTSUndefinedKeyword = assertTSUndefinedKeyword;
+exports.assertTSUnionType = assertTSUnionType;
+exports.assertTSUnknownKeyword = assertTSUnknownKeyword;
+exports.assertTSVoidKeyword = assertTSVoidKeyword;
+exports.assertTaggedTemplateExpression = assertTaggedTemplateExpression;
+exports.assertTemplateElement = assertTemplateElement;
+exports.assertTemplateLiteral = assertTemplateLiteral;
+exports.assertTerminatorless = assertTerminatorless;
+exports.assertThisExpression = assertThisExpression;
+exports.assertThisTypeAnnotation = assertThisTypeAnnotation;
+exports.assertThrowStatement = assertThrowStatement;
+exports.assertTopicReference = assertTopicReference;
+exports.assertTryStatement = assertTryStatement;
+exports.assertTupleExpression = assertTupleExpression;
+exports.assertTupleTypeAnnotation = assertTupleTypeAnnotation;
+exports.assertTypeAlias = assertTypeAlias;
+exports.assertTypeAnnotation = assertTypeAnnotation;
+exports.assertTypeCastExpression = assertTypeCastExpression;
+exports.assertTypeParameter = assertTypeParameter;
+exports.assertTypeParameterDeclaration = assertTypeParameterDeclaration;
+exports.assertTypeParameterInstantiation = assertTypeParameterInstantiation;
+exports.assertTypeScript = assertTypeScript;
+exports.assertTypeofTypeAnnotation = assertTypeofTypeAnnotation;
+exports.assertUnaryExpression = assertUnaryExpression;
+exports.assertUnaryLike = assertUnaryLike;
+exports.assertUnionTypeAnnotation = assertUnionTypeAnnotation;
+exports.assertUpdateExpression = assertUpdateExpression;
+exports.assertUserWhitespacable = assertUserWhitespacable;
+exports.assertV8IntrinsicIdentifier = assertV8IntrinsicIdentifier;
+exports.assertVariableDeclaration = assertVariableDeclaration;
+exports.assertVariableDeclarator = assertVariableDeclarator;
+exports.assertVariance = assertVariance;
+exports.assertVoidPattern = assertVoidPattern;
+exports.assertVoidTypeAnnotation = assertVoidTypeAnnotation;
+exports.assertWhile = assertWhile;
+exports.assertWhileStatement = assertWhileStatement;
+exports.assertWithStatement = assertWithStatement;
+exports.assertYieldExpression = assertYieldExpression;
+var _is = require("../../validators/is.js");
+var _deprecationWarning = require("../../utils/deprecationWarning.js");
+function assert(type, node, opts) {
+  if (!(0, _is.default)(type, node, opts)) {
+    throw new Error(`Expected type "${type}" with option ${JSON.stringify(opts)}, ` + `but instead got "${node.type}".`);
+  }
+}
+function assertArrayExpression(node, opts) {
+  assert("ArrayExpression", node, opts);
+}
+function assertAssignmentExpression(node, opts) {
+  assert("AssignmentExpression", node, opts);
+}
+function assertBinaryExpression(node, opts) {
+  assert("BinaryExpression", node, opts);
+}
+function assertInterpreterDirective(node, opts) {
+  assert("InterpreterDirective", node, opts);
+}
+function assertDirective(node, opts) {
+  assert("Directive", node, opts);
+}
+function assertDirectiveLiteral(node, opts) {
+  assert("DirectiveLiteral", node, opts);
+}
+function assertBlockStatement(node, opts) {
+  assert("BlockStatement", node, opts);
+}
+function assertBreakStatement(node, opts) {
+  assert("BreakStatement", node, opts);
+}
+function assertCallExpression(node, opts) {
+  assert("CallExpression", node, opts);
+}
+function assertCatchClause(node, opts) {
+  assert("CatchClause", node, opts);
+}
+function assertConditionalExpression(node, opts) {
+  assert("ConditionalExpression", node, opts);
+}
+function assertContinueStatement(node, opts) {
+  assert("ContinueStatement", node, opts);
+}
+function assertDebuggerStatement(node, opts) {
+  assert("DebuggerStatement", node, opts);
+}
+function assertDoWhileStatement(node, opts) {
+  assert("DoWhileStatement", node, opts);
+}
+function assertEmptyStatement(node, opts) {
+  assert("EmptyStatement", node, opts);
+}
+function assertExpressionStatement(node, opts) {
+  assert("ExpressionStatement", node, opts);
+}
+function assertFile(node, opts) {
+  assert("File", node, opts);
+}
+function assertForInStatement(node, opts) {
+  assert("ForInStatement", node, opts);
+}
+function assertForStatement(node, opts) {
+  assert("ForStatement", node, opts);
+}
+function assertFunctionDeclaration(node, opts) {
+  assert("FunctionDeclaration", node, opts);
+}
+function assertFunctionExpression(node, opts) {
+  assert("FunctionExpression", node, opts);
+}
+function assertIdentifier(node, opts) {
+  assert("Identifier", node, opts);
+}
+function assertIfStatement(node, opts) {
+  assert("IfStatement", node, opts);
+}
+function assertLabeledStatement(node, opts) {
+  assert("LabeledStatement", node, opts);
+}
+function assertStringLiteral(node, opts) {
+  assert("StringLiteral", node, opts);
+}
+function assertNumericLiteral(node, opts) {
+  assert("NumericLiteral", node, opts);
+}
+function assertNullLiteral(node, opts) {
+  assert("NullLiteral", node, opts);
+}
+function assertBooleanLiteral(node, opts) {
+  assert("BooleanLiteral", node, opts);
+}
+function assertRegExpLiteral(node, opts) {
+  assert("RegExpLiteral", node, opts);
+}
+function assertLogicalExpression(node, opts) {
+  assert("LogicalExpression", node, opts);
+}
+function assertMemberExpression(node, opts) {
+  assert("MemberExpression", node, opts);
+}
+function assertNewExpression(node, opts) {
+  assert("NewExpression", node, opts);
+}
+function assertProgram(node, opts) {
+  assert("Program", node, opts);
+}
+function assertObjectExpression(node, opts) {
+  assert("ObjectExpression", node, opts);
+}
+function assertObjectMethod(node, opts) {
+  assert("ObjectMethod", node, opts);
+}
+function assertObjectProperty(node, opts) {
+  assert("ObjectProperty", node, opts);
+}
+function assertRestElement(node, opts) {
+  assert("RestElement", node, opts);
+}
+function assertReturnStatement(node, opts) {
+  assert("ReturnStatement", node, opts);
+}
+function assertSequenceExpression(node, opts) {
+  assert("SequenceExpression", node, opts);
+}
+function assertParenthesizedExpression(node, opts) {
+  assert("ParenthesizedExpression", node, opts);
+}
+function assertSwitchCase(node, opts) {
+  assert("SwitchCase", node, opts);
+}
+function assertSwitchStatement(node, opts) {
+  assert("SwitchStatement", node, opts);
+}
+function assertThisExpression(node, opts) {
+  assert("ThisExpression", node, opts);
+}
+function assertThrowStatement(node, opts) {
+  assert("ThrowStatement", node, opts);
+}
+function assertTryStatement(node, opts) {
+  assert("TryStatement", node, opts);
+}
+function assertUnaryExpression(node, opts) {
+  assert("UnaryExpression", node, opts);
+}
+function assertUpdateExpression(node, opts) {
+  assert("UpdateExpression", node, opts);
+}
+function assertVariableDeclaration(node, opts) {
+  assert("VariableDeclaration", node, opts);
+}
+function assertVariableDeclarator(node, opts) {
+  assert("VariableDeclarator", node, opts);
+}
+function assertWhileStatement(node, opts) {
+  assert("WhileStatement", node, opts);
+}
+function assertWithStatement(node, opts) {
+  assert("WithStatement", node, opts);
+}
+function assertAssignmentPattern(node, opts) {
+  assert("AssignmentPattern", node, opts);
+}
+function assertArrayPattern(node, opts) {
+  assert("ArrayPattern", node, opts);
+}
+function assertArrowFunctionExpression(node, opts) {
+  assert("ArrowFunctionExpression", node, opts);
+}
+function assertClassBody(node, opts) {
+  assert("ClassBody", node, opts);
+}
+function assertClassExpression(node, opts) {
+  assert("ClassExpression", node, opts);
+}
+function assertClassDeclaration(node, opts) {
+  assert("ClassDeclaration", node, opts);
+}
+function assertExportAllDeclaration(node, opts) {
+  assert("ExportAllDeclaration", node, opts);
+}
+function assertExportDefaultDeclaration(node, opts) {
+  assert("ExportDefaultDeclaration", node, opts);
+}
+function assertExportNamedDeclaration(node, opts) {
+  assert("ExportNamedDeclaration", node, opts);
+}
+function assertExportSpecifier(node, opts) {
+  assert("ExportSpecifier", node, opts);
+}
+function assertForOfStatement(node, opts) {
+  assert("ForOfStatement", node, opts);
+}
+function assertImportDeclaration(node, opts) {
+  assert("ImportDeclaration", node, opts);
+}
+function assertImportDefaultSpecifier(node, opts) {
+  assert("ImportDefaultSpecifier", node, opts);
+}
+function assertImportNamespaceSpecifier(node, opts) {
+  assert("ImportNamespaceSpecifier", node, opts);
+}
+function assertImportSpecifier(node, opts) {
+  assert("ImportSpecifier", node, opts);
+}
+function assertImportExpression(node, opts) {
+  assert("ImportExpression", node, opts);
+}
+function assertMetaProperty(node, opts) {
+  assert("MetaProperty", node, opts);
+}
+function assertClassMethod(node, opts) {
+  assert("ClassMethod", node, opts);
+}
+function assertObjectPattern(node, opts) {
+  assert("ObjectPattern", node, opts);
+}
+function assertSpreadElement(node, opts) {
+  assert("SpreadElement", node, opts);
+}
+function assertSuper(node, opts) {
+  assert("Super", node, opts);
+}
+function assertTaggedTemplateExpression(node, opts) {
+  assert("TaggedTemplateExpression", node, opts);
+}
+function assertTemplateElement(node, opts) {
+  assert("TemplateElement", node, opts);
+}
+function assertTemplateLiteral(node, opts) {
+  assert("TemplateLiteral", node, opts);
+}
+function assertYieldExpression(node, opts) {
+  assert("YieldExpression", node, opts);
+}
+function assertAwaitExpression(node, opts) {
+  assert("AwaitExpression", node, opts);
+}
+function assertImport(node, opts) {
+  assert("Import", node, opts);
+}
+function assertBigIntLiteral(node, opts) {
+  assert("BigIntLiteral", node, opts);
+}
+function assertExportNamespaceSpecifier(node, opts) {
+  assert("ExportNamespaceSpecifier", node, opts);
+}
+function assertOptionalMemberExpression(node, opts) {
+  assert("OptionalMemberExpression", node, opts);
+}
+function assertOptionalCallExpression(node, opts) {
+  assert("OptionalCallExpression", node, opts);
+}
+function assertClassProperty(node, opts) {
+  assert("ClassProperty", node, opts);
+}
+function assertClassAccessorProperty(node, opts) {
+  assert("ClassAccessorProperty", node, opts);
+}
+function assertClassPrivateProperty(node, opts) {
+  assert("ClassPrivateProperty", node, opts);
+}
+function assertClassPrivateMethod(node, opts) {
+  assert("ClassPrivateMethod", node, opts);
+}
+function assertPrivateName(node, opts) {
+  assert("PrivateName", node, opts);
+}
+function assertStaticBlock(node, opts) {
+  assert("StaticBlock", node, opts);
+}
+function assertImportAttribute(node, opts) {
+  assert("ImportAttribute", node, opts);
+}
+function assertAnyTypeAnnotation(node, opts) {
+  assert("AnyTypeAnnotation", node, opts);
+}
+function assertArrayTypeAnnotation(node, opts) {
+  assert("ArrayTypeAnnotation", node, opts);
+}
+function assertBooleanTypeAnnotation(node, opts) {
+  assert("BooleanTypeAnnotation", node, opts);
+}
+function assertBooleanLiteralTypeAnnotation(node, opts) {
+  assert("BooleanLiteralTypeAnnotation", node, opts);
+}
+function assertNullLiteralTypeAnnotation(node, opts) {
+  assert("NullLiteralTypeAnnotation", node, opts);
+}
+function assertClassImplements(node, opts) {
+  assert("ClassImplements", node, opts);
+}
+function assertDeclareClass(node, opts) {
+  assert("DeclareClass", node, opts);
+}
+function assertDeclareFunction(node, opts) {
+  assert("DeclareFunction", node, opts);
+}
+function assertDeclareInterface(node, opts) {
+  assert("DeclareInterface", node, opts);
+}
+function assertDeclareModule(node, opts) {
+  assert("DeclareModule", node, opts);
+}
+function assertDeclareModuleExports(node, opts) {
+  assert("DeclareModuleExports", node, opts);
+}
+function assertDeclareTypeAlias(node, opts) {
+  assert("DeclareTypeAlias", node, opts);
+}
+function assertDeclareOpaqueType(node, opts) {
+  assert("DeclareOpaqueType", node, opts);
+}
+function assertDeclareVariable(node, opts) {
+  assert("DeclareVariable", node, opts);
+}
+function assertDeclareExportDeclaration(node, opts) {
+  assert("DeclareExportDeclaration", node, opts);
+}
+function assertDeclareExportAllDeclaration(node, opts) {
+  assert("DeclareExportAllDeclaration", node, opts);
+}
+function assertDeclaredPredicate(node, opts) {
+  assert("DeclaredPredicate", node, opts);
+}
+function assertExistsTypeAnnotation(node, opts) {
+  assert("ExistsTypeAnnotation", node, opts);
+}
+function assertFunctionTypeAnnotation(node, opts) {
+  assert("FunctionTypeAnnotation", node, opts);
+}
+function assertFunctionTypeParam(node, opts) {
+  assert("FunctionTypeParam", node, opts);
+}
+function assertGenericTypeAnnotation(node, opts) {
+  assert("GenericTypeAnnotation", node, opts);
+}
+function assertInferredPredicate(node, opts) {
+  assert("InferredPredicate", node, opts);
+}
+function assertInterfaceExtends(node, opts) {
+  assert("InterfaceExtends", node, opts);
+}
+function assertInterfaceDeclaration(node, opts) {
+  assert("InterfaceDeclaration", node, opts);
+}
+function assertInterfaceTypeAnnotation(node, opts) {
+  assert("InterfaceTypeAnnotation", node, opts);
+}
+function assertIntersectionTypeAnnotation(node, opts) {
+  assert("IntersectionTypeAnnotation", node, opts);
+}
+function assertMixedTypeAnnotation(node, opts) {
+  assert("MixedTypeAnnotation", node, opts);
+}
+function assertEmptyTypeAnnotation(node, opts) {
+  assert("EmptyTypeAnnotation", node, opts);
+}
+function assertNullableTypeAnnotation(node, opts) {
+  assert("NullableTypeAnnotation", node, opts);
+}
+function assertNumberLiteralTypeAnnotation(node, opts) {
+  assert("NumberLiteralTypeAnnotation", node, opts);
+}
+function assertNumberTypeAnnotation(node, opts) {
+  assert("NumberTypeAnnotation", node, opts);
+}
+function assertObjectTypeAnnotation(node, opts) {
+  assert("ObjectTypeAnnotation", node, opts);
+}
+function assertObjectTypeInternalSlot(node, opts) {
+  assert("ObjectTypeInternalSlot", node, opts);
+}
+function assertObjectTypeCallProperty(node, opts) {
+  assert("ObjectTypeCallProperty", node, opts);
+}
+function assertObjectTypeIndexer(node, opts) {
+  assert("ObjectTypeIndexer", node, opts);
+}
+function assertObjectTypeProperty(node, opts) {
+  assert("ObjectTypeProperty", node, opts);
+}
+function assertObjectTypeSpreadProperty(node, opts) {
+  assert("ObjectTypeSpreadProperty", node, opts);
+}
+function assertOpaqueType(node, opts) {
+  assert("OpaqueType", node, opts);
+}
+function assertQualifiedTypeIdentifier(node, opts) {
+  assert("QualifiedTypeIdentifier", node, opts);
+}
+function assertStringLiteralTypeAnnotation(node, opts) {
+  assert("StringLiteralTypeAnnotation", node, opts);
+}
+function assertStringTypeAnnotation(node, opts) {
+  assert("StringTypeAnnotation", node, opts);
+}
+function assertSymbolTypeAnnotation(node, opts) {
+  assert("SymbolTypeAnnotation", node, opts);
+}
+function assertThisTypeAnnotation(node, opts) {
+  assert("ThisTypeAnnotation", node, opts);
+}
+function assertTupleTypeAnnotation(node, opts) {
+  assert("TupleTypeAnnotation", node, opts);
+}
+function assertTypeofTypeAnnotation(node, opts) {
+  assert("TypeofTypeAnnotation", node, opts);
+}
+function assertTypeAlias(node, opts) {
+  assert("TypeAlias", node, opts);
+}
+function assertTypeAnnotation(node, opts) {
+  assert("TypeAnnotation", node, opts);
+}
+function assertTypeCastExpression(node, opts) {
+  assert("TypeCastExpression", node, opts);
+}
+function assertTypeParameter(node, opts) {
+  assert("TypeParameter", node, opts);
+}
+function assertTypeParameterDeclaration(node, opts) {
+  assert("TypeParameterDeclaration", node, opts);
+}
+function assertTypeParameterInstantiation(node, opts) {
+  assert("TypeParameterInstantiation", node, opts);
+}
+function assertUnionTypeAnnotation(node, opts) {
+  assert("UnionTypeAnnotation", node, opts);
+}
+function assertVariance(node, opts) {
+  assert("Variance", node, opts);
+}
+function assertVoidTypeAnnotation(node, opts) {
+  assert("VoidTypeAnnotation", node, opts);
+}
+function assertEnumDeclaration(node, opts) {
+  assert("EnumDeclaration", node, opts);
+}
+function assertEnumBooleanBody(node, opts) {
+  assert("EnumBooleanBody", node, opts);
+}
+function assertEnumNumberBody(node, opts) {
+  assert("EnumNumberBody", node, opts);
+}
+function assertEnumStringBody(node, opts) {
+  assert("EnumStringBody", node, opts);
+}
+function assertEnumSymbolBody(node, opts) {
+  assert("EnumSymbolBody", node, opts);
+}
+function assertEnumBooleanMember(node, opts) {
+  assert("EnumBooleanMember", node, opts);
+}
+function assertEnumNumberMember(node, opts) {
+  assert("EnumNumberMember", node, opts);
+}
+function assertEnumStringMember(node, opts) {
+  assert("EnumStringMember", node, opts);
+}
+function assertEnumDefaultedMember(node, opts) {
+  assert("EnumDefaultedMember", node, opts);
+}
+function assertIndexedAccessType(node, opts) {
+  assert("IndexedAccessType", node, opts);
+}
+function assertOptionalIndexedAccessType(node, opts) {
+  assert("OptionalIndexedAccessType", node, opts);
+}
+function assertJSXAttribute(node, opts) {
+  assert("JSXAttribute", node, opts);
+}
+function assertJSXClosingElement(node, opts) {
+  assert("JSXClosingElement", node, opts);
+}
+function assertJSXElement(node, opts) {
+  assert("JSXElement", node, opts);
+}
+function assertJSXEmptyExpression(node, opts) {
+  assert("JSXEmptyExpression", node, opts);
+}
+function assertJSXExpressionContainer(node, opts) {
+  assert("JSXExpressionContainer", node, opts);
+}
+function assertJSXSpreadChild(node, opts) {
+  assert("JSXSpreadChild", node, opts);
+}
+function assertJSXIdentifier(node, opts) {
+  assert("JSXIdentifier", node, opts);
+}
+function assertJSXMemberExpression(node, opts) {
+  assert("JSXMemberExpression", node, opts);
+}
+function assertJSXNamespacedName(node, opts) {
+  assert("JSXNamespacedName", node, opts);
+}
+function assertJSXOpeningElement(node, opts) {
+  assert("JSXOpeningElement", node, opts);
+}
+function assertJSXSpreadAttribute(node, opts) {
+  assert("JSXSpreadAttribute", node, opts);
+}
+function assertJSXText(node, opts) {
+  assert("JSXText", node, opts);
+}
+function assertJSXFragment(node, opts) {
+  assert("JSXFragment", node, opts);
+}
+function assertJSXOpeningFragment(node, opts) {
+  assert("JSXOpeningFragment", node, opts);
+}
+function assertJSXClosingFragment(node, opts) {
+  assert("JSXClosingFragment", node, opts);
+}
+function assertNoop(node, opts) {
+  assert("Noop", node, opts);
+}
+function assertPlaceholder(node, opts) {
+  assert("Placeholder", node, opts);
+}
+function assertV8IntrinsicIdentifier(node, opts) {
+  assert("V8IntrinsicIdentifier", node, opts);
+}
+function assertArgumentPlaceholder(node, opts) {
+  assert("ArgumentPlaceholder", node, opts);
+}
+function assertBindExpression(node, opts) {
+  assert("BindExpression", node, opts);
+}
+function assertDecorator(node, opts) {
+  assert("Decorator", node, opts);
+}
+function assertDoExpression(node, opts) {
+  assert("DoExpression", node, opts);
+}
+function assertExportDefaultSpecifier(node, opts) {
+  assert("ExportDefaultSpecifier", node, opts);
+}
+function assertRecordExpression(node, opts) {
+  assert("RecordExpression", node, opts);
+}
+function assertTupleExpression(node, opts) {
+  assert("TupleExpression", node, opts);
+}
+function assertDecimalLiteral(node, opts) {
+  assert("DecimalLiteral", node, opts);
+}
+function assertModuleExpression(node, opts) {
+  assert("ModuleExpression", node, opts);
+}
+function assertTopicReference(node, opts) {
+  assert("TopicReference", node, opts);
+}
+function assertPipelineTopicExpression(node, opts) {
+  assert("PipelineTopicExpression", node, opts);
+}
+function assertPipelineBareFunction(node, opts) {
+  assert("PipelineBareFunction", node, opts);
+}
+function assertPipelinePrimaryTopicReference(node, opts) {
+  assert("PipelinePrimaryTopicReference", node, opts);
+}
+function assertVoidPattern(node, opts) {
+  assert("VoidPattern", node, opts);
+}
+function assertTSParameterProperty(node, opts) {
+  assert("TSParameterProperty", node, opts);
+}
+function assertTSDeclareFunction(node, opts) {
+  assert("TSDeclareFunction", node, opts);
+}
+function assertTSDeclareMethod(node, opts) {
+  assert("TSDeclareMethod", node, opts);
+}
+function assertTSQualifiedName(node, opts) {
+  assert("TSQualifiedName", node, opts);
+}
+function assertTSCallSignatureDeclaration(node, opts) {
+  assert("TSCallSignatureDeclaration", node, opts);
+}
+function assertTSConstructSignatureDeclaration(node, opts) {
+  assert("TSConstructSignatureDeclaration", node, opts);
+}
+function assertTSPropertySignature(node, opts) {
+  assert("TSPropertySignature", node, opts);
+}
+function assertTSMethodSignature(node, opts) {
+  assert("TSMethodSignature", node, opts);
+}
+function assertTSIndexSignature(node, opts) {
+  assert("TSIndexSignature", node, opts);
+}
+function assertTSAnyKeyword(node, opts) {
+  assert("TSAnyKeyword", node, opts);
+}
+function assertTSBooleanKeyword(node, opts) {
+  assert("TSBooleanKeyword", node, opts);
+}
+function assertTSBigIntKeyword(node, opts) {
+  assert("TSBigIntKeyword", node, opts);
+}
+function assertTSIntrinsicKeyword(node, opts) {
+  assert("TSIntrinsicKeyword", node, opts);
+}
+function assertTSNeverKeyword(node, opts) {
+  assert("TSNeverKeyword", node, opts);
+}
+function assertTSNullKeyword(node, opts) {
+  assert("TSNullKeyword", node, opts);
+}
+function assertTSNumberKeyword(node, opts) {
+  assert("TSNumberKeyword", node, opts);
+}
+function assertTSObjectKeyword(node, opts) {
+  assert("TSObjectKeyword", node, opts);
+}
+function assertTSStringKeyword(node, opts) {
+  assert("TSStringKeyword", node, opts);
+}
+function assertTSSymbolKeyword(node, opts) {
+  assert("TSSymbolKeyword", node, opts);
+}
+function assertTSUndefinedKeyword(node, opts) {
+  assert("TSUndefinedKeyword", node, opts);
+}
+function assertTSUnknownKeyword(node, opts) {
+  assert("TSUnknownKeyword", node, opts);
+}
+function assertTSVoidKeyword(node, opts) {
+  assert("TSVoidKeyword", node, opts);
+}
+function assertTSThisType(node, opts) {
+  assert("TSThisType", node, opts);
+}
+function assertTSFunctionType(node, opts) {
+  assert("TSFunctionType", node, opts);
+}
+function assertTSConstructorType(node, opts) {
+  assert("TSConstructorType", node, opts);
+}
+function assertTSTypeReference(node, opts) {
+  assert("TSTypeReference", node, opts);
+}
+function assertTSTypePredicate(node, opts) {
+  assert("TSTypePredicate", node, opts);
+}
+function assertTSTypeQuery(node, opts) {
+  assert("TSTypeQuery", node, opts);
+}
+function assertTSTypeLiteral(node, opts) {
+  assert("TSTypeLiteral", node, opts);
+}
+function assertTSArrayType(node, opts) {
+  assert("TSArrayType", node, opts);
+}
+function assertTSTupleType(node, opts) {
+  assert("TSTupleType", node, opts);
+}
+function assertTSOptionalType(node, opts) {
+  assert("TSOptionalType", node, opts);
+}
+function assertTSRestType(node, opts) {
+  assert("TSRestType", node, opts);
+}
+function assertTSNamedTupleMember(node, opts) {
+  assert("TSNamedTupleMember", node, opts);
+}
+function assertTSUnionType(node, opts) {
+  assert("TSUnionType", node, opts);
+}
+function assertTSIntersectionType(node, opts) {
+  assert("TSIntersectionType", node, opts);
+}
+function assertTSConditionalType(node, opts) {
+  assert("TSConditionalType", node, opts);
+}
+function assertTSInferType(node, opts) {
+  assert("TSInferType", node, opts);
+}
+function assertTSParenthesizedType(node, opts) {
+  assert("TSParenthesizedType", node, opts);
+}
+function assertTSTypeOperator(node, opts) {
+  assert("TSTypeOperator", node, opts);
+}
+function assertTSIndexedAccessType(node, opts) {
+  assert("TSIndexedAccessType", node, opts);
+}
+function assertTSMappedType(node, opts) {
+  assert("TSMappedType", node, opts);
+}
+function assertTSTemplateLiteralType(node, opts) {
+  assert("TSTemplateLiteralType", node, opts);
+}
+function assertTSLiteralType(node, opts) {
+  assert("TSLiteralType", node, opts);
+}
+function assertTSExpressionWithTypeArguments(node, opts) {
+  assert("TSExpressionWithTypeArguments", node, opts);
+}
+function assertTSInterfaceDeclaration(node, opts) {
+  assert("TSInterfaceDeclaration", node, opts);
+}
+function assertTSInterfaceBody(node, opts) {
+  assert("TSInterfaceBody", node, opts);
+}
+function assertTSTypeAliasDeclaration(node, opts) {
+  assert("TSTypeAliasDeclaration", node, opts);
+}
+function assertTSInstantiationExpression(node, opts) {
+  assert("TSInstantiationExpression", node, opts);
+}
+function assertTSAsExpression(node, opts) {
+  assert("TSAsExpression", node, opts);
+}
+function assertTSSatisfiesExpression(node, opts) {
+  assert("TSSatisfiesExpression", node, opts);
+}
+function assertTSTypeAssertion(node, opts) {
+  assert("TSTypeAssertion", node, opts);
+}
+function assertTSEnumBody(node, opts) {
+  assert("TSEnumBody", node, opts);
+}
+function assertTSEnumDeclaration(node, opts) {
+  assert("TSEnumDeclaration", node, opts);
+}
+function assertTSEnumMember(node, opts) {
+  assert("TSEnumMember", node, opts);
+}
+function assertTSModuleDeclaration(node, opts) {
+  assert("TSModuleDeclaration", node, opts);
+}
+function assertTSModuleBlock(node, opts) {
+  assert("TSModuleBlock", node, opts);
+}
+function assertTSImportType(node, opts) {
+  assert("TSImportType", node, opts);
+}
+function assertTSImportEqualsDeclaration(node, opts) {
+  assert("TSImportEqualsDeclaration", node, opts);
+}
+function assertTSExternalModuleReference(node, opts) {
+  assert("TSExternalModuleReference", node, opts);
+}
+function assertTSNonNullExpression(node, opts) {
+  assert("TSNonNullExpression", node, opts);
+}
+function assertTSExportAssignment(node, opts) {
+  assert("TSExportAssignment", node, opts);
+}
+function assertTSNamespaceExportDeclaration(node, opts) {
+  assert("TSNamespaceExportDeclaration", node, opts);
+}
+function assertTSTypeAnnotation(node, opts) {
+  assert("TSTypeAnnotation", node, opts);
+}
+function assertTSTypeParameterInstantiation(node, opts) {
+  assert("TSTypeParameterInstantiation", node, opts);
+}
+function assertTSTypeParameterDeclaration(node, opts) {
+  assert("TSTypeParameterDeclaration", node, opts);
+}
+function assertTSTypeParameter(node, opts) {
+  assert("TSTypeParameter", node, opts);
+}
+function assertStandardized(node, opts) {
+  assert("Standardized", node, opts);
+}
+function assertExpression(node, opts) {
+  assert("Expression", node, opts);
+}
+function assertBinary(node, opts) {
+  assert("Binary", node, opts);
+}
+function assertScopable(node, opts) {
+  assert("Scopable", node, opts);
+}
+function assertBlockParent(node, opts) {
+  assert("BlockParent", node, opts);
+}
+function assertBlock(node, opts) {
+  assert("Block", node, opts);
+}
+function assertStatement(node, opts) {
+  assert("Statement", node, opts);
+}
+function assertTerminatorless(node, opts) {
+  assert("Terminatorless", node, opts);
+}
+function assertCompletionStatement(node, opts) {
+  assert("CompletionStatement", node, opts);
+}
+function assertConditional(node, opts) {
+  assert("Conditional", node, opts);
+}
+function assertLoop(node, opts) {
+  assert("Loop", node, opts);
+}
+function assertWhile(node, opts) {
+  assert("While", node, opts);
+}
+function assertExpressionWrapper(node, opts) {
+  assert("ExpressionWrapper", node, opts);
+}
+function assertFor(node, opts) {
+  assert("For", node, opts);
+}
+function assertForXStatement(node, opts) {
+  assert("ForXStatement", node, opts);
+}
+function assertFunction(node, opts) {
+  assert("Function", node, opts);
+}
+function assertFunctionParent(node, opts) {
+  assert("FunctionParent", node, opts);
+}
+function assertPureish(node, opts) {
+  assert("Pureish", node, opts);
+}
+function assertDeclaration(node, opts) {
+  assert("Declaration", node, opts);
+}
+function assertFunctionParameter(node, opts) {
+  assert("FunctionParameter", node, opts);
+}
+function assertPatternLike(node, opts) {
+  assert("PatternLike", node, opts);
+}
+function assertLVal(node, opts) {
+  assert("LVal", node, opts);
+}
+function assertTSEntityName(node, opts) {
+  assert("TSEntityName", node, opts);
+}
+function assertLiteral(node, opts) {
+  assert("Literal", node, opts);
+}
+function assertImmutable(node, opts) {
+  assert("Immutable", node, opts);
+}
+function assertUserWhitespacable(node, opts) {
+  assert("UserWhitespacable", node, opts);
+}
+function assertMethod(node, opts) {
+  assert("Method", node, opts);
+}
+function assertObjectMember(node, opts) {
+  assert("ObjectMember", node, opts);
+}
+function assertProperty(node, opts) {
+  assert("Property", node, opts);
+}
+function assertUnaryLike(node, opts) {
+  assert("UnaryLike", node, opts);
+}
+function assertPattern(node, opts) {
+  assert("Pattern", node, opts);
+}
+function assertClass(node, opts) {
+  assert("Class", node, opts);
+}
+function assertImportOrExportDeclaration(node, opts) {
+  assert("ImportOrExportDeclaration", node, opts);
+}
+function assertExportDeclaration(node, opts) {
+  assert("ExportDeclaration", node, opts);
+}
+function assertModuleSpecifier(node, opts) {
+  assert("ModuleSpecifier", node, opts);
+}
+function assertAccessor(node, opts) {
+  assert("Accessor", node, opts);
+}
+function assertPrivate(node, opts) {
+  assert("Private", node, opts);
+}
+function assertFlow(node, opts) {
+  assert("Flow", node, opts);
+}
+function assertFlowType(node, opts) {
+  assert("FlowType", node, opts);
+}
+function assertFlowBaseAnnotation(node, opts) {
+  assert("FlowBaseAnnotation", node, opts);
+}
+function assertFlowDeclaration(node, opts) {
+  assert("FlowDeclaration", node, opts);
+}
+function assertFlowPredicate(node, opts) {
+  assert("FlowPredicate", node, opts);
+}
+function assertEnumBody(node, opts) {
+  assert("EnumBody", node, opts);
+}
+function assertEnumMember(node, opts) {
+  assert("EnumMember", node, opts);
+}
+function assertJSX(node, opts) {
+  assert("JSX", node, opts);
+}
+function assertMiscellaneous(node, opts) {
+  assert("Miscellaneous", node, opts);
+}
+function assertTypeScript(node, opts) {
+  assert("TypeScript", node, opts);
+}
+function assertTSTypeElement(node, opts) {
+  assert("TSTypeElement", node, opts);
+}
+function assertTSType(node, opts) {
+  assert("TSType", node, opts);
+}
+function assertTSBaseType(node, opts) {
+  assert("TSBaseType", node, opts);
+}
+function assertNumberLiteral(node, opts) {
+  (0, _deprecationWarning.default)("assertNumberLiteral", "assertNumericLiteral");
+  assert("NumberLiteral", node, opts);
+}
+function assertRegexLiteral(node, opts) {
+  (0, _deprecationWarning.default)("assertRegexLiteral", "assertRegExpLiteral");
+  assert("RegexLiteral", node, opts);
+}
+function assertRestProperty(node, opts) {
+  (0, _deprecationWarning.default)("assertRestProperty", "assertRestElement");
+  assert("RestProperty", node, opts);
+}
+function assertSpreadProperty(node, opts) {
+  (0, _deprecationWarning.default)("assertSpreadProperty", "assertSpreadElement");
+  assert("SpreadProperty", node, opts);
+}
+function assertModuleDeclaration(node, opts) {
+  (0, _deprecationWarning.default)("assertModuleDeclaration", "assertImportOrExportDeclaration");
+  assert("ModuleDeclaration", node, opts);
+}
+
+//# sourceMappingURL=index.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/asserts/generated/index.js.map


+ 3 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/ast-types/generated/index.js

@@ -0,0 +1,3 @@
+"use strict";
+
+//# sourceMappingURL=index.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/ast-types/generated/index.js.map


+ 18 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js

@@ -0,0 +1,18 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = createFlowUnionType;
+var _index = require("../generated/index.js");
+var _removeTypeDuplicates = require("../../modifications/flow/removeTypeDuplicates.js");
+function createFlowUnionType(types) {
+  const flattened = (0, _removeTypeDuplicates.default)(types);
+  if (flattened.length === 1) {
+    return flattened[0];
+  } else {
+    return (0, _index.unionTypeAnnotation)(flattened);
+  }
+}
+
+//# sourceMappingURL=createFlowUnionType.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_index","require","_removeTypeDuplicates","createFlowUnionType","types","flattened","removeTypeDuplicates","length","unionTypeAnnotation"],"sources":["../../../src/builders/flow/createFlowUnionType.ts"],"sourcesContent":["import { unionTypeAnnotation } from \"../generated/index.ts\";\nimport removeTypeDuplicates from \"../../modifications/flow/removeTypeDuplicates.ts\";\nimport type * as t from \"../../index.ts\";\n\n/**\n * Takes an array of `types` and flattens them, removing duplicates and\n * returns a `UnionTypeAnnotation` node containing them.\n */\nexport default function createFlowUnionType<T extends t.FlowType>(\n  types: [T] | Array<T>,\n): T | t.UnionTypeAnnotation {\n  const flattened = removeTypeDuplicates(types);\n\n  if (flattened.length === 1) {\n    return flattened[0] as T;\n  } else {\n    return unionTypeAnnotation(flattened);\n  }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AAOe,SAASE,mBAAmBA,CACzCC,KAAqB,EACM;EAC3B,MAAMC,SAAS,GAAG,IAAAC,6BAAoB,EAACF,KAAK,CAAC;EAE7C,IAAIC,SAAS,CAACE,MAAM,KAAK,CAAC,EAAE;IAC1B,OAAOF,SAAS,CAAC,CAAC,CAAC;EACrB,CAAC,MAAM;IACL,OAAO,IAAAG,0BAAmB,EAACH,SAAS,CAAC;EACvC;AACF","ignoreList":[]}

+ 31 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js

@@ -0,0 +1,31 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = void 0;
+var _index = require("../generated/index.js");
+var _default = exports.default = createTypeAnnotationBasedOnTypeof;
+function createTypeAnnotationBasedOnTypeof(type) {
+  switch (type) {
+    case "string":
+      return (0, _index.stringTypeAnnotation)();
+    case "number":
+      return (0, _index.numberTypeAnnotation)();
+    case "undefined":
+      return (0, _index.voidTypeAnnotation)();
+    case "boolean":
+      return (0, _index.booleanTypeAnnotation)();
+    case "function":
+      return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Function"));
+    case "object":
+      return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Object"));
+    case "symbol":
+      return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Symbol"));
+    case "bigint":
+      return (0, _index.anyTypeAnnotation)();
+  }
+  throw new Error("Invalid typeof value: " + type);
+}
+
+//# sourceMappingURL=createTypeAnnotationBasedOnTypeof.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js.map


+ 29 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/index.js

@@ -0,0 +1,29 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+var _lowercase = require("./lowercase.js");
+Object.keys(_lowercase).forEach(function (key) {
+  if (key === "default" || key === "__esModule") return;
+  if (key in exports && exports[key] === _lowercase[key]) return;
+  Object.defineProperty(exports, key, {
+    enumerable: true,
+    get: function () {
+      return _lowercase[key];
+    }
+  });
+});
+var _uppercase = require("./uppercase.js");
+Object.keys(_uppercase).forEach(function (key) {
+  if (key === "default" || key === "__esModule") return;
+  if (key in exports && exports[key] === _uppercase[key]) return;
+  Object.defineProperty(exports, key, {
+    enumerable: true,
+    get: function () {
+      return _uppercase[key];
+    }
+  });
+});
+
+//# sourceMappingURL=index.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/index.js.map


+ 2896 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/lowercase.js

@@ -0,0 +1,2896 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.anyTypeAnnotation = anyTypeAnnotation;
+exports.argumentPlaceholder = argumentPlaceholder;
+exports.arrayExpression = arrayExpression;
+exports.arrayPattern = arrayPattern;
+exports.arrayTypeAnnotation = arrayTypeAnnotation;
+exports.arrowFunctionExpression = arrowFunctionExpression;
+exports.assignmentExpression = assignmentExpression;
+exports.assignmentPattern = assignmentPattern;
+exports.awaitExpression = awaitExpression;
+exports.bigIntLiteral = bigIntLiteral;
+exports.binaryExpression = binaryExpression;
+exports.bindExpression = bindExpression;
+exports.blockStatement = blockStatement;
+exports.booleanLiteral = booleanLiteral;
+exports.booleanLiteralTypeAnnotation = booleanLiteralTypeAnnotation;
+exports.booleanTypeAnnotation = booleanTypeAnnotation;
+exports.breakStatement = breakStatement;
+exports.callExpression = callExpression;
+exports.catchClause = catchClause;
+exports.classAccessorProperty = classAccessorProperty;
+exports.classBody = classBody;
+exports.classDeclaration = classDeclaration;
+exports.classExpression = classExpression;
+exports.classImplements = classImplements;
+exports.classMethod = classMethod;
+exports.classPrivateMethod = classPrivateMethod;
+exports.classPrivateProperty = classPrivateProperty;
+exports.classProperty = classProperty;
+exports.conditionalExpression = conditionalExpression;
+exports.continueStatement = continueStatement;
+exports.debuggerStatement = debuggerStatement;
+exports.decimalLiteral = decimalLiteral;
+exports.declareClass = declareClass;
+exports.declareExportAllDeclaration = declareExportAllDeclaration;
+exports.declareExportDeclaration = declareExportDeclaration;
+exports.declareFunction = declareFunction;
+exports.declareInterface = declareInterface;
+exports.declareModule = declareModule;
+exports.declareModuleExports = declareModuleExports;
+exports.declareOpaqueType = declareOpaqueType;
+exports.declareTypeAlias = declareTypeAlias;
+exports.declareVariable = declareVariable;
+exports.declaredPredicate = declaredPredicate;
+exports.decorator = decorator;
+exports.directive = directive;
+exports.directiveLiteral = directiveLiteral;
+exports.doExpression = doExpression;
+exports.doWhileStatement = doWhileStatement;
+exports.emptyStatement = emptyStatement;
+exports.emptyTypeAnnotation = emptyTypeAnnotation;
+exports.enumBooleanBody = enumBooleanBody;
+exports.enumBooleanMember = enumBooleanMember;
+exports.enumDeclaration = enumDeclaration;
+exports.enumDefaultedMember = enumDefaultedMember;
+exports.enumNumberBody = enumNumberBody;
+exports.enumNumberMember = enumNumberMember;
+exports.enumStringBody = enumStringBody;
+exports.enumStringMember = enumStringMember;
+exports.enumSymbolBody = enumSymbolBody;
+exports.existsTypeAnnotation = existsTypeAnnotation;
+exports.exportAllDeclaration = exportAllDeclaration;
+exports.exportDefaultDeclaration = exportDefaultDeclaration;
+exports.exportDefaultSpecifier = exportDefaultSpecifier;
+exports.exportNamedDeclaration = exportNamedDeclaration;
+exports.exportNamespaceSpecifier = exportNamespaceSpecifier;
+exports.exportSpecifier = exportSpecifier;
+exports.expressionStatement = expressionStatement;
+exports.file = file;
+exports.forInStatement = forInStatement;
+exports.forOfStatement = forOfStatement;
+exports.forStatement = forStatement;
+exports.functionDeclaration = functionDeclaration;
+exports.functionExpression = functionExpression;
+exports.functionTypeAnnotation = functionTypeAnnotation;
+exports.functionTypeParam = functionTypeParam;
+exports.genericTypeAnnotation = genericTypeAnnotation;
+exports.identifier = identifier;
+exports.ifStatement = ifStatement;
+exports.import = _import;
+exports.importAttribute = importAttribute;
+exports.importDeclaration = importDeclaration;
+exports.importDefaultSpecifier = importDefaultSpecifier;
+exports.importExpression = importExpression;
+exports.importNamespaceSpecifier = importNamespaceSpecifier;
+exports.importSpecifier = importSpecifier;
+exports.indexedAccessType = indexedAccessType;
+exports.inferredPredicate = inferredPredicate;
+exports.interfaceDeclaration = interfaceDeclaration;
+exports.interfaceExtends = interfaceExtends;
+exports.interfaceTypeAnnotation = interfaceTypeAnnotation;
+exports.interpreterDirective = interpreterDirective;
+exports.intersectionTypeAnnotation = intersectionTypeAnnotation;
+exports.jSXAttribute = exports.jsxAttribute = jsxAttribute;
+exports.jSXClosingElement = exports.jsxClosingElement = jsxClosingElement;
+exports.jSXClosingFragment = exports.jsxClosingFragment = jsxClosingFragment;
+exports.jSXElement = exports.jsxElement = jsxElement;
+exports.jSXEmptyExpression = exports.jsxEmptyExpression = jsxEmptyExpression;
+exports.jSXExpressionContainer = exports.jsxExpressionContainer = jsxExpressionContainer;
+exports.jSXFragment = exports.jsxFragment = jsxFragment;
+exports.jSXIdentifier = exports.jsxIdentifier = jsxIdentifier;
+exports.jSXMemberExpression = exports.jsxMemberExpression = jsxMemberExpression;
+exports.jSXNamespacedName = exports.jsxNamespacedName = jsxNamespacedName;
+exports.jSXOpeningElement = exports.jsxOpeningElement = jsxOpeningElement;
+exports.jSXOpeningFragment = exports.jsxOpeningFragment = jsxOpeningFragment;
+exports.jSXSpreadAttribute = exports.jsxSpreadAttribute = jsxSpreadAttribute;
+exports.jSXSpreadChild = exports.jsxSpreadChild = jsxSpreadChild;
+exports.jSXText = exports.jsxText = jsxText;
+exports.labeledStatement = labeledStatement;
+exports.logicalExpression = logicalExpression;
+exports.memberExpression = memberExpression;
+exports.metaProperty = metaProperty;
+exports.mixedTypeAnnotation = mixedTypeAnnotation;
+exports.moduleExpression = moduleExpression;
+exports.newExpression = newExpression;
+exports.noop = noop;
+exports.nullLiteral = nullLiteral;
+exports.nullLiteralTypeAnnotation = nullLiteralTypeAnnotation;
+exports.nullableTypeAnnotation = nullableTypeAnnotation;
+exports.numberLiteral = NumberLiteral;
+exports.numberLiteralTypeAnnotation = numberLiteralTypeAnnotation;
+exports.numberTypeAnnotation = numberTypeAnnotation;
+exports.numericLiteral = numericLiteral;
+exports.objectExpression = objectExpression;
+exports.objectMethod = objectMethod;
+exports.objectPattern = objectPattern;
+exports.objectProperty = objectProperty;
+exports.objectTypeAnnotation = objectTypeAnnotation;
+exports.objectTypeCallProperty = objectTypeCallProperty;
+exports.objectTypeIndexer = objectTypeIndexer;
+exports.objectTypeInternalSlot = objectTypeInternalSlot;
+exports.objectTypeProperty = objectTypeProperty;
+exports.objectTypeSpreadProperty = objectTypeSpreadProperty;
+exports.opaqueType = opaqueType;
+exports.optionalCallExpression = optionalCallExpression;
+exports.optionalIndexedAccessType = optionalIndexedAccessType;
+exports.optionalMemberExpression = optionalMemberExpression;
+exports.parenthesizedExpression = parenthesizedExpression;
+exports.pipelineBareFunction = pipelineBareFunction;
+exports.pipelinePrimaryTopicReference = pipelinePrimaryTopicReference;
+exports.pipelineTopicExpression = pipelineTopicExpression;
+exports.placeholder = placeholder;
+exports.privateName = privateName;
+exports.program = program;
+exports.qualifiedTypeIdentifier = qualifiedTypeIdentifier;
+exports.recordExpression = recordExpression;
+exports.regExpLiteral = regExpLiteral;
+exports.regexLiteral = RegexLiteral;
+exports.restElement = restElement;
+exports.restProperty = RestProperty;
+exports.returnStatement = returnStatement;
+exports.sequenceExpression = sequenceExpression;
+exports.spreadElement = spreadElement;
+exports.spreadProperty = SpreadProperty;
+exports.staticBlock = staticBlock;
+exports.stringLiteral = stringLiteral;
+exports.stringLiteralTypeAnnotation = stringLiteralTypeAnnotation;
+exports.stringTypeAnnotation = stringTypeAnnotation;
+exports.super = _super;
+exports.switchCase = switchCase;
+exports.switchStatement = switchStatement;
+exports.symbolTypeAnnotation = symbolTypeAnnotation;
+exports.taggedTemplateExpression = taggedTemplateExpression;
+exports.templateElement = templateElement;
+exports.templateLiteral = templateLiteral;
+exports.thisExpression = thisExpression;
+exports.thisTypeAnnotation = thisTypeAnnotation;
+exports.throwStatement = throwStatement;
+exports.topicReference = topicReference;
+exports.tryStatement = tryStatement;
+exports.tSAnyKeyword = exports.tsAnyKeyword = tsAnyKeyword;
+exports.tSArrayType = exports.tsArrayType = tsArrayType;
+exports.tSAsExpression = exports.tsAsExpression = tsAsExpression;
+exports.tSBigIntKeyword = exports.tsBigIntKeyword = tsBigIntKeyword;
+exports.tSBooleanKeyword = exports.tsBooleanKeyword = tsBooleanKeyword;
+exports.tSCallSignatureDeclaration = exports.tsCallSignatureDeclaration = tsCallSignatureDeclaration;
+exports.tSConditionalType = exports.tsConditionalType = tsConditionalType;
+exports.tSConstructSignatureDeclaration = exports.tsConstructSignatureDeclaration = tsConstructSignatureDeclaration;
+exports.tSConstructorType = exports.tsConstructorType = tsConstructorType;
+exports.tSDeclareFunction = exports.tsDeclareFunction = tsDeclareFunction;
+exports.tSDeclareMethod = exports.tsDeclareMethod = tsDeclareMethod;
+exports.tSEnumBody = exports.tsEnumBody = tsEnumBody;
+exports.tSEnumDeclaration = exports.tsEnumDeclaration = tsEnumDeclaration;
+exports.tSEnumMember = exports.tsEnumMember = tsEnumMember;
+exports.tSExportAssignment = exports.tsExportAssignment = tsExportAssignment;
+exports.tSExpressionWithTypeArguments = exports.tsExpressionWithTypeArguments = tsExpressionWithTypeArguments;
+exports.tSExternalModuleReference = exports.tsExternalModuleReference = tsExternalModuleReference;
+exports.tSFunctionType = exports.tsFunctionType = tsFunctionType;
+exports.tSImportEqualsDeclaration = exports.tsImportEqualsDeclaration = tsImportEqualsDeclaration;
+exports.tSImportType = exports.tsImportType = tsImportType;
+exports.tSIndexSignature = exports.tsIndexSignature = tsIndexSignature;
+exports.tSIndexedAccessType = exports.tsIndexedAccessType = tsIndexedAccessType;
+exports.tSInferType = exports.tsInferType = tsInferType;
+exports.tSInstantiationExpression = exports.tsInstantiationExpression = tsInstantiationExpression;
+exports.tSInterfaceBody = exports.tsInterfaceBody = tsInterfaceBody;
+exports.tSInterfaceDeclaration = exports.tsInterfaceDeclaration = tsInterfaceDeclaration;
+exports.tSIntersectionType = exports.tsIntersectionType = tsIntersectionType;
+exports.tSIntrinsicKeyword = exports.tsIntrinsicKeyword = tsIntrinsicKeyword;
+exports.tSLiteralType = exports.tsLiteralType = tsLiteralType;
+exports.tSMappedType = exports.tsMappedType = tsMappedType;
+exports.tSMethodSignature = exports.tsMethodSignature = tsMethodSignature;
+exports.tSModuleBlock = exports.tsModuleBlock = tsModuleBlock;
+exports.tSModuleDeclaration = exports.tsModuleDeclaration = tsModuleDeclaration;
+exports.tSNamedTupleMember = exports.tsNamedTupleMember = tsNamedTupleMember;
+exports.tSNamespaceExportDeclaration = exports.tsNamespaceExportDeclaration = tsNamespaceExportDeclaration;
+exports.tSNeverKeyword = exports.tsNeverKeyword = tsNeverKeyword;
+exports.tSNonNullExpression = exports.tsNonNullExpression = tsNonNullExpression;
+exports.tSNullKeyword = exports.tsNullKeyword = tsNullKeyword;
+exports.tSNumberKeyword = exports.tsNumberKeyword = tsNumberKeyword;
+exports.tSObjectKeyword = exports.tsObjectKeyword = tsObjectKeyword;
+exports.tSOptionalType = exports.tsOptionalType = tsOptionalType;
+exports.tSParameterProperty = exports.tsParameterProperty = tsParameterProperty;
+exports.tSParenthesizedType = exports.tsParenthesizedType = tsParenthesizedType;
+exports.tSPropertySignature = exports.tsPropertySignature = tsPropertySignature;
+exports.tSQualifiedName = exports.tsQualifiedName = tsQualifiedName;
+exports.tSRestType = exports.tsRestType = tsRestType;
+exports.tSSatisfiesExpression = exports.tsSatisfiesExpression = tsSatisfiesExpression;
+exports.tSStringKeyword = exports.tsStringKeyword = tsStringKeyword;
+exports.tSSymbolKeyword = exports.tsSymbolKeyword = tsSymbolKeyword;
+exports.tSTemplateLiteralType = exports.tsTemplateLiteralType = tsTemplateLiteralType;
+exports.tSThisType = exports.tsThisType = tsThisType;
+exports.tSTupleType = exports.tsTupleType = tsTupleType;
+exports.tSTypeAliasDeclaration = exports.tsTypeAliasDeclaration = tsTypeAliasDeclaration;
+exports.tSTypeAnnotation = exports.tsTypeAnnotation = tsTypeAnnotation;
+exports.tSTypeAssertion = exports.tsTypeAssertion = tsTypeAssertion;
+exports.tSTypeLiteral = exports.tsTypeLiteral = tsTypeLiteral;
+exports.tSTypeOperator = exports.tsTypeOperator = tsTypeOperator;
+exports.tSTypeParameter = exports.tsTypeParameter = tsTypeParameter;
+exports.tSTypeParameterDeclaration = exports.tsTypeParameterDeclaration = tsTypeParameterDeclaration;
+exports.tSTypeParameterInstantiation = exports.tsTypeParameterInstantiation = tsTypeParameterInstantiation;
+exports.tSTypePredicate = exports.tsTypePredicate = tsTypePredicate;
+exports.tSTypeQuery = exports.tsTypeQuery = tsTypeQuery;
+exports.tSTypeReference = exports.tsTypeReference = tsTypeReference;
+exports.tSUndefinedKeyword = exports.tsUndefinedKeyword = tsUndefinedKeyword;
+exports.tSUnionType = exports.tsUnionType = tsUnionType;
+exports.tSUnknownKeyword = exports.tsUnknownKeyword = tsUnknownKeyword;
+exports.tSVoidKeyword = exports.tsVoidKeyword = tsVoidKeyword;
+exports.tupleExpression = tupleExpression;
+exports.tupleTypeAnnotation = tupleTypeAnnotation;
+exports.typeAlias = typeAlias;
+exports.typeAnnotation = typeAnnotation;
+exports.typeCastExpression = typeCastExpression;
+exports.typeParameter = typeParameter;
+exports.typeParameterDeclaration = typeParameterDeclaration;
+exports.typeParameterInstantiation = typeParameterInstantiation;
+exports.typeofTypeAnnotation = typeofTypeAnnotation;
+exports.unaryExpression = unaryExpression;
+exports.unionTypeAnnotation = unionTypeAnnotation;
+exports.updateExpression = updateExpression;
+exports.v8IntrinsicIdentifier = v8IntrinsicIdentifier;
+exports.variableDeclaration = variableDeclaration;
+exports.variableDeclarator = variableDeclarator;
+exports.variance = variance;
+exports.voidPattern = voidPattern;
+exports.voidTypeAnnotation = voidTypeAnnotation;
+exports.whileStatement = whileStatement;
+exports.withStatement = withStatement;
+exports.yieldExpression = yieldExpression;
+var _validate = require("../../validators/validate.js");
+var _deprecationWarning = require("../../utils/deprecationWarning.js");
+var utils = require("../../definitions/utils.js");
+const {
+  validateInternal: validate
+} = _validate;
+const {
+  NODE_FIELDS
+} = utils;
+function bigIntLiteral(value) {
+  if (typeof value === "bigint") {
+    value = value.toString();
+  }
+  const node = {
+    type: "BigIntLiteral",
+    value
+  };
+  const defs = NODE_FIELDS.BigIntLiteral;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function arrayExpression(elements = []) {
+  const node = {
+    type: "ArrayExpression",
+    elements
+  };
+  const defs = NODE_FIELDS.ArrayExpression;
+  validate(defs.elements, node, "elements", elements, 1);
+  return node;
+}
+function assignmentExpression(operator, left, right) {
+  const node = {
+    type: "AssignmentExpression",
+    operator,
+    left,
+    right
+  };
+  const defs = NODE_FIELDS.AssignmentExpression;
+  validate(defs.operator, node, "operator", operator);
+  validate(defs.left, node, "left", left, 1);
+  validate(defs.right, node, "right", right, 1);
+  return node;
+}
+function binaryExpression(operator, left, right) {
+  const node = {
+    type: "BinaryExpression",
+    operator,
+    left,
+    right
+  };
+  const defs = NODE_FIELDS.BinaryExpression;
+  validate(defs.operator, node, "operator", operator);
+  validate(defs.left, node, "left", left, 1);
+  validate(defs.right, node, "right", right, 1);
+  return node;
+}
+function interpreterDirective(value) {
+  const node = {
+    type: "InterpreterDirective",
+    value
+  };
+  const defs = NODE_FIELDS.InterpreterDirective;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function directive(value) {
+  const node = {
+    type: "Directive",
+    value
+  };
+  const defs = NODE_FIELDS.Directive;
+  validate(defs.value, node, "value", value, 1);
+  return node;
+}
+function directiveLiteral(value) {
+  const node = {
+    type: "DirectiveLiteral",
+    value
+  };
+  const defs = NODE_FIELDS.DirectiveLiteral;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function blockStatement(body, directives = []) {
+  const node = {
+    type: "BlockStatement",
+    body,
+    directives
+  };
+  const defs = NODE_FIELDS.BlockStatement;
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.directives, node, "directives", directives, 1);
+  return node;
+}
+function breakStatement(label = null) {
+  const node = {
+    type: "BreakStatement",
+    label
+  };
+  const defs = NODE_FIELDS.BreakStatement;
+  validate(defs.label, node, "label", label, 1);
+  return node;
+}
+function callExpression(callee, _arguments) {
+  const node = {
+    type: "CallExpression",
+    callee,
+    arguments: _arguments
+  };
+  const defs = NODE_FIELDS.CallExpression;
+  validate(defs.callee, node, "callee", callee, 1);
+  validate(defs.arguments, node, "arguments", _arguments, 1);
+  return node;
+}
+function catchClause(param = null, body) {
+  const node = {
+    type: "CatchClause",
+    param,
+    body
+  };
+  const defs = NODE_FIELDS.CatchClause;
+  validate(defs.param, node, "param", param, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function conditionalExpression(test, consequent, alternate) {
+  const node = {
+    type: "ConditionalExpression",
+    test,
+    consequent,
+    alternate
+  };
+  const defs = NODE_FIELDS.ConditionalExpression;
+  validate(defs.test, node, "test", test, 1);
+  validate(defs.consequent, node, "consequent", consequent, 1);
+  validate(defs.alternate, node, "alternate", alternate, 1);
+  return node;
+}
+function continueStatement(label = null) {
+  const node = {
+    type: "ContinueStatement",
+    label
+  };
+  const defs = NODE_FIELDS.ContinueStatement;
+  validate(defs.label, node, "label", label, 1);
+  return node;
+}
+function debuggerStatement() {
+  return {
+    type: "DebuggerStatement"
+  };
+}
+function doWhileStatement(test, body) {
+  const node = {
+    type: "DoWhileStatement",
+    test,
+    body
+  };
+  const defs = NODE_FIELDS.DoWhileStatement;
+  validate(defs.test, node, "test", test, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function emptyStatement() {
+  return {
+    type: "EmptyStatement"
+  };
+}
+function expressionStatement(expression) {
+  const node = {
+    type: "ExpressionStatement",
+    expression
+  };
+  const defs = NODE_FIELDS.ExpressionStatement;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function file(program, comments = null, tokens = null) {
+  const node = {
+    type: "File",
+    program,
+    comments,
+    tokens
+  };
+  const defs = NODE_FIELDS.File;
+  validate(defs.program, node, "program", program, 1);
+  validate(defs.comments, node, "comments", comments, 1);
+  validate(defs.tokens, node, "tokens", tokens);
+  return node;
+}
+function forInStatement(left, right, body) {
+  const node = {
+    type: "ForInStatement",
+    left,
+    right,
+    body
+  };
+  const defs = NODE_FIELDS.ForInStatement;
+  validate(defs.left, node, "left", left, 1);
+  validate(defs.right, node, "right", right, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function forStatement(init = null, test = null, update = null, body) {
+  const node = {
+    type: "ForStatement",
+    init,
+    test,
+    update,
+    body
+  };
+  const defs = NODE_FIELDS.ForStatement;
+  validate(defs.init, node, "init", init, 1);
+  validate(defs.test, node, "test", test, 1);
+  validate(defs.update, node, "update", update, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function functionDeclaration(id = null, params, body, generator = false, async = false) {
+  const node = {
+    type: "FunctionDeclaration",
+    id,
+    params,
+    body,
+    generator,
+    async
+  };
+  const defs = NODE_FIELDS.FunctionDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.generator, node, "generator", generator);
+  validate(defs.async, node, "async", async);
+  return node;
+}
+function functionExpression(id = null, params, body, generator = false, async = false) {
+  const node = {
+    type: "FunctionExpression",
+    id,
+    params,
+    body,
+    generator,
+    async
+  };
+  const defs = NODE_FIELDS.FunctionExpression;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.generator, node, "generator", generator);
+  validate(defs.async, node, "async", async);
+  return node;
+}
+function identifier(name) {
+  const node = {
+    type: "Identifier",
+    name
+  };
+  const defs = NODE_FIELDS.Identifier;
+  validate(defs.name, node, "name", name);
+  return node;
+}
+function ifStatement(test, consequent, alternate = null) {
+  const node = {
+    type: "IfStatement",
+    test,
+    consequent,
+    alternate
+  };
+  const defs = NODE_FIELDS.IfStatement;
+  validate(defs.test, node, "test", test, 1);
+  validate(defs.consequent, node, "consequent", consequent, 1);
+  validate(defs.alternate, node, "alternate", alternate, 1);
+  return node;
+}
+function labeledStatement(label, body) {
+  const node = {
+    type: "LabeledStatement",
+    label,
+    body
+  };
+  const defs = NODE_FIELDS.LabeledStatement;
+  validate(defs.label, node, "label", label, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function stringLiteral(value) {
+  const node = {
+    type: "StringLiteral",
+    value
+  };
+  const defs = NODE_FIELDS.StringLiteral;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function numericLiteral(value) {
+  const node = {
+    type: "NumericLiteral",
+    value
+  };
+  const defs = NODE_FIELDS.NumericLiteral;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function nullLiteral() {
+  return {
+    type: "NullLiteral"
+  };
+}
+function booleanLiteral(value) {
+  const node = {
+    type: "BooleanLiteral",
+    value
+  };
+  const defs = NODE_FIELDS.BooleanLiteral;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function regExpLiteral(pattern, flags = "") {
+  const node = {
+    type: "RegExpLiteral",
+    pattern,
+    flags
+  };
+  const defs = NODE_FIELDS.RegExpLiteral;
+  validate(defs.pattern, node, "pattern", pattern);
+  validate(defs.flags, node, "flags", flags);
+  return node;
+}
+function logicalExpression(operator, left, right) {
+  const node = {
+    type: "LogicalExpression",
+    operator,
+    left,
+    right
+  };
+  const defs = NODE_FIELDS.LogicalExpression;
+  validate(defs.operator, node, "operator", operator);
+  validate(defs.left, node, "left", left, 1);
+  validate(defs.right, node, "right", right, 1);
+  return node;
+}
+function memberExpression(object, property, computed = false, optional = null) {
+  const node = {
+    type: "MemberExpression",
+    object,
+    property,
+    computed,
+    optional
+  };
+  const defs = NODE_FIELDS.MemberExpression;
+  validate(defs.object, node, "object", object, 1);
+  validate(defs.property, node, "property", property, 1);
+  validate(defs.computed, node, "computed", computed);
+  validate(defs.optional, node, "optional", optional);
+  return node;
+}
+function newExpression(callee, _arguments) {
+  const node = {
+    type: "NewExpression",
+    callee,
+    arguments: _arguments
+  };
+  const defs = NODE_FIELDS.NewExpression;
+  validate(defs.callee, node, "callee", callee, 1);
+  validate(defs.arguments, node, "arguments", _arguments, 1);
+  return node;
+}
+function program(body, directives = [], sourceType = "script", interpreter = null) {
+  const node = {
+    type: "Program",
+    body,
+    directives,
+    sourceType,
+    interpreter
+  };
+  const defs = NODE_FIELDS.Program;
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.directives, node, "directives", directives, 1);
+  validate(defs.sourceType, node, "sourceType", sourceType);
+  validate(defs.interpreter, node, "interpreter", interpreter, 1);
+  return node;
+}
+function objectExpression(properties) {
+  const node = {
+    type: "ObjectExpression",
+    properties
+  };
+  const defs = NODE_FIELDS.ObjectExpression;
+  validate(defs.properties, node, "properties", properties, 1);
+  return node;
+}
+function objectMethod(kind = "method", key, params, body, computed = false, generator = false, async = false) {
+  const node = {
+    type: "ObjectMethod",
+    kind,
+    key,
+    params,
+    body,
+    computed,
+    generator,
+    async
+  };
+  const defs = NODE_FIELDS.ObjectMethod;
+  validate(defs.kind, node, "kind", kind);
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.computed, node, "computed", computed);
+  validate(defs.generator, node, "generator", generator);
+  validate(defs.async, node, "async", async);
+  return node;
+}
+function objectProperty(key, value, computed = false, shorthand = false, decorators = null) {
+  const node = {
+    type: "ObjectProperty",
+    key,
+    value,
+    computed,
+    shorthand,
+    decorators
+  };
+  const defs = NODE_FIELDS.ObjectProperty;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.value, node, "value", value, 1);
+  validate(defs.computed, node, "computed", computed);
+  validate(defs.shorthand, node, "shorthand", shorthand);
+  validate(defs.decorators, node, "decorators", decorators, 1);
+  return node;
+}
+function restElement(argument) {
+  const node = {
+    type: "RestElement",
+    argument
+  };
+  const defs = NODE_FIELDS.RestElement;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function returnStatement(argument = null) {
+  const node = {
+    type: "ReturnStatement",
+    argument
+  };
+  const defs = NODE_FIELDS.ReturnStatement;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function sequenceExpression(expressions) {
+  const node = {
+    type: "SequenceExpression",
+    expressions
+  };
+  const defs = NODE_FIELDS.SequenceExpression;
+  validate(defs.expressions, node, "expressions", expressions, 1);
+  return node;
+}
+function parenthesizedExpression(expression) {
+  const node = {
+    type: "ParenthesizedExpression",
+    expression
+  };
+  const defs = NODE_FIELDS.ParenthesizedExpression;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function switchCase(test = null, consequent) {
+  const node = {
+    type: "SwitchCase",
+    test,
+    consequent
+  };
+  const defs = NODE_FIELDS.SwitchCase;
+  validate(defs.test, node, "test", test, 1);
+  validate(defs.consequent, node, "consequent", consequent, 1);
+  return node;
+}
+function switchStatement(discriminant, cases) {
+  const node = {
+    type: "SwitchStatement",
+    discriminant,
+    cases
+  };
+  const defs = NODE_FIELDS.SwitchStatement;
+  validate(defs.discriminant, node, "discriminant", discriminant, 1);
+  validate(defs.cases, node, "cases", cases, 1);
+  return node;
+}
+function thisExpression() {
+  return {
+    type: "ThisExpression"
+  };
+}
+function throwStatement(argument) {
+  const node = {
+    type: "ThrowStatement",
+    argument
+  };
+  const defs = NODE_FIELDS.ThrowStatement;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function tryStatement(block, handler = null, finalizer = null) {
+  const node = {
+    type: "TryStatement",
+    block,
+    handler,
+    finalizer
+  };
+  const defs = NODE_FIELDS.TryStatement;
+  validate(defs.block, node, "block", block, 1);
+  validate(defs.handler, node, "handler", handler, 1);
+  validate(defs.finalizer, node, "finalizer", finalizer, 1);
+  return node;
+}
+function unaryExpression(operator, argument, prefix = true) {
+  const node = {
+    type: "UnaryExpression",
+    operator,
+    argument,
+    prefix
+  };
+  const defs = NODE_FIELDS.UnaryExpression;
+  validate(defs.operator, node, "operator", operator);
+  validate(defs.argument, node, "argument", argument, 1);
+  validate(defs.prefix, node, "prefix", prefix);
+  return node;
+}
+function updateExpression(operator, argument, prefix = false) {
+  const node = {
+    type: "UpdateExpression",
+    operator,
+    argument,
+    prefix
+  };
+  const defs = NODE_FIELDS.UpdateExpression;
+  validate(defs.operator, node, "operator", operator);
+  validate(defs.argument, node, "argument", argument, 1);
+  validate(defs.prefix, node, "prefix", prefix);
+  return node;
+}
+function variableDeclaration(kind, declarations) {
+  const node = {
+    type: "VariableDeclaration",
+    kind,
+    declarations
+  };
+  const defs = NODE_FIELDS.VariableDeclaration;
+  validate(defs.kind, node, "kind", kind);
+  validate(defs.declarations, node, "declarations", declarations, 1);
+  return node;
+}
+function variableDeclarator(id, init = null) {
+  const node = {
+    type: "VariableDeclarator",
+    id,
+    init
+  };
+  const defs = NODE_FIELDS.VariableDeclarator;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.init, node, "init", init, 1);
+  return node;
+}
+function whileStatement(test, body) {
+  const node = {
+    type: "WhileStatement",
+    test,
+    body
+  };
+  const defs = NODE_FIELDS.WhileStatement;
+  validate(defs.test, node, "test", test, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function withStatement(object, body) {
+  const node = {
+    type: "WithStatement",
+    object,
+    body
+  };
+  const defs = NODE_FIELDS.WithStatement;
+  validate(defs.object, node, "object", object, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function assignmentPattern(left, right) {
+  const node = {
+    type: "AssignmentPattern",
+    left,
+    right
+  };
+  const defs = NODE_FIELDS.AssignmentPattern;
+  validate(defs.left, node, "left", left, 1);
+  validate(defs.right, node, "right", right, 1);
+  return node;
+}
+function arrayPattern(elements) {
+  const node = {
+    type: "ArrayPattern",
+    elements
+  };
+  const defs = NODE_FIELDS.ArrayPattern;
+  validate(defs.elements, node, "elements", elements, 1);
+  return node;
+}
+function arrowFunctionExpression(params, body, async = false) {
+  const node = {
+    type: "ArrowFunctionExpression",
+    params,
+    body,
+    async,
+    expression: null
+  };
+  const defs = NODE_FIELDS.ArrowFunctionExpression;
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.async, node, "async", async);
+  return node;
+}
+function classBody(body) {
+  const node = {
+    type: "ClassBody",
+    body
+  };
+  const defs = NODE_FIELDS.ClassBody;
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function classExpression(id = null, superClass = null, body, decorators = null) {
+  const node = {
+    type: "ClassExpression",
+    id,
+    superClass,
+    body,
+    decorators
+  };
+  const defs = NODE_FIELDS.ClassExpression;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.superClass, node, "superClass", superClass, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.decorators, node, "decorators", decorators, 1);
+  return node;
+}
+function classDeclaration(id = null, superClass = null, body, decorators = null) {
+  const node = {
+    type: "ClassDeclaration",
+    id,
+    superClass,
+    body,
+    decorators
+  };
+  const defs = NODE_FIELDS.ClassDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.superClass, node, "superClass", superClass, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.decorators, node, "decorators", decorators, 1);
+  return node;
+}
+function exportAllDeclaration(source) {
+  const node = {
+    type: "ExportAllDeclaration",
+    source
+  };
+  const defs = NODE_FIELDS.ExportAllDeclaration;
+  validate(defs.source, node, "source", source, 1);
+  return node;
+}
+function exportDefaultDeclaration(declaration) {
+  const node = {
+    type: "ExportDefaultDeclaration",
+    declaration
+  };
+  const defs = NODE_FIELDS.ExportDefaultDeclaration;
+  validate(defs.declaration, node, "declaration", declaration, 1);
+  return node;
+}
+function exportNamedDeclaration(declaration = null, specifiers = [], source = null) {
+  const node = {
+    type: "ExportNamedDeclaration",
+    declaration,
+    specifiers,
+    source
+  };
+  const defs = NODE_FIELDS.ExportNamedDeclaration;
+  validate(defs.declaration, node, "declaration", declaration, 1);
+  validate(defs.specifiers, node, "specifiers", specifiers, 1);
+  validate(defs.source, node, "source", source, 1);
+  return node;
+}
+function exportSpecifier(local, exported) {
+  const node = {
+    type: "ExportSpecifier",
+    local,
+    exported
+  };
+  const defs = NODE_FIELDS.ExportSpecifier;
+  validate(defs.local, node, "local", local, 1);
+  validate(defs.exported, node, "exported", exported, 1);
+  return node;
+}
+function forOfStatement(left, right, body, _await = false) {
+  const node = {
+    type: "ForOfStatement",
+    left,
+    right,
+    body,
+    await: _await
+  };
+  const defs = NODE_FIELDS.ForOfStatement;
+  validate(defs.left, node, "left", left, 1);
+  validate(defs.right, node, "right", right, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.await, node, "await", _await);
+  return node;
+}
+function importDeclaration(specifiers, source) {
+  const node = {
+    type: "ImportDeclaration",
+    specifiers,
+    source
+  };
+  const defs = NODE_FIELDS.ImportDeclaration;
+  validate(defs.specifiers, node, "specifiers", specifiers, 1);
+  validate(defs.source, node, "source", source, 1);
+  return node;
+}
+function importDefaultSpecifier(local) {
+  const node = {
+    type: "ImportDefaultSpecifier",
+    local
+  };
+  const defs = NODE_FIELDS.ImportDefaultSpecifier;
+  validate(defs.local, node, "local", local, 1);
+  return node;
+}
+function importNamespaceSpecifier(local) {
+  const node = {
+    type: "ImportNamespaceSpecifier",
+    local
+  };
+  const defs = NODE_FIELDS.ImportNamespaceSpecifier;
+  validate(defs.local, node, "local", local, 1);
+  return node;
+}
+function importSpecifier(local, imported) {
+  const node = {
+    type: "ImportSpecifier",
+    local,
+    imported
+  };
+  const defs = NODE_FIELDS.ImportSpecifier;
+  validate(defs.local, node, "local", local, 1);
+  validate(defs.imported, node, "imported", imported, 1);
+  return node;
+}
+function importExpression(source, options = null) {
+  const node = {
+    type: "ImportExpression",
+    source,
+    options
+  };
+  const defs = NODE_FIELDS.ImportExpression;
+  validate(defs.source, node, "source", source, 1);
+  validate(defs.options, node, "options", options, 1);
+  return node;
+}
+function metaProperty(meta, property) {
+  const node = {
+    type: "MetaProperty",
+    meta,
+    property
+  };
+  const defs = NODE_FIELDS.MetaProperty;
+  validate(defs.meta, node, "meta", meta, 1);
+  validate(defs.property, node, "property", property, 1);
+  return node;
+}
+function classMethod(kind = "method", key, params, body, computed = false, _static = false, generator = false, async = false) {
+  const node = {
+    type: "ClassMethod",
+    kind,
+    key,
+    params,
+    body,
+    computed,
+    static: _static,
+    generator,
+    async
+  };
+  const defs = NODE_FIELDS.ClassMethod;
+  validate(defs.kind, node, "kind", kind);
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.computed, node, "computed", computed);
+  validate(defs.static, node, "static", _static);
+  validate(defs.generator, node, "generator", generator);
+  validate(defs.async, node, "async", async);
+  return node;
+}
+function objectPattern(properties) {
+  const node = {
+    type: "ObjectPattern",
+    properties
+  };
+  const defs = NODE_FIELDS.ObjectPattern;
+  validate(defs.properties, node, "properties", properties, 1);
+  return node;
+}
+function spreadElement(argument) {
+  const node = {
+    type: "SpreadElement",
+    argument
+  };
+  const defs = NODE_FIELDS.SpreadElement;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function _super() {
+  return {
+    type: "Super"
+  };
+}
+function taggedTemplateExpression(tag, quasi) {
+  const node = {
+    type: "TaggedTemplateExpression",
+    tag,
+    quasi
+  };
+  const defs = NODE_FIELDS.TaggedTemplateExpression;
+  validate(defs.tag, node, "tag", tag, 1);
+  validate(defs.quasi, node, "quasi", quasi, 1);
+  return node;
+}
+function templateElement(value, tail = false) {
+  const node = {
+    type: "TemplateElement",
+    value,
+    tail
+  };
+  const defs = NODE_FIELDS.TemplateElement;
+  validate(defs.value, node, "value", value);
+  validate(defs.tail, node, "tail", tail);
+  return node;
+}
+function templateLiteral(quasis, expressions) {
+  const node = {
+    type: "TemplateLiteral",
+    quasis,
+    expressions
+  };
+  const defs = NODE_FIELDS.TemplateLiteral;
+  validate(defs.quasis, node, "quasis", quasis, 1);
+  validate(defs.expressions, node, "expressions", expressions, 1);
+  return node;
+}
+function yieldExpression(argument = null, delegate = false) {
+  const node = {
+    type: "YieldExpression",
+    argument,
+    delegate
+  };
+  const defs = NODE_FIELDS.YieldExpression;
+  validate(defs.argument, node, "argument", argument, 1);
+  validate(defs.delegate, node, "delegate", delegate);
+  return node;
+}
+function awaitExpression(argument) {
+  const node = {
+    type: "AwaitExpression",
+    argument
+  };
+  const defs = NODE_FIELDS.AwaitExpression;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function _import() {
+  return {
+    type: "Import"
+  };
+}
+function exportNamespaceSpecifier(exported) {
+  const node = {
+    type: "ExportNamespaceSpecifier",
+    exported
+  };
+  const defs = NODE_FIELDS.ExportNamespaceSpecifier;
+  validate(defs.exported, node, "exported", exported, 1);
+  return node;
+}
+function optionalMemberExpression(object, property, computed = false, optional) {
+  const node = {
+    type: "OptionalMemberExpression",
+    object,
+    property,
+    computed,
+    optional
+  };
+  const defs = NODE_FIELDS.OptionalMemberExpression;
+  validate(defs.object, node, "object", object, 1);
+  validate(defs.property, node, "property", property, 1);
+  validate(defs.computed, node, "computed", computed);
+  validate(defs.optional, node, "optional", optional);
+  return node;
+}
+function optionalCallExpression(callee, _arguments, optional) {
+  const node = {
+    type: "OptionalCallExpression",
+    callee,
+    arguments: _arguments,
+    optional
+  };
+  const defs = NODE_FIELDS.OptionalCallExpression;
+  validate(defs.callee, node, "callee", callee, 1);
+  validate(defs.arguments, node, "arguments", _arguments, 1);
+  validate(defs.optional, node, "optional", optional);
+  return node;
+}
+function classProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) {
+  const node = {
+    type: "ClassProperty",
+    key,
+    value,
+    typeAnnotation,
+    decorators,
+    computed,
+    static: _static
+  };
+  const defs = NODE_FIELDS.ClassProperty;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.value, node, "value", value, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  validate(defs.decorators, node, "decorators", decorators, 1);
+  validate(defs.computed, node, "computed", computed);
+  validate(defs.static, node, "static", _static);
+  return node;
+}
+function classAccessorProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) {
+  const node = {
+    type: "ClassAccessorProperty",
+    key,
+    value,
+    typeAnnotation,
+    decorators,
+    computed,
+    static: _static
+  };
+  const defs = NODE_FIELDS.ClassAccessorProperty;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.value, node, "value", value, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  validate(defs.decorators, node, "decorators", decorators, 1);
+  validate(defs.computed, node, "computed", computed);
+  validate(defs.static, node, "static", _static);
+  return node;
+}
+function classPrivateProperty(key, value = null, decorators = null, _static = false) {
+  const node = {
+    type: "ClassPrivateProperty",
+    key,
+    value,
+    decorators,
+    static: _static
+  };
+  const defs = NODE_FIELDS.ClassPrivateProperty;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.value, node, "value", value, 1);
+  validate(defs.decorators, node, "decorators", decorators, 1);
+  validate(defs.static, node, "static", _static);
+  return node;
+}
+function classPrivateMethod(kind = "method", key, params, body, _static = false) {
+  const node = {
+    type: "ClassPrivateMethod",
+    kind,
+    key,
+    params,
+    body,
+    static: _static
+  };
+  const defs = NODE_FIELDS.ClassPrivateMethod;
+  validate(defs.kind, node, "kind", kind);
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.static, node, "static", _static);
+  return node;
+}
+function privateName(id) {
+  const node = {
+    type: "PrivateName",
+    id
+  };
+  const defs = NODE_FIELDS.PrivateName;
+  validate(defs.id, node, "id", id, 1);
+  return node;
+}
+function staticBlock(body) {
+  const node = {
+    type: "StaticBlock",
+    body
+  };
+  const defs = NODE_FIELDS.StaticBlock;
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function importAttribute(key, value) {
+  const node = {
+    type: "ImportAttribute",
+    key,
+    value
+  };
+  const defs = NODE_FIELDS.ImportAttribute;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.value, node, "value", value, 1);
+  return node;
+}
+function anyTypeAnnotation() {
+  return {
+    type: "AnyTypeAnnotation"
+  };
+}
+function arrayTypeAnnotation(elementType) {
+  const node = {
+    type: "ArrayTypeAnnotation",
+    elementType
+  };
+  const defs = NODE_FIELDS.ArrayTypeAnnotation;
+  validate(defs.elementType, node, "elementType", elementType, 1);
+  return node;
+}
+function booleanTypeAnnotation() {
+  return {
+    type: "BooleanTypeAnnotation"
+  };
+}
+function booleanLiteralTypeAnnotation(value) {
+  const node = {
+    type: "BooleanLiteralTypeAnnotation",
+    value
+  };
+  const defs = NODE_FIELDS.BooleanLiteralTypeAnnotation;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function nullLiteralTypeAnnotation() {
+  return {
+    type: "NullLiteralTypeAnnotation"
+  };
+}
+function classImplements(id, typeParameters = null) {
+  const node = {
+    type: "ClassImplements",
+    id,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.ClassImplements;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function declareClass(id, typeParameters = null, _extends = null, body) {
+  const node = {
+    type: "DeclareClass",
+    id,
+    typeParameters,
+    extends: _extends,
+    body
+  };
+  const defs = NODE_FIELDS.DeclareClass;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.extends, node, "extends", _extends, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function declareFunction(id) {
+  const node = {
+    type: "DeclareFunction",
+    id
+  };
+  const defs = NODE_FIELDS.DeclareFunction;
+  validate(defs.id, node, "id", id, 1);
+  return node;
+}
+function declareInterface(id, typeParameters = null, _extends = null, body) {
+  const node = {
+    type: "DeclareInterface",
+    id,
+    typeParameters,
+    extends: _extends,
+    body
+  };
+  const defs = NODE_FIELDS.DeclareInterface;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.extends, node, "extends", _extends, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function declareModule(id, body, kind = null) {
+  const node = {
+    type: "DeclareModule",
+    id,
+    body,
+    kind
+  };
+  const defs = NODE_FIELDS.DeclareModule;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.kind, node, "kind", kind);
+  return node;
+}
+function declareModuleExports(typeAnnotation) {
+  const node = {
+    type: "DeclareModuleExports",
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.DeclareModuleExports;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function declareTypeAlias(id, typeParameters = null, right) {
+  const node = {
+    type: "DeclareTypeAlias",
+    id,
+    typeParameters,
+    right
+  };
+  const defs = NODE_FIELDS.DeclareTypeAlias;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.right, node, "right", right, 1);
+  return node;
+}
+function declareOpaqueType(id, typeParameters = null, supertype = null) {
+  const node = {
+    type: "DeclareOpaqueType",
+    id,
+    typeParameters,
+    supertype
+  };
+  const defs = NODE_FIELDS.DeclareOpaqueType;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.supertype, node, "supertype", supertype, 1);
+  return node;
+}
+function declareVariable(id) {
+  const node = {
+    type: "DeclareVariable",
+    id
+  };
+  const defs = NODE_FIELDS.DeclareVariable;
+  validate(defs.id, node, "id", id, 1);
+  return node;
+}
+function declareExportDeclaration(declaration = null, specifiers = null, source = null, attributes = null) {
+  const node = {
+    type: "DeclareExportDeclaration",
+    declaration,
+    specifiers,
+    source,
+    attributes
+  };
+  const defs = NODE_FIELDS.DeclareExportDeclaration;
+  validate(defs.declaration, node, "declaration", declaration, 1);
+  validate(defs.specifiers, node, "specifiers", specifiers, 1);
+  validate(defs.source, node, "source", source, 1);
+  validate(defs.attributes, node, "attributes", attributes, 1);
+  return node;
+}
+function declareExportAllDeclaration(source, attributes = null) {
+  const node = {
+    type: "DeclareExportAllDeclaration",
+    source,
+    attributes
+  };
+  const defs = NODE_FIELDS.DeclareExportAllDeclaration;
+  validate(defs.source, node, "source", source, 1);
+  validate(defs.attributes, node, "attributes", attributes, 1);
+  return node;
+}
+function declaredPredicate(value) {
+  const node = {
+    type: "DeclaredPredicate",
+    value
+  };
+  const defs = NODE_FIELDS.DeclaredPredicate;
+  validate(defs.value, node, "value", value, 1);
+  return node;
+}
+function existsTypeAnnotation() {
+  return {
+    type: "ExistsTypeAnnotation"
+  };
+}
+function functionTypeAnnotation(typeParameters = null, params, rest = null, returnType) {
+  const node = {
+    type: "FunctionTypeAnnotation",
+    typeParameters,
+    params,
+    rest,
+    returnType
+  };
+  const defs = NODE_FIELDS.FunctionTypeAnnotation;
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.rest, node, "rest", rest, 1);
+  validate(defs.returnType, node, "returnType", returnType, 1);
+  return node;
+}
+function functionTypeParam(name = null, typeAnnotation) {
+  const node = {
+    type: "FunctionTypeParam",
+    name,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.FunctionTypeParam;
+  validate(defs.name, node, "name", name, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function genericTypeAnnotation(id, typeParameters = null) {
+  const node = {
+    type: "GenericTypeAnnotation",
+    id,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.GenericTypeAnnotation;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function inferredPredicate() {
+  return {
+    type: "InferredPredicate"
+  };
+}
+function interfaceExtends(id, typeParameters = null) {
+  const node = {
+    type: "InterfaceExtends",
+    id,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.InterfaceExtends;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function interfaceDeclaration(id, typeParameters = null, _extends = null, body) {
+  const node = {
+    type: "InterfaceDeclaration",
+    id,
+    typeParameters,
+    extends: _extends,
+    body
+  };
+  const defs = NODE_FIELDS.InterfaceDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.extends, node, "extends", _extends, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function interfaceTypeAnnotation(_extends = null, body) {
+  const node = {
+    type: "InterfaceTypeAnnotation",
+    extends: _extends,
+    body
+  };
+  const defs = NODE_FIELDS.InterfaceTypeAnnotation;
+  validate(defs.extends, node, "extends", _extends, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function intersectionTypeAnnotation(types) {
+  const node = {
+    type: "IntersectionTypeAnnotation",
+    types
+  };
+  const defs = NODE_FIELDS.IntersectionTypeAnnotation;
+  validate(defs.types, node, "types", types, 1);
+  return node;
+}
+function mixedTypeAnnotation() {
+  return {
+    type: "MixedTypeAnnotation"
+  };
+}
+function emptyTypeAnnotation() {
+  return {
+    type: "EmptyTypeAnnotation"
+  };
+}
+function nullableTypeAnnotation(typeAnnotation) {
+  const node = {
+    type: "NullableTypeAnnotation",
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.NullableTypeAnnotation;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function numberLiteralTypeAnnotation(value) {
+  const node = {
+    type: "NumberLiteralTypeAnnotation",
+    value
+  };
+  const defs = NODE_FIELDS.NumberLiteralTypeAnnotation;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function numberTypeAnnotation() {
+  return {
+    type: "NumberTypeAnnotation"
+  };
+}
+function objectTypeAnnotation(properties, indexers = [], callProperties = [], internalSlots = [], exact = false) {
+  const node = {
+    type: "ObjectTypeAnnotation",
+    properties,
+    indexers,
+    callProperties,
+    internalSlots,
+    exact
+  };
+  const defs = NODE_FIELDS.ObjectTypeAnnotation;
+  validate(defs.properties, node, "properties", properties, 1);
+  validate(defs.indexers, node, "indexers", indexers, 1);
+  validate(defs.callProperties, node, "callProperties", callProperties, 1);
+  validate(defs.internalSlots, node, "internalSlots", internalSlots, 1);
+  validate(defs.exact, node, "exact", exact);
+  return node;
+}
+function objectTypeInternalSlot(id, value, optional, _static, method) {
+  const node = {
+    type: "ObjectTypeInternalSlot",
+    id,
+    value,
+    optional,
+    static: _static,
+    method
+  };
+  const defs = NODE_FIELDS.ObjectTypeInternalSlot;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.value, node, "value", value, 1);
+  validate(defs.optional, node, "optional", optional);
+  validate(defs.static, node, "static", _static);
+  validate(defs.method, node, "method", method);
+  return node;
+}
+function objectTypeCallProperty(value) {
+  const node = {
+    type: "ObjectTypeCallProperty",
+    value,
+    static: null
+  };
+  const defs = NODE_FIELDS.ObjectTypeCallProperty;
+  validate(defs.value, node, "value", value, 1);
+  return node;
+}
+function objectTypeIndexer(id = null, key, value, variance = null) {
+  const node = {
+    type: "ObjectTypeIndexer",
+    id,
+    key,
+    value,
+    variance,
+    static: null
+  };
+  const defs = NODE_FIELDS.ObjectTypeIndexer;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.value, node, "value", value, 1);
+  validate(defs.variance, node, "variance", variance, 1);
+  return node;
+}
+function objectTypeProperty(key, value, variance = null) {
+  const node = {
+    type: "ObjectTypeProperty",
+    key,
+    value,
+    variance,
+    kind: null,
+    method: null,
+    optional: null,
+    proto: null,
+    static: null
+  };
+  const defs = NODE_FIELDS.ObjectTypeProperty;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.value, node, "value", value, 1);
+  validate(defs.variance, node, "variance", variance, 1);
+  return node;
+}
+function objectTypeSpreadProperty(argument) {
+  const node = {
+    type: "ObjectTypeSpreadProperty",
+    argument
+  };
+  const defs = NODE_FIELDS.ObjectTypeSpreadProperty;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function opaqueType(id, typeParameters = null, supertype = null, impltype) {
+  const node = {
+    type: "OpaqueType",
+    id,
+    typeParameters,
+    supertype,
+    impltype
+  };
+  const defs = NODE_FIELDS.OpaqueType;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.supertype, node, "supertype", supertype, 1);
+  validate(defs.impltype, node, "impltype", impltype, 1);
+  return node;
+}
+function qualifiedTypeIdentifier(id, qualification) {
+  const node = {
+    type: "QualifiedTypeIdentifier",
+    id,
+    qualification
+  };
+  const defs = NODE_FIELDS.QualifiedTypeIdentifier;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.qualification, node, "qualification", qualification, 1);
+  return node;
+}
+function stringLiteralTypeAnnotation(value) {
+  const node = {
+    type: "StringLiteralTypeAnnotation",
+    value
+  };
+  const defs = NODE_FIELDS.StringLiteralTypeAnnotation;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function stringTypeAnnotation() {
+  return {
+    type: "StringTypeAnnotation"
+  };
+}
+function symbolTypeAnnotation() {
+  return {
+    type: "SymbolTypeAnnotation"
+  };
+}
+function thisTypeAnnotation() {
+  return {
+    type: "ThisTypeAnnotation"
+  };
+}
+function tupleTypeAnnotation(types) {
+  const node = {
+    type: "TupleTypeAnnotation",
+    types
+  };
+  const defs = NODE_FIELDS.TupleTypeAnnotation;
+  validate(defs.types, node, "types", types, 1);
+  return node;
+}
+function typeofTypeAnnotation(argument) {
+  const node = {
+    type: "TypeofTypeAnnotation",
+    argument
+  };
+  const defs = NODE_FIELDS.TypeofTypeAnnotation;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function typeAlias(id, typeParameters = null, right) {
+  const node = {
+    type: "TypeAlias",
+    id,
+    typeParameters,
+    right
+  };
+  const defs = NODE_FIELDS.TypeAlias;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.right, node, "right", right, 1);
+  return node;
+}
+function typeAnnotation(typeAnnotation) {
+  const node = {
+    type: "TypeAnnotation",
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TypeAnnotation;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function typeCastExpression(expression, typeAnnotation) {
+  const node = {
+    type: "TypeCastExpression",
+    expression,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TypeCastExpression;
+  validate(defs.expression, node, "expression", expression, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function typeParameter(bound = null, _default = null, variance = null) {
+  const node = {
+    type: "TypeParameter",
+    bound,
+    default: _default,
+    variance,
+    name: null
+  };
+  const defs = NODE_FIELDS.TypeParameter;
+  validate(defs.bound, node, "bound", bound, 1);
+  validate(defs.default, node, "default", _default, 1);
+  validate(defs.variance, node, "variance", variance, 1);
+  return node;
+}
+function typeParameterDeclaration(params) {
+  const node = {
+    type: "TypeParameterDeclaration",
+    params
+  };
+  const defs = NODE_FIELDS.TypeParameterDeclaration;
+  validate(defs.params, node, "params", params, 1);
+  return node;
+}
+function typeParameterInstantiation(params) {
+  const node = {
+    type: "TypeParameterInstantiation",
+    params
+  };
+  const defs = NODE_FIELDS.TypeParameterInstantiation;
+  validate(defs.params, node, "params", params, 1);
+  return node;
+}
+function unionTypeAnnotation(types) {
+  const node = {
+    type: "UnionTypeAnnotation",
+    types
+  };
+  const defs = NODE_FIELDS.UnionTypeAnnotation;
+  validate(defs.types, node, "types", types, 1);
+  return node;
+}
+function variance(kind) {
+  const node = {
+    type: "Variance",
+    kind
+  };
+  const defs = NODE_FIELDS.Variance;
+  validate(defs.kind, node, "kind", kind);
+  return node;
+}
+function voidTypeAnnotation() {
+  return {
+    type: "VoidTypeAnnotation"
+  };
+}
+function enumDeclaration(id, body) {
+  const node = {
+    type: "EnumDeclaration",
+    id,
+    body
+  };
+  const defs = NODE_FIELDS.EnumDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function enumBooleanBody(members) {
+  const node = {
+    type: "EnumBooleanBody",
+    members,
+    explicitType: null,
+    hasUnknownMembers: null
+  };
+  const defs = NODE_FIELDS.EnumBooleanBody;
+  validate(defs.members, node, "members", members, 1);
+  return node;
+}
+function enumNumberBody(members) {
+  const node = {
+    type: "EnumNumberBody",
+    members,
+    explicitType: null,
+    hasUnknownMembers: null
+  };
+  const defs = NODE_FIELDS.EnumNumberBody;
+  validate(defs.members, node, "members", members, 1);
+  return node;
+}
+function enumStringBody(members) {
+  const node = {
+    type: "EnumStringBody",
+    members,
+    explicitType: null,
+    hasUnknownMembers: null
+  };
+  const defs = NODE_FIELDS.EnumStringBody;
+  validate(defs.members, node, "members", members, 1);
+  return node;
+}
+function enumSymbolBody(members) {
+  const node = {
+    type: "EnumSymbolBody",
+    members,
+    hasUnknownMembers: null
+  };
+  const defs = NODE_FIELDS.EnumSymbolBody;
+  validate(defs.members, node, "members", members, 1);
+  return node;
+}
+function enumBooleanMember(id) {
+  const node = {
+    type: "EnumBooleanMember",
+    id,
+    init: null
+  };
+  const defs = NODE_FIELDS.EnumBooleanMember;
+  validate(defs.id, node, "id", id, 1);
+  return node;
+}
+function enumNumberMember(id, init) {
+  const node = {
+    type: "EnumNumberMember",
+    id,
+    init
+  };
+  const defs = NODE_FIELDS.EnumNumberMember;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.init, node, "init", init, 1);
+  return node;
+}
+function enumStringMember(id, init) {
+  const node = {
+    type: "EnumStringMember",
+    id,
+    init
+  };
+  const defs = NODE_FIELDS.EnumStringMember;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.init, node, "init", init, 1);
+  return node;
+}
+function enumDefaultedMember(id) {
+  const node = {
+    type: "EnumDefaultedMember",
+    id
+  };
+  const defs = NODE_FIELDS.EnumDefaultedMember;
+  validate(defs.id, node, "id", id, 1);
+  return node;
+}
+function indexedAccessType(objectType, indexType) {
+  const node = {
+    type: "IndexedAccessType",
+    objectType,
+    indexType
+  };
+  const defs = NODE_FIELDS.IndexedAccessType;
+  validate(defs.objectType, node, "objectType", objectType, 1);
+  validate(defs.indexType, node, "indexType", indexType, 1);
+  return node;
+}
+function optionalIndexedAccessType(objectType, indexType) {
+  const node = {
+    type: "OptionalIndexedAccessType",
+    objectType,
+    indexType,
+    optional: null
+  };
+  const defs = NODE_FIELDS.OptionalIndexedAccessType;
+  validate(defs.objectType, node, "objectType", objectType, 1);
+  validate(defs.indexType, node, "indexType", indexType, 1);
+  return node;
+}
+function jsxAttribute(name, value = null) {
+  const node = {
+    type: "JSXAttribute",
+    name,
+    value
+  };
+  const defs = NODE_FIELDS.JSXAttribute;
+  validate(defs.name, node, "name", name, 1);
+  validate(defs.value, node, "value", value, 1);
+  return node;
+}
+function jsxClosingElement(name) {
+  const node = {
+    type: "JSXClosingElement",
+    name
+  };
+  const defs = NODE_FIELDS.JSXClosingElement;
+  validate(defs.name, node, "name", name, 1);
+  return node;
+}
+function jsxElement(openingElement, closingElement = null, children, selfClosing = null) {
+  const node = {
+    type: "JSXElement",
+    openingElement,
+    closingElement,
+    children,
+    selfClosing
+  };
+  const defs = NODE_FIELDS.JSXElement;
+  validate(defs.openingElement, node, "openingElement", openingElement, 1);
+  validate(defs.closingElement, node, "closingElement", closingElement, 1);
+  validate(defs.children, node, "children", children, 1);
+  validate(defs.selfClosing, node, "selfClosing", selfClosing);
+  return node;
+}
+function jsxEmptyExpression() {
+  return {
+    type: "JSXEmptyExpression"
+  };
+}
+function jsxExpressionContainer(expression) {
+  const node = {
+    type: "JSXExpressionContainer",
+    expression
+  };
+  const defs = NODE_FIELDS.JSXExpressionContainer;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function jsxSpreadChild(expression) {
+  const node = {
+    type: "JSXSpreadChild",
+    expression
+  };
+  const defs = NODE_FIELDS.JSXSpreadChild;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function jsxIdentifier(name) {
+  const node = {
+    type: "JSXIdentifier",
+    name
+  };
+  const defs = NODE_FIELDS.JSXIdentifier;
+  validate(defs.name, node, "name", name);
+  return node;
+}
+function jsxMemberExpression(object, property) {
+  const node = {
+    type: "JSXMemberExpression",
+    object,
+    property
+  };
+  const defs = NODE_FIELDS.JSXMemberExpression;
+  validate(defs.object, node, "object", object, 1);
+  validate(defs.property, node, "property", property, 1);
+  return node;
+}
+function jsxNamespacedName(namespace, name) {
+  const node = {
+    type: "JSXNamespacedName",
+    namespace,
+    name
+  };
+  const defs = NODE_FIELDS.JSXNamespacedName;
+  validate(defs.namespace, node, "namespace", namespace, 1);
+  validate(defs.name, node, "name", name, 1);
+  return node;
+}
+function jsxOpeningElement(name, attributes, selfClosing = false) {
+  const node = {
+    type: "JSXOpeningElement",
+    name,
+    attributes,
+    selfClosing
+  };
+  const defs = NODE_FIELDS.JSXOpeningElement;
+  validate(defs.name, node, "name", name, 1);
+  validate(defs.attributes, node, "attributes", attributes, 1);
+  validate(defs.selfClosing, node, "selfClosing", selfClosing);
+  return node;
+}
+function jsxSpreadAttribute(argument) {
+  const node = {
+    type: "JSXSpreadAttribute",
+    argument
+  };
+  const defs = NODE_FIELDS.JSXSpreadAttribute;
+  validate(defs.argument, node, "argument", argument, 1);
+  return node;
+}
+function jsxText(value) {
+  const node = {
+    type: "JSXText",
+    value
+  };
+  const defs = NODE_FIELDS.JSXText;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function jsxFragment(openingFragment, closingFragment, children) {
+  const node = {
+    type: "JSXFragment",
+    openingFragment,
+    closingFragment,
+    children
+  };
+  const defs = NODE_FIELDS.JSXFragment;
+  validate(defs.openingFragment, node, "openingFragment", openingFragment, 1);
+  validate(defs.closingFragment, node, "closingFragment", closingFragment, 1);
+  validate(defs.children, node, "children", children, 1);
+  return node;
+}
+function jsxOpeningFragment() {
+  return {
+    type: "JSXOpeningFragment"
+  };
+}
+function jsxClosingFragment() {
+  return {
+    type: "JSXClosingFragment"
+  };
+}
+function noop() {
+  return {
+    type: "Noop"
+  };
+}
+function placeholder(expectedNode, name) {
+  const node = {
+    type: "Placeholder",
+    expectedNode,
+    name
+  };
+  const defs = NODE_FIELDS.Placeholder;
+  validate(defs.expectedNode, node, "expectedNode", expectedNode);
+  validate(defs.name, node, "name", name, 1);
+  return node;
+}
+function v8IntrinsicIdentifier(name) {
+  const node = {
+    type: "V8IntrinsicIdentifier",
+    name
+  };
+  const defs = NODE_FIELDS.V8IntrinsicIdentifier;
+  validate(defs.name, node, "name", name);
+  return node;
+}
+function argumentPlaceholder() {
+  return {
+    type: "ArgumentPlaceholder"
+  };
+}
+function bindExpression(object, callee) {
+  const node = {
+    type: "BindExpression",
+    object,
+    callee
+  };
+  const defs = NODE_FIELDS.BindExpression;
+  validate(defs.object, node, "object", object, 1);
+  validate(defs.callee, node, "callee", callee, 1);
+  return node;
+}
+function decorator(expression) {
+  const node = {
+    type: "Decorator",
+    expression
+  };
+  const defs = NODE_FIELDS.Decorator;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function doExpression(body, async = false) {
+  const node = {
+    type: "DoExpression",
+    body,
+    async
+  };
+  const defs = NODE_FIELDS.DoExpression;
+  validate(defs.body, node, "body", body, 1);
+  validate(defs.async, node, "async", async);
+  return node;
+}
+function exportDefaultSpecifier(exported) {
+  const node = {
+    type: "ExportDefaultSpecifier",
+    exported
+  };
+  const defs = NODE_FIELDS.ExportDefaultSpecifier;
+  validate(defs.exported, node, "exported", exported, 1);
+  return node;
+}
+function recordExpression(properties) {
+  const node = {
+    type: "RecordExpression",
+    properties
+  };
+  const defs = NODE_FIELDS.RecordExpression;
+  validate(defs.properties, node, "properties", properties, 1);
+  return node;
+}
+function tupleExpression(elements = []) {
+  const node = {
+    type: "TupleExpression",
+    elements
+  };
+  const defs = NODE_FIELDS.TupleExpression;
+  validate(defs.elements, node, "elements", elements, 1);
+  return node;
+}
+function decimalLiteral(value) {
+  const node = {
+    type: "DecimalLiteral",
+    value
+  };
+  const defs = NODE_FIELDS.DecimalLiteral;
+  validate(defs.value, node, "value", value);
+  return node;
+}
+function moduleExpression(body) {
+  const node = {
+    type: "ModuleExpression",
+    body
+  };
+  const defs = NODE_FIELDS.ModuleExpression;
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function topicReference() {
+  return {
+    type: "TopicReference"
+  };
+}
+function pipelineTopicExpression(expression) {
+  const node = {
+    type: "PipelineTopicExpression",
+    expression
+  };
+  const defs = NODE_FIELDS.PipelineTopicExpression;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function pipelineBareFunction(callee) {
+  const node = {
+    type: "PipelineBareFunction",
+    callee
+  };
+  const defs = NODE_FIELDS.PipelineBareFunction;
+  validate(defs.callee, node, "callee", callee, 1);
+  return node;
+}
+function pipelinePrimaryTopicReference() {
+  return {
+    type: "PipelinePrimaryTopicReference"
+  };
+}
+function voidPattern() {
+  return {
+    type: "VoidPattern"
+  };
+}
+function tsParameterProperty(parameter) {
+  const node = {
+    type: "TSParameterProperty",
+    parameter
+  };
+  const defs = NODE_FIELDS.TSParameterProperty;
+  validate(defs.parameter, node, "parameter", parameter, 1);
+  return node;
+}
+function tsDeclareFunction(id = null, typeParameters = null, params, returnType = null) {
+  const node = {
+    type: "TSDeclareFunction",
+    id,
+    typeParameters,
+    params,
+    returnType
+  };
+  const defs = NODE_FIELDS.TSDeclareFunction;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.returnType, node, "returnType", returnType, 1);
+  return node;
+}
+function tsDeclareMethod(decorators = null, key, typeParameters = null, params, returnType = null) {
+  const node = {
+    type: "TSDeclareMethod",
+    decorators,
+    key,
+    typeParameters,
+    params,
+    returnType
+  };
+  const defs = NODE_FIELDS.TSDeclareMethod;
+  validate(defs.decorators, node, "decorators", decorators, 1);
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.params, node, "params", params, 1);
+  validate(defs.returnType, node, "returnType", returnType, 1);
+  return node;
+}
+function tsQualifiedName(left, right) {
+  const node = {
+    type: "TSQualifiedName",
+    left,
+    right
+  };
+  const defs = NODE_FIELDS.TSQualifiedName;
+  validate(defs.left, node, "left", left, 1);
+  validate(defs.right, node, "right", right, 1);
+  return node;
+}
+function tsCallSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) {
+  const node = {
+    type: "TSCallSignatureDeclaration",
+    typeParameters,
+    parameters,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSCallSignatureDeclaration;
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.parameters, node, "parameters", parameters, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsConstructSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) {
+  const node = {
+    type: "TSConstructSignatureDeclaration",
+    typeParameters,
+    parameters,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSConstructSignatureDeclaration;
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.parameters, node, "parameters", parameters, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsPropertySignature(key, typeAnnotation = null) {
+  const node = {
+    type: "TSPropertySignature",
+    key,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSPropertySignature;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsMethodSignature(key, typeParameters = null, parameters, typeAnnotation = null) {
+  const node = {
+    type: "TSMethodSignature",
+    key,
+    typeParameters,
+    parameters,
+    typeAnnotation,
+    kind: null
+  };
+  const defs = NODE_FIELDS.TSMethodSignature;
+  validate(defs.key, node, "key", key, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.parameters, node, "parameters", parameters, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsIndexSignature(parameters, typeAnnotation = null) {
+  const node = {
+    type: "TSIndexSignature",
+    parameters,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSIndexSignature;
+  validate(defs.parameters, node, "parameters", parameters, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsAnyKeyword() {
+  return {
+    type: "TSAnyKeyword"
+  };
+}
+function tsBooleanKeyword() {
+  return {
+    type: "TSBooleanKeyword"
+  };
+}
+function tsBigIntKeyword() {
+  return {
+    type: "TSBigIntKeyword"
+  };
+}
+function tsIntrinsicKeyword() {
+  return {
+    type: "TSIntrinsicKeyword"
+  };
+}
+function tsNeverKeyword() {
+  return {
+    type: "TSNeverKeyword"
+  };
+}
+function tsNullKeyword() {
+  return {
+    type: "TSNullKeyword"
+  };
+}
+function tsNumberKeyword() {
+  return {
+    type: "TSNumberKeyword"
+  };
+}
+function tsObjectKeyword() {
+  return {
+    type: "TSObjectKeyword"
+  };
+}
+function tsStringKeyword() {
+  return {
+    type: "TSStringKeyword"
+  };
+}
+function tsSymbolKeyword() {
+  return {
+    type: "TSSymbolKeyword"
+  };
+}
+function tsUndefinedKeyword() {
+  return {
+    type: "TSUndefinedKeyword"
+  };
+}
+function tsUnknownKeyword() {
+  return {
+    type: "TSUnknownKeyword"
+  };
+}
+function tsVoidKeyword() {
+  return {
+    type: "TSVoidKeyword"
+  };
+}
+function tsThisType() {
+  return {
+    type: "TSThisType"
+  };
+}
+function tsFunctionType(typeParameters = null, parameters, typeAnnotation = null) {
+  const node = {
+    type: "TSFunctionType",
+    typeParameters,
+    parameters,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSFunctionType;
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.parameters, node, "parameters", parameters, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsConstructorType(typeParameters = null, parameters, typeAnnotation = null) {
+  const node = {
+    type: "TSConstructorType",
+    typeParameters,
+    parameters,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSConstructorType;
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.parameters, node, "parameters", parameters, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsTypeReference(typeName, typeParameters = null) {
+  const node = {
+    type: "TSTypeReference",
+    typeName,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.TSTypeReference;
+  validate(defs.typeName, node, "typeName", typeName, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function tsTypePredicate(parameterName, typeAnnotation = null, asserts = null) {
+  const node = {
+    type: "TSTypePredicate",
+    parameterName,
+    typeAnnotation,
+    asserts
+  };
+  const defs = NODE_FIELDS.TSTypePredicate;
+  validate(defs.parameterName, node, "parameterName", parameterName, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  validate(defs.asserts, node, "asserts", asserts);
+  return node;
+}
+function tsTypeQuery(exprName, typeParameters = null) {
+  const node = {
+    type: "TSTypeQuery",
+    exprName,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.TSTypeQuery;
+  validate(defs.exprName, node, "exprName", exprName, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function tsTypeLiteral(members) {
+  const node = {
+    type: "TSTypeLiteral",
+    members
+  };
+  const defs = NODE_FIELDS.TSTypeLiteral;
+  validate(defs.members, node, "members", members, 1);
+  return node;
+}
+function tsArrayType(elementType) {
+  const node = {
+    type: "TSArrayType",
+    elementType
+  };
+  const defs = NODE_FIELDS.TSArrayType;
+  validate(defs.elementType, node, "elementType", elementType, 1);
+  return node;
+}
+function tsTupleType(elementTypes) {
+  const node = {
+    type: "TSTupleType",
+    elementTypes
+  };
+  const defs = NODE_FIELDS.TSTupleType;
+  validate(defs.elementTypes, node, "elementTypes", elementTypes, 1);
+  return node;
+}
+function tsOptionalType(typeAnnotation) {
+  const node = {
+    type: "TSOptionalType",
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSOptionalType;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsRestType(typeAnnotation) {
+  const node = {
+    type: "TSRestType",
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSRestType;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsNamedTupleMember(label, elementType, optional = false) {
+  const node = {
+    type: "TSNamedTupleMember",
+    label,
+    elementType,
+    optional
+  };
+  const defs = NODE_FIELDS.TSNamedTupleMember;
+  validate(defs.label, node, "label", label, 1);
+  validate(defs.elementType, node, "elementType", elementType, 1);
+  validate(defs.optional, node, "optional", optional);
+  return node;
+}
+function tsUnionType(types) {
+  const node = {
+    type: "TSUnionType",
+    types
+  };
+  const defs = NODE_FIELDS.TSUnionType;
+  validate(defs.types, node, "types", types, 1);
+  return node;
+}
+function tsIntersectionType(types) {
+  const node = {
+    type: "TSIntersectionType",
+    types
+  };
+  const defs = NODE_FIELDS.TSIntersectionType;
+  validate(defs.types, node, "types", types, 1);
+  return node;
+}
+function tsConditionalType(checkType, extendsType, trueType, falseType) {
+  const node = {
+    type: "TSConditionalType",
+    checkType,
+    extendsType,
+    trueType,
+    falseType
+  };
+  const defs = NODE_FIELDS.TSConditionalType;
+  validate(defs.checkType, node, "checkType", checkType, 1);
+  validate(defs.extendsType, node, "extendsType", extendsType, 1);
+  validate(defs.trueType, node, "trueType", trueType, 1);
+  validate(defs.falseType, node, "falseType", falseType, 1);
+  return node;
+}
+function tsInferType(typeParameter) {
+  const node = {
+    type: "TSInferType",
+    typeParameter
+  };
+  const defs = NODE_FIELDS.TSInferType;
+  validate(defs.typeParameter, node, "typeParameter", typeParameter, 1);
+  return node;
+}
+function tsParenthesizedType(typeAnnotation) {
+  const node = {
+    type: "TSParenthesizedType",
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSParenthesizedType;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsTypeOperator(typeAnnotation, operator) {
+  const node = {
+    type: "TSTypeOperator",
+    typeAnnotation,
+    operator
+  };
+  const defs = NODE_FIELDS.TSTypeOperator;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  validate(defs.operator, node, "operator", operator);
+  return node;
+}
+function tsIndexedAccessType(objectType, indexType) {
+  const node = {
+    type: "TSIndexedAccessType",
+    objectType,
+    indexType
+  };
+  const defs = NODE_FIELDS.TSIndexedAccessType;
+  validate(defs.objectType, node, "objectType", objectType, 1);
+  validate(defs.indexType, node, "indexType", indexType, 1);
+  return node;
+}
+function tsMappedType(typeParameter, typeAnnotation = null, nameType = null) {
+  const node = {
+    type: "TSMappedType",
+    typeParameter,
+    typeAnnotation,
+    nameType
+  };
+  const defs = NODE_FIELDS.TSMappedType;
+  validate(defs.typeParameter, node, "typeParameter", typeParameter, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  validate(defs.nameType, node, "nameType", nameType, 1);
+  return node;
+}
+function tsTemplateLiteralType(quasis, types) {
+  const node = {
+    type: "TSTemplateLiteralType",
+    quasis,
+    types
+  };
+  const defs = NODE_FIELDS.TSTemplateLiteralType;
+  validate(defs.quasis, node, "quasis", quasis, 1);
+  validate(defs.types, node, "types", types, 1);
+  return node;
+}
+function tsLiteralType(literal) {
+  const node = {
+    type: "TSLiteralType",
+    literal
+  };
+  const defs = NODE_FIELDS.TSLiteralType;
+  validate(defs.literal, node, "literal", literal, 1);
+  return node;
+}
+function tsExpressionWithTypeArguments(expression, typeParameters = null) {
+  const node = {
+    type: "TSExpressionWithTypeArguments",
+    expression,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.TSExpressionWithTypeArguments;
+  validate(defs.expression, node, "expression", expression, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function tsInterfaceDeclaration(id, typeParameters = null, _extends = null, body) {
+  const node = {
+    type: "TSInterfaceDeclaration",
+    id,
+    typeParameters,
+    extends: _extends,
+    body
+  };
+  const defs = NODE_FIELDS.TSInterfaceDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.extends, node, "extends", _extends, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function tsInterfaceBody(body) {
+  const node = {
+    type: "TSInterfaceBody",
+    body
+  };
+  const defs = NODE_FIELDS.TSInterfaceBody;
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function tsTypeAliasDeclaration(id, typeParameters = null, typeAnnotation) {
+  const node = {
+    type: "TSTypeAliasDeclaration",
+    id,
+    typeParameters,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSTypeAliasDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsInstantiationExpression(expression, typeParameters = null) {
+  const node = {
+    type: "TSInstantiationExpression",
+    expression,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.TSInstantiationExpression;
+  validate(defs.expression, node, "expression", expression, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function tsAsExpression(expression, typeAnnotation) {
+  const node = {
+    type: "TSAsExpression",
+    expression,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSAsExpression;
+  validate(defs.expression, node, "expression", expression, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsSatisfiesExpression(expression, typeAnnotation) {
+  const node = {
+    type: "TSSatisfiesExpression",
+    expression,
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSSatisfiesExpression;
+  validate(defs.expression, node, "expression", expression, 1);
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsTypeAssertion(typeAnnotation, expression) {
+  const node = {
+    type: "TSTypeAssertion",
+    typeAnnotation,
+    expression
+  };
+  const defs = NODE_FIELDS.TSTypeAssertion;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function tsEnumBody(members) {
+  const node = {
+    type: "TSEnumBody",
+    members
+  };
+  const defs = NODE_FIELDS.TSEnumBody;
+  validate(defs.members, node, "members", members, 1);
+  return node;
+}
+function tsEnumDeclaration(id, members) {
+  const node = {
+    type: "TSEnumDeclaration",
+    id,
+    members
+  };
+  const defs = NODE_FIELDS.TSEnumDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.members, node, "members", members, 1);
+  return node;
+}
+function tsEnumMember(id, initializer = null) {
+  const node = {
+    type: "TSEnumMember",
+    id,
+    initializer
+  };
+  const defs = NODE_FIELDS.TSEnumMember;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.initializer, node, "initializer", initializer, 1);
+  return node;
+}
+function tsModuleDeclaration(id, body) {
+  const node = {
+    type: "TSModuleDeclaration",
+    id,
+    body,
+    kind: null
+  };
+  const defs = NODE_FIELDS.TSModuleDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function tsModuleBlock(body) {
+  const node = {
+    type: "TSModuleBlock",
+    body
+  };
+  const defs = NODE_FIELDS.TSModuleBlock;
+  validate(defs.body, node, "body", body, 1);
+  return node;
+}
+function tsImportType(argument, qualifier = null, typeParameters = null) {
+  const node = {
+    type: "TSImportType",
+    argument,
+    qualifier,
+    typeParameters
+  };
+  const defs = NODE_FIELDS.TSImportType;
+  validate(defs.argument, node, "argument", argument, 1);
+  validate(defs.qualifier, node, "qualifier", qualifier, 1);
+  validate(defs.typeParameters, node, "typeParameters", typeParameters, 1);
+  return node;
+}
+function tsImportEqualsDeclaration(id, moduleReference) {
+  const node = {
+    type: "TSImportEqualsDeclaration",
+    id,
+    moduleReference,
+    isExport: null
+  };
+  const defs = NODE_FIELDS.TSImportEqualsDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  validate(defs.moduleReference, node, "moduleReference", moduleReference, 1);
+  return node;
+}
+function tsExternalModuleReference(expression) {
+  const node = {
+    type: "TSExternalModuleReference",
+    expression
+  };
+  const defs = NODE_FIELDS.TSExternalModuleReference;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function tsNonNullExpression(expression) {
+  const node = {
+    type: "TSNonNullExpression",
+    expression
+  };
+  const defs = NODE_FIELDS.TSNonNullExpression;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function tsExportAssignment(expression) {
+  const node = {
+    type: "TSExportAssignment",
+    expression
+  };
+  const defs = NODE_FIELDS.TSExportAssignment;
+  validate(defs.expression, node, "expression", expression, 1);
+  return node;
+}
+function tsNamespaceExportDeclaration(id) {
+  const node = {
+    type: "TSNamespaceExportDeclaration",
+    id
+  };
+  const defs = NODE_FIELDS.TSNamespaceExportDeclaration;
+  validate(defs.id, node, "id", id, 1);
+  return node;
+}
+function tsTypeAnnotation(typeAnnotation) {
+  const node = {
+    type: "TSTypeAnnotation",
+    typeAnnotation
+  };
+  const defs = NODE_FIELDS.TSTypeAnnotation;
+  validate(defs.typeAnnotation, node, "typeAnnotation", typeAnnotation, 1);
+  return node;
+}
+function tsTypeParameterInstantiation(params) {
+  const node = {
+    type: "TSTypeParameterInstantiation",
+    params
+  };
+  const defs = NODE_FIELDS.TSTypeParameterInstantiation;
+  validate(defs.params, node, "params", params, 1);
+  return node;
+}
+function tsTypeParameterDeclaration(params) {
+  const node = {
+    type: "TSTypeParameterDeclaration",
+    params
+  };
+  const defs = NODE_FIELDS.TSTypeParameterDeclaration;
+  validate(defs.params, node, "params", params, 1);
+  return node;
+}
+function tsTypeParameter(constraint = null, _default = null, name) {
+  const node = {
+    type: "TSTypeParameter",
+    constraint,
+    default: _default,
+    name
+  };
+  const defs = NODE_FIELDS.TSTypeParameter;
+  validate(defs.constraint, node, "constraint", constraint, 1);
+  validate(defs.default, node, "default", _default, 1);
+  validate(defs.name, node, "name", name);
+  return node;
+}
+function NumberLiteral(value) {
+  (0, _deprecationWarning.default)("NumberLiteral", "NumericLiteral", "The node type ");
+  return numericLiteral(value);
+}
+function RegexLiteral(pattern, flags = "") {
+  (0, _deprecationWarning.default)("RegexLiteral", "RegExpLiteral", "The node type ");
+  return regExpLiteral(pattern, flags);
+}
+function RestProperty(argument) {
+  (0, _deprecationWarning.default)("RestProperty", "RestElement", "The node type ");
+  return restElement(argument);
+}
+function SpreadProperty(argument) {
+  (0, _deprecationWarning.default)("SpreadProperty", "SpreadElement", "The node type ");
+  return spreadElement(argument);
+}
+
+//# sourceMappingURL=lowercase.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/lowercase.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 5 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/uppercase.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/generated/uppercase.js.map


+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/productions.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.buildUndefinedNode = buildUndefinedNode;
+var _index = require("./generated/index.js");
+function buildUndefinedNode() {
+  return (0, _index.unaryExpression)("void", (0, _index.numericLiteral)(0), true);
+}
+
+//# sourceMappingURL=productions.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/productions.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_index","require","buildUndefinedNode","unaryExpression","numericLiteral"],"sources":["../../src/builders/productions.ts"],"sourcesContent":["import { numericLiteral, unaryExpression } from \"./generated/index.ts\";\n\nexport function buildUndefinedNode() {\n  return unaryExpression(\"void\", numericLiteral(0), true);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEO,SAASC,kBAAkBA,CAAA,EAAG;EACnC,OAAO,IAAAC,sBAAe,EAAC,MAAM,EAAE,IAAAC,qBAAc,EAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AACzD","ignoreList":[]}

+ 24 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/react/buildChildren.js

@@ -0,0 +1,24 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = buildChildren;
+var _index = require("../../validators/generated/index.js");
+var _cleanJSXElementLiteralChild = require("../../utils/react/cleanJSXElementLiteralChild.js");
+function buildChildren(node) {
+  const elements = [];
+  for (let i = 0; i < node.children.length; i++) {
+    let child = node.children[i];
+    if ((0, _index.isJSXText)(child)) {
+      (0, _cleanJSXElementLiteralChild.default)(child, elements);
+      continue;
+    }
+    if ((0, _index.isJSXExpressionContainer)(child)) child = child.expression;
+    if ((0, _index.isJSXEmptyExpression)(child)) continue;
+    elements.push(child);
+  }
+  return elements;
+}
+
+//# sourceMappingURL=buildChildren.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/react/buildChildren.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_index","require","_cleanJSXElementLiteralChild","buildChildren","node","elements","i","children","length","child","isJSXText","cleanJSXElementLiteralChild","isJSXExpressionContainer","expression","isJSXEmptyExpression","push"],"sources":["../../../src/builders/react/buildChildren.ts"],"sourcesContent":["import {\n  isJSXText,\n  isJSXExpressionContainer,\n  isJSXEmptyExpression,\n} from \"../../validators/generated/index.ts\";\nimport cleanJSXElementLiteralChild from \"../../utils/react/cleanJSXElementLiteralChild.ts\";\nimport type * as t from \"../../index.ts\";\n\ntype ReturnedChild =\n  | t.JSXSpreadChild\n  | t.JSXElement\n  | t.JSXFragment\n  | t.Expression;\n\nexport default function buildChildren(\n  node: t.JSXElement | t.JSXFragment,\n): ReturnedChild[] {\n  const elements = [];\n\n  for (let i = 0; i < node.children.length; i++) {\n    let child: any = node.children[i];\n\n    if (isJSXText(child)) {\n      cleanJSXElementLiteralChild(child, elements);\n      continue;\n    }\n\n    if (isJSXExpressionContainer(child)) child = child.expression;\n    if (isJSXEmptyExpression(child)) continue;\n\n    elements.push(child);\n  }\n\n  return elements;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAKA,IAAAC,4BAAA,GAAAD,OAAA;AASe,SAASE,aAAaA,CACnCC,IAAkC,EACjB;EACjB,MAAMC,QAAQ,GAAG,EAAE;EAEnB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,IAAI,CAACG,QAAQ,CAACC,MAAM,EAAEF,CAAC,EAAE,EAAE;IAC7C,IAAIG,KAAU,GAAGL,IAAI,CAACG,QAAQ,CAACD,CAAC,CAAC;IAEjC,IAAI,IAAAI,gBAAS,EAACD,KAAK,CAAC,EAAE;MACpB,IAAAE,oCAA2B,EAACF,KAAK,EAAEJ,QAAQ,CAAC;MAC5C;IACF;IAEA,IAAI,IAAAO,+BAAwB,EAACH,KAAK,CAAC,EAAEA,KAAK,GAAGA,KAAK,CAACI,UAAU;IAC7D,IAAI,IAAAC,2BAAoB,EAACL,KAAK,CAAC,EAAE;IAEjCJ,QAAQ,CAACU,IAAI,CAACN,KAAK,CAAC;EACtB;EAEA,OAAOJ,QAAQ;AACjB","ignoreList":[]}

+ 22 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js

@@ -0,0 +1,22 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = createTSUnionType;
+var _index = require("../generated/index.js");
+var _removeTypeDuplicates = require("../../modifications/typescript/removeTypeDuplicates.js");
+var _index2 = require("../../validators/generated/index.js");
+function createTSUnionType(typeAnnotations) {
+  const types = typeAnnotations.map(type => {
+    return (0, _index2.isTSTypeAnnotation)(type) ? type.typeAnnotation : type;
+  });
+  const flattened = (0, _removeTypeDuplicates.default)(types);
+  if (flattened.length === 1) {
+    return flattened[0];
+  } else {
+    return (0, _index.tsUnionType)(flattened);
+  }
+}
+
+//# sourceMappingURL=createTSUnionType.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_index","require","_removeTypeDuplicates","_index2","createTSUnionType","typeAnnotations","types","map","type","isTSTypeAnnotation","typeAnnotation","flattened","removeTypeDuplicates","length","tsUnionType"],"sources":["../../../src/builders/typescript/createTSUnionType.ts"],"sourcesContent":["import { tsUnionType } from \"../generated/index.ts\";\nimport removeTypeDuplicates from \"../../modifications/typescript/removeTypeDuplicates.ts\";\nimport { isTSTypeAnnotation } from \"../../validators/generated/index.ts\";\nimport type * as t from \"../../index.ts\";\n\n/**\n * Takes an array of `types` and flattens them, removing duplicates and\n * returns a `UnionTypeAnnotation` node containing them.\n */\nexport default function createTSUnionType(\n  typeAnnotations: Array<t.TSTypeAnnotation | t.TSType>,\n): t.TSType {\n  const types = typeAnnotations.map(type => {\n    return isTSTypeAnnotation(type) ? type.typeAnnotation : type;\n  });\n  const flattened = removeTypeDuplicates(types);\n\n  if (flattened.length === 1) {\n    return flattened[0];\n  } else {\n    return tsUnionType(flattened);\n  }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAOe,SAASG,iBAAiBA,CACvCC,eAAqD,EAC3C;EACV,MAAMC,KAAK,GAAGD,eAAe,CAACE,GAAG,CAACC,IAAI,IAAI;IACxC,OAAO,IAAAC,0BAAkB,EAACD,IAAI,CAAC,GAAGA,IAAI,CAACE,cAAc,GAAGF,IAAI;EAC9D,CAAC,CAAC;EACF,MAAMG,SAAS,GAAG,IAAAC,6BAAoB,EAACN,KAAK,CAAC;EAE7C,IAAIK,SAAS,CAACE,MAAM,KAAK,CAAC,EAAE;IAC1B,OAAOF,SAAS,CAAC,CAAC,CAAC;EACrB,CAAC,MAAM;IACL,OAAO,IAAAG,kBAAW,EAACH,SAAS,CAAC;EAC/B;AACF","ignoreList":[]}

+ 21 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/validateNode.js

@@ -0,0 +1,21 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = validateNode;
+var _validate = require("../validators/validate.js");
+var _index = require("../index.js");
+function validateNode(node) {
+  if (node == null || typeof node !== "object") return;
+  const fields = _index.NODE_FIELDS[node.type];
+  if (!fields) return;
+  const keys = _index.BUILDER_KEYS[node.type];
+  for (const key of keys) {
+    const field = fields[key];
+    if (field != null) (0, _validate.validateInternal)(field, node, key, node[key]);
+  }
+  return node;
+}
+
+//# sourceMappingURL=validateNode.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/builders/validateNode.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_validate","require","_index","validateNode","node","fields","NODE_FIELDS","type","keys","BUILDER_KEYS","key","field","validateInternal"],"sources":["../../src/builders/validateNode.ts"],"sourcesContent":["import { validateInternal } from \"../validators/validate.ts\";\nimport type * as t from \"../index.ts\";\nimport { BUILDER_KEYS, NODE_FIELDS } from \"../index.ts\";\n\nexport default function validateNode<N extends t.Node>(node: N) {\n  if (node == null || typeof node !== \"object\") return;\n  const fields = NODE_FIELDS[node.type];\n  if (!fields) return;\n\n  // todo: because keys not in BUILDER_KEYS are not validated - this actually allows invalid nodes in some cases\n  const keys = BUILDER_KEYS[node.type] as (keyof N & string)[];\n  for (const key of keys) {\n    const field = fields[key];\n    if (field != null) validateInternal(field, node, key, node[key]);\n  }\n  return node;\n}\n"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AAEe,SAASE,YAAYA,CAAmBC,IAAO,EAAE;EAC9D,IAAIA,IAAI,IAAI,IAAI,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;EAC9C,MAAMC,MAAM,GAAGC,kBAAW,CAACF,IAAI,CAACG,IAAI,CAAC;EACrC,IAAI,CAACF,MAAM,EAAE;EAGb,MAAMG,IAAI,GAAGC,mBAAY,CAACL,IAAI,CAACG,IAAI,CAAyB;EAC5D,KAAK,MAAMG,GAAG,IAAIF,IAAI,EAAE;IACtB,MAAMG,KAAK,GAAGN,MAAM,CAACK,GAAG,CAAC;IACzB,IAAIC,KAAK,IAAI,IAAI,EAAE,IAAAC,0BAAgB,EAACD,KAAK,EAAEP,IAAI,EAAEM,GAAG,EAAEN,IAAI,CAACM,GAAG,CAAC,CAAC;EAClE;EACA,OAAON,IAAI;AACb","ignoreList":[]}

+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/clone.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = clone;
+var _cloneNode = require("./cloneNode.js");
+function clone(node) {
+  return (0, _cloneNode.default)(node, false);
+}
+
+//# sourceMappingURL=clone.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/clone.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_cloneNode","require","clone","node","cloneNode"],"sources":["../../src/clone/clone.ts"],"sourcesContent":["import cloneNode from \"./cloneNode.ts\";\nimport type * as t from \"../index.ts\";\n\n/**\n * Create a shallow clone of a `node`, including only\n * properties belonging to the node.\n * @deprecated Use t.cloneNode instead.\n */\nexport default function clone<T extends t.Node>(node: T): T {\n  return cloneNode(node, /* deep */ false);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAQe,SAASC,KAAKA,CAAmBC,IAAO,EAAK;EAC1D,OAAO,IAAAC,kBAAS,EAACD,IAAI,EAAa,KAAK,CAAC;AAC1C","ignoreList":[]}

+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeep.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = cloneDeep;
+var _cloneNode = require("./cloneNode.js");
+function cloneDeep(node) {
+  return (0, _cloneNode.default)(node);
+}
+
+//# sourceMappingURL=cloneDeep.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeep.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_cloneNode","require","cloneDeep","node","cloneNode"],"sources":["../../src/clone/cloneDeep.ts"],"sourcesContent":["import cloneNode from \"./cloneNode.ts\";\nimport type * as t from \"../index.ts\";\n\n/**\n * Create a deep clone of a `node` and all of it's child nodes\n * including only properties belonging to the node.\n * @deprecated Use t.cloneNode instead.\n */\nexport default function cloneDeep<T extends t.Node>(node: T): T {\n  return cloneNode(node);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAQe,SAASC,SAASA,CAAmBC,IAAO,EAAK;EAC9D,OAAO,IAAAC,kBAAS,EAACD,IAAI,CAAC;AACxB","ignoreList":[]}

+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = cloneDeepWithoutLoc;
+var _cloneNode = require("./cloneNode.js");
+function cloneDeepWithoutLoc(node) {
+  return (0, _cloneNode.default)(node, true, true);
+}
+
+//# sourceMappingURL=cloneDeepWithoutLoc.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_cloneNode","require","cloneDeepWithoutLoc","node","cloneNode"],"sources":["../../src/clone/cloneDeepWithoutLoc.ts"],"sourcesContent":["import cloneNode from \"./cloneNode.ts\";\nimport type * as t from \"../index.ts\";\n/**\n * Create a deep clone of a `node` and all of it's child nodes\n * including only properties belonging to the node.\n * excluding `_private` and location properties.\n */\nexport default function cloneDeepWithoutLoc<T extends t.Node>(node: T): T {\n  return cloneNode(node, /* deep */ true, /* withoutLoc */ true);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAOe,SAASC,mBAAmBA,CAAmBC,IAAO,EAAK;EACxE,OAAO,IAAAC,kBAAS,EAACD,IAAI,EAAa,IAAI,EAAmB,IAAI,CAAC;AAChE","ignoreList":[]}

+ 107 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneNode.js

@@ -0,0 +1,107 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = cloneNode;
+var _index = require("../definitions/index.js");
+var _index2 = require("../validators/generated/index.js");
+const {
+  hasOwn
+} = {
+  hasOwn: Function.call.bind(Object.prototype.hasOwnProperty)
+};
+function cloneIfNode(obj, deep, withoutLoc, commentsCache) {
+  if (obj && typeof obj.type === "string") {
+    return cloneNodeInternal(obj, deep, withoutLoc, commentsCache);
+  }
+  return obj;
+}
+function cloneIfNodeOrArray(obj, deep, withoutLoc, commentsCache) {
+  if (Array.isArray(obj)) {
+    return obj.map(node => cloneIfNode(node, deep, withoutLoc, commentsCache));
+  }
+  return cloneIfNode(obj, deep, withoutLoc, commentsCache);
+}
+function cloneNode(node, deep = true, withoutLoc = false) {
+  return cloneNodeInternal(node, deep, withoutLoc, new Map());
+}
+function cloneNodeInternal(node, deep = true, withoutLoc = false, commentsCache) {
+  if (!node) return node;
+  const {
+    type
+  } = node;
+  const newNode = {
+    type: node.type
+  };
+  if ((0, _index2.isIdentifier)(node)) {
+    newNode.name = node.name;
+    if (hasOwn(node, "optional") && typeof node.optional === "boolean") {
+      newNode.optional = node.optional;
+    }
+    if (hasOwn(node, "typeAnnotation")) {
+      newNode.typeAnnotation = deep ? cloneIfNodeOrArray(node.typeAnnotation, true, withoutLoc, commentsCache) : node.typeAnnotation;
+    }
+    if (hasOwn(node, "decorators")) {
+      newNode.decorators = deep ? cloneIfNodeOrArray(node.decorators, true, withoutLoc, commentsCache) : node.decorators;
+    }
+  } else if (!hasOwn(_index.NODE_FIELDS, type)) {
+    throw new Error(`Unknown node type: "${type}"`);
+  } else {
+    for (const field of Object.keys(_index.NODE_FIELDS[type])) {
+      if (hasOwn(node, field)) {
+        if (deep) {
+          newNode[field] = (0, _index2.isFile)(node) && field === "comments" ? maybeCloneComments(node.comments, deep, withoutLoc, commentsCache) : cloneIfNodeOrArray(node[field], true, withoutLoc, commentsCache);
+        } else {
+          newNode[field] = node[field];
+        }
+      }
+    }
+  }
+  if (hasOwn(node, "loc")) {
+    if (withoutLoc) {
+      newNode.loc = null;
+    } else {
+      newNode.loc = node.loc;
+    }
+  }
+  if (hasOwn(node, "leadingComments")) {
+    newNode.leadingComments = maybeCloneComments(node.leadingComments, deep, withoutLoc, commentsCache);
+  }
+  if (hasOwn(node, "innerComments")) {
+    newNode.innerComments = maybeCloneComments(node.innerComments, deep, withoutLoc, commentsCache);
+  }
+  if (hasOwn(node, "trailingComments")) {
+    newNode.trailingComments = maybeCloneComments(node.trailingComments, deep, withoutLoc, commentsCache);
+  }
+  if (hasOwn(node, "extra")) {
+    newNode.extra = Object.assign({}, node.extra);
+  }
+  return newNode;
+}
+function maybeCloneComments(comments, deep, withoutLoc, commentsCache) {
+  if (!comments || !deep) {
+    return comments;
+  }
+  return comments.map(comment => {
+    const cache = commentsCache.get(comment);
+    if (cache) return cache;
+    const {
+      type,
+      value,
+      loc
+    } = comment;
+    const ret = {
+      type,
+      value,
+      loc
+    };
+    if (withoutLoc) {
+      ret.loc = null;
+    }
+    commentsCache.set(comment, ret);
+    return ret;
+  });
+}
+
+//# sourceMappingURL=cloneNode.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneNode.js.map


+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = cloneWithoutLoc;
+var _cloneNode = require("./cloneNode.js");
+function cloneWithoutLoc(node) {
+  return (0, _cloneNode.default)(node, false, true);
+}
+
+//# sourceMappingURL=cloneWithoutLoc.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_cloneNode","require","cloneWithoutLoc","node","cloneNode"],"sources":["../../src/clone/cloneWithoutLoc.ts"],"sourcesContent":["import cloneNode from \"./cloneNode.ts\";\nimport type * as t from \"../index.ts\";\n\n/**\n * Create a shallow clone of a `node` excluding `_private` and location properties.\n */\nexport default function cloneWithoutLoc<T extends t.Node>(node: T): T {\n  return cloneNode(node, /* deep */ false, /* withoutLoc */ true);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAMe,SAASC,eAAeA,CAAmBC,IAAO,EAAK;EACpE,OAAO,IAAAC,kBAAS,EAACD,IAAI,EAAa,KAAK,EAAmB,IAAI,CAAC;AACjE","ignoreList":[]}

+ 15 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComment.js

@@ -0,0 +1,15 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = addComment;
+var _addComments = require("./addComments.js");
+function addComment(node, type, content, line) {
+  return (0, _addComments.default)(node, type, [{
+    type: line ? "CommentLine" : "CommentBlock",
+    value: content
+  }]);
+}
+
+//# sourceMappingURL=addComment.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComment.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_addComments","require","addComment","node","type","content","line","addComments","value"],"sources":["../../src/comments/addComment.ts"],"sourcesContent":["import addComments from \"./addComments.ts\";\nimport type * as t from \"../index.ts\";\n\n/**\n * Add comment of certain type to a node.\n */\nexport default function addComment<T extends t.Node>(\n  node: T,\n  type: t.CommentTypeShorthand,\n  content: string,\n  line?: boolean,\n): T {\n  return addComments(node, type, [\n    {\n      type: line ? \"CommentLine\" : \"CommentBlock\",\n      value: content,\n    } as t.Comment,\n  ]);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAMe,SAASC,UAAUA,CAChCC,IAAO,EACPC,IAA4B,EAC5BC,OAAe,EACfC,IAAc,EACX;EACH,OAAO,IAAAC,oBAAW,EAACJ,IAAI,EAAEC,IAAI,EAAE,CAC7B;IACEA,IAAI,EAAEE,IAAI,GAAG,aAAa,GAAG,cAAc;IAC3CE,KAAK,EAAEH;EACT,CAAC,CACF,CAAC;AACJ","ignoreList":[]}

+ 22 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComments.js

@@ -0,0 +1,22 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = addComments;
+function addComments(node, type, comments) {
+  if (!comments || !node) return node;
+  const key = `${type}Comments`;
+  if (node[key]) {
+    if (type === "leading") {
+      node[key] = comments.concat(node[key]);
+    } else {
+      node[key].push(...comments);
+    }
+  } else {
+    node[key] = comments;
+  }
+  return node;
+}
+
+//# sourceMappingURL=addComments.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/addComments.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["addComments","node","type","comments","key","concat","push"],"sources":["../../src/comments/addComments.ts"],"sourcesContent":["import type * as t from \"../index.ts\";\n\n/**\n * Add comments of certain type to a node.\n */\nexport default function addComments<T extends t.Node>(\n  node: T,\n  type: t.CommentTypeShorthand,\n  comments: Array<t.Comment>,\n): T {\n  if (!comments || !node) return node;\n\n  const key = `${type}Comments` as const;\n\n  if (node[key]) {\n    if (type === \"leading\") {\n      node[key] = comments.concat(node[key]);\n    } else {\n      node[key].push(...comments);\n    }\n  } else {\n    node[key] = comments;\n  }\n\n  return node;\n}\n"],"mappings":";;;;;;AAKe,SAASA,WAAWA,CACjCC,IAAO,EACPC,IAA4B,EAC5BC,QAA0B,EACvB;EACH,IAAI,CAACA,QAAQ,IAAI,CAACF,IAAI,EAAE,OAAOA,IAAI;EAEnC,MAAMG,GAAG,GAAG,GAAGF,IAAI,UAAmB;EAEtC,IAAID,IAAI,CAACG,GAAG,CAAC,EAAE;IACb,IAAIF,IAAI,KAAK,SAAS,EAAE;MACtBD,IAAI,CAACG,GAAG,CAAC,GAAGD,QAAQ,CAACE,MAAM,CAACJ,IAAI,CAACG,GAAG,CAAC,CAAC;IACxC,CAAC,MAAM;MACLH,IAAI,CAACG,GAAG,CAAC,CAACE,IAAI,CAAC,GAAGH,QAAQ,CAAC;IAC7B;EACF,CAAC,MAAM;IACLF,IAAI,CAACG,GAAG,CAAC,GAAGD,QAAQ;EACtB;EAEA,OAAOF,IAAI;AACb","ignoreList":[]}

+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritInnerComments.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = inheritInnerComments;
+var _inherit = require("../utils/inherit.js");
+function inheritInnerComments(child, parent) {
+  (0, _inherit.default)("innerComments", child, parent);
+}
+
+//# sourceMappingURL=inheritInnerComments.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritInnerComments.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_inherit","require","inheritInnerComments","child","parent","inherit"],"sources":["../../src/comments/inheritInnerComments.ts"],"sourcesContent":["import inherit from \"../utils/inherit.ts\";\nimport type * as t from \"../index.ts\";\n\nexport default function inheritInnerComments(\n  child: t.Node,\n  parent: t.Node,\n): void {\n  inherit(\"innerComments\", child, parent);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAGe,SAASC,oBAAoBA,CAC1CC,KAAa,EACbC,MAAc,EACR;EACN,IAAAC,gBAAO,EAAC,eAAe,EAAEF,KAAK,EAAEC,MAAM,CAAC;AACzC","ignoreList":[]}

+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritLeadingComments.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = inheritLeadingComments;
+var _inherit = require("../utils/inherit.js");
+function inheritLeadingComments(child, parent) {
+  (0, _inherit.default)("leadingComments", child, parent);
+}
+
+//# sourceMappingURL=inheritLeadingComments.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritLeadingComments.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_inherit","require","inheritLeadingComments","child","parent","inherit"],"sources":["../../src/comments/inheritLeadingComments.ts"],"sourcesContent":["import inherit from \"../utils/inherit.ts\";\nimport type * as t from \"../index.ts\";\n\nexport default function inheritLeadingComments(\n  child: t.Node,\n  parent: t.Node,\n): void {\n  inherit(\"leadingComments\", child, parent);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAGe,SAASC,sBAAsBA,CAC5CC,KAAa,EACbC,MAAc,EACR;EACN,IAAAC,gBAAO,EAAC,iBAAiB,EAAEF,KAAK,EAAEC,MAAM,CAAC;AAC3C","ignoreList":[]}

+ 12 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritTrailingComments.js

@@ -0,0 +1,12 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = inheritTrailingComments;
+var _inherit = require("../utils/inherit.js");
+function inheritTrailingComments(child, parent) {
+  (0, _inherit.default)("trailingComments", child, parent);
+}
+
+//# sourceMappingURL=inheritTrailingComments.js.map

+ 1 - 0
node_modules/.pnpm/@babel+types@7.28.1/node_modules/@babel/types/lib/comments/inheritTrailingComments.js.map

@@ -0,0 +1 @@
+{"version":3,"names":["_inherit","require","inheritTrailingComments","child","parent","inherit"],"sources":["../../src/comments/inheritTrailingComments.ts"],"sourcesContent":["import inherit from \"../utils/inherit.ts\";\nimport type * as t from \"../index.ts\";\n\nexport default function inheritTrailingComments(\n  child: t.Node,\n  parent: t.Node,\n): void {\n  inherit(\"trailingComments\", child, parent);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAGe,SAASC,uBAAuBA,CAC7CC,KAAa,EACbC,MAAc,EACR;EACN,IAAAC,gBAAO,EAAC,kBAAkB,EAAEF,KAAK,EAAEC,MAAM,CAAC;AAC5C","ignoreList":[]}

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio