From f32ba3be80016cda0915728de9742e1f6e762053 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Mon, 8 Nov 2021 19:03:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=E4=BB=AA=E8=A1=A8=E6=9D=BF=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=A7=86=E9=A2=91=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../authModel/VAuthModelController.java | 19 ++ .../dataease/dto/authModel/VAuthModelDTO.java | 12 + .../src/main/resources/generatorConfig.xml | 8 +- frontend/package.json | 1 + .../components/Editor/ComponentWrapper.vue | 24 ++ .../canvas/components/Editor/VideoLinks.vue | 125 ++++++++++ .../canvas/components/Editor/index.vue | 15 +- .../components/canvas/components/TextAttr.vue | 13 +- .../canvas/custom-component/DeVideo.vue | 161 +++++++++++++ .../canvas/custom-component/component-list.js | 39 ++++ .../canvas/custom-component/index.js | 2 + frontend/src/custom-theme.css | 180 +++++++++++++++ frontend/src/main.js | 6 + frontend/src/store/index.js | 5 +- frontend/src/styles/deicon/demo_index.html | 213 +++++++++++++++--- frontend/src/styles/deicon/iconfont.css | 18 +- frontend/src/styles/deicon/iconfont.js | 2 +- frontend/src/styles/deicon/iconfont.json | 21 ++ frontend/src/styles/deicon/iconfont.ttf | Bin 18284 -> 19504 bytes frontend/src/styles/deicon/iconfont.woff | Bin 11108 -> 11916 bytes frontend/src/styles/deicon/iconfont.woff2 | Bin 9352 -> 10096 bytes .../src/views/panel/AssistComponent/index.vue | 2 +- frontend/src/views/panel/edit/index.vue | 14 +- frontend/src/views/panel/video/index.vue | 24 ++ 24 files changed, 841 insertions(+), 63 deletions(-) create mode 100644 backend/src/main/java/io/dataease/controller/authModel/VAuthModelController.java create mode 100644 backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java create mode 100644 frontend/src/components/canvas/components/Editor/VideoLinks.vue create mode 100644 frontend/src/components/canvas/custom-component/DeVideo.vue create mode 100755 frontend/src/custom-theme.css create mode 100644 frontend/src/views/panel/video/index.vue diff --git a/backend/src/main/java/io/dataease/controller/authModel/VAuthModelController.java b/backend/src/main/java/io/dataease/controller/authModel/VAuthModelController.java new file mode 100644 index 0000000000..b6352ffa18 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/authModel/VAuthModelController.java @@ -0,0 +1,19 @@ +package io.dataease.controller.authModel; + +import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Author: wangjiahao + * Date: 2021/11/5 + * Description: + */ +@Api(tags = "授权树:授权树模型") +@ApiSupport(order = 80) +@RestController +@RequestMapping("authModel") +public class VAuthModelController { + +} diff --git a/backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java b/backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java new file mode 100644 index 0000000000..703649a885 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java @@ -0,0 +1,12 @@ +package io.dataease.dto.authModel; + +import io.dataease.base.domain.VAuthModel; + +/** + * Author: wangjiahao + * Date: 2021/11/5 + * Description: + */ +public class VAuthModelDTO extends VAuthModel { + +} diff --git a/backend/src/main/resources/generatorConfig.xml b/backend/src/main/resources/generatorConfig.xml index 4bcf3af04a..9cbceb1e76 100644 --- a/backend/src/main/resources/generatorConfig.xml +++ b/backend/src/main/resources/generatorConfig.xml @@ -65,10 +65,10 @@ - -
-
-
+ + + +
diff --git a/frontend/package.json b/frontend/package.json index 0b67ccfac9..0d9599f1d4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -51,6 +51,7 @@ "vue-router": "3.0.6", "vue-to-pdf": "^1.0.0", "vue-uuid": "2.0.2", + "vue-video-player": "^5.0.2", "vuedraggable": "^2.24.3", "vuex": "3.1.0", "webpack": "^4.46.0", diff --git a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue index 02df49725b..3d0b764a8e 100644 --- a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue @@ -27,6 +27,7 @@ :is-edit="false" :element="config" :search-count="searchCount" + :h="config.style.height" /> @@ -76,6 +77,29 @@ export default { methods: { getStyle, + getShapeStyleIntDeDrag(style, prop) { + if (prop === 'rotate') { + return style['rotate'] + } + if (prop === 'width') { + return this.format(style['width'], this.scaleWidth) + } + if (prop === 'left') { + return this.format(style['left'], this.scaleWidth) + } + if (prop === 'height') { + return this.format(style['height'], this.scaleHeight) + } + if (prop === 'top') { + const top = this.format(style['top'], this.scaleHeight) + // console.log('top:' + top) + return top + } + }, + format(value, scale) { + // 自适应画布区域 返回原值 + return value * scale / 100 + }, getOutStyleDefault(style) { const result = {}; ['width', 'left'].forEach(attr => { diff --git a/frontend/src/components/canvas/components/Editor/VideoLinks.vue b/frontend/src/components/canvas/components/Editor/VideoLinks.vue new file mode 100644 index 0000000000..5de4189786 --- /dev/null +++ b/frontend/src/components/canvas/components/Editor/VideoLinks.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/frontend/src/components/canvas/components/Editor/index.vue b/frontend/src/components/canvas/components/Editor/index.vue index 0fe18e756c..6c3b4d297c 100644 --- a/frontend/src/components/canvas/components/Editor/index.vue +++ b/frontend/src/components/canvas/components/Editor/index.vue @@ -55,9 +55,6 @@ @amAddItem="addItemBox(item)" @linkJumpSet="linkJumpSet(item)" > - - - - diff --git a/frontend/src/components/canvas/components/TextAttr.vue b/frontend/src/components/canvas/components/TextAttr.vue index a21ace722f..1946ad107d 100644 --- a/frontend/src/components/canvas/components/TextAttr.vue +++ b/frontend/src/components/canvas/components/TextAttr.vue @@ -136,6 +136,11 @@ +
+ + + +
@@ -150,10 +155,11 @@ + + + diff --git a/frontend/src/components/canvas/custom-component/component-list.js b/frontend/src/components/canvas/custom-component/component-list.js index c6a5e0589c..5f08f9cd9c 100644 --- a/frontend/src/components/canvas/custom-component/component-list.js +++ b/frontend/src/components/canvas/custom-component/component-list.js @@ -21,6 +21,19 @@ export const HYPERLINKS = { content: 'http://' } +// 视频信息配置 +export const VIDEOLINKS = { + autoplay: true, + muted: true, + loop: true, + language: 'zh', + controlBar: { + fullscreenToggle: false + }, + sources: [{ + }] +} + export const assistList = [ { id: '10001', @@ -57,6 +70,14 @@ export const pictureList = [ label: '拖拽上传', icon: 'iconfont icon-picture', defaultClass: 'text-filter' + }, + { + id: '20002', + component: 'video', + type: 'video', + label: '视频', + icon: 'iconfont icon-video', + defaultClass: 'text-filter' } ] @@ -275,6 +296,24 @@ const list = [ y: 1, sizex: 10, sizey: 5 + }, + { + id: '20002', + component: 'de-video', + type: 'de-video', + label: '', + icon: 'iconfont icon-picture', + defaultClass: 'text-filter', + style: { + width: 400, + height: 200, + borderRadius: '' + }, + videoLinks: VIDEOLINKS, + x: 1, + y: 1, + sizex: 10, + sizey: 5 } ] diff --git a/frontend/src/components/canvas/custom-component/index.js b/frontend/src/components/canvas/custom-component/index.js index ce8c3a3e5e..9fd3141ffd 100644 --- a/frontend/src/components/canvas/custom-component/index.js +++ b/frontend/src/components/canvas/custom-component/index.js @@ -6,6 +6,7 @@ import VButton from '@/components/canvas/custom-component/VButton' import Group from '@/components/canvas/custom-component/Group' import RectShape from '@/components/canvas/custom-component/RectShape' import UserView from '@/components/canvas/custom-component/UserView' +import DeVideo from '@/components/canvas/custom-component/DeVideo' Vue.component('Picture', Picture) Vue.component('VText', VText) @@ -13,4 +14,5 @@ Vue.component('VButton', VButton) Vue.component('Group', Group) Vue.component('RectShape', RectShape) Vue.component('UserView', UserView) +Vue.component('DeVideo', DeVideo) diff --git a/frontend/src/custom-theme.css b/frontend/src/custom-theme.css new file mode 100755 index 0000000000..e9bb74b11a --- /dev/null +++ b/frontend/src/custom-theme.css @@ -0,0 +1,180 @@ +.vjs-custom-skin > .video-js { + width: 100%; + font-family: "PingFang SC","Helvetica Neue","Hiragino Sans GB","Segoe UI","Microsoft YaHei","微软雅黑",sans-serif; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-inline.vjs-slider-active,.vjs-custom-skin > .video-js .vjs-menu-button-inline:focus,.vjs-custom-skin > .video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline { + width: 10em +} + +.vjs-custom-skin > .video-js .vjs-controls-disabled .vjs-big-play-button { + display: none!important +} + +.vjs-custom-skin > .video-js .vjs-control { + width: 3em +} + +.vjs-custom-skin > .video-js .vjs-control.vjs-live-control{ + width: auto; + padding-left: .5em; + letter-spacing: .1em; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-inline:before { + width: 1.5em +} + +.vjs-menu-button-inline .vjs-menu { + left: 3em +} + +.vjs-paused.vjs-has-started.vjs-custom-skin > .video-js .vjs-big-play-button,.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button { + display: block +} + +.vjs-custom-skin > .video-js .vjs-load-progress div,.vjs-seeking .vjs-big-play-button,.vjs-waiting .vjs-big-play-button { + display: none!important +} + +.vjs-custom-skin > .video-js .vjs-mouse-display:after,.vjs-custom-skin > .video-js .vjs-play-progress:after { + padding: 0 .4em .3em +} + +.video-js.vjs-ended .vjs-loading-spinner { + display: none; +} + +.video-js.vjs-ended .vjs-big-play-button { + display: block !important; +} + +.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button,.vjs-paused.vjs-has-started.vjs-custom-skin > .video-js .vjs-big-play-button { + display: block +} + +.vjs-custom-skin > .video-js .vjs-big-play-button { + top: 50%; + left: 50%; + margin-left: -1.5em; + margin-top: -1em +} + +.vjs-custom-skin > .video-js .vjs-big-play-button { + background-color: rgba(0,0,0,0.45); + font-size: 3.5em; + /*border-radius: 50%;*/ + height: 2em !important; + line-height: 2em !important; + margin-top: -1em !important +} + +.video-js:hover .vjs-big-play-button,.vjs-custom-skin > .video-js .vjs-big-play-button:focus,.vjs-custom-skin > .video-js .vjs-big-play-button:active { + background-color: rgba(36,131,213,0.9) +} + +.vjs-custom-skin > .video-js .vjs-loading-spinner { + border-color: rgba(36,131,213,0.8) +} + +.vjs-custom-skin > .video-js .vjs-control-bar2 { + background-color: #000000 +} + +.vjs-custom-skin > .video-js .vjs-control-bar { + /*background-color: rgba(0,0,0,0.3) !important;*/ + color: #ffffff; + font-size: 14px +} + +.vjs-custom-skin > .video-js .vjs-play-progress,.vjs-custom-skin > .video-js .vjs-volume-level { + background-color: #2483d5 +} + +.vjs-custom-skin > .video-js .vjs-play-progress:before { + top: -0.3em; +} + +.vjs-custom-skin > .video-js .vjs-progress-control:hover .vjs-progress-holder { + font-size: 1.3em; +} + +.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu { + left: 0em; +} + +.vjs-custom-skin > .video-js .vjs-menu li { + padding: 0; + line-height: 2em; + font-size: 1.1em; + font-family: "PingFang SC","Helvetica Neue","Hiragino Sans GB","Segoe UI","Microsoft YaHei","微软雅黑",sans-serif; +} + +.vjs-custom-skin > .video-js .vjs-time-tooltip, +.vjs-custom-skin > .video-js .vjs-mouse-display:after, +.vjs-custom-skin > .video-js .vjs-play-progress:after { + border-radius: 0; + font-size: 1em; + padding: 0; + width: 3em; + height: 1.5em; + line-height: 1.5em; + top: -3em; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-popup .vjs-menu { + width: 5em; + left: -1em; +} + +.vjs-custom-skin > .video-js .vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu { + left: 0; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button .vjs-menu { + /*order: 4;*/ +} + + /*排序顺序*/ +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-play-control { + order: 0; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-time-control { + min-width: 1em; + padding: 0; + margin: 0 .1em; + text-align: center; + display: block; + order: 1; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-playback-rate .vjs-playback-rate-value{ + font-size: 1.2em; + line-height: 2.4; +} + +.vjs-custom-skin > .video-js .vjs-progress-control.vjs-control { + order: 2; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-volume-menu-button { + order: 3; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button { + order: 4; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-resolution-button .vjs-resolution-button-label { + display: block; + line-height: 3em; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-playback-rate { + order: 5; +} + +.vjs-custom-skin > .video-js .vjs-control-bar .vjs-fullscreen-control { + order: 6; +} diff --git a/frontend/src/main.js b/frontend/src/main.js index 9fc65811e5..7d19913c38 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -82,6 +82,12 @@ Vue.config.productionTip = false import vueToPdf from 'vue-to-pdf' Vue.use(vueToPdf) +import VueVideoPlayer from 'vue-video-player' + +import 'video.js/dist/video-js.css' + +Vue.use(VueVideoPlayer) + Vue.prototype.hasDataPermission = function(pTarget, pSource) { if (this.$store.state.user.user.isAdmin) { return true diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index bf21246af7..2cac3c4eb9 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -66,7 +66,10 @@ const data = { nowPanelJumpInfoTargetPanel: {}, // 当前仪表板的跳转信息(只包括仪表板) // 拖拽的组件信息 - dragComponentInfo: null + dragComponentInfo: null, + + // 仪表板组件间隙大小 px + componentGap: 5 }, mutations: { ...animation.mutations, diff --git a/frontend/src/styles/deicon/demo_index.html b/frontend/src/styles/deicon/demo_index.html index 8f3440b4c8..c0cd14e760 100644 --- a/frontend/src/styles/deicon/demo_index.html +++ b/frontend/src/styles/deicon/demo_index.html @@ -54,6 +54,54 @@
    +
  • + +
    video
    +
    &#xe625;
    +
  • + +
  • + +
    悬浮按钮发动态
    +
    &#xe6e8;
    +
  • + +
  • + +
    吸附选择
    +
    &#xe697;
    +
  • + +
  • + +
    margin
    +
    &#xe902;
    +
  • + +
  • + +
    padding
    +
    &#xe91b;
    +
  • + +
  • + +
    tabs
    +
    &#xe9a8;
    +
  • + +
  • + +
    时间
    +
    &#xe665;
    +
  • + +
  • + +
    时间格式转换
    +
    &#xe6fb;
    +
  • +
  • 超链接
    @@ -102,12 +150,6 @@
    &#xe8e6;
  • -
  • - -
    44.tabs
    -
    &#xe62a;
    -
  • -
  • 洗浴
    @@ -420,9 +462,9 @@
    @font-face {
       font-family: 'iconfont';
    -  src: url('iconfont.woff2?t=1634191971474') format('woff2'),
    -       url('iconfont.woff?t=1634191971474') format('woff'),
    -       url('iconfont.ttf?t=1634191971474') format('truetype');
    +  src: url('iconfont.woff2?t=1636358286475') format('woff2'),
    +       url('iconfont.woff?t=1636358286475') format('woff'),
    +       url('iconfont.ttf?t=1636358286475') format('truetype');
     }
     

    第二步:定义使用 iconfont 的样式

    @@ -448,6 +490,78 @@
      +
    • + +
      + video +
      +
      .icon-video +
      +
    • + +
    • + +
      + 悬浮按钮发动态 +
      +
      .icon-xuanfuanniufadongtai +
      +
    • + +
    • + +
      + 吸附选择 +
      +
      .icon-xifuxuanze +
      +
    • + +
    • + +
      + margin +
      +
      .icon-margin +
      +
    • + +
    • + +
      + padding +
      +
      .icon-padding +
      +
    • + +
    • + +
      + tabs +
      +
      .icon-tabs +
      +
    • + +
    • + +
      + 时间 +
      +
      .icon-shijian +
      +
    • + +
    • + +
      + 时间格式转换 +
      +
      .icon-shijiangeshizhuanhuan +
      +
    • +
    • @@ -520,15 +634,6 @@
    • -
    • - -
      - 44.tabs -
      -
      .icon-tabs -
      -
    • -
    • @@ -997,6 +1102,70 @@
        +
      • + +
        video
        +
        #icon-video
        +
      • + +
      • + +
        悬浮按钮发动态
        +
        #icon-xuanfuanniufadongtai
        +
      • + +
      • + +
        吸附选择
        +
        #icon-xifuxuanze
        +
      • + +
      • + +
        margin
        +
        #icon-margin
        +
      • + +
      • + +
        padding
        +
        #icon-padding
        +
      • + +
      • + +
        tabs
        +
        #icon-tabs
        +
      • + +
      • + +
        时间
        +
        #icon-shijian
        +
      • + +
      • + +
        时间格式转换
        +
        #icon-shijiangeshizhuanhuan
        +
      • +
      • #icon-xuanfuanniu
      • -
      • - -
        44.tabs
        -
        #icon-tabs
        -
      • -
      • TasfH(1+r(QcNx88hJ{ zZ!pwTn)r25GjRh6IOks=J&fSDUdpZE&f_+5Tv5#D*d*(0a!A)0&9mKU&r(60CvrCA zeQa)6K7uE^g`Web+u^Prrin@g`vjg ztyk>bwzbi0HnwityKF3XNiaremw#XE>>fq^aulMiZO!Jkt6A_j->wyIagM^!x2yU6 zuxy>WsCV_c&#YbDyQo;WeLV?YwdJB}eW`i$&?s~lj3b600>&dov0N~ov2@)E z)+N93u)oK+-2nf?MvqZ{vV$4Y4XcA_`29w3k>TO_8Jb`Ee}NPZ`9)Fs-fRq8f(-8& zqfjnl4+tKyYBjfm9<1rV9cw*o81-{KG*;$ex!na9`Mc+_{L;gcDEdQTY`zn-qbj@S zbvOAr7e*QsnG2CzLe>)lMtQmyuHvE+CHpCd8G2CcaYs^g`r=|wrzRVlmdNp14?6Pb(9~Z_w zj48r6501vm&3of>nUhx~Md00o$*5?VXKmftU%Q|xSwRL>{`fY4_k;7*fn+(6C@10S z+%;z>6PdJ?NMy(2wxx!0TBJL7%_>7DnxaK*t+u`!e}cI4g1%rlv!*AJ2&J-C?cDC5 zBr07|0R%p#nD)h^sSJo_K%=4vspQbcumwHcrRwm_!-Y&ZC|kIULFisz({+@6Wa5+k zfsyL+a$b(=`H*bc@$~536K7wuLK#a&H`M!gZdqxO86Jldd zI-koae=*e`288cO=LaNg{^wAR45 zkq3ms_*yj+V>2%x44s$dADwo86BGE7i8A*c*CaVOOu@(wrF5?TRZY%<5_3kT|c1;oyaiU^ACVrkx+#y-~)kx)aWyq{`h%*qJOl z{|rxAT`|+yYISv4O5C&#gdio3`r#`v=0c`X`&(a4TSXx-Y`-6V|8A*D^1y(@+0}nj#mq$*|JtDjE`Y-5rkiU1Ke8>SV zQ&}iVxN@#8Q&X4%ifT(43y@1mf8dqiM^uopHJWw$*8*MYT<=`JlnOjgcmglNiwqQ~ zv%w6S&IT{RvO(e@%nP}n{Va!hCQl^i*C306Oy$?90E#R-{~=JpRsRBFYPP zIPXe^QaE34N+=wl?&(?pe=rxPB2|&E;U<>yxL@ly35it+iP#5Sf38&y!aC$C*dlEfD9|@$wGVSMk;?7O+9=@N- z;Zy*A>coRl7$8U|-fKko0U8OmA8CFouW#@AZk7gB^dXsvN$2i zzK|S-Lq;rPw&VGHf4psGV#Zub%f%f@Hlmq;b1Ih0#Q*}CsF8_T&VL#fifSMPlVn8; zf0@PEefUCVaVD(?4T8*)tQgumgiqGqYiF%M#DBX_&Di_c1Tjc!@;epwHLhb5JbSS3 z*S{?0(mAo(821}i+=|C7BP#p#3~$PYAmiEbDFNvkNi0i>e`NzX;c}-StbG%n`vm-5|RTXPW>nkHClGK zRc0hh3QOgNWHszom=p@BsoQSe+-_(7{!xiY`2CDS?aYs!N7$J(jK3mZO%=|+!8ro! zVf{xwP)P0Hf1fIlJ40p@Zk>kqeM5I_W!O?b#~lr4xMqsdgq99WOm&9JHsY_@H-A0M%-b$e|+@|^d-6ur36=gVInM(Ky8#T zQ^W;O+$=#yRxLA0)Rk;oEM=9!rdPMlS+nMx;d>X|*L%Yan^LLX`xf6f6t+svw)u3+ z!rwLP7~Xx0dlor=zL@-@o7cK;@jbn%)TSG5=)G^zz1Y%&?FSa7*RDNhUk48+7CC>h z*cMsy(v{zira@NxoQIxaz=7*W*Ne(u0buz|^2~ zIriv>gJs1^D7#f`BBA=Aqko-xmcBsOpyoA#66l584(@91W)9WbVkG3B-Db_Imq>XD zTB)!mQAtdiTuQew_xRw2f~koC00e;m%c?sAn-*)z0woDCLWm79!Rg+#`6>e50i za+%M!zyFRqrn1@o{k}}Zw?7}VS6;Nago&>$D3Wk?_{kTP{urqtK7WPVVX+#Dt9|NO z;lL6j95$BtBTmLEePF(HS=hfM5JnV#_)EUDc1wRYJ9Wn$efxcpw6?#nW%J6ee`x6z z4Gt_UlLf&DTkHSv@`98QJ9WN@xDer9Qe$uNRz zkE3)Nr7n>(xjt?^t^%X8w!#RN`x(O_7#PIw>{?L9q1pnE=ez1Eh;-g~io!<2%rBH$ zvkj;ZtxCbZ3!D$Zw^2V8L*k&^f4-U2sUWI4<&RPdGq&FtGzwNB;s|ge-XF(@mN1xX z6x-Jp8;v5o_?4Si+z30)cOHl52hJZ5iP$frnE3#GPBxKqRw?{ElC|=BzwWo4E+A&S zFFx}^tS=t#ixI;aE!Jv9^07i4^$5weoqU}xLw#t7TghF(?d0Cc9pJb#f9#}@j*hUv znuiKRna!F>DXtn{bHyLJ(0)X{+nE%TH<&Hc6{xb_&Xdka3wbZyF%F7w%sHuBmQJQI zj9H~vdm>gU#b5%H@ajfh5&b6NH%h#y7(w|z>YMBJ%~!CXo*&KUM^`S%W|xrmDLoj} z31A)n0@(S&F$S{$J2=X^fAKm4w~sa#D`A)7Mu7wkN#-vU32*xO0KB)h`AXKsm78nM z(cIFNOLLH4vT{itP6c&v>+8Ykw*+y2;ekJOkp3gRnk!(!wZyT%fbH2GBbkckWJZ>DCB0l4a^QCGdr}v>|p8dHf%>6ednW3KmF)CM`vUB?UU zf%a2x-=_1`*&OIA2|JdOvGm#cU48=`J1MkPf`P&46okY#N>&<1ORLLYoGA zUtaJ#&VC&LKH}xAf0^en1Cz&JrnOnf%Y6A|&Se<1L4Js|i7Pf->+T3NJezJ3pxCT$ z*|z8IPu{lo%CYfx+`VVpmU{Dw@v$rS-u6k(y>X!1$w`#Pe@1ZKQz&kAR1YcNFEsFw zVxrZoTD7#m?!-_ZkwiSb<9Nbd-J}KIm5F@(LmJA^+TV+~AUrW+7I{&PefTE}k_ra1 zXmF9zr5+DxycQ%tcu|sH)q}*;{`i{;OrMbvh|OZMq4K9rojQPf^){qQ_j3<%A4l?B zW23-7ly=Lde-_hv8>MpH6T;ZG8-+ZZ4*sEB$pp+0lBO`TFS=5j%`A{%+oduktl}zJ zC@h!z+>5O=xVyM9OMoJ_NAR(7*k+&0fPUBRh`ONIp=;g^^l20i9zUw6ix*ke_De5~ zC`dPC;nGXDTh^k*)_j2~3s@q^YNtq5e&YDenzhRpe^qW*Wn~lf^m{(<^$X;*&436#2TAbtHTUol#D@*+@Qpj z$4Dq@5>5KD761rpQ;$)JoRo<~ADhyGs5ok0f0i_2MnmK=B@VC6!BJ}git{kPptcpA zYZNp^d2FZd2TS`RFR3JmyF2h0Rl8)lOQnx_n_ZRoFXCD8>pLG);Pul|W^@i~u5Q$X zg>AYr^0V}VC_mawkW7U1jk8889|ZNs9;Q>fYXDsi)_hW=}R<9iF^kcxZ@z z!1>Rip?{T=xff@a4Nqip9eMpW{tDzT>>gnVX%rrbagxQ;)2g-8 zCyALMnN*I;gF<~4B?+c}z=US$g0BLxe__7MOh~ePQb?5py6|Hy3ev5=C5P`6HJJHp zUARjS?i6*}uZwpIAMo3H@|KU9UBrxp$@>ElpD)n9p^zYVIv;Y*-@!}L=%^&}+o{HH z=S3M45(1jX7pM8@4!!p?n=#bPy!&F<%Gx!WwRmoNdIn$ep^rJo@1KC{Chm8fe>T>d z!3JiKTeLHeKMomK;@a%qpx09$@{FQunT^;;M^K=~t&9>BPM8VTEhIV=Wu`LCvrqDO zV`f6ceM;$#JglO!^EH{S0{#XR2_Y>eR=qBYWWR755vghg+7TkqW0G`?3WWS3U^y{W zfJx_&pmMW!g6s}fL0)FMtAV<=f7Hl^%dK!0P$7d%AEiB(LGmf+H}>PP2{TfBss)hr!qAKCocTXtUtle=}DU5!puHd zY`BcBQNuVtM@oTl%4`F_CzFm@z9;kLnS}VriWM)fSh2D@`Es(`$*jEBf4ThL6{Yb4 zW{^U%du4I_*_Gc~$(}@acVZ=+Z2#@O_mX09y!b85NWP2!*O6_$Nq!HXGS#VeEQ(b z9{3!C>Ds+}ox87g?q*@9f1Ts}!*u<8J4M#cf|nj>cd=bVUi0E}ZoeHk_jPYLxDKy> z7@lFLip^vft>KnLJ&RLuhow9lh0Ef~CHJOmkX@F!_hL|nmQ8PLRJ!f+ zUOC^^w3*k`l;5BPw1l;Hp905TajMNb$Qun!>pJh1^X%@5Q&9G`e;R5aq=S@9De(L& z?Mt7%gAGS=$20^Fy8a4zl!KVYx)H~hXI=`P+L&Dcvt9oCzzgfXDzS@hNzpX;p}}s# z4NPCzfponCVQ>{o${h%+FbGbtiVAB2_Gm%vcYL_n`+)g5a_}~Dt1WYc_VqGg_W8co29_+*UhJ~m@ zxL{XTuzi9DS>pq4NcytFXR&rM_;Rc^i@x;GjqL-f&!>_JMLa4xm%jrZ*w&ueaud0( ze_Q{bygPMR^|gON#-^QzU~Kx&4razqJa@&|hslwL{=lcUIn{@i6!(Z zL1$Qt&a@_-nTBJ|Kl#I9KLlC00Cv8@%zdfwnl-6PCB*{rDd%~&cnrgU!v`Xf0L=I! z5o2M#R}1nOAb5)85y9X75f;HIuN@XRf3JuAYgow|e;9@%fwK_~tO`WhA9b_b!a3hR z`YOE}VGX6UsO$a5vE7aA8+UhWun7yVHH*wT(+94ni|zT+NX)|(cRfjwG0FyL(%vxc&YQe;=3( z^)(jV02x*@n`PCVqXYQcUa71*_vqBN)oa&DQvcvbcT8QpZRN-~ISCUt9{j*{OO@5P z9(-SOah2oLjvvwgMjfPqRBk(W1@{YRz!Y2#S8`m-^o$jwfEsrV7bx2(wQ3P5lmzB? zn+B8Jv1DEIku^sKi&>Y?WOTR@aW zeW{`avV_W(uE7#=5C~t;e@OdQwOrCt(HsC-Y>ecTZX{T$l+5*1LaL-*($WS9$;IMI zp+^xFqAbn`IssACNmlDJwe9|JN=o;~^8nqEex(f9j2u)1zOMJ9auBTnuZ7kaCV=es z2^17uU4_>WD|vshg&Gh1P6tZ(__wlBV_sE&fE^3x1lCdMF2$@=#v!!vRnfQYwdp}RI_|CP7maw zQ2!62#(hL4yiRNae?F?AZYL5HF1m20Ox$0 zT7MT#;}pK{N)9CPAy+2`lgU9NYPJuW(Wp6BY)0GvzDw10b(d-wuk2O~Lt()yEUB^r zXY{`;CSP#ZV8RQr6G!rTgx@3w6Yc-OI)mQ?qXVpbzzd_n%ME2SYjrbg@XgRq{_En| zv&jSbe=_dTZj>W7a@$-V=$t6!`&gJ|Diw32t2SFTrc=6Nu`nwZXJ-K`+t;b&{u7n! zVCGf9(7W+_QyqG+utfcHb$HDZ)wze=sliR^k~PDawWN@$CX-d?yih#e9goB9Rw7YO zB$hb$xCqA(p?6fER2c2WCXTsHz)jf1%pD;Ye-m!=YLYKia=A(+7mNjSix%Z_i;~rm zYVwgd^W}|uq4SJa(&`ZnvAZ>gf9@OxhVwRzqvU5Ob>-dvPGi1m+nDF)yn9GrwFLHGGnv)%sC@VK-Sda0T6lx0euc9-0+?OP&)VyVhbmGfb{4wH`>!C|O;ziMbRz@D?Mf#2sbZ6~|JwPvs()0AX!v||HpUk1OOV9$B#$0V_83a%{G57@{)q1A ztW=sC;6}N%%<@|c*UYTRzP*VroZ+#{oHiw#ur1(eGMUGYd;92K%G8_Lf7yiV1^LkT zbIz;3{XYJnnC$6E&b+`vIyCcwVgSlZBW~1w3`JZmXfRvZor*>fB*vb69zN(?^G^qy zSMG-|_9WYr$==>1Ih5?_!x|g0BIpYF491W9l;;%Y()gTWEC4(9+Xs0L=a}IpxJz8y z1RG!N^eM4bbnl?pzc2~Xf9ccfht71eUW_6;s^W7u!Qp&^8Od>Pic-00V;(tTe^Wzg6Sf%6Ro_$%qAPT>8-17gC_10egMPTSAZgJ3M|a)z@sH1%Gf6rzV);(97^Mcl;UP_CRu9j9St!=i+8fNTE$ z@2vg}i{<~BDGJI++4&7DhR|Q&56ZviKDc7ZmWx9q+YP%VsOV_;-pU;yHuDr=2@$Mf5KW#DFE0D-&fI{9Gq|NsB%SY|P|0l6FuOdwGJbqfu3 z0001!OeYwBBLJ~*2Xp`cc${NlU|?XOC1yfm^PtQB{|{%U191a(Ggysj>qY<>%LFU{ z000000Wbm30xSZS0{{a)1Goe_1lR@m21o|92NVZb2dD@738)GL3SbJl3nmMg3|~35?&Hef)b<>vJ&nSU=x-T=oE$(5*4Tx z1{RbS{21&RW*O=lx*Jd%)*KofejM-}Vjb!pXn34sU}RumaAeG45MuxVCLrblLI#Ha zU_Ju?8B>ONMK8?@vrYH zFg<1}&suM_PshI3+G?#w-1`4G#ul~_pp6g_I_M%s4}I)lfL-k249?;l_HlqioW})R z#3fwD6vUg0&~;4R+aJwD(g zKH)RI;0RxFjBl;>4^GMK*G}oFgl0EYsnMBL9M?Q`zR*xOS7pXJTBtN-ods5ntEkGk zV5JW>b4CK1T=+hElU$jZEEi1i3Du4Yu5#CtDCBE$(mTSp8$2@6`U%6q%D6R5CT6h; z*SPoB1B04ZZhv>_YF4Jo<>E%xch0n0IQaP#?Y9fS9nrzZ`!*iz&r>2}MJNlP8>iV-r6@NF>S2NCZG9fMXcHu-T`8UqQ zm9&(Od>3tzf6Sd!dhz{;fPRX{BrfT!qG4FL`qV_KZM5KtbtSdMm(m5cB8WXrcTd+Y{9YQjNP?1=+?R_dlq{XMUnD25k{5BNPDF>Sa|&f&r^!WY(PyjV RKnr<$I9XL}+DUWB>ps8~^|SFaQ7mHXh~Mw`gc(VE_Op zOaK4?9smFUBnWr}@n~&ycmMz=YybcNB>(^b`1&aS|7>q#VE_OplmGw#egFUfez;|; zqHSS#Z~y={C=>ty03QGV03ZQg0d{U-ZDjxeC^P^70YCr%0%s7TJg{(Yb94XzDRck; z0q+0+0`+KLbrF*Y0YU*}lS=_Pe|1v~^?01s)w@qrQ541D9|IyN@bX4>N$~ALCXu*U6*I`d$0<;v)$p?4NWcJO> zUi%Di2`II0EAwR^CB7op>)n!*{Zg)+?3d;II-eNyd)if|3e~7d&1zMLe>&Br9`$QL zgBsR|Mm45!O=waxn$v=ow5%1aX+zuE(Y_9KlrPWM=64I5g{^|JT-KJ2XVckgw!Sxe zdd$NORQ-c<>refwe}Rt@e@CCazVOv+s<^%t*Y`8)2R~1( zU+1phCkvj?!3~;e;y!n{f6QB7)$@qwJf@mf8hAmkd)7uHuj!(Nr|#lIZqe=z_j8*E zyyHC|xJd=Cc*b3>(nl>-)Va6UxyMW1Fu*l`mK;5FQsWeqQ|S*^excvp|M93we{z3{ z&pxKK2KNS)1a}GLg8PL^gFA=Hf;;D&2X_-y2lo}#1a}zK1@{`&e}|LzHU!dMV{j5s zQ*b6wb8tFPOCa5+HIV*y1X8`u;1r>*;5?!3kWK^j1ZNEO2h#lqf^&xk1F6PPAl-jB zIF)E5q|-;E!AV79!I?$l!RbX4A)Qp345a(d1ZNw~1*aU%2j?9v1ScOY2G0Om3Z4eE z97sJ`37!zN7Cb9xex2;GDbLJ}b? z31L@(kTe+g11w=XrZe$BJ zvsy2Qf@VO>f6PsEf}3LXSUR6EGqlv)YlXuWnPA}@_%rwx!{MnD0!~bRJEyGqJmGAP zmRLbCJT>md``)LQ_rT+XW554zI6>yUIFWs}Gb%Wv&Ves+acQ=2BmX=#fjI%X7sIKo zbYf~RnRIb!?sMbG_vyuf?Zd5h0oKPjo!~gi5TpCZf2*9AOL83!HX_a`gmbIo91Apq z6CHwbC;=?9mZ`bPARTW`w3o~6WG@Sw6A|-OGZOK`xc#aFlEdYk&E?AF9Ko=;4-WgW zc-$YE=wblpjD7SVeU6TDK5j9029DhWS%U(xRD>J9c6 z41~({e_;rP*&h;_{Qa=H=UWt|b18&pNYQ9jL84_h;v>s||$G zkAA6H&7@SOKT z52=qLYUNN0k|27a*r-=~p^){00c=Sdf8k?_TaBQKt-_+S=%X;*qSyllacYhbtOZZ_ zjrNXqW53}ApK+g&FSZ*`TDoretCH8a*V}3AG{AeW(P>m4Zq*FvhSjQQc)f;yp5fN> zvT9!Gr&2KB6-DXC(=nXoXZ4;m+KYJ{0m1!NrQ!_Gi7mZ5vDLkXQ9Z@2#>(7Uf6j3J zdESoMT3+d1Nff<-Aa>u1*-@39^Lhb!lM5mZig0l*!4Y9!O@a$|)UwNmSY*0tkFmF~esMC(|IBe?E`A|6>In&-qzVRGS3BgvRZ1>H0Sh{Ol4onJns z(;r$rknf1a^<>8ImQU#bix+uNeSTbgAymv>wlupi>50cOso}HRBFf@RaqD>S>>WY+ zlSb+*Vamc?6ytJSkt=b%T!rJTN-$@(URtSPT+0E%L42)>iLsdze-MV&%kmFQI=`_o ze971hY-0@EsK?CMOx#92=vos#CIIlJh(JyF~W2=I3qA zFg0h64Q_}Vd4R8?9Js#ny4@={SE}e0bl!()c6`Cid>_nwVt4_)MM? z*!x(fy_dmoc<W#D7QJ@8^_1yV!iPeOdQze%(gZYvtn>g zoBd6eAWjyU#5|jG>#}mvf;-zx)(FmF&CRw$ZqjYWIW!xQe;6ZwM4A&tx?OT41q0j( z1p{JkMyA2Z3oXHBCX-CsuZ6oJj9YcY?awBQ9SPW!DBAxDk6CR|(_U+}wOQneXenYp zU2H@XrH(X7CQ7suXBe=bw&Jk>oD_&n%PX77caZ)?oLNXh9(i680-_{{#k|W5EFJPi z;h4-uz77*te*iL#%NO4usj6gu(d)IpC@YFQ`M>OcV+BWH^|1x8+6$cvcJE%$zL@v= zz5J7s^rQnUhTh$~cmKowV{`Y*9C7&jtH|HmP(I`Um#HY^C0sd?@$HHNNQ&#VY7q;N zOG)6C;73%DvDNBT`h9^eu&=bQTtEe$Cp>`{;Y9`tf7D)O`b~S4n_$@>@et&N?5}^F z#XOTIlKn@JMM0+WTT}o=mhC?XR4{oe*uRD-@RT?4^Mzad53~I%N_FNbpa-R8XNk zLRZYbF4iUVP$igz-@~!F1a66U3O&S^49c{Z?~K{k#5(z2DhHE3_>~>=N1%@&o%m}b z#P`vVzj|Z5JQzwa>Q!ZNOq4wVIS6}=XxePXa=BR3 zOh=8Gl$MRzl59lMKKp1in~eha(h(yaf3@sC85W9aAovqxaRYzp?#woPA>Ex$>3)MC zvm}cLwhrKv32zN&EMLgG)1#)t+Zcivq%`>og?)|78Gj*$`wrJ08U+T`Gx1Ns+`3QF%Ye{wWcKOGFQKLfEYE}J3pawK zy*;^p$F*yk&GawtmxzSl&)C~c|NMD`?Fqy99(gv|e%e*`epm@B@A+hVa{KmVJGn7n z*5Ud|Xx=t(!&=@H-m?sHTn`=fl`7azc3M&NuXhrFq6aqP~0p)e@j*^GD*~t zY#S_P6(LM7X`H-l*~x>q&bzJas;kD6$*$YFZyN|&1$*6Wx?$n((iN=UZQY&o>~D9I z-#U4X+q!S*N+!pzx~l88dADLucQtp z%g|l+-VFst`*1fP2B^^qf5>D5VF7iYJnAtZwKUu!hBFEe5}Q96fj~SEfPb^Utj9b^ z0yz72`_6YYj~3PKZ>XLSyg+>v4tq54*cX-#c8?J_ z{nMfvjS5#@vuleGi>l%$c+(S>A0^~&-WM|Mo#k6t&Fw`sfUQ-0f8qgd8n6GLA4a^o zxur}aVd|=*s#gnn{OB$gj3(z9k|_|n!9@~R1sW!+TQkE5uuqbc@NTHNE&-?8`Dw*#lEo|tYwq3|L++K<%>YAm3h=ZUHpAR~`o889C6 zT9)@QBk)Jnq<0hYe>v(6oAl$7CmItj-gV8Dh^R-pOOX{=-*2CfBYI&^QL*C61uAwC zS3S_uzm7gdU!coS^BO`4^bBqzcL{ebhiYv;6!1=OvwGQ0B;5opRGHrD>_=l-$?ah& zF>5ia5MyA-dKzLD@vb^tB~Ww?EiPw+Ikk#)#;yV)<2qGoe{L;up2xGj_l6tRXEMFp zJ?W5VdoCJYa^{)>CcZVNNJ8xJlg}xA4XGhM-^1bjrrb?opwui z&z3F>dguFsSj8Lsh9{+6*PF?#zu|_S?VeCd+unZGnk8+K!gU(#np-9df)TXj>+)xv zxzs7PJ%(i&e+yYqP}N>sFi?8b_+#E+Fc}Pz{+ZI)@ueXq!w8N&j?zh#x&ln6qUq60l$AU5nF0RmRyIQHiYyLQJ=y5U+Q>%O9Eqbv~a{^je- zwP-|^BsmhTmDewaf#Y-NCDV}o!UxxOb*`g3c%ZntD5(!{=P(&OkfbBD+CvQr+38_@ zf7265PfyJ^Jz4taP1_cSuekq-C+@#ucsho6A6~hs+K5FINm3%QMs?FlSbTiW!w)Ur zP^m@R6j4;#qP5C~<*;bkhDtpWkwsCCMCz3d%V2Wt=RdYKm0J6;&p$a0G#~rmKJ90x zbLfAxdR=BeyX@F;mciob9FEf+I=~?vfB0aV0at6;G+aBz`^KfYHVyW^Jm+_a{aOIr zmn{EOiU$36EZp+Povt#Q; zBcmU>dCR)9s`U#;M=sjB<8L_U#({1iM^G9Y!gWugxYbfUq+G91!$XRRM!jrRe^Np) zz$|w)NyO7TiYMIBO&ahcnaGFk)KG@jektOD@WhN-w^W+AS6u zOzW)`id9z#W7}>Rats~(L%EU(f0zLzO+jW~bfmU0vp@#J4wWfj6GzEHVY$eV90BZ= z^-6T<*TS~J7Ip+!gOeBVVK#mOdU@^Ys;cE1fwL!%m=txG8J5LiFG!uRtH&yVKM?0a+MNO9w32;Ni^vh z%?IGu);~ZcazrK)ePF%jN5xTlM$(8G36KYr7`!n9N31zj?0fk+f32;^OsAkJ$^)Bp zFId{wc}XRH+}*whsM;pWZ7O}h-R!Ewe;v0DuWtjcSLT<{aaxj29)s30$!~}NR6|CSEmvTX7@xudi7u>t@x~_z2b*6^SD3v=q zK7FBm4vDW?`R0)of2IE0r@&afUh3|nCv|lt3Z0!N*E=(*^5Dejg98KfllGqm2L4@6 zWM7e|f(*UC%s`kaorU)2CDHJcu~fLgn;Jq z#Yuj$Men`LW(*ZG=e!s;GT{o%SUfj5IfXB|^HKZI?PGBH*zLC6#8y+-!4z_fX8OSg zAr12#o88;=e@f~>o{@Jfv!O835frF#E29L32s7cjfkcO*%v7W~_DTL}#Egr$Pbs~c zhow}uza`V9z+Z(TA*96k(zisBY!`MAk*b!j86pBbC`kvYK*(==mK{|En6UQ>DmQ&6 z$nIbj+Y#%sn$kZ~^Z;jq%$Cwe#K8@ZrwFSP+V7h$k zR{Q2l?3-EG>gN!DFI_p?PoDKN=cT)vZEV+&e>dFtQJ1ptiC>$17EI2o1{p_;Lxfg>XG{W@iTB##^>MN&(HErq* zHR&}d0WEHA-KN07SL|~A2J&`I)7nmb<n=l9tvxW-m0=8&=?azF;>HC0L969&^+$wWm=v&Q3Ud=|uwa*lD?wZj0jf7u`_tS|*Lub|$UsS1v4O8;9=15RBRfB~3Y`dE&v8FPhIseW_r4dd>feyo5WghnvqWMGf(M?j!8Gf3yro zEq95Q3x(rWA>ai2Yb_58*Jjh0Nx3F%7fyoE@~>bxNltgc=_<^~BjwH9v?0sYIqBB( zG{1hHf|AO4x?f{JGbw9%+2fH16_2+2Lu@Hn@QrB*Jg`{vY4`+W?bPYwuiKk|<;w6? zOp#SHU7pYO)A=~aYL61~nAmSgfA(}SVEXxq+Xt4+*W@v`mopUY41jA{iG8`u26J?4 z*T2VdP7CwTm_YrS6Eer%&9PfMIQ}wjj^~fyD#or_oSB=TbKQXEZb{}%({pMMK4h;G zH#=sXYbI^SribI+OXf9)veIti7+ zfiBkRF@ZhV8YSS2=u~w5o}Q!sKo{b7Nphpy3T_RzarXXi#&*J_>6*nPbBdVdnIXkV zwaj_Uor49_MhaRm96uct!;8m=JkxfBC@$TJvB{qkdwHmLR$`=@Pwe;cgUsdgu?c=$a*p{@9(pb)VM=WlECHxKh5 zYrM}1Nl#|*1lBJGKWUu8`gXq6UWX@{$YI-%lc$(ug(}aiC5By+f0;<>nO&XPsc5az z$g#7OF&*ZI0$;_8>;Rc^gT8e4)y-Y1$D@)lMLZzd=YI%xuWL@7bq%?^cU|viKbqX9 zdYZo>Ba`;sFf#eKd(tC^pT2P9Q)K_$ANHtCPW50T1^(84a2(s&kFU%U3)@Y-{?RUv ziXz8kX|j|)Jn~d&e~)WhdW#+)M_aVC!Yx8>@gd}fAK>98%xvXs!8+a=bey&5cx%$} zX*g*Ai#Hhbf}e$RVEdcQ+?Nb4Tb3-9k}M#P+s`}2BN+N@-WLk_V9FZ`8FTa9R*=I0 z!J{OH6}-)#V-Xy6`(c6oR?xeQl`QiHVKC%75nxVszub(njtnP=9S9&kKe!mck3asyO83kFG&5y}e553`4|_+vqHT_2?T z`s^cp@ZhF1$A=aaqLI{$MBd!e+7q~f>8*vOAg%pQlnlgA{VKN zIf*&@F>g044uz#4LXOiLGN2@WZUawD59*k?U?7YGHEK+4!cEt}`SfF5iB)7~g=(>% z%`VhnoQaL#^j}20SfW}hVgsCOQDDXdW>yGSP~WUK!cHeeJcH~SH{6gIfTay*DpDMR z?g&nVe?8$un5}^kH`JPX*j-<>Q7yW2!pR|dOgXM>s0FhjdkLO)+zum9!~=dW5Iv9@ z1Bog++yuI+!9rQc=pxbDrRL{B(=9n}dC7@ht9doKok$U1+Q%dD5$x+gltq1kqWLm} z%9gIde6j}!->#A7^=h%8B_mk?(rpZ7l@26Wf2x$oc9sIFq@L5z`UuHJV@i9cA}U1b zP768#QPfFBYcsVC-e6Kn^~Q1l9id*O2-uD6R|LMQ_o8wTsQ|A9mKi31?DYr~6kJ_} z*RWRRL@Efnp|x8$bnWBw06Yd6LM%woK;_$S1i;X0ngR2Gr%1LXu`Ac1D{2_P@}26l ze`HxqM53xG3mUJ$yi_T#5JEl5&LQ5TN#5R}q17Zp{N7Mm5P0CtQkS0>yplJJvM(NP zAuki06iQAH*xQYO<%Juw8+kqq6_F|eC_-P4tPqgp3P4b6{yU+X<&hCRkn=+I4@8Z5 zh)j5$gb8@4hPs_dP`GF#BH@XLC~>6Mf0{xAQOTDSkiw)rCiaEcO<+SzqhT9ydnsCq@&jX~lGD8y2U4lvIW zyam1F^@zOBt7|6CjtC+lhNi?-9zgI(RQFmq1TPqaC`|Am~Td|k)!LIZ?nrX;$h(j zz|D?%ne)oj!;5?%n(j^s*3#1>x}L$;<5R%YJtny^kO&470sH62#w2#%eShp;FA6e< zDxWhGp$w!$x~Kgs3zU#IoZ#mPe~RTvF?1CN=SgzJu>hwWyYDD>D)O*%QRg|9J>}Tp z3(q2*ga2mvgY4db-F)a9#>U*M3Fn%kIrf(pkaQ~>gR!wOE6Q$D>;r#prh7;E2K_7z z;kvsV{7UYxxINq>bG3jOZQwmJoHcs`HmfGgs0*Q>kaIPFX_>$Be@XwPfAwkgBZ$UP zd_R)tOW;E;iT5WG{YJ!W?lB_~bEepgH2-t6s_W`z)i7SUKrsx31+TEA$_nh^|FW2T z%~^vnH^f0~$sG~iN%Y5?|AP$%@AxBqth~<+BmVOZWew|f4eRi|&@cY$;_0)=19=Ab zXa~v>tGRWK4|G%kkp7#0bx7ERA^Huv6cBcl{sPmT%V%GfjWI2&2+ouL%v5r^_c3SaxF&>|9-{Mp_ zh!whq1xkhCF6`o<(*<0ET}<5&aB9L1w*Qx9x5m9i!oo` zm>b$px+RTH(GWWtGxblIse$3F4dVd$HA-DMu8#Ye`KqmBo}aS{YDFkA59OYgD?IxK zjt@am>}ST*8QXu5iKVPrE>mF5rvG)o(NkM6^G?W}vtRT3wf(wjYV_<2BC&{zd9kyn1x`G8S(og=DQc9 zR&*}hHa50x*S4`(+Xb@Ob`y}cSl{WJPVehGy}x}S95Qj!VbzbiE$n+R2F!EM_4iP> z=$o-qF(1eTmtl0>Y}vd_=VdODjj&?@V}Hzo_1&qh^ixw0f76bsAJg@-Fu7%2ph-PlIxdIzJ$ASE_tAA`CE)m0u2zwd zURF@K5%6Vy%v#$(P9x#lXq8XbV|Q?K=ezachjHYG;LG-DC}}-muVSygs*ZUNJ@l|s z=vIMiw`?K9f1v;9A$t`|KU{yP&g%ZCUdQJl%(B0Q0eQC0wd^@xqCcP)ap@L!WVD_6 z<%UtiC%I{@9|ah8lT`sn(5<<92`kP*)534TbwXsoK{?o>4mW~LNwE=|`` z4A@i23-&v@3O#zLEu^2Lg(5-yDphZ`kvDYp^NEhve>xL;Rh?ecC_J95B<!kU8`%P7ULNF>zV0<;{|#5PqOyw@BRdT zkWX}WeuI4wGt?WicBM1^>OD+d@*q8pxF8h_+;p?4= z=0u{aD?#=qI(x9iYHSF)LcWOcgC6B+g}F37tr&B_mi_iFo}s~n3G zTSey%iv0_dARUWdFSO9fxG{?CsEW_r1P609e`X}dy(vn?dKmM_A;jjDRH>Aj`a-I! zEA?FsrA;`?urL0uY7kwaYnmAE`^;$R?K%%P4`Gc!R^LOH-O|NnPZ|Eg~J zf2Q+-GE}tRfo=%=9sZ#B7w&@#=bv?UfMh!0f+HL70H5~!YS{Jvup9ml#L*C@c${Nk zWME(b;kR#2$Mf5KW#DFE0D-&HPTz*n6#xJKuVb0T+y>-wFff5c0hiAYGm~5@7=IlA zv26!&004NLV_{%mV4*fJh3+y^G5uzoAH_Gn{U!IUoO;g0sFeNNM5VI|~>yt;$lHOBjS1V7l%gKHJy)^L~IGffkPP!biunq zj5hQ{?JhW8DrsV>%nK7QRF%ytZVYb{U9*%3`!wFCgHEh1J6)<~%}nwyH5s|P5-mDD zVU@^boN`I$gVK^#w02fSnp(;d*TsNueJ1ONme1%zh@h9MjBK1D``jRQag@9RVqwQ^Bn zv;PkXoXD^+4Rrnkl0nk0tU)Lep^9LFL}MeF+C9Q`?)Q%02{;B62F@;z?QwZ*vEYKc z!*}cQZB74i;Wa}klZXFb``^AZ?|m~xwTWgkOHeAM(Fjp29;{MXESpvWfdYkVI&O_+ ze;M^kzjZ%6ZSx--aUgZTM9M(1f&*Kk z>!tTtN(wWUyo7C*fDMI(a`q7OW8eMRbAN)sE(dI<3&_{ju%xS$3O1VC1tduIinso)fyE8*DdL@@E**R^l&+F|UtcGxFdOUih&azk5uS)eM$`8H`^88=g`IV>EkC#IQ*#!sp4Xuux^e>P zIn!A>aY$KTMT$)lDfAY5}A^7vW>NnHQ=BPih6+qqg#Z7$BLLEH$MC* zC`F2O1J7QNHilMmVxZ3mkrwGNU=e>Hj%PJ?zla-W=Nx|2xF;ziwnCzfQ)RoOYSL%3iO%dDyp4`>uzF|JeETe}l)20i8Ou z88f89TbpK6mY7zrTZ^TVqiP+kR+!Xf-mD3I`jvVZG;W>sHt3a$T`d?^<1Uk{RVY(8 zVwu&}s8gWqjA~HA@*tIfvsVG~uApNh0VrUGzyJmaETEHs038Gl&_=+3F@gpdBItk$ z5C~u`!Q{*&766(FHeiZa1Xx0F0Mi5)P*3mx-GmjOg|GuGCB%RP!V$1YxB{v{xB+?y zA3!VN2UtNU0Fy*0po>rf=7~taED;TuAT)qJA_LG*6ah*>Q~_2Ib$~&_02n7W1J)5+ z0PBhEfDOb~fL>w;AP2DvPzmA?U^y`aSRgI|hKXl@8W0PBmBdFt2I4zFBk?<+7Q`Qb zCgLAJ8Tdh<+PTC4Y6PU`09eM)o78HM?gF(2r1t=*;}@1HfW!x?2vP=6b094TY80du zKsA7L1gH{_MnO~Ve!~NQQH-^*pU0##15NvByDr*1{bjB}1Rb-|S|LU(lcT^8DvIEg z{ToUIkpKy##wa3y7d3)JjASH=u~p1Ocg+%w5Hu3S{Df*ALMgdzc`*}G6z;J^+iiKD zk%$${iAzsBFM`&~1!F}BiS{Qhiso~LVDxfsAg)Nt>h+>hr09(g=yOgvO9OObQ?XXf zt!gz2-CF3^+ue1c;Z#ZSrlYb3-4xJ8!Sr z*WPImCqgg=K)5R>xT>t-ECsULqZsclGwG@Q%%dgSA?fFD%d}8~dhsr5?e=9*$Pn)3 z5r_(pywS-QIFFUER9b9vD2i8Bk>x=cdLN{kM=p&_{^&_o0o%-xm{R3R8w>~|+%;*? zEmVzK!u5qQ8ROp-i(DKVv7=qjFd&7Bn&2EA7>e{L-2XmA7Sn)g%3@7s#Tyq|dX(Sp znn@xH+i*Nm01}1>Z$c}ar}H}0BE5+kibEQ?dBsAVAgTru->ut$<8`NO7}h%Cs4)Zz zF8zWwUJpZ1X>Snh1_NV8j&QDSdbUpI6?LC1QRAL@s};&puE7GkzKvJ3ykAqzbOLLS zP zYVR1e4j*pNrI`DRfcV&9gUeUy{)#AxRuM5%nAWXlxj;yR;mr-!uBkGM6l_|)uf@K_y^RBx`9nZkbeazn_%W9c{8uXur z{3$tH8h(6TNNu3UmdErUGraEHq=qa=RgTkZ{_`)AK&G6&W5MH|9VG4d9L*F8#fP6#jL%T@X|ydN&$pyM7I5Pxc~laFLPAq zX3FL0L9|P%P*yn4GbJouBU}40HcuzB^vR_@-IW|Z;}`}iC|kM~G13%yJtY9z60W#5 zP3uHlP}RxK4wL|63~JN)@nRhu)@BK><9z1=sATXqYVGbth{U35y>t)vqG;uxb?s@Kw#O`vJ_(O6T$aJh9a-;8Q@o2Fn+`#Xv_)iGGJ^wQ3UUNg zwN+{^C*u9*2nub92c!Dr);ecw0Yk{FG6d2_Q>gX~=a-eI;QlbjSFR*uT=aPY(ap1kB)g7u1;b`%p^X3Ka9CRvd&!V|JK4gK_6yv$h?1P?e?01TZiRk zn*a*&dwa&^bAFSq%|xnon)5)WcXPLkR)T%|5j79)A3I)q5eS@bviR~RP&M;wULa`X z&*fJZQCRj+fty?2$K87Sw75lhkFs}9L(+zwz^FLR<5=QNJN?#RHyx# z&j9KTkeEZ)3cFq*Yq({!=iDjLHTWD6h|*OlUKN+3k>YyI5C>s<@L+soQXzXdkZ*11 z9#d$?SvA#Hwhr|a-79V)%k;6M7v|toa^Vi{yZ0`^nhNESIy{dV=Rz)N2*ts$WO&?qNBan+MJJ%9@?kq!()i@zT++@V|6zL;%VaeE>y!C zD(7h7_Sf?-YvCVywBX8)H+uA!ne2ME=$e`QX~YY!?tE*++0?C0jgk;WZ0P^Y0sL)R zc-4siG_SqC*1O)B$zOW3ByJR0Vc6lk ze{4PZ;C^~$KmGWFbcqfpwTcfIJ!FW+MfkL7;z-9O!v^1U2f^1JJaJaSS(g(qa8yT? z13tvtM^kvSP5XvrL}6Qq2Lzly{s6L=iNswxM{E2!7l5oE+#PKg;_v$75H-^;+A$*F z|5ts|5V)McPgg$db!#PcteFl4zttUE8go43~C;Ttk=|yAA6flRjIGYo7E+O`T z@D{?z;Td|1>K(d^%i7_^)KZSKPd?)ek?lqeHD-X)Aqw>iS#QHx(hfAw_&2)824VvD z)W4|i)9lRxipZlS-E#+z5{k^D2=x)>JA%b7RSXSsOCKF$r|%}5`ju&CCPAj;d8O4%)U0tgg(Wg! zOU#*DES(;eXc@Efla(D3cjW9-bf6WE>HGT3*%|%(212v4_rA`qX9imRiYeZxJdg+O zBd9ZrGjr%!)bo7md1mFFV}&mhJ|w7!fI)*P@b@u((o*2v545PK!b?^8pm+g@Dzu)G zx=f*9SEiWX8Z3@stx1A=If_6fVSBOcGk90zALpg6>lWWjNiU_eJ=?38^c}3^8rok+ z5L?8I+2{^p;q9Y!NW%IJTrUl)2_(z%VWkYGM!6B%Fzq47|j{BN8BOn z@0{UVV_-_Swn;T5EVpkD*aB??c&=>ksmNKZ zN_gM~X8avptI!g2oR{5dRXNc>!o4rq-b6IIvxG3F(7OSpXq9nnj>6?^S_N}%^^^?6 z3CbW2ge|ry6xApd^%O+b#j(9tozN zgcTXi&6eAX>x2AE*hC{vq%<(ntMK`0OLPAW83Is}P|=uKWHxlYbi=RpCo)^Zmv{ll zZDbU3SC*>iC^~kd7f>BZ;Uv2}(F-cvYH&|{^_>412X~<{@4}^CeS75m^1Ob?{1{lz zkxluTD@t7(aY3+nVRm87Ip_U2bm}7uq#W-(o_uie`X^%7aejBrHKD61xaUiMsqHCU zRH7GTe~)7pIXQ%Th;a{O>3_v5omi$Ks(#*^#&-$)0g(ykWR}j0A_jx|yq~}DH}?pT z@cYIxW7@G43^^-uTgpx>QP)&9|JsaAzctl7v26Orc;K-^_r3BH2~1nTq0+h?A$yF( z4w?;MVZXb$padDboF;Xc5}w9DojU}8^P4N9|6vW@e-913y$atp7rciVbz~Vn-dcYO z)Kbl@6aaA2nB{qnPkr&>0}_7Y>VbhRWZ<$X>LLX-2JQn;$>q6sQ@b~tj4A)JIQh+$ z>c8!mH~w{rDKkbxdWnIKTsk%-oJ(q5;`rLSG&{0kCZ$x8o9Rp59+iG-Gyx$Y$0quD z^~^-i7PIxt#2}6bfj3!b){TKEU`|o2ya>T2$Ncb{XQGFDVy-47y61X57R0b8dU!Zk zR}n%8RUuWshx}e;xf%!IO9#H<;vqt(Stphl)_9u%H#WkYwoBnnk8c_CCMyC_!LnLs zz_Rrh7=#*14WUG3dnnHrA&a9OqU~vdJ+piU@B0z{N{7uZ45wB{z$z2hWqF3wPtc?$;ex9gvk_Z$)8lkiQlspElhlp`pQ) z5qU-JuWxuFNhu!)45x&8p%hI|la!>RXc{Q~E<`Fg{OcBkJhjE&9?i0kj1XsO6^e{p zA})US7ZG8fg*xnaqIkx8vL_tlO29j4kvPRJ+b&tG7Khs9Df672!XurW)h-dab+~i3 zGn^H;EP5(=C4BtUQtRyg%eqzbtcrnfs1Pmm3b!%_LYSmg;57qC##~ZaS_dtQT@iy0 z2`yh4SqUaxFR(uvze~-pqgs#}L|u(K!>&yAQnv~nq?Fpc+b_;Www6uX{S=y1t`o?T z9~$itTVRXWacf((@gdWIJVFdi4U@E_Iy*1N0QBPd@AoT5wR2;ma{nmoWrSk2o1@_g zWCD)X;!>q*RHBil;))_ktA0}CT!%CjRjbidX%P+}OsP_h1XUwsZ7BqfG$u{$`E9il z6XlBw7c|HOq5{PEidvd{(ZGQ`#wPQ=3S!uQuaKebS|=X`WE6HjvQm7qKg+r2&(u{Bn(!_X8co}_^J;ye!{HZ0Dv;alRe`w;c(tz zwju#p3WsxVTrj=4(KFHwv!URkh*xu+m`?EQQ6v|L&lcojlshoILsg1R;xXDrjWgyV%VLq{5-d*526b#8@Z{?*qZmX9%I= zFp)`2lxR`}W&Z2jC=?VxC;|wBuNdD&ZM1g#H+l=doxde|-V5uEQ47CdB!%)j1_c%a)I&I>K(HS>wyzW?yjTd1X*u3OOQgPPnC}k@L^d> zgE%I)A2~^hmAsOw+#lS2;4HPQBF|!uHLoDgFu!i*DE&mfz7?V(KVr(kaR8@++KHH> zRelT&U1wIxF>#i5G_g57_~_Bihg6Vzn1)YNC*I%mx&LnZW4>{^s(?{A_}kg%oz*Kh4N4N53I>acdIi1tu^1Gf0st?kqqIYG ziBLj6L__g^aEG_d?eL;|T|cnpIA^#ea^30iLF45=ODmdJ)|!@I?i(~-P26ViN#CCZ zcG6KHO5d8=!#c)kWr11$T|T9fm0YOv*| zo2RK%shl(mO+)>V_4#I;MX^-+ohrGwq28{)RjMj%frVdbBEE*O?fQN*giI3z9GmPLlAh+MX<@U6|H=cE7AF|;~I*CP4B zwslR<_tef61;;98u6B3Ri>Pf+R!^&3w{u_XX&AbRMvfz}(5kIAzG)$9$6R4>duP;} zx|sEHS(=wuTA9OcC<_*p28jlED&ByKRST>zGw=<2_T&rXdMxEM&iov4eB>tzWM)Ol z-m^zk%6UPo;gpIlEt_KX()pA4X=I#u&K!4|g4N3f`Fr*l_#Zy6TuE6A0c&alaaS)VZGLyU()*BgkE~^2PduhYo+=Ojzh1>n60Wsr=h`qBS?= zG$F_%h=*w&tWkvckte2s;v7zD@f-D zELmhZGMZ!g31bJX!ePUv>|rHr-}7N{DSP7yE(U5ob^cF#iKu~l!S-=uK}C8!bJ64nU9Uc3ks zcXjO?ablJITe&#wb}nOAqVQIjIQ}ib+DazYOpL8jH>$_#CmItNxd4OSfe7@%|i2a~gUqKB#$jY_pr;FJ8DYN(+&KK}mwgm~?laj)k2 z9%1GCIpAakogcO@7gP!jQ`3L+Tm7=ryT{^984;dfPQXMG8#7N+NVJTvG~IHBIfKDj z=7Ry7aiBgV0%vJD@F+`>I#R|`)^bdIm=Q^e%7Bko0Q(O5vbJqmUyPrx6#| zc{$TzqC=G1{t7vVtfg!q&CYb!^H2WI;7MgF9)otk1$bXfDl8vf(kydkR1sY1 zdAO*MG{c;Il?;!QfVmhpB1YJcWQ1Md@eNJ|8AQh6u;E;~KVVcofhQOfTQkOCznQQi z0h57PNKKkJm9iVu1G`ZeO)>#lqTc8p@8%Zo-Z0@zbr+_)wGP?6LDthwI+Jm=4zHT9 zMt$w9vYkZ)U3ai%`bQmWwT8Odo+Mkm&E^5#mlRKU-|XU#^LKs2ONQTTOlY`nwfo}4 z@bEX{L8L~~&t%phX8$Db`gvmKW|UHErtI6IZsS}%c1*Pr9{CR_Y@Q%BOb=&ee+>nt zqr-v4pKhXRI25i{>N`d2t)Dooj<1O?j@N>~(XkynR<3Fy8_9qct{`b9CpDxCeL4B+ z4I45uq15!)TAOO-_dD);(i=f-?b9Jd+>rSrxlUK&GPk(kvegtcHy3o~^s;&D7BEF; z(r?~~k+6HcC|dBVn(BYs(66D_!>cV-k^e_o8ZD{S5w@JJqDRrg=<*JUO6T|em!V-q z(82!e4M!7oiPVG21|C=;GcyPR7>vcj$o^nYYfn$$+5J~%Z%%%yv)b7|Iv`Fw$<4CJ zlt%E36k2Ao{@OZb}F2{Eb$tQ2I_}@rC3w3Oqb=(*M@=r zRt&?_=OkO&^84n}#p9M-gowcjrfC5jgjDU1Z6N0gMJ@Yen=5uLAzJuQep-aZVR;CT zZwTnnr*>PkT>2~g4%QM+ClIJ?OZs>tpybjOPYT`u555hJvfSK5L|LDUhX90OuVLx& zD3L9tzQ&MjxF`Yg91V)10Rk2xul#T@$_CRRsxI5;bDBbN;DHE-= zO?faDgU8!25*Rj(4e2voTgjkWHR;`gIsg5>@Mb25*f4CKTWr^{ynWu(~N;V12f1LWkoEmK#Hk{mj{R*8! z;ZiTT9$*--Wa@DQ?6rF8s|%*)1S_b%2z~|>r`Y8_8C={6prNN~6yH-6CT>$B{AWt| zm+;QN!b$<pnlmvr#C}CYso0#L>J$ zuq1Sh!r&s5F)D@&D6-+dwb~85Xr~ZGWo2-)U<)lt1tE^nyboG!CkI#zwgG^2DtLCD z$sQg_`3_ykBW5o*=&0kzqrGL1ya&AdNz*_-qNzMI@z+h%u$2P`R;j(#esH5z(9hI+ z95U$Vj9bUQwVvgW=>wdtgJN+Ap5V@@*$c`LN{U zKC&bq7S;-C^tB!x#*pTda&q^QZo+3t=aFYHI73=!BaK^35i4o|xL(R7&A@pNtc;cyEsa)c zt3Lh$`>bwelfJh8Ov=m1CNFG1a08H^aj%eX>1BEhc|OSS2)L8a+dQ+7WZ=)Uw-{gG zs#b69grm(@vF$eP+JmBlWumfqQ9|eXSpD?9@(5XPS-G|xtSG)gOuw4RwhqDT0~{QS zi7!FUEQ@kE@$$vXDVOb=8#15HWcvLF6UXSsWIEz4lulgJrl4TgsM}E7>GWYBeJ22* zA?zcJbCP_A@=_*R2b;KHhXP}6*+M~3f&DWGYOz;L9gncdXowfS z;sF%E#|B)d%s?@d4Ss=EZSpI$I&#K!D9R-Vgx0N1LLuPV>N}`1(uBi6EfADp=V6mv z?8}G=5(s1J+#G1am0&uVeuGv(X0Gr}3w-j@^}99Q^c+H6Xqm0A3Bf+hNmql@P-t)k zU(9yi$#lXXlq_Dc6+7d@;G{b)%0^q^FQ%|274p5@;XCm|uvrWCH&O3$^GADpG#!V* zjt84eVc(OxHj+Jw>$v++sq3r-C@;7@zRR1domw)AIfqZ$=Co3;&1l7p2Krnzl-X+^Hkv1UVlM&Hu*5 zMfW(5Ox~EvL5q%5v4|{D5zWYsXL}Nyb!1vslNYkA&25g~r;Vz0D+$D^+yTa1e z!7Jr1%3+}#81bazM(nLyDEW6w>^)1hAKXgC54Xntxt+slq-|kXODg#05CV!Q?;|R# zk@5w8Z-1lW3S3_3KRQpC6{X4B>fB#w&{bjMKh=8(GLp{L(a-RiVO80vakj)FBszrV z<9?U2qLaebgKr!J0whFoJv$&NScXg=#IN3ONMRM=knDfW@c}0HK9WkjA=qD{K`qyj zc<+<)E)Y$MC~;&?E%LLkp=uJbB8}WAp<)tDXal41;U1@xSTR|@T%WO`<8Fmf{~OZ? zB@!ys7@(+f9Hkuq_CrmIa$_7h^p zi|xv9k0P=L^fc8BIV}W%nW3GB7se__Dl0NPrn9mP-h&yj3-gAGzz(Mt&yFX-A#M&@ z_KuCW?AcCA5_^ok2y9KqvtQ0~6Hk`YlQy-63yhz<@6qlS&_j3!hAMb4KwNwy6Mga0 ScGvG#)5y`pM4NHXI2ZsyHhgmc literal 9352 zcmV;3BzN0)Pew8T0RR9103?V23jhEB07q;903nj&$*|w6>SMZ?KbhLmDBA)j|&tP^{MB zfdnKcy-{_Mdb+h7AYkG7?~jzT*)DzrvVg@j_UC4KlYoUbO*o=4FIHlzb+BW8Y;qwRHpW7W!?SX zk)YDNUFq@9Qy5~0V^eETN66L!R_S3u~c?A@tFJa%q%l!9~ zuPr7Qq>4=RrE_HWSFkmDO=T_(|MV=P0LiOerBHL zxS0}OZ{U=x(}IJ?jVE70i+>AFr`nsHZ4XBD6^?WqX`Qp)#}t_(Y#7snynbuVb-)UJ$mKV z^c%Hh+m3GKmdzPdWmUau4GOJ>ELpdqMj|z1Se;Bs1xX1!Rzv!Sf8Qkl#T0=-AAv^!>w@@PrxGKi+Lgt zl|&G_2sxUGNURXb#y;_Y4nl=lBB5~`9bk+wpod6BFOiL$D8U+0gMPw_QDO_Wh^^Qr zc3_9tiEd&K%84UbCb}?3T*4sn6jg*BtHc-76ThRH_yY~ZKPdQ|P+EByP=+AS084yv zv#dkzLfL@41Jv*(wj>ZfG})v=nSqo;8HQ9qse>GYl0kZ5QboztLx46FNBWxa6p&m! z0F9pjt*=GHk`Lfg%x3gLu3VKyncUY?tqN$!RxDR2lgI}clIsx)ry$5m4h11m;l#)( zV&n}&WF#`fQcqD*jYJH-Z9azL#=9ohJ)hW2EXy{7_b(&<=Lv$|DK1Q$Ly&o{6D>^i zkxW!9SPFv0*iVAMnbWcisLiO)>vmo6X|fH`BTcaZu%nnwHP4WcO>@6Psq3oF!mzNb z4FD;J;i7v|nazuYjgg*tTq&+8sd)tnLLK$Y2qf5!a~0+&YNDtaU&220|DQdOr$DM( zLHJasj-we}5DcVKstD0s$;w?IO5f;i!Mvp%eOH70{^-;gXJuV9D5q+?`e7J|7zMqe zaW&S%t9{d!TsA})^tRZcTyOS+j1_0)?oE(`hHj=SFZ&`Mb%(DdY(I02_HqBUef7}) zVLAVIivM@6{I@r2DiKXJ#%r{rLa>~O|7**pxp>Q^I%P%sRS=2PjJ1vNE=i>#LF`1k zWZb9}pcU*KrRIjH>4!$}8g~LSOS*^8p)4zkGMz{TtyXaUuF7PTSdm+&lX~XLep$6J zni^4~bH_?jAnMa{Q$#g+%Gy4?{6LTy$CvI5twLU(lNa1D`RudLy(qn?&O1Tv%P;cz zm%a6+hl#X({mI%d=e-mS7KMEaM$8(#PxFsZgbvuLmy3F4HfK_)lFrW=C*?rBeap#i zFy8Zf>)+Om$2z9=JI_U81gC{NfxM;~qAsh`3(c^+tvs-;K5*r~-Sf$C>))+A1LA?@ zPGB6z%+3_c?r+V7=1s==bjQltj^nMnhSk>EZCiisEQ7dtRWe^GVO}(+)f{OyU##X) z7n5Xe-t!uR|95UV+g?KXHkV>#|H%X_1XtM>>4vk9+4-@W&^^C@_X=drZ3%Ng`4&8XbEnFiz^4Okay#`pP)+Z6^~KL`pN)R5~g! zT2sO#E!diILu-^kxYOkacjsYu7{hmOj>2TF%d?yyy2%gB?0(1&qX-7?Vo|tvz7?O{ zIRO4J?6`+b-ZjVqKMX!V<@mM%A6NeFL@+rq7T~&P$7)B|z?~5P7qeP#XTFCBCWVOGD*X7|XI{z`~<{UD!4jOjn@mH3zb>WpR+=A}= zjB4~xN9T?y9X8zdH&abjO@d9}Vctk0ylsl>V!2O%GBiXGlfy$k!{B5sk(TcLiD;CZ z`wS2JbN-kpuD_0mhpE!Z)iN&6C(b6LAS?t^g=fPT(vtI>Vf=`I`Z2SZ8Vh1|g$9Vv z+~<=EDDzW#|C#x#Uc--HrhawxB=lkz{|B@3Kj;Fx-cBzX|A&gi=&jtK8NYc0~qoMbwdd4JcV?b?( zg@KJeLOr4MsCA4n&$&Urig=;uKbCVbi=br^E|V<;7e|FDoCcMAQYDA+85`ZGGKfZ{ z=CCMLqvUwjj8}_w7kn+tb6$k9te-jWjT5uH`aorC5QX*CVjct}Zn|6)`o(Qm?ydu1 zmC;N09wa>BHjU3P&WvMbY(I!9TQA>bW?9g#rr);ty6lEYNfFLRW0Y2$z^lam4p)Bl ziVhqxC@Hdv;PI-tp%Q8q{FrJnzDi}SXe2Wl zld3td8I360QNfI~fJvQ+_eR!sDTaeY z0^(^1VwvcQKsks##4v zIE+Uzf9UwX+b`t(AZo1p>_hE;u>rI_V@lhjj#mg@je=2>iAaf*;o3^}Pdtv@X(_1o zOdYZK%sto(XG~SU_;SazIZtA+aP?4OZyC#qx3pbdF~j(xS_UyNHxT1k)H^=)j#>F} ztoWu7LX1V2%_5N`T*rjhsk3JMh89j@aAQ?rR@@0dB>qG<227VsRv9NBWo5e!y`s~h zoNBdL&YS(kamV1r=-48?Vf2K=Lnf)1 zS1~K`WAJ2H{~^C~9`*-h^WH>j?rb%wCU5_l=){-*iT~BV{GT}Vvr@BbxG~-&FG`_% zDl7y?0{?@1!v{VD+S6g*YPL7$XPD(9qr4wQ1Q<;=DsQBL{(GI}WqlOo5*)b-UpV^8 z_uY+Fp%HoS_FBAiU$A&DEZiS1Jpju`6cre7%t!z+dAGr}#m<8Td`k11{y)wA1G~4U zm)bAiED!4S<}HW-QqLp9m<4luOKr{=Dd+r3r^o)}Ry*q^Zh6&c*KKJX-G_1@+_`NM zk#SqQNdk~r!?mrytkBjoY%h15*{#NLu*DYfF0S|3p|ZT{p}f^g!97m|=kV4Fsbomq zadEq69G?mPamn%mqPcvVqqXf`sk<(w8ELT^?$ldKL~480&I3-gXC}t=t-^(*8oA^h zgU~ryJ$WWvFWruEizmR37)B`wOf+|P^7{}c&(|2YclvarnPvPEN*9bu=gYVn4_xR) zTt!ZBl%1D&M2C6}e#GbJ9rDsC)^(;azbCuJncw!EUf%nU5Zwm)IdmC%b3pO+5vPab zGja@TjO8C|@Uy>IJR_@*@%YoTH@cprk^22?-Ndn`ph?*JiVbH>VTm44{j2XKaoIm8nZx4A4VXb0LfyRabVfb4^kIK zK+F$CuRhF1yg>|O^)Ex}*V8Mz__2k@(D-j>;9;}#RU#1o-$AeT)*k`Hd_|RJ86(l6 z($gFr`()_`2|aL?(QFckQFo?mRk(}l1+~a})S@ zMJ9|`OAK&vA+p7kiz@-P_{zq7H=)ojm?2jQZkt(QjT#LM0fAxzp1OCS6J(uCejgFz z@^)NH3c53_sVr#EM7GJD_eD$k0*ow^kBP<3k3qYnsXJ{ffk^QM_D9PXW4@0nv3d{{ z+su~5O#M=~LNny$xxC5G{x-IWO=m>r6PKRF6swQX?)qfs~Gt64olD zMpUmyjnZr!01QT{L4xWLAyX*`Tr!g!Yxyl*ivvp+E*OwO!~mRish;}j0UAHQ>3+Hs ze%g*|{61^f&r*3RJ&g6FnJ>5C^5iK}V{%w3np>DAPnAm3WEqnI6iDUCkQYvU=(eDQ z*}{B_X9ri%i}y|QU%QGtFvzsJu;pnoSz6HmM2f_db8ppzcWCVzr95TAIizmQRB$o{ zu`7HP_TE1GYr?Pgwl@20pQB1&ulV9cF@l=D`q^7sGxJ$}y&eAA+G@Y1p&hf(^CTDV zi-SGdU;DncBZJR;`+o6z=&zyT)!9y}haPOQJdj22NT#8|p3N8l2`z?l* zl+DuP_A8Z^c&akaoMFslWGb3LcErs?nQALAG0|n~@;4g|Mzf>q0vn=)zpcyWhh{XG zZ2$-uiRd-$W*fSfZ99FN!9QCKILs!&=L>uwxbRs3_;=uF{mwzwnu# zZbGWmV;_F7XFe(Bw65bO_=J0ldBR%3BG(*|>w8VYMHh1gjNl`zT6O|!H{#X8u4Ms( zZ&@_0nc7?$t@5y_7Vl&3Tb$VU?j7YSnwiZNX4T7JTC?s-|G%BsJ1L#m`yRw1Q*dgi zXTw|HQ4gfXp~$Fk>~&%$q`}J}82SW}I0+M(#DqeTA}EVq=ek|67(x+1=zPieqTM74 z`d7D=znZ^Qw{C%Glh*zVMq!t~R?wge`p+3=*b~el!634Mzn0$+iLDTGf}Qck?Jctj z8-f!`?rxxE#*Uuc7a&Vi@)Efm$XSKFSdQcRBWK>+B3?^L)(=5HaEe_^$m5t34He`u z<~I!-Riro~qA(!%Cb9kF(bS4*KZ$oX8pVQkI5CIC5stLI)6J?duJI& zH&~E)7nRQms)(OC9RDBGlDui&dg;B~x@mP$jd#)2;Ax#JWBC0qrWwox0F}AM+BDR( zrnN$dq}R{Q6|GH8V@=j&?7}Pe+J3N9iA^Q2Hl919xJYMTwW(>`H*PQ{dK~tySoo~G|ZR56fCrU~ z=(Jt_Gq13rvf5F8xvkT7b?$bnJmp|I*iA=;D1Do;g)b4bEH-uWT1_UapsBVSEIwy* z>#D2$Y7x1Vo(@LKm%2Ke$dL0xs`KEcI47&sMozMep{}+|G}M5jJ44F0DR{0QEOPke7-;?azkyyCq!Q~DuKmDdde7!^^))De%hz_$Re zbS2Ng8zC$Zm6@7f;}a954Fo!dM&zK0N!ejZBpQQ`GylF`nk+$+^I}jknkxvK5;V?Z zG(ZzDss>w08q!wG{}?Jloh*|TUzj`1oEok(kCM?GI|vX#MSHY_bfSxPdjm0@pp6L7 z_g%wwtxGylONdaG1`hMz^J9*bt=*k^($ztM4UU5SPgVa)Jus875RS+{vJzfMn5hoX z_ua}P`4J1@nFO`6I@#mb4lO&t^gtd580vVUOs*wm#8ds%4 zA^{I(-LgL5R$$yoiw`uD@&Fx|0pYO^JU(gTZbu=%F5tOnO@S;8O-Vu1WCd$-kJT3_ za${q26$SOje$V(PRL!Xw8{0|=al%o4>Ull4EXfegc|*l)5%G6jztO_mW`3T%yp;1j++@76V-d`pKG^2-sP4C?%=+%&@gnz zfgDWC656Wj+4Xkqu8Adat3B82nv9JKS#nrda=t)E^8L=zSaAnW&FfIJCks?KS^3s| z`xXfl7A)lq&iOoXpywwFg0(0F zi}vla^51_-UBDu8G3{o;Il2%Rk!3yaL_kVPXq#2**E){(^_#i+Lwk~Ihl?@MTD3!- zdvG%!7co~p>*LQabj0JBb=Uv>mzI>Sj4ZkH6WH5C3BEe>xPL7#;y`E>Mv%3%^7+O& z4}Jc=Imf=fZ#`k<@}j?Or&eYqogu`A#1gNlR%OOhR4X%+uE28iYSKehQGgP%Sb#-| z1FVFfhvg9Ze0|*hvZ!tSe{PUD61cL+3ZysF^&`d;T8hJJM!aDa?A?oCag~rK=G#VQ z_G;dKCZw|K4EPlWb}Fz9oAb?iqo+XL0&|ul&t{AlmED|}@0I>20`upZ+>+)zYzL9u zXEo~EYRxSMteT)ocuQC%&^&*x@oH+?JxyL}?>7oB&Fx&qb0dYfG+wjc0IY{(aQR^0 za{UT@U+v%u0lXT3l5~YT3g6VcEqZ&ZX2&I-BBeltXr}ptS&0E=Mc+HbTCfG4)a+iV zNebkNzp1`t27^+8TpUFL0w)zrpTSO0ZbvBfCrlW7N?2~ zz+vQkvI}5SJ%$GvgQFM&aO50VIR}#gbkUOrPbcjKwZLu?dqpWAn`^NJ&khQj9o!(n z$`6)i1+DDze1P=R#mo-dOg{ITpj_Yh$JqWdgyLPSckP3jwag&4%$wx8Jj`wYgkMrV z=6$z^KfvGf9Zx*4* zt0zvVE8(91fX3o6QpF7MSG8ABP&(S}Q~nGRm%{OIsmkIxwum14ESp_5J7=~D#Ps&< z+Eux6@F=(ja5X%xd>i=GVvcmGoLrUHzmBVd`>zq%fOv z1Ll+q0oxq06BDs#&nz3aZ3QEACjH_K8P;6uiFhHT74`ofVbnmcyVkp^6aLq_+FU8^ z7+XPC)3tOBUEyJEvS`G=3OlwMRN@W2fj8$%GlU@W>K2jfCTp`jo& z_)lkl<|3oN-akqgJdPm>#F?*JTkh2#LY^(82>wSx)J~`L1aibz6%f@wpDH zj!Ua_+v>R~vvghbHn?HBVL5AS&<4#=MHpyJ3Jk6SDvT|xp@`(rMV`)Ncv zXDX~DjAwYT`{fH$LH9NPa{j(mG!Oc8x|qIdo%{NQIF`x65HV1Kq`E&e0Ux@W3a6CK zy#}K(mhN9EA}W>{Q0{-N8$@lxFhb@1Y-!`~Tk_@)xN;F91}7M$MRO2RX%x1OoFx=D z9*}J*+_Qk_BB%T`1&hP-5FXzey~bi(@6vebuW5I%u6R0uKxMnq2UY+|7G3#x@oNym zcc)RxokPTwjahgIKp6INmIaRz*;48&49T5~5}?rDSS<|@un@WO{b8*;W{tQsf0O(S zh2p~l(|vT)Mj!QgvJfYda-%2^CSu@@dt7=n0mi~Tqg?tF8iRntVqk>EW|6U!yA;{| zrg92o;c2qKfqGqb(teNn@%5V*!dMI*@6MRRa9>fEGS;+>3`*6*;f+%5VeXh~SQ7an#BHIPxs zW})+sBR@D(bsn1T#P!#&&^Z(?^-|y=h80VuoiUZrs|v-mhC2KzRfv^I zT4EyKBBhYW$z#z;atg`*AV*LhH%ZDN^)->9jvc==Z(V$5Tna==&U?0PxwK`SwrDj} zgojXTw(Qof&p6%f=_(kF9u;)Av28wGzFj^xGi$(SFrG3HIm3V*HTz#p@S=H5zv^Gb zo<=qKkF(h*=qrQuY&-00Un5u$-$!9^5lSBw!vz#s_unQ{Gf(F?RasON*ASq^Mp465 zUmfqg$+VUOTsl_)fUH&WJVO&hLgp9_T4`3Rq_?z_pR@mthD(CgT~#`x3ah4xNu$- z#2kp-PTekh@vU!%Z^6j}HmIN=JiDViyqnr_D*P06ojjQyE_)Q-5#CPPI@%F!1@R(U zGgwbq0q|kvd7HdDH@U_BOufe;gLcknXcgLa?#6*#`5sR^#9IVg{`&Hy@k!8= z^-nxct2JShFoI%RvPRSr96@>tpCEl>LAx=eNwFze`$;$9bEF~UDGbh%?5juvE^m-I zvV*`&S)?&|;R83D>qS?ao8GOBKf*S*n;E2UM4w0tQ!~i+9fxiJ@>A{=@-2(Zf+0`( zB_4rb@{s#e7fC9AoxR2Q44147Hx2r_@0_{XeYNSZ_;9{Be^NYW?Z%mw(R&5cWv%%I zrUForbAy<2HH|Hrinm1j_~sB_fXs0ghb0VTAr=5Y zUD!teI7SUaai05=5y%;odI?hM2IpWu;uk6+k_QK1yPEslf@TGkf3Q9aGGVXSa*vQr zZ-|$?;sF%R`v%;njX^V-t$u-)4*nHdmOAS?q^%PN!F4Oc&{S}5^93qO)#ETwBd9X$ zBn-~NzDPMB4q2+R(?nB$aAC{aHDO6*t{s>ANoF=TU<{A>j4(9Q7%TGMspJsH}F{f$`aJmrIZ zT{H`a!4CL?N3iekT^G5b#C_6zD9?RP+ds{wnj9Bo;U9c@^23+!$1;ogb?EgOA{Q$Z2@a z{-0JX)#=#4cS7@SG8{PTDJtV4{x$=*cnu!UN#qjKc!z35cf$S#9hFM77)y9Hqq3igeRExf)cIE_ zR5h6B=ar(PPP*)k*qvOR37Uhm9B>JAIae=ErNxKi8&_6QAKJ2$={k+>1L%#i`A^V9=5lL9fVpi5n-(Wx%h@Q+Qky2?ROmLDA5V0^YLEs0000O C4l>dJ diff --git a/frontend/src/views/panel/AssistComponent/index.vue b/frontend/src/views/panel/AssistComponent/index.vue index c5e4548f4d..f36e3bd6bb 100644 --- a/frontend/src/views/panel/AssistComponent/index.vue +++ b/frontend/src/views/panel/AssistComponent/index.vue @@ -27,7 +27,7 @@

        - 图片 + 多媒体
        diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index 1a66c84aa1..e4c5abac0d 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -289,7 +289,8 @@ export default { 'picture-add', 'de-tabs', 'rect-shape', - 'de-show-date' + 'de-show-date', + 'de-video' ] } }, @@ -551,15 +552,12 @@ export default { }) } else { this.currentWidget = ApplicationContext.getService(componentInfo.id) - this.currentFilterCom = this.currentWidget.getDrawPanel() - if (this.canvasStyleData.auxiliaryMatrix) { this.currentFilterCom.x = this.dropComponentInfo.x this.currentFilterCom.y = this.dropComponentInfo.y this.currentFilterCom.sizex = this.dropComponentInfo.sizex this.currentFilterCom.sizey = this.dropComponentInfo.sizey - this.currentFilterCom.style.left = (this.dragComponentInfo.x - 1) * this.curCanvasScale.matrixStyleOriginWidth this.currentFilterCom.style.top = (this.dragComponentInfo.y - 1) * this.curCanvasScale.matrixStyleOriginHeight this.currentFilterCom.style.width = this.dragComponentInfo.sizex * this.curCanvasScale.matrixStyleOriginWidth @@ -608,14 +606,6 @@ export default { this.$store.commit('addComponent', { component }) this.$store.commit('recordSnapshot', 'handleDrop') this.clearCurrentInfo() - // this.$store.commit('clearDragComponentInfo') - - // // 文字组件 - // if (component.type === 'v-text') { - // this.$store.commit('setCurComponent', { component: component, index: this.componentData.length }) - // this.styleDialogVisible = true - // this.show = false - // } }, clearCurrentInfo() { this.currentWidget = null diff --git a/frontend/src/views/panel/video/index.vue b/frontend/src/views/panel/video/index.vue new file mode 100644 index 0000000000..627a458736 --- /dev/null +++ b/frontend/src/views/panel/video/index.vue @@ -0,0 +1,24 @@ + + + + + From 6a62267d8dd15df462bb9778f454cc86ecc45c57 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Tue, 9 Nov 2021 11:08:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=E4=BC=98=E5=8C=96=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E6=9F=A5=E8=AF=A2=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/base/domain/VAuthModel.java | 23 + .../base/domain/VAuthModelExample.java | 690 ++++++++++++++++++ .../base/domain/VAuthModelWithBLOBs.java | 17 + .../base/mapper/VAuthModelMapper.java | 27 + .../dataease/base/mapper/VAuthModelMapper.xml | 257 +++++++ 5 files changed, 1014 insertions(+) create mode 100644 backend/src/main/java/io/dataease/base/domain/VAuthModel.java create mode 100644 backend/src/main/java/io/dataease/base/domain/VAuthModelExample.java create mode 100644 backend/src/main/java/io/dataease/base/domain/VAuthModelWithBLOBs.java create mode 100644 backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.java create mode 100644 backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.xml diff --git a/backend/src/main/java/io/dataease/base/domain/VAuthModel.java b/backend/src/main/java/io/dataease/base/domain/VAuthModel.java new file mode 100644 index 0000000000..7205966be8 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/VAuthModel.java @@ -0,0 +1,23 @@ +package io.dataease.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class VAuthModel implements Serializable { + private String id; + + private String pid; + + private String nodeType; + + private String modelType; + + private String modelInnerType; + + private String authType; + + private String createBy; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/VAuthModelExample.java b/backend/src/main/java/io/dataease/base/domain/VAuthModelExample.java new file mode 100644 index 0000000000..5948918233 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/VAuthModelExample.java @@ -0,0 +1,690 @@ +package io.dataease.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class VAuthModelExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public VAuthModelExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(String value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(String value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(String value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(String value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(String value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(String value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLike(String value) { + addCriterion("id like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotLike(String value) { + addCriterion("id not like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(String value1, String value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(String value1, String value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andPidIsNull() { + addCriterion("pid is null"); + return (Criteria) this; + } + + public Criteria andPidIsNotNull() { + addCriterion("pid is not null"); + return (Criteria) this; + } + + public Criteria andPidEqualTo(String value) { + addCriterion("pid =", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidNotEqualTo(String value) { + addCriterion("pid <>", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidGreaterThan(String value) { + addCriterion("pid >", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidGreaterThanOrEqualTo(String value) { + addCriterion("pid >=", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidLessThan(String value) { + addCriterion("pid <", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidLessThanOrEqualTo(String value) { + addCriterion("pid <=", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidLike(String value) { + addCriterion("pid like", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidNotLike(String value) { + addCriterion("pid not like", value, "pid"); + return (Criteria) this; + } + + public Criteria andPidIn(List values) { + addCriterion("pid in", values, "pid"); + return (Criteria) this; + } + + public Criteria andPidNotIn(List values) { + addCriterion("pid not in", values, "pid"); + return (Criteria) this; + } + + public Criteria andPidBetween(String value1, String value2) { + addCriterion("pid between", value1, value2, "pid"); + return (Criteria) this; + } + + public Criteria andPidNotBetween(String value1, String value2) { + addCriterion("pid not between", value1, value2, "pid"); + return (Criteria) this; + } + + public Criteria andNodeTypeIsNull() { + addCriterion("node_type is null"); + return (Criteria) this; + } + + public Criteria andNodeTypeIsNotNull() { + addCriterion("node_type is not null"); + return (Criteria) this; + } + + public Criteria andNodeTypeEqualTo(String value) { + addCriterion("node_type =", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeNotEqualTo(String value) { + addCriterion("node_type <>", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeGreaterThan(String value) { + addCriterion("node_type >", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeGreaterThanOrEqualTo(String value) { + addCriterion("node_type >=", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeLessThan(String value) { + addCriterion("node_type <", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeLessThanOrEqualTo(String value) { + addCriterion("node_type <=", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeLike(String value) { + addCriterion("node_type like", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeNotLike(String value) { + addCriterion("node_type not like", value, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeIn(List values) { + addCriterion("node_type in", values, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeNotIn(List values) { + addCriterion("node_type not in", values, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeBetween(String value1, String value2) { + addCriterion("node_type between", value1, value2, "nodeType"); + return (Criteria) this; + } + + public Criteria andNodeTypeNotBetween(String value1, String value2) { + addCriterion("node_type not between", value1, value2, "nodeType"); + return (Criteria) this; + } + + public Criteria andModelTypeIsNull() { + addCriterion("model_type is null"); + return (Criteria) this; + } + + public Criteria andModelTypeIsNotNull() { + addCriterion("model_type is not null"); + return (Criteria) this; + } + + public Criteria andModelTypeEqualTo(String value) { + addCriterion("model_type =", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeNotEqualTo(String value) { + addCriterion("model_type <>", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeGreaterThan(String value) { + addCriterion("model_type >", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeGreaterThanOrEqualTo(String value) { + addCriterion("model_type >=", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeLessThan(String value) { + addCriterion("model_type <", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeLessThanOrEqualTo(String value) { + addCriterion("model_type <=", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeLike(String value) { + addCriterion("model_type like", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeNotLike(String value) { + addCriterion("model_type not like", value, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeIn(List values) { + addCriterion("model_type in", values, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeNotIn(List values) { + addCriterion("model_type not in", values, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeBetween(String value1, String value2) { + addCriterion("model_type between", value1, value2, "modelType"); + return (Criteria) this; + } + + public Criteria andModelTypeNotBetween(String value1, String value2) { + addCriterion("model_type not between", value1, value2, "modelType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeIsNull() { + addCriterion("model_inner_type is null"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeIsNotNull() { + addCriterion("model_inner_type is not null"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeEqualTo(String value) { + addCriterion("model_inner_type =", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeNotEqualTo(String value) { + addCriterion("model_inner_type <>", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeGreaterThan(String value) { + addCriterion("model_inner_type >", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeGreaterThanOrEqualTo(String value) { + addCriterion("model_inner_type >=", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeLessThan(String value) { + addCriterion("model_inner_type <", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeLessThanOrEqualTo(String value) { + addCriterion("model_inner_type <=", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeLike(String value) { + addCriterion("model_inner_type like", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeNotLike(String value) { + addCriterion("model_inner_type not like", value, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeIn(List values) { + addCriterion("model_inner_type in", values, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeNotIn(List values) { + addCriterion("model_inner_type not in", values, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeBetween(String value1, String value2) { + addCriterion("model_inner_type between", value1, value2, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andModelInnerTypeNotBetween(String value1, String value2) { + addCriterion("model_inner_type not between", value1, value2, "modelInnerType"); + return (Criteria) this; + } + + public Criteria andAuthTypeIsNull() { + addCriterion("auth_type is null"); + return (Criteria) this; + } + + public Criteria andAuthTypeIsNotNull() { + addCriterion("auth_type is not null"); + return (Criteria) this; + } + + public Criteria andAuthTypeEqualTo(String value) { + addCriterion("auth_type =", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeNotEqualTo(String value) { + addCriterion("auth_type <>", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeGreaterThan(String value) { + addCriterion("auth_type >", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeGreaterThanOrEqualTo(String value) { + addCriterion("auth_type >=", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeLessThan(String value) { + addCriterion("auth_type <", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeLessThanOrEqualTo(String value) { + addCriterion("auth_type <=", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeLike(String value) { + addCriterion("auth_type like", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeNotLike(String value) { + addCriterion("auth_type not like", value, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeIn(List values) { + addCriterion("auth_type in", values, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeNotIn(List values) { + addCriterion("auth_type not in", values, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeBetween(String value1, String value2) { + addCriterion("auth_type between", value1, value2, "authType"); + return (Criteria) this; + } + + public Criteria andAuthTypeNotBetween(String value1, String value2) { + addCriterion("auth_type not between", value1, value2, "authType"); + return (Criteria) this; + } + + public Criteria andCreateByIsNull() { + addCriterion("create_by is null"); + return (Criteria) this; + } + + public Criteria andCreateByIsNotNull() { + addCriterion("create_by is not null"); + return (Criteria) this; + } + + public Criteria andCreateByEqualTo(String value) { + addCriterion("create_by =", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByNotEqualTo(String value) { + addCriterion("create_by <>", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByGreaterThan(String value) { + addCriterion("create_by >", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByGreaterThanOrEqualTo(String value) { + addCriterion("create_by >=", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByLessThan(String value) { + addCriterion("create_by <", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByLessThanOrEqualTo(String value) { + addCriterion("create_by <=", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByLike(String value) { + addCriterion("create_by like", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByNotLike(String value) { + addCriterion("create_by not like", value, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByIn(List values) { + addCriterion("create_by in", values, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByNotIn(List values) { + addCriterion("create_by not in", values, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByBetween(String value1, String value2) { + addCriterion("create_by between", value1, value2, "createBy"); + return (Criteria) this; + } + + public Criteria andCreateByNotBetween(String value1, String value2) { + addCriterion("create_by not between", value1, value2, "createBy"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/VAuthModelWithBLOBs.java b/backend/src/main/java/io/dataease/base/domain/VAuthModelWithBLOBs.java new file mode 100644 index 0000000000..e5fc73af43 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/VAuthModelWithBLOBs.java @@ -0,0 +1,17 @@ +package io.dataease.base.domain; + +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class VAuthModelWithBLOBs extends VAuthModel implements Serializable { + private String name; + + private String label; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.java b/backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.java new file mode 100644 index 0000000000..aa655532ac --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.java @@ -0,0 +1,27 @@ +package io.dataease.base.mapper; + +import io.dataease.base.domain.VAuthModel; +import io.dataease.base.domain.VAuthModelExample; +import io.dataease.base.domain.VAuthModelWithBLOBs; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface VAuthModelMapper { + long countByExample(VAuthModelExample example); + + int deleteByExample(VAuthModelExample example); + + int insert(VAuthModelWithBLOBs record); + + int insertSelective(VAuthModelWithBLOBs record); + + List selectByExampleWithBLOBs(VAuthModelExample example); + + List selectByExample(VAuthModelExample example); + + int updateByExampleSelective(@Param("record") VAuthModelWithBLOBs record, @Param("example") VAuthModelExample example); + + int updateByExampleWithBLOBs(@Param("record") VAuthModelWithBLOBs record, @Param("example") VAuthModelExample example); + + int updateByExample(@Param("record") VAuthModel record, @Param("example") VAuthModelExample example); +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.xml b/backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.xml new file mode 100644 index 0000000000..d98ac7744b --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/VAuthModelMapper.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, pid, node_type, model_type, model_inner_type, auth_type, create_by + + + `name`, `label` + + + + + delete from v_auth_model + + + + + + insert into v_auth_model (id, pid, node_type, + model_type, model_inner_type, auth_type, + create_by, `name`, `label` + ) + values (#{id,jdbcType=VARCHAR}, #{pid,jdbcType=VARCHAR}, #{nodeType,jdbcType=VARCHAR}, + #{modelType,jdbcType=VARCHAR}, #{modelInnerType,jdbcType=VARCHAR}, #{authType,jdbcType=VARCHAR}, + #{createBy,jdbcType=VARCHAR}, #{name,jdbcType=LONGVARCHAR}, #{label,jdbcType=LONGVARCHAR} + ) + + + insert into v_auth_model + + + id, + + + pid, + + + node_type, + + + model_type, + + + model_inner_type, + + + auth_type, + + + create_by, + + + `name`, + + + `label`, + + + + + #{id,jdbcType=VARCHAR}, + + + #{pid,jdbcType=VARCHAR}, + + + #{nodeType,jdbcType=VARCHAR}, + + + #{modelType,jdbcType=VARCHAR}, + + + #{modelInnerType,jdbcType=VARCHAR}, + + + #{authType,jdbcType=VARCHAR}, + + + #{createBy,jdbcType=VARCHAR}, + + + #{name,jdbcType=LONGVARCHAR}, + + + #{label,jdbcType=LONGVARCHAR}, + + + + + + update v_auth_model + + + id = #{record.id,jdbcType=VARCHAR}, + + + pid = #{record.pid,jdbcType=VARCHAR}, + + + node_type = #{record.nodeType,jdbcType=VARCHAR}, + + + model_type = #{record.modelType,jdbcType=VARCHAR}, + + + model_inner_type = #{record.modelInnerType,jdbcType=VARCHAR}, + + + auth_type = #{record.authType,jdbcType=VARCHAR}, + + + create_by = #{record.createBy,jdbcType=VARCHAR}, + + + `name` = #{record.name,jdbcType=LONGVARCHAR}, + + + `label` = #{record.label,jdbcType=LONGVARCHAR}, + + + + + + + + update v_auth_model + set id = #{record.id,jdbcType=VARCHAR}, + pid = #{record.pid,jdbcType=VARCHAR}, + node_type = #{record.nodeType,jdbcType=VARCHAR}, + model_type = #{record.modelType,jdbcType=VARCHAR}, + model_inner_type = #{record.modelInnerType,jdbcType=VARCHAR}, + auth_type = #{record.authType,jdbcType=VARCHAR}, + create_by = #{record.createBy,jdbcType=VARCHAR}, + `name` = #{record.name,jdbcType=LONGVARCHAR}, + `label` = #{record.label,jdbcType=LONGVARCHAR} + + + + + + update v_auth_model + set id = #{record.id,jdbcType=VARCHAR}, + pid = #{record.pid,jdbcType=VARCHAR}, + node_type = #{record.nodeType,jdbcType=VARCHAR}, + model_type = #{record.modelType,jdbcType=VARCHAR}, + model_inner_type = #{record.modelInnerType,jdbcType=VARCHAR}, + auth_type = #{record.authType,jdbcType=VARCHAR}, + create_by = #{record.createBy,jdbcType=VARCHAR} + + + + + \ No newline at end of file