From 00bdec300c3400c8bb1d0a0082481a2b1680660c Mon Sep 17 00:00:00 2001
From: oceangoing <1821478380@qq.com>
Date: Tue, 4 Apr 2023 18:42:14 +0800
Subject: [PATCH] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.codeStyle/eclipse-codestyle.xml | 216 +-
README.md | 12 +-
db/lenos-mysql5.7.35.sql | 2504 +-
db/lenos-oracle.sql | 2504 +-
len-activiti/pom.xml | 154 +-
.../com/len/actlistener/ActNodeListener.java | 29 +-
.../len/actlistener/ActStartNodeListener.java | 26 +-
.../len/actlistener/LeaveListenerImpl.java | 24 +-
.../com/len/actlistener/ListenUserRole.java | 76 +-
.../com/len/config/ActPropertiesConfig.java | 37 +-
.../java/com/len/config/ActivitiConfig.java | 37 +-
.../len/controller/ActivitiController.java | 145 +-
.../len/controller/UserLeaveController.java | 240 +-
.../main/java/com/len/entity/ActAssignee.java | 14 +-
.../java/com/len/entity/ActDeployment.java | 47 +-
.../main/java/com/len/entity/ActModel.java | 74 +-
.../main/java/com/len/entity/BaseTask.java | 46 +-
.../java/com/len/entity/LeaveOpinion.java | 40 +-
.../com/len/entity/ProcessDefinition.java | 76 +-
.../src/main/java/com/len/entity/Task.java | 63 +-
.../main/java/com/len/entity/UserLeave.java | 69 +-
.../java/com/len/mapper/UserLeaveMapper.java | 3 +-
.../com/len/service/ActAssigneeService.java | 13 +-
.../com/len/service/UserLeaveService.java | 4 +-
.../service/impl/ActAssigneeServiceImpl.java | 29 +-
.../service/impl/UserLeaveServiceImpl.java | 12 +-
.../java/com/len/util/AnimatedGifEncoder.java | 2335 +-
.../main/java/com/len/util/AssigneeType.java | 8 +-
.../main/java/com/len/util/Base64Utils.java | 14 +-
.../activiti/FilterServletOutputStream.java | 1 +
.../org/activiti/GenericResponseWrapper.java | 15 +-
.../org/activiti/JsonpCallbackFilter.java | 25 +-
.../image/HMProcessDiagramGenerator.java | 124 +-
.../impl/DefaultProcessDiagramCanvas.java | 2536 +-
.../impl/DefaultProcessDiagramGenerator.java | 2110 +-
.../org/activiti/rest/ActivitiService.java | 108 +-
...rocessDefinitionDiagramLayoutResource.java | 833 +-
...rocessDefinitionDiagramLayoutResource.java | 31 +-
.../ProcessInstanceDiagramLayoutResource.java | 28 +-
.../ProcessInstanceHighlightsResource.java | 445 +-
.../editor/main/StencilsetRestResource.java | 37 +-
.../model/ModelEditorJsonRestResource.java | 88 +-
.../editor/model/ModelSaveRestResource.java | 123 +-
.../activiti/rest/model/ActivitiProcess.java | 4 +-
len-activiti/src/main/resources/bpmn/demo.xml | 350 +-
.../resources/ftl/act/activiti/shinePics.html | 150 +-
.../resources/ftl/act/deploy/act-node.ftl | 182 +-
.../resources/ftl/act/leave/add-leave.ftl | 3 +-
.../resources/ftl/act/leave/leaveDetail.ftl | 168 +-
.../resources/ftl/act/leave/leaveList.ftl | 3 +-
.../ftl/act/leave/update-leave-readonly.ftl | 244 +-
.../resources/ftl/act/leave/update-leave.ftl | 269 +-
.../ftl/act/task/task-agent-iframe.ftl | 125 +-
.../resources/ftl/act/task/task-agent.ftl | 185 +-
.../main/resources/ftl/act/task/taskList.ftl | 283 +-
.../src/main/resources/ftl/actList.ftl | 21 +-
.../src/main/resources/ftl/actModelList.ftl | 32 +-
.../resources/mapper/ActAssigneeMapper.xml | 55 +-
.../main/resources/mapper/UserLeaveMapper.xml | 64 +-
.../src/main/resources/plugin/activiti.js | 4 +-
.../resources/properties/activiti.properties | 1 -
.../static/diagram-viewer/index.html | 233 +-
.../static/diagram-viewer/js/ActivitiRest.js | 144 +-
.../static/diagram-viewer/js/ActivityImpl.js | 2 +-
.../static/diagram-viewer/js/Color.js | 1187 +-
.../diagram-viewer/js/LineBreakMeasurer.js | 528 +-
.../static/diagram-viewer/js/Polyline.js | 709 +-
.../diagram-viewer/js/ProcessDiagramCanvas.js | 4196 +-
.../js/ProcessDiagramGenerator.js | 2151 +-
.../js/jquery/jquery.asyncqueue.js | 130 +-
.../static/diagram-viewer/js/jquery/jquery.js | 17981 ++++----
.../js/jquery/jquery.progressbar.js | 254 +-
.../static/diagram-viewer/js/jstools.js | 40 +-
.../diagram-viewer/js/raphael_uncompressed.js | 2913 +-
.../static/diagram-viewer/js/textlayout.js | 891 +-
.../resources/static/diagram-viewer/style.css | 2 +-
.../resources/static/editor-app/app-cfg.js | 2 +-
.../main/resources/static/editor-app/app.js | 508 +-
.../properties-assignment-controller.js | 257 +-
...perties-condition-expression-controller.js | 20 +-
.../properties-default-controllers.js | 54 +-
.../properties-event-listeners-controller.js | 219 +-
...operties-execution-listeners-controller.js | 169 +-
.../properties-fields-controller.js | 99 +-
.../properties-form-properties-controller.js | 167 +-
.../properties-in-parameters-controller.js | 48 +-
...operties-message-definitions-controller.js | 13 +-
.../properties-message-scope-controller.js | 6 +-
.../properties-multiinstance-controller.js | 13 +-
.../properties-out-parameters-controller.js | 50 +-
...roperties-sequenceflow-order-controller.js | 30 +-
...roperties-signal-definitions-controller.js | 9 +-
.../properties-signal-scope-controller.js | 6 +-
.../properties-task-listeners-controller.js | 167 +-
.../editor-app/configuration/properties.js | 154 +-
.../properties/assignment-candidateGroup.html | 76 +-
.../assignment-display-template.html | 6 +-
.../properties/assignment-popup-popup.html | 114 +-
.../properties/assignment-popup.html | 70 +-
.../properties/assignment-write-template.html | 1 -
.../properties/boolean-property-template.html | 3 +-
...condition-expression-display-template.html | 2 +-
.../condition-expression-popup.html | 47 +-
.../condition-expression-write-template.html | 1 -
.../default-value-display-template.html | 3 +-
.../event-listeners-display-template.html | 1 -
.../properties/event-listeners-popup.html | 242 +-
.../event-listeners-write-template.html | 1 -
.../execution-listeners-display-template.html | 1 -
.../properties/execution-listeners-popup.html | 144 +-
.../execution-listeners-write-template.html | 1 -
.../properties/feedback-popup.html | 22 +-
.../properties/fields-display-template.html | 1 -
.../properties/fields-popup.html | 111 +-
.../properties/fields-write-template.html | 1 -
.../form-properties-display-template.html | 1 -
.../properties/form-properties-popup.html | 207 +-
.../form-properties-write-template.html | 1 -
.../in-parameters-display-template.html | 1 -
.../properties/in-parameters-popup.html | 118 +-
.../in-parameters-write-template.html | 1 -
.../properties/message-definitions-popup.html | 40 +-
.../message-property-write-template.html | 3 +-
...multiinstance-property-write-template.html | 9 +-
.../out-parameters-display-template.html | 1 -
.../properties/out-parameters-popup.html | 118 +-
.../out-parameters-write-template.html | 1 -
.../sequenceflow-order-display-template.html | 1 -
.../properties/sequenceflow-order-popup.html | 86 +-
.../sequenceflow-order-write-template.html | 1 -
.../signal-definitions-display-template.html | 1 -
.../properties/signal-definitions-popup.html | 47 +-
.../signal-definitions-write-template.html | 1 -
.../signal-property-write-template.html | 3 +-
.../string-property-write-mode-template.html | 9 +-
...subprocess-reference-display-template.html | 1 -
.../subprocess-reference-popup.html | 83 +-
.../subprocess-reference-write-template.html | 1 -
.../task-listeners-display-template.html | 1 -
.../properties/task-listeners-popup.html | 232 +-
.../task-listeners-write-template.html | 1 -
.../configuration/properties/text-popup.html | 27 +-
.../text-property-write-template.html | 1 -
.../configuration/toolbar-default-actions.js | 336 +-
.../editor-app/configuration/toolbar.js | 224 +-
.../editor-app/configuration/url-config.js | 6 +-
.../static/editor-app/css/style-common.css | 118 +-
.../static/editor-app/css/style-editor.css | 587 +-
.../resources/static/editor-app/css/style.css | 378 +-
.../static/editor-app/editor-config.js | 10 +-
.../static/editor-app/editor-controller.js | 74 +-
.../resources/static/editor-app/editor.html | 238 +-
.../static/editor-app/editor/css/editor.css | 131 +-
.../editor-app/editor/i18n/translation_de.js | 82 +-
.../editor/i18n/translation_en_us.js | 94 +-
.../editor/i18n/translation_signavio_de.js | 46 +-
.../editor/i18n/translation_signavio_en_us.js | 50 +-
.../static/editor-app/editor/oryx.debug.js | 35180 ++++++++--------
.../resources/static/editor-app/eventbus.js | 22 +-
.../fonts/activiti-admin-webfont.svg | 98 +-
.../fonts/glyphicons-halflings-regular.svg | 633 +-
.../static/editor-app/header-controller.js | 16 +-
.../resources/static/editor-app/i18n/en.json | 541 +-
.../angular-mocks_1.2.13/angular-mocks.js | 3824 +-
.../angular-resource.js | 1023 +-
.../angular-route_1.2.13/angular-route.js | 1508 +-
.../angular-sanitize.js | 980 +-
.../angular-translate-loader-static-files.js | 48 +-
.../angular-translate-storage-cookie.js | 24 +-
.../angular-translate.js | 1830 +-
.../daterangepicker-bs3.css | 4 +-
.../daterangepicker.js | 41 +-
.../bootstrap_3.1.1/css/bootstrap-theme.css | 446 +-
.../libs/bootstrap_3.1.1/css/bootstrap.css | 7253 ++--
.../fonts/glyphicons-halflings-regular.svg | 633 +-
.../libs/bootstrap_3.1.1/js/bootstrap.js | 2749 +-
.../libs/es5-shim-15.3.4.5/CONTRIBUTORS.md | 49 +-
.../libs/es5-shim-15.3.4.5/README.md | 128 +-
.../libs/es5-shim-15.3.4.5/es5-sham.js | 674 +-
.../libs/es5-shim-15.3.4.5/es5-shim.js | 1988 +-
.../es5-shim-15.3.4.5/tests/helpers/h-kill.js | 8 +-
.../tests/helpers/h-matchers.js | 20 +-
.../libs/es5-shim-15.3.4.5/tests/index.html | 80 +-
.../es5-shim-15.3.4.5/tests/index.min.html | 80 +-
.../tests/lib/jasmine-html.js | 326 +-
.../es5-shim-15.3.4.5/tests/lib/jasmine.css | 134 +-
.../es5-shim-15.3.4.5/tests/lib/jasmine.js | 2740 +-
.../libs/es5-shim-15.3.4.5/tests/lib/json2.js | 123 +-
.../es5-shim-15.3.4.5/tests/spec/s-array.js | 772 +-
.../es5-shim-15.3.4.5/tests/spec/s-date.js | 47 +-
.../tests/spec/s-function.js | 108 +-
.../es5-shim-15.3.4.5/tests/spec/s-number.js | 2 +-
.../es5-shim-15.3.4.5/tests/spec/s-object.js | 32 +-
.../es5-shim-15.3.4.5/tests/spec/s-string.js | 12 +-
.../libs/jquery.autogrow-textarea.js | 65 +-
.../editor-app/libs/jquery_1.11.0/jquery.js | 19035 ++++-----
.../editor-app/libs/json3_3.2.6/lib/json3.js | 1679 +-
.../libs/pagination/tm.pagination.js | 124 +-
.../static/editor-app/libs/path_parser.js | 173 +-
.../static/editor-app/libs/prototype-1.5.1.js | 5799 +--
.../partials/root-stencil-item-template.html | 10 +-
.../partials/stencil-item-template.html | 20 +-
.../resources/static/editor-app/plugins.xml | 106 +-
.../editor-app/popups/icon-template.html | 2 +-
.../static/editor-app/popups/save-model.html | 74 +-
.../editor-app/popups/select-shape.html | 14 +-
.../editor-app/popups/unsaved-changes.html | 19 +-
.../editor-app/select-shape-controller.js | 533 +-
.../static/editor-app/stencil-controller.js | 1198 +-
.../static/editor-app/toolbar-controller.js | 186 +-
.../src/main/resources/static/modeler.html | 125 +-
.../src/main/resources/stencilset.json | 3745 +-
.../src/test/java/com/len/AppTest.java | 19 +-
.../src/test/java/com/len/JsonTest.java | 46 +-
len-blog/pom.xml | 5 +-
.../main/java/com/len/config/CorsConfig.java | 8 +-
.../com/len/controller/ArticleController.java | 17 +-
.../com/len/controller/AuthController.java | 38 +-
.../len/controller/BlogAdminController.java | 24 +-
.../controller/BlogCategoryController.java | 8 +-
.../com/len/controller/TagController.java | 21 +-
.../src/main/java/com/len/core/BlogRealm.java | 28 +-
.../src/main/java/com/len/core/LenUser.java | 4 +-
.../core/MyBasicHttpAuthenticationFilter.java | 16 +-
.../len/core/exception/CustomException.java | 3 +-
.../java/com/len/entity/ArticleCategory.java | 1 -
.../java/com/len/entity/ArticleDetail.java | 8 +-
.../main/java/com/len/entity/ArticleList.java | 11 +-
.../main/java/com/len/entity/BlogArticle.java | 9 +-
.../java/com/len/entity/BlogCategory.java | 11 +-
.../com/len/mapper/ArticleCategoryMapper.java | 7 +-
.../java/com/len/mapper/ArticleTagMapper.java | 3 +-
.../com/len/mapper/BlogArticleMapper.java | 13 +-
.../com/len/mapper/BlogCategoryMapper.java | 3 +-
.../java/com/len/mapper/BlogTagMapper.java | 3 +-
.../src/main/java/com/len/model/Article.java | 7 +-
.../java/com/len/model/SimpleArticle.java | 1 -
.../src/main/java/com/len/model/VArticle.java | 7 +-
.../len/service/ArticleCategoryService.java | 5 +-
.../com/len/service/ArticleTagService.java | 4 +-
.../com/len/service/BlogArticleService.java | 7 +-
.../com/len/service/BlogCategoryService.java | 4 +-
.../java/com/len/service/BlogTagService.java | 4 +-
.../impl/ArticleCategoryServiceImpl.java | 12 +-
.../service/impl/ArticleTagServiceImpl.java | 6 +-
.../service/impl/BlogArticleServiceImpl.java | 66 +-
.../service/impl/BlogCategoryServiceImpl.java | 7 +-
.../len/service/impl/BlogTagServiceImpl.java | 7 +-
.../src/main/resources/ftl/articleList.ftl | 18 +-
.../mapper/ArticleCategoryMapper.xml | 40 +-
.../resources/mapper/ArticleTagMapper.xml | 14 +-
.../resources/mapper/BlogArticleMapper.xml | 27 +-
.../resources/mapper/BlogCategoryMapper.xml | 28 +-
.../main/resources/mapper/BlogTagMapper.xml | 16 +-
len-core/pom.xml | 74 +-
.../java/com/len/base/BaseController.java | 11 +-
.../main/java/com/len/base/BaseEntity.java | 9 +-
.../main/java/com/len/base/BaseMapper.java | 3 +-
.../main/java/com/len/base/BaseService.java | 5 +-
.../main/java/com/len/base/CurrentMenu.java | 1 -
.../main/java/com/len/base/CurrentRole.java | 17 +-
.../main/java/com/len/base/CurrentUser.java | 22 +-
.../com/len/base/handler/ExecuteContext.java | 2 -
.../len/base/impl/AbstractServiceImpl.java | 14 +-
.../com/len/base/impl/BaseServiceImpl.java | 2 +-
.../com/len/cache/CacheManagerFactory.java | 1 -
.../cache/impl/config/PropertiesConfig.java | 1 -
.../exception/CustomErrorViewResolver.java | 11 +-
.../java/com/len/exception/LenException.java | 25 +-
.../com/len/exception/ServiceException.java | 5 +-
.../java/com/len/freemarker/LenInclude.java | 31 +-
.../src/main/java/com/len/menu/LoginType.java | 7 +-
.../main/java/com/len/redis/RedisService.java | 9 +-
.../java/com/len/socket/WebSocketService.java | 15 +-
.../com/len/util/ApplicationContextUtil.java | 11 +-
.../src/main/java/com/len/util/BeanUtil.java | 42 +-
.../src/main/java/com/len/util/Checkbox.java | 8 +-
.../main/java/com/len/util/CommonUtil.java | 37 +-
.../main/java/com/len/util/ContextUtil.java | 16 +-
.../len/util/CustomUsernamePasswordToken.java | 7 +-
.../src/main/java/com/len/util/FileUtil.java | 3 -
.../src/main/java/com/len/util/IpUtil.java | 21 +-
.../src/main/java/com/len/util/JWTUtil.java | 26 +-
.../src/main/java/com/len/util/JdbcUtil.java | 53 +-
.../src/main/java/com/len/util/JsonUtil.java | 23 +-
.../src/main/java/com/len/util/JwtToken.java | 6 +-
.../main/java/com/len/util/LenResponse.java | 17 +-
.../main/java/com/len/util/LocalLocale.java | 11 +-
.../src/main/java/com/len/util/Md5Util.java | 23 +-
.../src/main/java/com/len/util/MsHelper.java | 7 +-
.../src/main/java/com/len/util/PageUtil.java | 110 +-
.../src/main/java/com/len/util/Principal.java | 4 +-
.../src/main/java/com/len/util/ReType.java | 101 +-
.../main/java/com/len/util/SpringUtil.java | 49 +-
.../src/main/java/com/len/util/TreeUtil.java | 14 +-
.../main/java/com/len/util/UploadUtil.java | 39 +-
.../java/com/len/util/VerifyCodeUtils.java | 581 +-
.../com/len/validator/ValidatorUtils.java | 16 +-
.../com/len/validator/group/AddGroup.java | 5 +-
.../java/com/len/validator/group/Group.java | 2 +-
.../com/len/validator/group/UpdateGroup.java | 2 +-
len-core/src/test/java/com/len/AppTest.java | 19 +-
len-sys/pom.xml | 52 +-
.../com/len/controller/ErrorController.java | 2 +-
.../com/len/controller/LogController.java | 16 +-
.../com/len/controller/LoginController.java | 12 +-
.../com/len/controller/MenuController.java | 4 +-
.../com/len/controller/PersonController.java | 20 +-
.../com/len/controller/RoleController.java | 26 +-
.../com/len/controller/UserController.java | 2 +-
.../java/com/len/core/annotation/Log.java | 21 +-
.../com/len/core/annotation/LogAspect.java | 18 +-
.../len/core/filter/CustomAdvicFilter.java | 11 +-
.../com/len/core/filter/PermissionFilter.java | 10 +-
.../len/core/filter/VerfityCodeFilter.java | 6 +-
.../com/len/core/filter/VerifyCodeUtils.java | 79 +-
.../core/init/job/DataSourceJobThread.java | 2 +-
.../com/len/core/init/job/JobExecuteImpl.java | 3 +-
.../com/len/core/listener/LenospInit.java | 7 +-
.../core/quartz/CustomQuartz/DataSchdule.java | 23 +-
.../core/quartz/CustomQuartz/JobDemo1.java | 57 +-
.../core/quartz/CustomQuartz/JobDemo2.java | 46 +-
.../core/quartz/CustomQuartz/JobDemo3.java | 42 +-
.../core/quartz/CustomQuartz/JobDemo4.java | 42 +-
.../core/quartz/CustomQuartz/JobDemo5.java | 42 +-
.../java/com/len/core/quartz/JobTask.java | 23 +-
.../com/len/core/quartz/MyJobFactory.java | 3 -
.../len/core/quartz/MySchedulerListener.java | 1 -
.../java/com/len/core/shiro/LoginRealm.java | 24 +-
.../java/com/len/core/shiro/Principal.java | 8 +-
.../shiro/RetryLimitCredentialsMatcher.java | 12 +-
.../src/main/java/com/len/entity/SysDept.java | 2 -
.../src/main/java/com/len/entity/SysJob.java | 5 +-
.../src/main/java/com/len/entity/SysLog.java | 5 +-
.../src/main/java/com/len/entity/SysMenu.java | 13 +-
.../src/main/java/com/len/entity/SysRole.java | 5 +-
.../main/java/com/len/entity/SysRoleMenu.java | 1 +
.../main/java/com/len/entity/SysRoleUser.java | 1 +
.../src/main/java/com/len/entity/SysUser.java | 7 +-
.../java/com/len/entity/SysUserDepart.java | 1 +
.../java/com/len/mapper/SysDeptMapper.java | 3 +-
.../java/com/len/mapper/SysLogMapper.java | 3 +-
.../java/com/len/mapper/SysMenuMapper.java | 2 -
.../java/com/len/mapper/SysRoleMapper.java | 3 +-
.../com/len/mapper/SysRoleMenuMapper.java | 4 +-
.../com/len/mapper/SysRoleUserMapper.java | 4 +-
.../java/com/len/service/DeptService.java | 3 +-
.../java/com/len/service/EmployeeService.java | 3 +-
.../main/java/com/len/service/JobService.java | 5 +-
.../java/com/len/service/MenuService.java | 1 -
.../java/com/len/service/RoleMenuService.java | 5 +-
.../java/com/len/service/RoleService.java | 2 -
.../java/com/len/service/RoleUserService.java | 4 +-
.../java/com/len/service/SysUserService.java | 8 +-
.../service/impl/DashboardServiceImpl.java | 2 +-
.../com/len/service/impl/DeptServiceImpl.java | 3 +-
.../com/len/service/impl/JobServiceImpl.java | 7 +-
.../com/len/service/impl/MenuServiceImpl.java | 44 +-
.../len/service/impl/RoleMenuServiceImpl.java | 12 +-
.../com/len/service/impl/RoleServiceImpl.java | 9 +-
.../len/service/impl/SysUserServiceImpl.java | 7 +-
len-sys/src/main/resources/ftl/login.ftl | 101 +-
len-sys/src/main/resources/ftl/login2.html | 43 +-
.../resources/ftl/system/base/blockInput.ftl | 2 +-
.../main/resources/ftl/system/base/readme.md | 16 +-
.../main/resources/ftl/system/job/jobList.ftl | 21 +-
.../main/resources/ftl/system/job/update.ftl | 189 +-
.../main/resources/ftl/system/log/logList.ftl | 2 +-
.../main/resources/ftl/system/menu/add.ftl | 5 +-
.../resources/ftl/system/menu/menuList.ftl | 2 +-
.../main/resources/ftl/system/menu/update.ftl | 4 +-
.../main/resources/ftl/system/role/add.ftl | 2 +-
.../resources/ftl/system/role/roleList.ftl | 3 -
.../main/resources/ftl/system/role/update.ftl | 2 +-
.../main/resources/ftl/system/user/add.ftl | 14 +-
.../ftl/system/user/resetPassword.ftl | 155 +-
.../resources/ftl/system/user/userList.ftl | 4 +-
.../resources/i18n/message_en_US.properties | 5 +-
.../resources/i18n/message_zh_CN.properties | 3 -
.../main/resources/mapper/SysDeptMapper.xml | 20 +-
.../resources/mapper/SysEmployeeMapper.xml | 42 +-
.../main/resources/mapper/SysJobMapper.xml | 44 +-
.../main/resources/mapper/SysLogMapper.xml | 36 +-
.../main/resources/mapper/SysMenuMapper.xml | 60 +-
.../main/resources/mapper/SysRoleMapper.xml | 36 +-
.../resources/mapper/SysRoleMenuMapper.xml | 44 +-
.../resources/mapper/SysRoleUserMapper.xml | 44 +-
.../main/resources/mapper/SysUserMapper.xml | 260 +-
.../main/resources/plugin/build/css/admin.css | 2 +-
.../plugin/build/css/themes/default.css | 3 +-
.../main/resources/plugin/build/js/admin.js | 1 -
.../src/main/resources/plugin/build/js/app.js | 34 +-
.../resources/plugin/build/js/kitconfig.js | 2 +-
.../main/resources/plugin/build/js/loader.js | 12 +-
.../main/resources/plugin/build/js/message.js | 14 +-
.../resources/plugin/build/js/nprogress.js | 74 +-
.../resources/plugin/build/js/onelevel.js | 22 +-
.../main/resources/plugin/build/js/pjax.js | 41 +-
.../src/main/resources/plugin/build/js/spa.js | 12 +-
.../resources/plugin/build/js/treeselect.js | 385 +-
.../main/resources/plugin/build/js/utils.js | 66 +-
.../main/resources/plugin/build/js/ztree.js | 572 +-
.../src/main/resources/plugin/html/icon.html | 13 +-
.../resources/plugin/layui/font/iconfont.svg | 950 +-
.../plugin/layui/modules/treeTable.js | 10 +-
.../plugins/font-awesome/css/font-awesome.css | 2290 +-
.../fonts/fontawesome-webfont.svg | 4045 +-
.../plugin/plugins/sideshow/css/component.css | 126 +-
.../plugin/plugins/sideshow/css/demo.css | 218 +-
.../fonts/codropsicons/codropsicons.svg | 43 +-
.../sideshow/fonts/codropsicons/license.txt | 8 +-
.../plugin/plugins/sideshow/js/demo-1.js | 89 +-
.../plugin/plugins/sideshow/js/demo-2.js | 34 +-
.../plugin/plugins/sideshow/js/demo-3.js | 82 +-
.../plugin/plugins/sideshow/js/demo-4.js | 38 +-
.../plugin/plugins/sideshow/js/rAF.js | 18 +-
.../plugin/plugins/sortable/Sortable.js | 6781 +--
.../src/main/resources/plugin/tools/moment.js | 1177 +-
.../resources/plugin/x-admin/css/font.css | 26 +-
.../resources/plugin/x-admin/css/xadmin.css | 601 +-
.../plugin/x-admin/fonts/iconfont.svg | 932 +-
.../plugin/ztree/css/awesomeStyle/awesome.css | 547 +-
.../ztree/css/awesomeStyle/awesome.less | 547 +-
.../ztree/css/metroStyle/metroStyle.css | 441 +-
.../ztree/css/zTreeStyle/zTreeStyle.css | 428 +-
.../plugin/ztree/js/jquery.ztree.all.js | 3626 +-
.../plugin/ztree/js/jquery.ztree.core.js | 26 +-
.../plugin/ztree/js/jquery.ztree.excheck.js | 1198 +-
.../plugin/ztree/js/jquery.ztree.exedit.js | 2365 +-
.../plugin/ztree/js/jquery.ztree.exhide.js | 645 +-
len-sys/src/test/java/com/len/AppTest.java | 19 +-
len-web/pom.xml | 136 +-
.../src/main/java/com/len/LenApplication.java | 10 +-
.../java/com/len/config/BeanFactoryImpl.java | 12 +-
.../main/java/com/len/config/BeanName.java | 9 +-
.../java/com/len/config/FreeMarkerConfig.java | 101 +-
.../com/len/config/FreemarkerShiroConfig.java | 4 +-
.../main/java/com/len/config/LenFilter.java | 29 +-
.../main/java/com/len/config/LogConfig.java | 10 +-
.../com/len/config/MyBatisPlusConfig.java | 7 +-
.../config/MyModularRealmAuthenticator.java | 24 +-
.../java/com/len/config/PageHelperConfig.java | 9 +-
.../main/java/com/len/config/ShiroConfig.java | 66 +-
.../com/len/config/ShiroSessionManager.java | 11 +-
.../java/com/len/config/SwaggerConfig.java | 20 +-
.../com/len/config/TransactionalConfig.java | 11 +-
.../java/com/len/config/WebMvcConfig.java | 17 +-
.../java/com/len/config/ZBeanFactory.java | 17 +-
len-web/src/main/java/test/ActivitiDemo.java | 574 +-
.../src/main/java/test/ActivitiGateWay.java | 270 +-
.../src/main/java/test/ActivitiVariable.java | 189 +-
len-web/src/main/java/test/BlogTest.java | 28 +-
len-web/src/main/java/test/BootTest.java | 9 +-
len-web/src/main/java/test/MybatisApp.java | 10 +-
.../main/len-web\350\257\264\346\230\216.md" | 107 +-
.../main/resources/application-mysql-dev.yml | 62 +-
.../main/resources/application-oracle-dev.yml | 68 +-
.../src/main/resources/application-prod.yml | 74 +-
.../resources/application-sqlserver-dev.yml | 64 +-
.../src/main/resources/application-test.yml | 70 +-
.../resources/auto-config/mybatis-config.xml | 90 +-
.../src/main/resources/ehcache/ehcache.xml | 36 +-
len-web/src/main/resources/len.properties | 4 -
len-web/src/main/resources/log4j.properties | 2 +-
len-web/src/main/resources/quartz.properties | 24 +-
pom.xml | 898 +-
466 files changed, 97651 insertions(+), 90187 deletions(-)
diff --git a/.codeStyle/eclipse-codestyle.xml b/.codeStyle/eclipse-codestyle.xml
index b620a30..3163c13 100644
--- a/.codeStyle/eclipse-codestyle.xml
+++ b/.codeStyle/eclipse-codestyle.xml
@@ -11,71 +11,71 @@
由于IDEA只有一个SPACE_BEFORE_COMMA选项,所以统一设置 insert_space_before_comma 为 do not insert
-->
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
@@ -95,7 +95,7 @@
+ value="do not insert"/>
@@ -104,7 +104,7 @@
程序导入的时候强制将SPACE_BEFORE_SEMICOLON设置为false
-->
+ value="do not insert"/>
@@ -114,12 +114,12 @@
+ value="do not insert"/>
+ id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
+ value="do not insert"/>
+ value="do not insert"/>
@@ -131,46 +131,46 @@
+ id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="insert"/>
+ id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
+ value="do not insert"/>
+ value="do not insert"/>
+ id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="insert"/>
@@ -181,123 +181,123 @@
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
@@ -308,7 +308,7 @@
+ value="do not insert"/>
@@ -327,7 +327,7 @@
+ value="do not insert"/>
@@ -342,13 +342,13 @@
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
@@ -357,9 +357,9 @@
+ value="do not insert"/>
+ value="do not insert"/>
@@ -373,23 +373,23 @@
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
+ value="do not insert"/>
@@ -417,7 +417,7 @@
+ value="false"/>
@@ -482,16 +482,16 @@
+ value="true"/>
+ value="true"/>
+ value="true"/>
@@ -527,7 +527,7 @@
+ value="16"/>
@@ -536,7 +536,7 @@
+ value="common_lines"/>
@@ -578,7 +578,7 @@
+ value="end_of_line"/>
diff --git a/README.md b/README.md
index ef2fa90..623d543 100644
--- a/README.md
+++ b/README.md
@@ -18,27 +18,37 @@
# 简介
+
lenosp是一个基于spring boot的脚手架,并提供完善社区文档教程,中小企业可以用来快速迭代。
+
# 体验
+
[http://42.192.219.164:8081/login](http://42.192.219.164:8081/login)
体验账户:admin,所有账户密码:123456
测试环境,所有业务增删改不会持久化,默认显示成功
# 架构
-
# 模块
+

+
# 里程碑
+
完善当前单体应用,趋于稳定,可供中小企业快速迭代。
# 功能
+
xxx
# 关于我们
+
本项目是郑州程序员组织成员开发迭代
+
# 加入开源组织
+

# 社区
+
文档地址:https://www.kancloud.cn/zhuxm/zzdevelop/3141950
\ No newline at end of file
diff --git a/db/lenos-mysql5.7.35.sql b/db/lenos-mysql5.7.35.sql
index 6f19d94..ecb6519 100644
--- a/db/lenos-mysql5.7.35.sql
+++ b/db/lenos-mysql5.7.35.sql
@@ -15,1362 +15,1992 @@
*/
SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
+SET
+FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for act_assignee
-- ----------------------------
DROP TABLE IF EXISTS `act_assignee`;
-CREATE TABLE `act_assignee` (
- `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
- `sid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '节点id',
- `assignee` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '办理人',
- `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '候选组(角色)',
- `assignee_type` int(11) NOT NULL COMMENT '办理人类型1办理人2候选人3组',
- `activti_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点名称',
- PRIMARY KEY (`id`) USING BTREE
+CREATE TABLE `act_assignee`
+(
+ `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+ `sid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '节点id',
+ `assignee` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '办理人',
+ `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '候选组(角色)',
+ `assignee_type` int(11) NOT NULL COMMENT '办理人类型1办理人2候选人3组',
+ `activti_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点名称',
+ PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_evt_log
-- ----------------------------
DROP TABLE IF EXISTS `act_evt_log`;
-CREATE TABLE `act_evt_log` (
- `LOG_NR_` bigint(20) NOT NULL AUTO_INCREMENT,
- `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
- `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DATA_` longblob NULL,
- `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL,
- `IS_PROCESSED_` tinyint(4) NULL DEFAULT 0,
- PRIMARY KEY (`LOG_NR_`) USING BTREE
+CREATE TABLE `act_evt_log`
+(
+ `LOG_NR_` bigint(20) NOT NULL AUTO_INCREMENT,
+ `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP (3),
+ `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DATA_` longblob NULL,
+ `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL,
+ `IS_PROCESSED_` tinyint(4) NULL DEFAULT 0,
+ PRIMARY KEY (`LOG_NR_`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_ge_bytearray
-- ----------------------------
DROP TABLE IF EXISTS `act_ge_bytearray`;
-CREATE TABLE `act_ge_bytearray` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `BYTES_` longblob NULL,
- `GENERATED_` tinyint(4) NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_FK_BYTEARR_DEPL`(`DEPLOYMENT_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_ge_bytearray`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `BYTES_` longblob NULL,
+ `GENERATED_` tinyint(4) NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_FK_BYTEARR_DEPL`(`DEPLOYMENT_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_ge_bytearray
-- ----------------------------
-INSERT INTO `act_ge_bytearray` VALUES ('142518', 20, 'source', NULL, 0x7B227265736F757263654964223A22313432353137222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F636573735F6C65617665222C226E616D65223A22E8AFB7E58187E6B581E7A88B222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41343530344644322D303230342D343246352D393036312D344134323938324442343938222C2270726F70657274696573223A7B226F766572726964656964223A227374617274222C226E616D65223A227374617274222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A36302C2279223A3235382E373033373033393938313833387D2C2275707065724C656674223A7B2278223A33302C2279223A3232382E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834222C2270726F70657274696573223A7B226F766572726964656964223A227573657231222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223062373632356665646161303565383566323832343836653163396339316239222C2263616E64696461746547726F757073223A5B7B2276616C7565223A226533343665393633363834383463386661376632313763653535306130313836222C226E616D6556616C7565223A22E589AFE7BB8FE79086222C222424686173684B6579223A2231494C227D5D7D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3231392E39393939393939393939393939342C2279223A3238332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3132302C2279223A3230332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3131392E31393533313234393939393939372C2279223A3234332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A36302E363438343337352C2279223A3234332E373033373033393938313833387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31342E3939393939393939393939393939367D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835222C2270726F70657274696573223A7B226F766572726964656964223A227573657232222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223938623035316230333638316465363032383939336135643134616339336362227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3631302E3039303838323633363434362C2279223A3238332E373033373033313034313134327D2C2275707065724C656674223A7B2278223A3531302E30393038383236333634343631372C2279223A3230332E37303337303331303431313432337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935227D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3735352E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3731352E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3731352E313133303933303035303039392C2279223A3234342E31343432323136333535323135377D2C2275707065724C656674223A7B2278223A3631302E3537383039383232383233392C2279223A3234332E383437313639393931393532327D7D2C22646F636B657273223A5B7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D7D2C7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334227D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431302E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3337302E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731222C2270726F70657274696573223A7B226F766572726964656964223A2275736572222C226E616D65223A22E8B083E695B4222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332227D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E35343534343133313832323332352C2279223A3434382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3334302E3534353434313331383232332C2279223A3336382E373033373036363437323739327D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345222C2270726F70657274696573223A7B226F766572726964656964223A22656E64222C226E616D65223A22656E64222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3930382E353435343431333138323233322C2279223A3235372E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3838302E353435343431333138323233322C2279223A3232392E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3837392E3932343335323534333835352C2279223A3234342E313431393535363839373437337D2C2275707065724C656674223A7B2278223A3735352E363139363535303932353931322C2279223A3234332E37343938323733303636323033327D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3434312E313234353432383830373233312C2279223A3236342E343831303438303538363234377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C7B2278223A39392C2279223A34302E3030303030303030303030303033367D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E9878DE696B0E794B3E8AFB7222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334302E3534353434313331383232332C2279223A3430382E373033373036363437323739337D2C2275707065724C656674223A7B2278223A3136392E39393939393939393939393939372C2279223A3238342E363634363432313339373631367D7D2C22646F636B657273223A5B7B2278223A302E393939393939393939393939393939392C2279223A34302E30303030303030303030303030397D2C7B2278223A3136392E39393939393939393939393939372C2279223A3430382E373033373036363437323739337D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732227D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3330342E39393939393939393939393939342C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3236342E39393939393939393939393939342C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E58F96E6B688E8AFB7E58187222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3339302E35343534343133313832323331342C2279223A3235382E343330323636363433303536327D7D2C22646F636B657273223A5B7B2278223A35302E3030303030303030303030303131342C2279223A37397D2C7B2278223A3339302E35343534343133313832323331342C2279223A3439342E373033373036363437323739327D2C7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236342E363438343436383730303037352C2279223A3234342E313133343337353334343137367D2C2275707065724C656674223A7B2278223A3232302E36323838393638373939393234352C2279223A3234332E39323238373637313139357D7D2C22646F636B657273223A5B7B2278223A34392E3939393939393939393939393938362C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D7D2C7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E353435343431333138323233312C2279223A3232332E34303037363130373131373438387D2C2275707065724C656674223A7B2278223A3339302E353435343431333138323233312C2279223A3137322E363031353334383239363530357D7D2C22646F636B657273223A5B7B2278223A3230352E38303433363431303339333632382C2279223A3137312E303333383031323134313530327D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232222C2270726F70657274696573223A7B226F766572726964656964223A226368696C64222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C2269737472616E73616374696F6E223A2266616C7365227D2C227374656E63696C223A7B226964223A2253756250726F63657373227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D39443541314632382D393042372D343644322D414637462D353446464637383631343146222C2270726F70657274696573223A7B226F766572726964656964223A22737374617274222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A34382E3531383531383436343031303338342C2279223A3130312E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A31382E3531383531383436343031303338342C2279223A37312E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333222C2270726F70657274696573223A7B226F766572726964656964223A22616C6C6D616E61676572222C226E616D65223A22E680BBE7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A226438313861633661383663663161363464323138346266303639396436376138227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138392E39393939393939393939393939372C2279223A3132362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A38392E39393939393939393939393939372C2279223A34362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635227D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237352C2279223A3130362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A3233342E39393939393939393939393939372C2279223A36362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334382C2279223A3130302E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3332302C2279223A37322E30353130343034353136333330347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236392C2279223A3136337D2C2275707065724C656674223A7B2278223A3234312C2279223A3133357D7D2C22646F636B657273223A5B5D7D5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539362E333439383035343232313539342C2279223A3137322E31303230383039303332363630387D2C2275707065724C656674223A7B2278223A3138342E37343130373732313432383638362C2279223A312E34323130383534373135323032303034652D31347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237332E38323738383237343432393137342C2279223A38362E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3233342E323333353534303139323935382C2279223A38362E30353130343034353136333330347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D7D2C7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530392E35363538353533373434373936372C2279223A3234342E3134363035383632333436327D2C2275707065724C656674223A7B2278223A3431302E3533343738323038383137322C2279223A3234332E383533313435353137393831367D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D5D2C22746172676574223A7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D7D2C7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530342E32343839303939393834363832362C2279223A38362E34323734383336353430383030367D2C2275707065724C656674223A7B2278223A3435392E36333934393434333031303534362C2279223A38362E31343333343732343931383630327D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D7D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E30383436333334333233383532362C2279223A3133342E333339333232313439353833337D2C2275707065724C656674223A7B2278223A3433392E38353834353834393631383834362C2279223A3130362E303930353433323636373635397D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D7D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E39383338303830363836333436332C2279223A3336372E38363338363638373439393039357D2C2275707065724C656674223A7B2278223A3339302E36363935373435363738313135342C2279223A3236342E34383130343334333933333531377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A35302E3030303030303030303030303131342C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3337302E363730303939393039323233372C2279223A3234342E31303931303034353732383030387D2C2275707065724C656674223A7B2278223A3330352E33373533343134303839393932352C2279223A3234332E37393833303735333930383735357D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E323935353338353539393932382C2279223A3232342E34393134393033323031333735337D2C2275707065724C656674223A7B2278223A3139332E35383236343937343733333034362C2279223A3137322E313532383934353937323330387D7D2C22646F636B657273223A5B7B2278223A32302E31363137303636333435343032382C2279223A312E323837353339313237343833333730337D2C7B2278223A362E3530383031393933353239333633372C2279223A3137302E38303635303532363235393035357D5D2C22746172676574223A7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D7D2C7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431392E333839353234303834323934342C2279223A38362E34363037373339383738363638347D2C2275707065724C656674223A7B2278223A3337352E333639393734303934323739332C2279223A38362E32373032313331363533393932347D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('142519', 14, 'source-extra', NULL, 0x89504E470D0A1A0A0000000D49484452000003BF00000221080600000086FB0D1D000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000020004944415478DAECDD097854D5F9C7F17726FB4A080989088208B20B620444145454A854AD08844544C5B58A50A46E55B0EE555BFBB7D52A5A5141826241C50A8A821659944D0908B21804214080908410B2FECF7B3213424820099964327C3FCF739FC9EC933377EEBDBF7B368700A7A0952B575E565454342E3737B77B767676A3C2C24207A50200288FC3E190D0D0D08C9090901F9C4EE7DF3B77EE3C935201807AB83DA708702AF9F2CB2F3B040505CD34C1F7EC264D9A38A3A2A2A4418306620E66281C0040B90A0B0B25333353D2D3D365E7CE9D66175294626E4EECD9B3E7B7940E00107E01AFF3BFFFFDEFB70505051F9C79E69901CD9A35B367F20100A8AA6DDBB6C9962D5B0A222222EE3CEFBCF326532200503FF85104385582AFB978AF73E7CE41717171045F0040B5698BA1989818A709C1FDEFBCF3CE6D93274F5E4DA90000E117A873F3E6CD6B6B2E3EEBD2A54BA81EB0000070B2020303253A3ADAB975EBD67EC3860DFB70EAD4A9BB291500F06E7474C4A9708032F9ACB3CE0A22F802006A527878B898FD4BB0F10EA50100845FA04E7DF6D9675D9C4EE739CD9A35F3A7340000354DC790F0F3F36BF5F9E79FF7A0340080F00BD41987C331F0F4D34F2FA48F2F00C0539A366D1AEC743A8750120040F805EA8C9F9F5FBFE8E8E8284A0200E029515151FE26FCF6A7240080F00BD49982828273E8EB0B00F0A4888808C9CFCF6F4D490000E117A84B814E27AB3900C0830753C5FB1976360040F8050000000080F00B0000000000E1170000000000C22F0000000000845F0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000A80C7F8A00404D397CF8B07CB7E53BC94ECB16E761CEADD5967CFF7C713472C8392DCE91D3224EA34000000008BF003C65EFBEBDB2227985EC8DD92B07CE3A2087430E5328B52430275022D32365F5CAD5B2AFCD3EE910DF814201000020FC02A8695AE3BB3A79B56C3D73AB6487675320B52C373857D2E2D3242B324B6483485C789CC484C75030000000A5D02E11C0494BD99A227B62F6107CEB584E688EEC6BBC4F92372553180000006550F30BE0A4EDDABD4BD25BA69FF07121BB43242C254CFC33FCA5C8AF4872E27224F3EC4C29F42FA4106B48465486C4FE144B410000009441CD2F8093969B937BC23EBE213B43A4C10F0D24E04080388A1CE2CC774AE8AFA1D2E8BB46E22870508835F55D04E78A338F4D3B000000E117409D08DF126E436F59FE59FE12921A420101000080F00BA09E6F68729DE29F5D712F8B808C000A09000000845F00F5DB099B35D3E517000000845F000000000008BF0000000000107E01D4AD82A00229721455787F6120ED9E01000040F805E0035B9A43A71D2AF72E3BDF6FE31CCA08000000845F00F5DF810E07A420A4E098DB33DA66485E833C0A08000000845F00BEEB8423410300000035C09F2200E06901990112B93E52FC0EF91D735FE44F91E2CC734A668B4C4EC701000080F00BA0FE711439246C6B98846F09AFB886B750247C73B804EF0A9603ED0E486E542E0507000000C22F80FA21E0408034D8D0C05E566A6394E52FD1CBA325FB8C6CC96895412D3000000008BF00BC3FF8C62C8FB1B5BA55E1AE29F6CFF6977D5DF65190000000A831D4AD00A871B68973E1493E1F3849D9D9D9140200002841CD2F801A971B9D2B3B2FDF4941A0CE7CFFFDF7F2CC33CFC8030F3C209D3B77A64000000035BF0000DFB27CF972F9BFFFFB3FE9DFBFBFFCF39FFF9475EBD651280000809A5F0080EFF8EAABAF64DAB4693266CC185BE3DBBE7D7B79E18517E4E1871F96962D5B7AF4BDD7AF5F2FFEFEFE76294F7A7ABAA4A6A64ABF7EFDCABDFF89279E90112346488B162D243F3FBFC2D7010000845F00C0296CD1A24536F86A536777D04D484890912347DA26D07FFEF39F253E3EDE63EFBF74E9521B70BB74E952729BBE5F70707049385EB162C551E177E1C285F6322B2B4BC2C3C3ED750DC89B376F96DB6FBFDD7E7E000040F80500C0FAF0C30F65EEDCB947055FB7DEBD7B8B9F9F9F3CF5D453F2C8238F486C6CACC73E8706DF3E7DFA9404DAB4B43449494991EDDBB74BD3A64D252C2CECA8C7BB1F7BE79D77CA2BAFBC229B366DB24DB5274F9E2C39393925CF030000845FC0EBA4E6EE93CFD3BF936F337E941FB3B7CA9EBC74C92ECC91206780C4044449FBD0E6D235BC8D0C88EE29F181D11418709266CD9A25F3E7CF978913275658B3DBAB572FC9CBCB93C71F7FDCE301D85D9B5B9ABB29B39B06DB3973E6484C4C8CBD7EE18517DAE769D8BDEAAAABECDF5A53FCEBAFBFDAFF8B26D00000107E01AFF1F9FEE53275F767F2EBE13DD23DB29D5CD5E80219D774B00DB8A1CE601B80F7E765CA4F87B6C9E28C6419B1FE717BDFA0D84BE49A46BD2840A01A66CE9C295F7FFDB54C9A34E98481F6924B2E916DDBB6D900FCE4934F4A444484473E93D6FE6A187707DBD5AB57CBB5D75E6B9B33BB6953E8EBAFBF5E9292926C736777EDAE865C0DC09F7CF289ADFD8D8A8AF268F9EDDBB7CF8E8CAD8B968D5ED760AE9F4FCBA759B366D2B1634739F7DC733DDA641C0000C22F500F68D87D74EB1BB6C6F7BEA689727183CEE2E7F03BE6711A80438382E5F4A058B924AAAB3C7CC648F9FAC0F7F2E2AFEF49D2EEF9F24CCB3BA4791007974065BDF6DA6BB69970556A72B5FFAF863B0DBF1A98DDFD716B8ABBEFAEF6ED7DFAE9A7ED6D6FBDF596DC7DF7DDE53E5E3F8B8662773F6177C0D4D7F164F0D5A0ABC15B6B97BB76ED2ADDBA7593C18307DBF70C0D0DB59F2B33335376ECD8214B962CB127195AB76E6D1FE3E981C3000020FC025E68CEBEC5F2D42FEFC8CDF157C94D71FDCB0DBDC7A34159977776CF93A13F3E26F7371B4E2D3050C9E0BB65CB161B7CAB5A837BDB6DB7D9E76B1F60ED23AC61AFA6681F5FADBD2D5DCB6B77B6C769B65CBA9FB09B06664F282828B0A177F1E2C572F5D557CBD8B163252020E098C7E949015DF4A4828E9A7DEBADB7CA82050BE4B9E79E93EEDDBB4B6262628D9F38000080F00B78A905E92BE5F9ED49F272AB3F4897F0D627F55A3734BE5212C2DBCA9D9B5E90C385793238F6120A182887F6DBD5397CB579AE4E5F54DDA6CB1A805F7AE92579F1C51765C28409E506C0EAD2BEBD5A233D65CA14DBF4594780D69AD4F2E8FD5AFBAABEF8E20B3B389706650D98354DCB4CFFDF56AD5AD9105B95D0AF0386F5EDDBD7F69D9E3D7BB6AD351F3F7EBC47FB4E030050D39C140150755AE3FBD82F53645A9B474E3AF8BAB50B6D6E5FEFE59DB3E4C3BD8B2864A09CE0ABE1EDF0E1C3D5AAF12DEB8E3BEEB0A15783A0BE764DD1A0AB4D9E478D1A2503060CB0AF5F7AB0ABD221596DDDBA55DAB66D2B43860CB101586B81753A249DF7D71D8C6B22F86A60D5E6CDDAF4BBBAB5DD5ADBABB5BE1A84B5E67CCF9E3DAC980000C22FE0ABB48FAF36757EB1E53DB6FF6E4DD2D77BA5D5787976DB34D992B383C2064A05CA175E78C136DBD59ADA9A6872ABC1D7DDEC57A717D2D7AE09DAE7576B48DDB47677F9F2E576202BBDCF1D7C1F7BEC315BCB1B141464FBFAEAC0525A9BAA35C53ADAB3F613D6FFF964E9FFA5270DAEB8E20A1BC66B82865F1D955A3F5F45B5DA0000781B9A3D0355F450CA64DBC7B7A66A7CCBD21AE03B9B5C2B0FFFFC9A4C6F378902C7292F3B3BDB0E50A50151FB9E6A58D580A873E39675FBEDB71FD37FB6A2C76AE08D8E8E967BEEB9479E79E6193BBAB2BEBE36F1ADD60ED5045977B82D4D0791D2D19C6FB8E10679F3CD374BC2EF79E79D6743A44E83A4B5B2A56978D6E7FDED6F7F3BE9F2D33EBEDAD4B9A6826FE900AC7D9CF5F5B5961B00006FE74711C0978D1C3972524D8E4CAAD3197D99BE429E6A719BF83B3CF7F3E91CD64ADEDE3D5742FD82A56DE8195E5FCE3AF0D09E26347FF4168D7736F6991179DDC157A7DCD166CA818181F676ADF9D5DB3232326CB82D2C2CB4B7AF5DBB567EFBDBDF8AD379A461D3F3CF3F7F54F35C7DDE75D75D279D3A752A09AD3ACFAE4E2FB471E3463BAD4FE9E757D639E79C639B2F974743F6E8D1A34BA63FD2F7D4C7EAFBE86D1AD84B2FEEEFCFFDFF56978EEAFCDE7BEFC99831636AB45FB39B86EA37DE78C396A5A7A765AA0FDBC177DE79E731B64000E0BD68F60C5481CEE3ABD3190539033CFE5E0F341B6EA740AA0DB366CDB2CD326BAAD9274E4D35BD1E6960D5BEBDCD9B372FB746D63D28944ED5E3A64D705F7EF9E592EB8B162D929F7EFAA9E4BAD6CC6A70BEF4D24B8F7A2D0D863AF2B3865F13607CA64CB556569B27D7E488D6A569590E1C3850A64D9BC60F0000E0F568F60C5492CEE3BBF570AA9D9AA836F48CEC248FA6FCDBF631AEE9BEC56569CD903B0068EDD5E5975F2E6DDAB4F19AA94CF6A6EC95C0B04089882D1EE068C5FB2BA4F979CD25A665CC318FCDD89521E93BD2E58C738FAE312FCC2F94ECF46C098F09AFD27B17E416885F60F9B5FC8BDF5A2CDD8776AFF07EF7635AF66829F16DE2E5D735BFCAE99D4EB7B7EFDBB64FA29B45FBD46FC4BD1E69D0D240AA4D77ABBB1E69F0D5019534E00E1A34A8C2A6C8DA6459477DD6DA536D826BCB7CF162B9E69A6BE4B4D34EB35306951ECC4A3FCB5D77DD556E2DA87E6E0DC08F3FFEB87DEE95575EE935651A1212629B4957A54C75902B1D304BFB357BD225975C623FA74EEFE49EA71800006F44B367F8B49A6CF63C6BEFD712E1172A97459D576B9F7F67EE5EF935374DBA869FEDD1F7F9E0830F8A036261A1ECDCB9D3D696CD9D3B57525252EC4177A3468D8EDB0FD2D3CD9E43A342E5F5E1AF4BE7DF7616FF407F59F8CA42E93EBCFCA96016BDB1481C0E87C49D1D27DF257D678370DACF69F2DFA7FE2B7987F34A42F1C17D0725E5DB14D9BB75AFECFC71A7FCFCEDCFB274EA527BDFBACFD649E6EE4CF965D52FF2E3FC1FE5AC9E67D9DBD37F4D97E0C823A163F7C6DD927B28571A366D58725BD9C72C7B779974BEBAF8734FB9698A240C4A10A79F535E1BF29A741FD6DD7ED69A5657CD9EDDEB9186CD5F7EF9C5AE475F7EF9A5FCFAEBAF366C9E683D72DBB163873CFBECB3B629F2E0C1838FDB045943A0F69F3D74E890ECDDBB578A8A8AECEDAB57AF9675EBD6D941A6DCB769D3639D4AE878D308858585D9FBFFFDEF7FDBA6C975DD7CDC5DA6FA3FBACB544784D6323A51997EF3CD37B6D9748F1E3D3CFA19F5FBD1ED466666A69C7DF6D972AAA2D93300783F6A7E814AFA36E347B9AAD105B5FA9EDD22DAC9F43D5FC8E8F801B5FEFFEA7432CB962DB38B860077AD93F687ACEE8040D5A12155C36FB7A1DD2420284036FE6FA35CF5F0557260E7011B3283C2824A1EABB5B45AF37BD9BD97C9FA05EB8B83A6BFD3D6B286350A930B6FBAF048C8890EB30139796EB274B9A68B048707DB00DCFEF2F6F2DDBEEFA4E505C5A167DDE7EB4A9EB362E60A896F1B2F0E677160CDDC93693F83FB319B166DB2AFABEFAF35CD1AB60BF30A256D4B9AFD3FA29A4495D4126B6076BF8E2FD340F4D5575FD94583AA06CB8484840AD7239DF647FBF85E7DF5D5951EA0496B797FF8E10769D7AE9D242727DBDBB41678FFFEFD257D817544650DB6DAD7F74434243FF4D043F2E8A38FDACFA8359BDE242B2BABA44CF5FFD2705B5E996A595C7041ED6CB3F47BFDECB3CF6A7C502D000008BF401DF8317BABDCD72CB156DFF3EC9066E67D53EAFC7FD75A277710D683EDF6EDDBDB26A17AE98941744AD3A6C26BE7AD953697B4B181B6A8B0487E4DFE55367EBD519A7569265D071EE9EFB974DA52B9F28F57DAE6CD8BDF5C2CCD3A3713FF207FF9E4F14FA4C3951D6C20D530ECD6E0B406E217E0671FA3A1B420AFC006D91DC93B6C4D6D79F475DCB45659436C930E4DECF5B8D671D2A84523FBB706DFCC5D99367C854485D8DB97BEB3D47E367D4FB7C9C326CBF09787DB80EFEBB43FAE3BB4E91CBD3A48D2C5175F5CB21EB983EFD0A143AB1C3875B4E1BFFEF5AFB6E9B20E92654F8694EA27ABC15B1F53D91337B1B1B1B609F49FFFFC67FB9AC7AB2DAE4B7A92CA5DA61AEE3B77EE5C52A65A9E3A276F6D68D2A4891D5C0B0000C22FE003F6E4A54B6C40ED8E66DA3020420EEECD909933677AD5C1F6AA55ABECE20E099EAC5DD2B07A5AFBD36C8D6C695A935ABAFF6ECA772936B86A88DCF4CD2619F4C220C93F9C2F5FBFF6B50CFCCB401B9A678C9B216DFAB4B18159AF6B18D6C09B919A216929693694EAFBE86B9FDDBBB8F966E99A5FADD19DF7DC3C1BBAD5AE0DBB243C3ADC86E07DBFEC939C8C1CE93BAEAFBD4F6BA4835A06D960ADB5C1FA180DBE9BBFD92CD16714F7F5D5D7BA72C295351E7CB566D09BD699F2688DB0F6CDD5C5AEEB0D1BDA75AB3AC157E908CE3A4AF2CA952B8F1AE04A454646DAD7D44058153AD0D61FFFF8471BAA75D0A9B8B838AF2ED383070F1E55A6DAA45EFB4ED7463F5C3D99A1DF290000845FC0076417E648A8B3760780D2F78B48CE970F967CE0BD2705CCC1F5B7DF7E2B2DFAB5F0C8EB6B48AD88BB49AB6A717E0BB979CACDB2E1AB0D72FE90F3252B2DCB2EFD1FE85FF298A12F0D95590FCDB2E1579B1CFFF8C58FB649B23647D6005A999A5FED3FAC81556913EB3697B6B14177CB922DB2F797BD4707BC3D99F6F597BFB75CCE4F3CDFBE47A7AB8AA7D739907A40125F4A94C090C01A2F330D7FEE9313F5853651D690AA73C7569736B95DB06081ED835A7ADDD01A609DFEA83A7470291DFC4AFBDAD637DAD759478B764FE9E4495AB3AE35FB0000107E011FA041B4B603B0BE5F66477F19D8E41A8FBE8F7B509D13D19A24F7E0416E5A1BA6FD0DD324CD239F4D436AD69E2C1B4A5337A4DA5193D5C1BD07E5F48EA71FF5D8ED6BB6DBD0AACD8CB5FF6F5078906D32AD7FFB07FBDBA6D2DABFD7AD63FF8E92B5374B5AF56A6503ACD6CC96AEF9D57EC01A608F0ADCF98525B5C13BD7ED94D006A1F6B5F5EFC8F8C892C76918D6C1B734F0260C4E3826E436886FE091E0AB74D0A1BA1CF0AA3AB4E6579B2B6BD3FAEA3631D626CD5A7B5C3AF82ABDADEC7A5B591B366CB08339697FF7BAA8F9AD4C99EAEF5297B2FFB79E04D0FED0B54183AFB78C0E0F0000E1173849DAE4599B3E370FAABDA93CF6E7654A58A348B9FED2EBEBEC00BB74E0D54BEDFFA835491A06B47FA1F6D59C3F7FBEC7C26F6CCBE2699E34446AB3620D99DAFC58A73ADAB3F9C808D35A433CFBE1D9B66FF0B9D79D5BD20F57BD3DFA6D19F9FAC8639A4E977EAE8EECDCF692B63628BB9B43EFDFBE5F0EEE3F2851A71F69EEAECDB0DDAF53BAE6578372E99A5F1D304B97997F3C7EF363AD9DAEEAF44B27A273D99E4C0D6A6D84DFF2D623779F5F0DC1D569FAFCE1871F96F4F72D4DFBACBFF2CA2B72DF7DF755E9F5F4F3FCE52F7F915B6EB9457AF6EC5927DB9DCAFC36DD4BD932D526DBB515D8B5C9B3367D060080F00BF88076A1CDEDA057B5197E7F3AB4CDBC6F8B5AFF5FB506CD3D58901E546B8D8E1E4C6BDF5E3DB8D683ECDAE01EE04AFBE416362DB4CD95577EB0D2DEA7FD6D359CEA3CBAC3FE31CCD6108FF9EF187BA9E15547856E7D51EB0A5F5B43AED6E06E5EBCD986081D195A03F0E1ECC3B27BD36E1BB6B5E638A441C851CFD39AE7F26A7E752E621D3DFA8421614FA6ED1F5C12B0566C3D6A102D5F76A2F548FBD83EF2C823767E5F559500AC53FF7CF2C927929B9B7BE44445A9E6CF3AF5918E7EDCB163C74ABD9E36E77FE6996764C4881175167CCBDD69FBFBDB305F99DFA696A706F8DAE8F3ABE5AFFDAE010020FC023EA05B643B599C912CFD1AD6DEA8AFDF66FE68A73BAA6D1A7CDDD3D2E8F4295DBB76F5F8A8CE65E564E6D8519AC7CE1D2B2B3E582105F9C561DC3DBAF3EA0F57CB75CF5C676B4E6D58D9BC473E7BE133898C8B9433BB9D59612DEF8EB53B6CAD704E568E0DB9EEE0ACCEEC7E667140DD9D696B6D75A02A7D7C695AEBEC56BAE6B72C6D429D7B3057F20EE515071513E2B7FFB05D56CF5E2D17DD7A917D7FA503616D5BBDAD64102D5F0CBC55598F3440E908CB1A807500A7CA4E9DF3AF7FFDCB3EBEF4FBEA929E9E5EB24EBFF4D24BF2EAABAF9EF8044566A67D7F9D63D8DBA639D2E05BD932D5A0AF0375D5C648D5DA5C5DA79A020080F00BF880CBA3CE9737523F9182A202F173D4CE3CB79FEF5F2E6FB579A8D6FE47AD35D211717BF7EE6D2F6BAB86B7DCD014112CE3BF1C6FFF3EEB82B3E4F3BF7D2EDF7FF47D49903CADDD69F6EFDE77F6B697B167C54ABF3FF62B996A68CD276B6C13650DB6DACFD75D5B9B9B9D2B118D23242236A224C86A1F5FED1BEC6E7EAC4D98B546D686F08C1C3B976F74B3E8634F12E415D8F0AA531C1D539651A17664670DE5EE707CCDE3D794D4F2F6BAA5972C9DBAD4F651D6E9927CC9C9AE473A82B8CEB3FBF8E38FDB66CC1A428F67CE9C39B6E6B1749F570D7E3AF54F4A4A8AADFDB4272B3232E4F5D75F97D1A34757F85AEE1A5F1D39DA9B826F75CA5483F1F4E9D3252F2FCFA327AFF4C482866C3D69010000E117F001F181D1B6C9F3D707BE974BA2BA7AFCFD1667AC91D88006727A50ACC7DF4BC385060EAD21AAED1ADECAD0409BF8F7C44A3DCECD3DAA7265680D6FB7A1DDAAFCB97A0CEF61E707AE887E86D29FA374F3E68A6AA6EBB39A5C8FF475DC4DA035BCE97CB5E5CDD1AB35BB1A7E4BD7FA6A9FE7DB6EBBCD7E86FBEFBFDF8E22ADC1577DFDF5D7D2AF5F3F69DAB4E931AFA5415B836FEBD6AD2B5DE3ECCD651A1D1D2D6DDBB6952FBFFCD2CECBED293AC2768B162D6AA57935000027C34911009537A2F115F2FCF6245BFBEB69FA3E898D6B67D0A2DFFDEE7776901C6F0CBEDEEC78C1F75454D3EB91BB06586B15274F9E5CD20FBDB4BFFFFDEF72E8D0A192EBFADE43860CB1832F69F3E061C3861D350AB106E9679F7DF698D7D1DB35F8EA28D9B7DE7A6BB941BB3E96A99E34F8E8A38FCA1D08AC26E828CF3A2897BE0F0000845FC0875CDE30411AFA47C89BBB3EF5E8FBBCB37B9E0439026440F405143A4E691A80274E9C689B2F970DC01A8A5353538F1AE44AE7E42D3DD2B5D6986A4DAED682BAE99CC23A3856E900A7A34C3769D244EEB8E30EAF09BE3541FB50EB805D3367CEF4C8EBCF9E3DDB96715D4CAD050000E117F0B067CFBC43FE9DFA89ACCEDAE891D7D711A55FD9315B9E3CF3B65AEB5B0C78B3A8A82879F4D1476DBFDE175F7CD106606DEEFCC20B2F940C68E576EFBDF71EF37CADFDDDB7EFC808DBFAFCA953A7DADBDC0361694DB137D5F8D624AD95DDB469937CFA69CD9EB4D3E6CE3A8A36B5BE0080FA823EBF4015691FDC87CEB841C66E7949A6B579A446FBE4FE7A788FDCB9E905B9BFD9706919DC84C2065C748027ED03AC8157C3EAEF7FFF7B3B98536568AD6F458FD551A2B5C9F38409137C32F82AFDBFC68E1D2B93264DB2D7FBF7EF5F23C157C3B4965BE966E5000078336A7E816A1810DD53C6341928C3373C5E6335C05AE3ABAF3734F632B9A6512F0A192843FBBD8E1F3FDE86D5E79E7BCE36573E19494949B6F657039CAFF777D713001A7E972C59226FBFFD76B5CB4E9FA7E5366FDE3C5B6EDA2C1D0000C22FE0E3AE8BE92DF7354D94DB363E27AFA7CE39A941B0B48FEF2D3F3D6303F5EDA75D43E102C709C05A8BA9CD947524E8EA86B869D3A6C9BA75EBEC6B9D2A03BD6900D6FED35A13AC271134C09637885879F4715ADB3B6EDC385BE61AA409BE0080FA8666CFC049D01AE073C35ACB4329936556DAD7B6B9F2C50D3A57FAF93A9DD1DF7E7DDFFC109D32B5ED233475062A1980EFB9E71E79EDB5D76C087BF8E1876D18AEAC59B366C99A356BEC734FB526BB1A7C870F37DBA98B2FB62700B4165707AC4A4848B0D33FE9B450DAC45C036E6666A61D504C6B8B57AD5A6507CFFAC31FFE600710030080F00B9C82B4CFEF5B6D1E92B9FB97C91BA99FC8A35BDFB001F8A2C8CE72766853890D88925067B06417E6C8FEBC4CD99CB343966424CBE7FB97DB797CDDCD9C19DC0AA81A9DCB5703B0865FED0F5C999A480DBE5A83A9A33B9FCA7D5535C83EF0C003B6D9F7CA952BE5ABAFBE92EDDBB7DB01C434F86AD9E809051D01BB63C78E72F5D557338F2F0080F00BA058BF86DDED929ABBCF06E18FF62E9235DBB6485A5EBA1C2ECC932067809D26A95D680BE916D1CE06E69A1C2C0B385503F0942953E4F1C71FB773021F2FA0CD9F3F5F3EFBEC33F9F39FFF5CA59A625FA64DA1756AA8D2D343010040F8055029F181D1322AAEBF5D0078DEA851A36C935DED035C5100D69ACD8F3EFAC8D676D2571500805313035E0100EA3DADB91C3C78B09D0F78CB962D47DDB77CF972DBBF558371F3E6CD292C000008BF0000D45FBD7AF5B28339697F5E1DC9592D5BB64CDE78E30D5BE34B9F5500004E6D347B0600F88CDEBD7B4B585898FCF5AF7F95B8B838D9B56B971DA1B865CB96140E0000A7386A7E01003E45A7ED39F7DC736DF367BD6CDFBE3D8502000008BF0000DFA3B5BEA52F01000008BF00009F939F9F6F2F030202280C000040F80500F8A68C8C0C7B1919194961000000C22F00C03715161616EFE49CECE6000000E1170000000040F80500A07E4A4F4FB7975151511406000020FC02007C535E5E9EBD64C02B000040F8050078B5ACAC2C993061C231B7A7A5A5C9A041832435359542020000845F0040FDB57AF56A090F0F97B3CE3AABA409B3DB942953E4F1C71F97F8F8F80A9F4FCD2F000028CB9F220000789B175E7841DE7CF34D69DBB6AD3CF9E493929C9C6CC370AB56ADE4C61B6F94EDDBB7CBA64D9B64C08001E53E3F3333D35E46444450980000C0A2E61700E075AEBAEA2A19376E9C6DDAAC7FDF7FFFFDF2DC73CF499B366D6C20EED1A3877CF3CD37153EBFA0A0C05EFAF9F95198000080F00B00F03E5AA3ABFD7A1F7EF8E172FBF53EFFFCF39293932341414114160000A8349A3D0300BCCAA2458B6C13E7E0E060E9D8B163C9ED7ADB575F7D25975D7659C914461F7EF8A124252555F85A63C68C39EAFAC08103E5FAEBAFA7900100380551F30B00F02AA3468DB2E1F6C1071F94F5EBD797DC1E131323C3870F973E7DFA88BFBFBF1C3E7C585AB46851A5D73EDE20590000C0B751F30B00F03A5ACBFBCA2BAFC8C2850B6D13686DE69C9292629B41CF983143F2F3F3E5CA2BAF94CE9D3BDB41ADDC035C1D8F3693EEDEBD3B850B0000E11700AA27242444427342253B389BC2A863813981E20870D4FBFF43C3AD9B065FBDAE41586B7F75B467BDD481AF544242822C58B040020303253737B7C2D7D426D44CF642C5FD00002000494441547D040000E11700AA2D363656CECE3C5B5607AFA630EA58C3030D25BA6174BDFF3FFAF5EB672FB3B2B264C4881147DDA761F89E7BEEB135BFDA7FF7820B2EB0E1B7A8A8E8B8AF79E9A597B282000040F80580EA6BDEBCB9ECFA76979C1579966C0EDA4C81D491E09C6089DB1D276D12DAF8CCFFD4B76FDF63FFCFE060DB24DA5D3BAC35C0DA47383D3DBDC2D7D15A61774D310000383531E0158093A67D293B74E8200D363690F3D3CE9726B94DCCC685CD4B6D093F1C2E6DF6B491B69BDA4AA7F69D243434D47702BD09BAE5D101AFDCF7695366EDFBAB2A9AD757E705F6A5720100005547CD2F801A111D1D2DDDBA7593CD9B374BD1A6226978A82185524BB456B361C38672D67967F944C09B33678E9DD2282C2CACE4B6A64D9BDAC05B9AD60AEBEDEAE28B2FB6CFA948D7AE5D5951000020FC0240CDD01AE0F6EDDB53103829AD5AB5B2CD98DDC1569B37EB28CFA507C15ABD7AB5EDF73B6BD62C7BBD4D9B3636F8676767977B7280F00B000008BF0000AFA2CD9935F8CE9E3D5BAEBDF65A7B5D9B2D97AEF9D581B0F436376DEE7CD14517C9BC79F3C4E9744A616161C97D5DBA74619467000040F8050078A73E7DFAD8CBA4A42459BB76ADFD7BD3A64DB6B65783AF4E7754DA39E79C63C36F593D7BF6A430010000E11700E09DB4E9B3D2797CEFBBEF3EFBF79429538E09BD6E3AE895F63DDFB76F5FC96D5A6BDCA953270A130000301C2B00C0BB68FFDEF8F8F82A3F4F9B3E970DBA5A1BCC28CF00004051F30B00F02A393939B6C676FBF6EDB6EFEFFAF5EB65E1C285F6BEEFBFFFDE36876ED1A245B9CF2D3BEAB3F60306000020FC0200BC7707E51AE0EAFAEBAFB74DA0F5BAD60A87878757F89CD6AD5B1F75DD3DFF2F000000E11700E055742467EDDBABB4D65769E02DDBD757AF77ECD8F1A8DB7454E7264D9AC88E1D3B24363696519E010000E11700E09DB496372D2DED9840AC8B9BCEF9ABC158C3AF0E70A5CDA175D9B66D5BC9730F1C382063C68C9166CD9AD9C79D7BEEB9D5EA4B0C000008BF0000D4B85EBD7AD9E54434E83EF7DC73360477EDDA55BA75EB2683070FB6E15907B9D2BEC3999999B61678C992253273E64CDB2C5A1FD3B2654B0A1A0000C22F0000754B6B76DD7D7ECB2A2828B073FF2E5EBC58AEBEFA6A193B766CB9CD9B75D02C5DB4F9B3F6FDBDF5D65B65C18205363077EFDE5D121313EDFD000080F00B0040AD9B306182FCFEF7BF3F6A44671DE86AD0A041D2BF7F7F5BA3DBAA552B1B62AB328D914E85D4B76F5F5BAB3C7BF66C993469928C1F3FDE86630000E0FB98E71700E055860F1F7ED475AD05BEE79E7BE40F7FF8830DC1DABC79E4C891D59EBF576B7BB5D65783F0534F3D257BF6ECA1D0010020FC020050BBB4CF6E69FFF8C73FE491471E9155AB56C915575C2103060CA891F7D1F07BD55557C90B2FBC606B93010000E11700803A919E9E6E43EA9A356B6C53E79A0ABEA50370972E5D6C1F62000040F80500A0D6E894460F3EF8A06CDAB449E6CC9923EBD6AD93FFFCE73F121717270B172E2C59B66FDF5E23EF77EDB5D7CAB265CB64EBD6AD143E00003E8C01AF00005E45E7E9EDDDBBB7DC79E79D929C9C2CE79F7FBE0DBE3A5D51695A2BDCB469D3937E3FED033C70E04099366D9A3CF4D0437C010000107E0100A81D23468C903BEEB843A64E9D6A03E937DF7C23CD9A35F3D8FB5D72C925F2DE7BEFD901B5E2E3E3F9020000F041347B0600789DF0F0707BA941546B8075A4E79494148FBD9F4E8394909020CB972FA7F0010020FC020050BBB4D9F3A5975E2A93274F96575F7DD54E7BE429DDBB77971F7FFC9142070080F00B0040EDD041AF940E42D5BC79733BFDD1C48913ED00589ED2A44913D9B66D1B850F0000E1170000CFEBD1A34749B3671DD42A3232D2FEAD0353E97D9EAAFD8D888890CCCC4CBE0000007C14035E0100BC8A865CB79C9C1C090D0D2DB9EEC9C1A8F47DF5FD0000806FA2E61700E0D541383B3BBB56DE4B836FE9E00D000008BF0000D40AEDEB9B9191512BEFA54D9EB5E933000020FC020050AB74B02B1DF4AA36ECD8B1C3A37309030000C22F0000E5EAD8B163ADCDBDBB6CD93269D7AE1D850E0000E1170080DAD5B56B5759B972A5E4E5E579F47D0A0A0A6CC84E4848A0D0010020FC020050BBA2A3A3A56DDBB6F2E5975F7AF47D162C58202D5AB4F0E868D2000080F00B004085121313E5A38F3EF2D8A8CF3ACAF3071F7C60DF070000107E0100A8133A0855CF9E3D65E6CC991E79FDD9B3674BF7EEDDA565CB9614360000845F0000EA8ED6CA6EDAB4493EFDF4D31A7D5D6DEEBC7AF56A6A7D010020FC020050F7FCFCFC64ECD8B136FCD65400D6E0ABAF357EFC78090E0EA690010020FC020050F774F0AB499326C992254BE4EDB7DFB67D75AB439F97949424F3E6CD93091326486C6C2C850B0000E1170000EF0AC013274EB435C15A63AB0156A729AA0C7D9CD6F68E1B37CE06600DD2045F00004E1DFE140100A03ED1E03B7CF870B9F8E28B65DAB469B6165707ACD2397A9B366D2A919191121A1A6A036E6666A6A4A6A6DADAE255AB56D9C1B3FEF0873F48EBD6AD2948000008BF804F395C585818E474D2C801F0351A641F78E001D9B76F9FAC5CB952BEFAEA2BD9BE7DBBA4A7A7DBE0ABFD78232222A4499326D2B16347B9FAEAAB99C7171E61F6337A5140490000E117A84BDFEDDFBFBF4DA3468D68DB08F8286D0ADDB76F5FBB0075213333B3C0E170FC4049008077A33A0CBE6EE1EEDDBBB7530C00004F494B4BDB5E5454F405250100845FA0CE9883910F5253534F3397F9940600C013B66FDFEE672E3EA0240080F00BD4992BAEB862754141C1EA8D1B372EA7340000356DCB962D9BF3F2F2365C7EF9E54B290D0020FC0275AAB0B070DC2FBFFCD272FFFEFD347F0600D4984CE3E79F7F6E60F63363290D00F07E7E14017CDDD4A953D36EBCF1C6D5A9A9A9BF8D8A8ACA0A090989A4540000271B7C972F5F9E51545474EB15575CB188120100C22FE015DE7EFBED2D23478E4CDEB163C7D0DCDCDCEF1A356AD4D4E170D0F2010050659B366D5AB176EDDA30F3E7AD7DFBF69D43890000E117F0BA003C62C4888F3233332FDBBA756BF8C18307576CD9B2C53179F2E406E63687CE071A1A1A2ACC098C53D99E3D7BE4D34F3F95D8D858090B0BA34000299EC7373D3D7DBBD977FC989C9C9CB76FDFBE1DE6B661D4F80240FDE2A008702AFAECB3CFBA381C8E81B366CD1A630E624A9A4107040448545494346EDCB8E45243B1DE0E9C0A56AE5C29AB56AD9273CF3D57BA76ED4A8100C574C680D5665968960F18DC0A0008BF40BD337CF8F01E0505054B4EF0B002B3AC3561799DB95C6696F54141414BA74C99924E09C2D72426264E321713CDF2585252D2244A040000F80A9A3DE394B666CD9AED1D3B767CCB04DBEBCDD58A06C2D276D07166E968967E6619919F9FFF8079DE1D1D3A74E8B576EDDA1994247C8559AFFB980B5DBE4A4E4E5E48890000005F41E7469CF2929292529C4EE705E6CF942A3E35DE84E66B294100000080F00BD40BD3A64DD339802FA96A0036C199AE0300000000E117A83FB406D8CFCFEFA2CA06E0A2A2A27C4A0D00000020FC02F58ED600BB02F0D6133D76C68C190C010D000000107E81FA1B80A578C09FE306E0C4C4C48F870C19D291120300000008BF40BDE46A02DDCBE1706C29E7EE22B364996580B9FF3B9D1A66D0A041E1941A00000040F805EA1DAD012E2A2ABACCFCF96B9960EC34C1B89DF973AE5982CD32D15CDF6842F07D7DFAF4F1A7E400000000C22F50AF680DB0B9E865966D6583B1B9AFBF148F10BDC82CF166792E3E3E7E8909C17D2839000000C0BBF85104C0F1252727A777ECD87196F9738409BC6165EE4B31CB9B9D3A75D2DAE1AE66696B96511D3A74E8626EDB6CEEDB4109A23E31EB7A1F29EEF3FE95597F175222000080F00B9C6201B873E7CED3D7AC599351C1FD2B131212DECCCFCFD766CFE7381C8E73CCE548132402CCEDAB8D1C4A11845F000000C22FE0F52A0ABE6E1A704D58F8BC5DBB766F9AF0DBCA2C3A12741F1388479B40516442F04AF318E60606E117000080F00BD47FEBD6ADCB5ABB76ED0C1322BE32577B98E50CB35C6142703F73DB466D2A4D2981F00B000040F8057C8286DC98989857C3C3C37F365713C4D51FD8848B1E9D3A755A61EE4FA39440F805000020FC02F55E4A4A4AA10910AB4DD87D478A4757D7BEC0EDCD32DADC16DEAE5DBB65EBD6ADCBA5A440F805000020FC02F59E0911D9DA1FB873E7CEEF1415159DE10AC0173B9DCE61266C1CD0804C2981F00B000040F8057C820E9A6502C5FBEDDBB75FE270387A9A9B5A9AE55A1338AE37B76D5CBB76ED164A09845F000000C22FE01334E4C6C4C4BC121E1EBEB3A8A8A89709C2679845A7464AE8D4A9D32AFA0383F00B000040F8057C82AB3FF0F2F3CF3FFFD5828202BD494786D641B1746AA48076EDDA2DA73F3008BF000000845FC027B8E607FEA253A74EEF9BABF1523C28561FFA0383F00B000040F8057C8E3675D6FEC0A5E6076E25DED31F38DE15887EE29B22FC020000107E01D44408B6F303474444EC97E2F9815B78417FE0A7CD72403F8B59B69B85E6D8845F000000C22F8093E3EA0FBC34212161727E7E7E94B9A98BD45D7FE08EAEF77FD62CEBCD72B1144FD5442D30E117000080F00BE0E4B9FA037F6202C93BE6AABF59BA99E5D25AEE0FFC86591E7705DE40B32C37CB2F6619609670B3ECE09B22FC020000107E019C341342D2CDF2E939E79CF371515191D6006B4D6C6DF407D666D73A14F57FCD926D962CB3F435CB3E5708769AE50A291EA42B996F8AF00B0000E0AD9C1401507FBCFBEEBBAB9392922E71381CBF33575334AB389DCECF1313135F193E7C78530FBCE5ED66F9872B043F679618B3CC318BBE978E4E9D2FC50373C5F0ED000000C09B51F30BD443C9C9C9EB1312125ECDCFCF2F282A2AEA62C2702F73795BC78E1D836AB03FF008B3AC90E2BEBD6F99E55E57C8EDE90ABD7F334BB4596E31CBFD6629E49BA9FFA8F9050000BE8A9A5FA09E9A32654A4E5252D224A7D3D9DA5C9D6A9660B34CF4F3F35B93989838EA245F5EFBF25E6596F9AE10AC035DA54A715367BDEF3257007ED82C8FB9FE76D35AE278D7DF7AE9CFB705000080BA46CD2F50CF252727679B6596AB3FB08ECCACFD6F4FB63FF03FCDF292144F6B146996196619EC0ABE774A7173E8AE523C12F49BAEE7685FE00CB36C72DDDECB157E2F768566D403D4FC0200005FE5A0084E0D0B162C689A979F77BFF8C9404781E3344AA4D6EC32CBAC82828217FAF5EBB7A936DE70C89021031C0E8706D716AE9B669A65425252524A155E4683EBA2726ED7F97EE7994543D1FFCC32488A6B84DD125C0159F5308BCE499C23C535D3A80712131327998B8966794C5B1650223EBE5F28C89B608E04AE77143A9A5022B5A3488A763BC4F19FDADC2F000008BFA78CCFBFFCFCCA7CC97F7F7FE3FD21071A1EF03F1C729842A92581398187635263BE6DB8B7614B1348EFE8DBB7EF9CDA78DF41830685FBFBFB3F5C545474B72B8CE698F77F313F3FFFC9F7DF7F3FAB06DEE20EB3E8FCC3CF94B95D6B819F74055F0DBDDA6C5A07CA5A6696E6667984B582F08BBA377FFEFCBEF98EFC99FBE2F60599FD4230FB855ADC2F1C0E2C88D915F343D49EA838A7C3797B6DED170000347BF6797A663FD791BB785BAB6D61E98DD29D050105144A2D2AF02FF0CF8CCA6C7E30F2E08F0DF634183A7CF8F08FA74E9DBACFD3EFAB035E2527277FD1B973E7774C00D641A9B446B697D3E91CDCA143879FD7AE5DFB53355E5643F4A552DC145A07BBD2E6CFA5FBFA8E35CB41296EF6ACFD7CB5B9F548B37C60968FCCB2CA1588E1C568F67C6AEC17F21C798B7E69FD4B84D92FF8B35FA8F5FD8233B341E669590DB276344C6B789DD92F7C541BFB050000035EF9BCF4D0F4A9FB1BEF0FCE0ECFA630EA9029FFEE99D1993F98F0F9786DBEEFB469D3B6272525DDE470382E322178B5B9A995F9FBE3C4C4C44F870C19D2B18A2FA735C617BA42EC936582ACD6020F94E2699174EAA314291E806BA1EB3E1D346B346B0250F7B282B25EDE17B72F8CFD42DD3A1476A8CDFE98FDBFD4F67E010008BFF059C187827B1C883A70E207168A04A6074AE0BE4071E6B35A78C2AED37669F0EC5317EF3D7DFAF4453366CC38D7BCFF0D525C33DBCFFCBDCA04E0C9559C1FF859B35C2EC573FDBA69FFE070D77DFA779AEBF616AEBFB59FF04C57580E664D00EA56406EC0A595D92F388A1C47F60BB9EC173C212D2EAD435DED1700E054C41424BEFE05E7F9079DA82F57D8D630094F092F39B829F22B92CCB332E560F38314600DCA0DC93DBBAE3F8309C153FBF4E99374DA69A73D5E5454749F39E81A5D505030223131F1D9E0E0E06774FAA413BC44966B71D33EBE3A17B03685BED22CE3CCF227B3682DB34E8FA4A3423FE80ABEFF602DF02E43860C79C0AC034F5770F744B35E4C2C731BFD807D805F9E5F5855F70B7AAAFC60B38392D93A538A1C4514624DED1782737534FD484A02006A07A7724F71C1A9C112F953E45167F51D050E7B5BC8CE100AC8072D5CB830DF84E0074DE86D67824F92B8E607CEC9C9593574E8D07E557CB99B5CA156FB00BBE7FBED6096D9AED7D5652EA5EEA53B00A77375551E6FD61746A63D45F70BDA3A480371D8CF6114100080F08BFA293435B4C2FB4276107E7DD9FBEFBFBFC984E0A14545451748F13CBC6DCDDF9F9A00FCF9B061C3BA54F1E56E35CBF566D1F0AC4DABB59F6F8A59DEA0A4BD97F9FEF5C4445A651E6BD68DF4A0A0A09994DA29BE5FE0A4280080F08BFACAEF60C5037EFB1FA255FCA960C68C194B939292CE77F5074E3521A76F6161E1778989896F0E1A3428BE922FA301EA5F52DC245A9BD13EECBA6D3C25ECDDCCF73DBB920F5D588966F1F0F5FD4236FB050000E117F5940E680228ED0F5C5050D05A8E345F1EE5E7E7F7F3D0A1439FD679832BF9328BA4B8DFEF0CD7756DF61C4EE97A75F89D51C987528BCF7E010000C22F00DFF0FEFBEF67E9804626F4B676F70736E1E801735D47861E5085975AEEBAFC9D1C3D4016BC4C6868A89EB0483DC1C3B242424216515A000080F08B7AEB78A37632A2E7A94BE7072ED31FD83D3FF0826AF40786177335653ED1A06433CDE3D2292DF60BEC170000845FD45B79E17915DE57105640019DE2CAF607364B9FC2C2C255DA1FB88AF303C3BBBD7582FB3FA188D82FB05F0000107E51AF65B5CE92FCD0FC636ED7DB32CFCCA4806095E90FAC3585A3CCF58D26043F376AD4A8284AA87E4B4D4D5DA4A33957B499080E0E9E4329B15F280C2C948CB33328200000E117F5931EE0E446E51E73BBDE96D7208F024289F2FA039BE5BE9C9C9C1F870E1D7A2D25547FE9DCCFE63B9D5AC1DD7319E599FD82BD3D3C5F0E373A4C01010008BFA8A72B40BE53020E061C737B406680BD0F28AB9CFEC0F1E6EF59DA1FD82C099450FD64BEC37915DC3583D239B5380A1CE5EE17740A24BF437E14100080F08BFA2738355862FF172B0107CA0FBF7A5FE88E50A6BD40F989A89CFEC066B1F3039BA5052554BFECDAB54B07BDDA5E2610A7070707CFA7744EA1FDC26EB35F5852FE7EC1EFB09F345EDC58C253C2D92F000008BFA81FF400267A75B4345CD3F0B8B5BB7A5F83B50D247A653467FB51A1F2FA039BE5C7214386FC8DFEC0F587367D361747055D87C3319F519E4F918301B3BDD77D42C3EF1B1E7F7B5F2812B131426296C6D893A40000107EE1B5C2B68549EC37B112B427A8D2CF09DC17686B02C2B6865180285779FD81CDE5D89C9C9C8D2604275242F5C65B65C2EF348AC4F785EC0EB1FB056D0D5459FE59FED268592389D81C412D300080F00BEF14B93ED2F6E7AA2A7D4EE44F9114208EAB9CFEC03126404D4F4C4CFC9F09C13DF431D4067BAFE0E0E0A5A5AF070505CDA5547C5FC44F11E2CCADFAE18086DEF02DE1E2CCE15002A82AF68500E117B520373AF7A416A032CAE90FDCCBFCBD64E8D0A15FE6E4E4EC3797FD2825EFE31AD579BDFBFAE1C387FB502ABE4F47F63F99FD42915F11850854C1E8D1A37FC3BE10A81BFE14C1A965EF797B2904D41AED0F3C68D0A0D97E7E7EF799AB0F1615155D72DA69A715ECDEBD7BE6B061C37ABDFBEEBBAB2925EF121414F47C7E7EFE6BAD5BB74EFBF1C71FB5D6FEF2A4A4A4E5948CEFDADF693F8500D492BBEEBAABE7A143876675EFDE7DDBD2A54BD9C602B58C9A5F001EA5FD819D4EA706E0C39D3A752AFCE31FFFE8376EDC381D29E77F4C8DE45D6EBCF1C6ABCCC52BB7DE7AAB73E2C4898D478C18F193C3E1983368D0A056940E009CFC36F6E0C1830BCD65E0D8B1639BB18D0508BF007CCCD0A143DB9A9DFBC251A346F93DF4D043CEF8F87839EFBCF3026FB9E516A7BFBFFF275E322D528C59EE2875BD8B59F460A445054B5BB31CAFB9DA9F5C8F53F5A25FD74D37DDD4BBA8A8E83F7A62A277EFDEF6B601030674EBD7AFDF4EF33DCD370767F11EFE085ADEE1C7B95F47633ADEC9927EAED750B46A02C036B666B7B17DCD12CF3616F51D2B2F008FD1601B1414F4C575D75D17D6B76FDFA3B637975E7A69A85E4E993265B1795CCFA4A4A4140F7D0C0D9F3AE2748EEB7A9A2BBC5E6896BF977ADC7AD7CE3FC7157EF5726905AFA9F79F6796B9650E0C74BAA08E660972BDA70E91DE548A47515EE8ADDFD36DB7DD76456161E147B7DF7E7B60E7CE9D8FBA6FE4C8915DD2D3D3D72C5EBCF85373707691D6E47BE863E84197BEF9BC0AEED7832E3D622CDD3C7080EBC445B0EBFE04D7F7A8DFEDB4328F058053791BDBCB2C6D6A601BBB896D2C08BF1ED46AE9F0A6457EF9D78648F0150552704E415161E342290C7138E4B0439CBB0BA560455191E31B47A15FD2A61ED3B6F39502DE137C838383BFF9CD6F7ED3F8B7BFFD6DB9DB1A0DC03939398EE9D3A72F328FEFE5A100ACF3D4FEABCC6DC3CDF2E40976DCA9AE305BFAB3B7708559DDD61C2CF3F8F9A55EFB4157E8BEC52C37B90E1CDCCFF32A37DC70C395870F1FFEF8EEBBEF0E484828FFA4FF9831633A656464FCB876EDDAE97DFAF4F99D6B4EE09A96EA2AA785E59CBCE8EB3A11D1B6CC7D735C976F9A659CEBEFA75D7FEBC90BADE5C8E2D708806DACB5816D2C08BF5EEAAC6543AF8D0E8878D8298ED63D1B7428BCA261B78667873493F8C0680975064B76614ED0FEBCCC663F1CDCEC98B36F71ABFF1DF8616CAB6F13378A38DED8D46DFA54BE5AA0EEE8140E0E8763C1E5975FDE78D0A041C7DDCE98701C92959515F6D1471F2D3101F8020FD600BB69D3AF6BA5F8ACF589C4B8C2B35B8A6B6951EA360D6C7DE448CDF257525CFBAB61F70BD77D7A4071BA591E73056AAFE01A78E5233D28EBDAB5EB711FFBE0830FB69B306142585151D12BE6E0EC4E0F1E9CF529E7B6B432FBABB265BE428A6B24F4BBFDC02C3D5C7F7730CB046F2A7300A70EB6B1A84BC3870F6F5A5858D8CFAC5357FAF9F97531974DCCF550A7D3996D8ED1F699BFBF370F9B9F9F9F3FE7FDF7DFDF44F8AD236D9724B6880A6E30C304DC0E7F3A6364D8C50D3A8B9FC3EF98C769000E0D0A96D383629BF68FEEA10799F2DF7D4B331FDDFAFAA3AD9725DE5EE85F70D3E6F34E9D2F12F0A6E06B36B2CB1212124E1F3C7870A5B631E67151070F1E3CF0C5175F2C3161F95CB3114EF5E0479C689629527CB65A9B81E999EB8AE6B3D5A0ABCDBEDC35B6BAF39F59EA80405C7FCF75056AFF528FCD7705E06BA4B8F637DD9BBE27AD8DD083B29B6FBE39F0440765CA7CA7F2C4134F9C317EFCF8DF989DA696E1231EFA680B75357295BDFB64C5C2320757EE321FE03A119125476AD6F35D65AE4DDA5FE71709806D6CC93EC99F6DACEF1B32644847B30E3D6DC26E9F76EDDAA5F6EEDD3BA655AB5651868486864A4E4E4E68666666E8B66DDB223FFFFCF3F66BD6AC7962D8B061DF9830FCF0A930F2B8570D78D579E5A81B420343D7DD1C7F55C2679D5E08BB24AA6BB9C1B722BF89EED176F9B9AFB7BEB5C96F839C05FE8B5A7D3B74043F01A0F698E01A6E36B88BCF3DF7DC16B7DE7A6B80EECC2BEBA69B6E6A70C10517840506067E3E74E8D0180F7D441D88EA55296EFAA51649F119EE57E4D881A9DCCDB92E731D18E872966BE75F5E388F721D1C9415E36DC1F7C61B6FBCCC7C4F5A1B11D8AB57AF4A3F4F779A4F3FFD7493B0B0B0DF272626DEE1C18F78951CA965EF20159FA88D71DDE77EACBBF95DDB52077600C036B6B876976DAC0FEBD3A78FBF596F9E0B0E0EFEDA1C479D3F65CA94F0471E79A4D5C5175F1CD5A44913BB7E2973BFC4C6C64AD7AE5D23EFBFFFFE33DF7AEBADB01B6EB8A1878ED1327CF8F07FEAB11CE1B7165CB7F6A15161CE90D7DF38FB81905BE37FEBAC4AE82D6B42D361E7BFDFFEF143FE4EBF675A2D1B3A9A9F03E079A3468D0A6ED4A8D182CE9D3BB7BEE38E3B02AB127CDD7EFFFBDF4774EBD6ED34A7D3B9C0031BDF075C3BEB4565C2E86CB37C63968FCBD9E9976DCAB54B8EDFBC6B75A9A09C24C535CC5ED502C57C37979A8B4FEFB9E79E4AD5461C93F0A3A2B476A2A1BFBFFF5FCDCEF55A0F7DCCAC52075B07E4E89AF6B2524B3DB6EC011A00B08D2D96C336D67769136763C985175E38F0E5975F6E78F5D557C705040454EAB97ABCD6AF5FBFC87FFDEB5F91975E7AE9B58181814BBC64260EDF0DBFFD92C7DFB52B2FFDB5F7DA3E16D825BC758DBC66E7B0B35ACCEBF0BC9FBF9FDF246A8001CF07DF90909005679C7146D7DB6FBFDDBF3AC1D76DCC98318D3A75EAD4343838788EBE6E0D7C3C3D6B3D568A9B7055341E80DEBEBC82E7EA08977D5C4B7329AE29AE28B0B5753DEE71291E4044FF5EE12DDFD3E8D1A37F73E8D0A1B9B7DD765B8503AF54864E57650ECE42CCC1D9DB43860C19E0818F5AB6CC2BA22731B4C65D77D2BA9DEFE17A0E5D5E00B08DADB96DAC368D1ECF36D67B83AFB95872EDB5D79E71F7DD779FE9AEE1AD2AAD11BEF9E69B9B0C1B362CCEAC7B0B7D3500D779F8EDB9FCB6B3F6E666BCF88FB3C6069C1E145BA3AF7D46705C7C52DB49790E91E7CF5E3EB42D3F0FC033C2C2C2E69D7EFAE9DDEEBBEF3EA76E3C4F96799DA873CE39A7635E5EDE7F6B20006B0DAEF64B5A7D82C78D2BE736AD7DD651A117BA9627A5FCE6617A5B8EEB2022C52C33E44873E939AE305CA7DB20AD8D30E5397BCC9831013D7BF63CE9D76BDEBCB97E4FA101010133CCC1598F1AFEB87F2F53E669153C2ED555E67A80A635FADDA5B8B6FD59296EE2DE945F2700B6B127BD8D4D73EDD7CE2BB58D7D4E8ECCAD8E3AA24D9D1D0EC7ACDFFDEE778103070E6C5C13AFF99BDFFC26D604E0483F3FBF39BED804BACE07BC0A0F8CF87C506C9F809AAAF12D4B6B8047C45DF1C5D4D47993CDD58BF89900356BECD8B1FF0D0909E9356EDC38A736B1494F4F973BEFBCF398C7FDDFFFFD9FED63E2969D9D2DB7DC72CB318FFBE73FFF29D1D1D1625EAFD1134F3CD171E3C68DEF9A8DFBE09318F932B5826D5F65B67FC16CBB950000200049444154EE50E5A607005AA3AB813CABD46BE9D40F3AB2F3615708D600FC82149F31EFE3FA7BBA59FAD7C577A4FDCF0E1D3AF4A9D6466833BC8ABEA3BFFDED6FB6C6E1A802A8E0B1FA3D9D73CE397EE3C78F0F7AFEF9E7E70E1D3AB4C7F4E9D3D7D7D0479E5BA6CC5BB94E449476B714F7BF3EEC7ACC6A3932D8580FD7090F2DF34BF89502601B5B23DBD84DA5B6B12FB08DAD7B4D9A3479B6478F1E3135157CDDFAF7EFDF30353535D71C7B3DAFE7767CA9CCEAB4E677C8BAC7EEF473385ADCD0F84A8FBECFA3678CBA2CC82F3086E6CF40CDBAEBAEBB6699C07BC5830F3EE87437B3D1FE4A575F7DF5518FD39DFD7BEFBD77D46DB366CD3AEA20C0E170E8C6D6065FA54DA7EFBFFFFE58B361BFD82C6FE8D9CD1AFCE8E12708BFF952FE20557A5BB259EE9523F31F2A9DDE48E7F94D72ED2426B90E1CC6BA0E1EF47983EAE23BD211478B8A8AFEAB536DB86B23F43B1A3B76AC4444441CF5D8975F7EF998E74F9E3CD97E376E0D1A3490912347967C4F5DBA74F1BBE5965B82CD7AF0F94936918A3F4E99EB7D7F2B73C096E3FA0EF4B6DB5D653EC275D9C275D26310BF52006C636B6C1B7B07DB58EFA1A33A878484DC64B4F0C4EB0F1D3A34CE1C8B0D1F366C5817C26F0D395878E891094D873A829C011E7FAFA7CEBC6DB7A3A8E8F6FAF605990DDD9F74C0831A3EF0074E9A09BC534DE0BDFA91471EF12BBB831F3C78B036852EB99E9A9A2A1B366C9075EBD6D9EBDBB66D93A54B97DADBDDF4F1FABCD2B409F5934F3ED9282E2EAE7F0D07E017A5E2E98D94F6019E5DC17D7AE6FB02B3AC2F1594E7B82ED7BB0E0C4A2FF35D8FABF50142CC0EB1BBBFBFFF47F7DE7B6F60D9FE67DDBB7797C68D1B4BE901317EF9E51759B06041C9F565CB96D9EFCC1CD895DCA607757DFBF63DEAB52EB9E492A06BAEB926E62447EA4E3A4E99EB7775BE599696BAED755799EB6D8F9429F37FB91E93C62F1500DB58B6B1BEC8AC0FCF5F7BEDB58EEAF6F13D113D0633EB5B9059C7FFEE4BE5E657576FFCFC2F49E7FF90BD69DCA3678C72381D9ECFE06D42CE68FECACE0F8B626E6E3F3BED8DE4F4FAF20575ECD8516B94124D3018D3A953A78E6639A47376998D656E659E3F72E4C8497B9AEC610BE1251AEF6C2CEFBCF3CE63B57D02C5AC37D13131319B5252520A6BE235274E9CF8567A7AFA88871E7AC8D9B061C363EE773A9DB6BFD292254B4A76EA7ADBC68D1BED4E5D9B40676464E85C73F6BEA0A020DB04BA65CB96C76EA4FCFCE4A28B2E0AFBFAEBAF9B9B0D7093E4E4E44F7D71DD30DF5391F9BD4FEAD0A1C3D8EAFCD6CBD281570A0A0A3E33E51AA80761E5D1E6799F7FFEB9E4E717B728378FB70762975F7EB9BDFEF4D34F4B56D691CCAE27391E7CF0415B335196F9ACFEBB77EF0E4E4D4DEDDFA54B97B757AF5E9DCF2FDEB3EB8A59469BA58959F69BDFC58ECA3EBFAEF60B2BDE5F21C191C112D220A4528FFF79D9CF92BA2155625B1EE92E51545874542D59698BDF5A2C4DDA3711A75FC5C714FA98809000098F09975FD7FC2A917191F6F67DDBF655FA73F9C27EE114FDDDD4E8BE906D2C6A685B3EC22CEDCDB2AB2ADB711DE4CA6C0B5FF8C31FFE107E32838C9E488B162DFC3EFAE8A3D8B3CF3EFB3DB3EEEEF38572AFB3DAC41DF97BC6F76ED0C57132531A55D5F9116D377D93917CBD66EFFAF64599155CFB0E8E3041628459C9D3CC0F668EB96D86090D0BA74C9992E30D9F31635786A4EF489733CE3DE3A8DB0BF30B253B3DDB1E6C5445416E81F805FA557800D37D68F70AEF773FA6658F9612DF26DE1EE49CDEE9F492839CE866D1A7D2F6F5710DA0717171D9AEF5E64DB3235EF4FEFBEF57AB26D204DF7F9B1DF00D8F3DF698A3741FDEB23A77EE2CCD9A3513739061AFEB0E5E77E8AFBEFAAAA4A5A5C9FEFDFB4B1EABCD9F2FBCF0C20A5F4BCF6A9AF78B32070523860C19B261C68C19FFF0D52FAB267EEBB7DD76DB15870F1FB603AF1C6FAA0DAD61B8EAAAABC4ECD82437B73863E7E5E5C9EBAFBF6EFF3E78F060C963030303B5F6E198FE6AA5DD7EFBEDA1999999EDD6AF5F3FBD4F9F3E834EA29F362A4707F4BA4F17B39E680D4C92D3E97CE3DD77DF5DED8D1FF6BB19DF49F419D1156E7FD7CE5B2B0EE791609BF25D4A49E0B5DBEE5FF6C98F5FFC28374FB9D96EFBD37F4D97A8D38F4CCF1D141A24BFACFA45CEEC7E66C96D651FB363ED0E39EFFAF3ECDF1FDCFF81FC7EF6EFED6BBD73EB3B32E6BF638E7A7FF8E6BED06CC332CCEFE523B35D9D56DD7D21DB58D4A056AEE50EB35E6A7338AD9D9F919A9ABAE878DF6F4141C1802E5DBA1C0C080808F6E487D3607DDE79E71D5EBC78F1B5F5313F7955F8DD99B3AFE7C8F82B6BF53D0744F70C5E9C91DCBB9E7F79FA43D0262FA3CC467C544E4E4E96F9B1CC341BF10F77EEDC39A72E3784DF257D278D5A3492669D9BD9839CB0E8307B20F1EDBBDF4AEB8B5BCB853715879B83FB0EDA30AA72B373EDF56DDF6F93F697B7973D9BF6D883A39CAC1C49DF9E2E978FBFBCDC03180E72AA15AAB45DCC60B3DE0C3607C89966BDF9D8DCF64E5542D55FFFFAD7A7376CD830EAD1471F3D6EF075BBFFFEFBE5DE7BEF2DD9E99B75F4A8A6CEF6BB0C0AD2E98D4EF85AFA7E7FF9CB5FA21E78E081C7CC67CF4F4A4AFA978F7F6505D5F9ADEB88A3E6A0ECE33BEFBC33A032734C0E1C3850BEFDF65BDB1CCF6E60F2F365F5EAD5B686420FD2DCB4FF59D966E9E5B9FBEEBB43264E9CD8CFEC905F369FF1368E6B6A459E6B5DB9BBB0B0F06EB39E6C37EBCC5C3DB837BF9385DEF221776FDA6D4F8456A4C3951DEC763C2D25CDB61409082A6E2E1A1C1E2C05F9051277769CF4BAA557C9E357CC5C21F16DE34BB6E5997B326DCDF2BACF8BBB576C5AB4C9EE872EBBF7327B1236EF709E14E6154ADA9634BBDF896A12557202B561D38604DF538756F7BB4F30EE7305E14A9F60641B0B0F1DA3159A7552CF7C68BFEA3BE2E3E3B70F193264AEB96DC6EEDDBB1796DDE70707070FE8D5AB57546D7CB68B2FBEB8E1AA55ABFA137E4FD2AFB96971ED429BD7EA7B768B68A767C99BFBD077A6CD76C2DD07C7E687923674E850ED5FF8566DD7086B2DADD6FCEA41C6FA05EB2561508238FD9DB69635AC515849F0557A30A20731C97393A5CB355DEC81CDCFDFFE6CC3EF77FBBE93961714377D751FC07090E3918DAC76D21D66D69B612654E5989DFF7FCC6DEF1F2F543DF6D86393D6AD5B77FF830F3EE868D2A449A5DEC7DD77E9D34F3FB5CD9FCD81B96DB2E86E0AEDEFEF6F6B7C2BFB7A7A70F0E4934F464F9830E119B3AEE74F9F3EFD751FFE9A4A376B28AACC6FDDDCD62F3B3BFBC3BBEEBAABC26678151C4C698DBE1C3A74C85E775FBA69CDFBADB7DE2A95695AA57D84CC6B053FF0C003379AE7A44D9E3CF9210E6B3C2EA0CC7E419BC38D3697A35D35C236089BDFCBDCBAFC90EE5640C7F3CBCAE280D0E6D236B625913AFD9CD3ED365EAFB7BEA8F53181D94DEFD7ED7B930EC5DB93B8D671F684AC3D3B60F60999BB32ED3628242AC4DEBEF49DA5F6F3F8051C59AF270F9B2CC35F1E2EA151A1AC55A78668397282F1A0F9BDBC7FBC138C6C63E129661D2CDB5FC36EC775898B8B4B77B5029BE6DEE79BBFCFD326C9B5F1D9F418CD7CBE4EBE52D675167EF7E76704C40644D5EE8AB53F37B2C9374511098989937CE4FB7396FAD114991F428CB948345713B52FE590214336EDD9533BFDBA964E5B2A57FEF14A7B20B1F8CDC5B6F6D73FC85F3E79FC137B70A2073D1A86DD1A9CD6C01E70E863349416E415D820BB237987F80796BF5AD6F7839C43BB0EC9CA952BB58F877BFDD32AD09C528134BFA0A020D5E974E69709AAA9E67B3DEA4486795C5A759B2D97B72F7507616D0E6676EEF3CCF57F970E55AFBCF2CAC4152B563CAAC1B7BC7EB9C7336CD83059B46891EDE3EB5A574BEE0B0909D19132ABF47A5A036C8278833FFDE94F7F3765999E949434D35B7E9083060D8A37072FC1C7D9B9C59BEFB33A4D941C27FAAD9B03221DC4EB6FE3C68D0BD026E755A1CDD3AFBCF24AF9F8E38F6D6DC4513B097F7FD1114CDBB76F5FE9D7D303B949932605DE7FFFFDE3478F1EFDEBEBAFBFFE4F5F3F70D1F9A8CD77115FC9839C4AAF07D558679C6582B0D608DB5A2EF37BD1D7ABB5FDC251DBACDC0239A3EB19929371E273B23BD7EF14FF607FDBDFD76EA02283EDBEA149C7A34F92E9C9CE79CFCD93665D9AD9EBBB36EC92F0E870BB7FD026D2FA5E7DC7150F1C14141624412D83EC3E474F94EA63749FB0F99BCDB6B591D2D7BA72C295B51A7C0FEF3D5C76BF5056BE6B1F50AD565DE5ED3F6AEA39665B9163F643A93EF4330E93232718F7997DE16752EA04A309BC3D0F1E3CF811DBD8FAE544FB650F6C834B3F375CF7D727FB3F94EE0EE5DEE7E7E6E6368A8C8CAC9532D4BEE8F9F9F991BEB24ED459F83D5478D811EA0CAED5F75CFECDB70D9B2CB3C790137DEDC7ED2867041073532B6D6AD3A25F0B8FBEB7F6CBD2E0AA070C9BBED924835E1824F987F3E5EBD7BE96817F1968FB6BCD183743DAF469235D0776B5D7350C6BE0CD48CDB04DDC34946ACDAFD6D29EDDFB6CFBBAA56B7E7DE12067EFF2BDB27DD5F60AD73F0D85DAD4AFBCDBCBD2B3C37A205BC65161DAA5AA2331469AF7D3A90B06B937B06DDBB65D60D6A3D166875FE5E0EBFEAC3A98D58B2FBE78D4FFA2ABECF5D75F6FCF6257950EA665C26FD0134F3CF1868E86AE07F4650E608EB7B3897705FE8AB6894D8FB3238B72ED84AAFB3BF5D86FDDEC085FBAFDF6DB1D553D2873D3EFE2CB2FBF2C3949E1A6FDD04C1957F9F5B496DE7C47818F3DF6D8DF870F1F7EB139E0FBF1380FD73357E1D52C92F0137CDF555D07AAF558F7E06D35BD1E9CE43AE3ACABFD42591BBEDA605BEFE8B65F5BEE44C44694FF0334A1B7E939C7FE04A39A46D9E79595F6739ADD962B6D7DA435C6BA0FD8B2648BECFD65EF518FD5E76B6BA0E5EF2D97F313CFB7DBFF4E571557661C483D20892F254A604860AD96CB9EA57B8EBB5FA8681F5085836F8F3DA782FD50853F11297FCEF59A7E4E4D3D3FBAF40946B30DDC69826FEC4D37DDE4CF36B6CAAAB2BDF5C4F34F769F5B27CF3DC1EBB6D293289E1AE5B92C3D4E33E13788F07B9234F86617E6486D06E06E17F5287869FBCC2213809FAC47DFD1C493F8716C4948486899E6E191E85B9CDFC20E40A20737E70F395FB2D2B2ECD2FF81FE258F19FAD25099F5D02C1B7EB5C9B10E5AA20721DA1C590F402A53F35BDF0F721A253492D81DB1B26AD52AF7A89E716536E8FEE63B8B373B5CFF4A6CF863CAD9919557EB745247B8BA81DDB061432B9D7FB753A7EAB778D11A5E0DF6A5CF78EBF5EA045FB7366DDAF8C5C4C414A6A6A60EF7A29D60792720AA727F9FEA7E36734096D7BB77EF6AAFD47A20AB351065E981597927652A7B92A269D3A6CE8D1B370E16DF579503ED13AD07A5D7B9F26AE1469DC4E7FCD9EC17CE4CABE5194A7E5AF8939C37E83C3BBAF2A237161DB57F284D4F82BA696DB1FBB69FBEFAC96EBB577EB0D2EE47DC344CBB4F94EE5CB753421B84DA00AD7F47C61FA9A8D0FD84BEAFEE0B1206271CB3FD6F10DFA0D6F7092AB6476CD9FDC2313F4D57CD53758FD7AA131C2AFB9CE00AF63B153DB63AFBA3B6DEF0E336DFC169663F5668B6B1D57E0DB6B175A6D2DB5B0F3C5F5BE81D6F633BAA9AEBE366B32E35CFCECEF6AF8D00AC2780CCFBE5FACA0A5167E1B7A17F44DE9EBCF480E641F1B5F7A60D02F6ECB8D091FFF5B8A449F5E50B4A4C4C9C58851FC301B383FCDCD52760AE36D3B9F9E69B8B6AE32067FB9AED36B46A33633D60090A0FB22377EADF7A20B2F1EB8DB67FAF5BC7FE1D256B6F96B4EAD5CA0658AD992D5DF3ABFD80CB9EE5AFEF0739217121D2A16B071D04CA23EB5F054D7B34247F57C9F527BFEC01969E403181F5CDAFBFFEFA61133683ABD2C7A9E400D604DE37DE78E398A65E7AFDBDF7DE936EDDBA552B04CF9F3F7FF5AE5DBB5AE8FA5EA6E6F7B83B9BE335E9D3A6E7E6BEED151EBD0507A79BDF55BA077FEF4595FCAE32CD679DE7FEAD9B1D60AF356BD6CCFCE28B2F8A2EBBECB26A9D9D2D3D1A6999F7B2F755662096B27EF8E187822D5BB6E49ACFF99F32DF51D9F748338FA96E33FE131D5C54691D28E73B4FF59611F54BAD27953E6032FF67966BBFF0B67BBF70CB2DB714D566F8D5EDFBDEAD7B4B5AEEE8767ECFE63D127BD69141F3747C885F7FF8F5A811FC7520441B1ACC6D7A9FBE8E8EE0AF2757DDB30768771A77602E7D5254F721A54F8AEA5812BACCFCE3F17B49947EEDDA10D428C8A3FB056F51956E01A57EA7C1AE0180AAA59CE7BF5989A7E9A04385E5EC0B77666666469A6DAC3FDBD82A7F0F556E7AEFEDDBE0DADE96BBB6E39F98658ABB19BE39BE4FCDC8C888AB8DF06BD67D9DAF3A93F07B925A069F96F963F6D6E8DA0CBF3F1CDCAC5FDC061FFBEDE838F93AEFE98C909090F99E3C30AFF047595824B31F9E2D6D2E6923E75E776E493F5CF5F6E8B765E4EB238F3A9B5FF6B93A6A73DB4BDADAA0EC6E0EBD7FFB7E39B8FFE051A337D7F7831C4FABA0EF55CAF19AA5990D6A81D998FAB97650FEE67ABAB99C5FFA048ADE3774E8D085FFFCE73FBF34212B40A762A88AB973E7DA0D6779F44060D6AC59556EF2B570E1C255FFFEF7BFCF30017A9009D0F3E5D470C87C3FFF35DF4D5239BFF5F9C3860DEB636E9BBF7FFFFE82EBAFBFBE4A7BC31D3B76C8BC79F38E9A6FD2EDC08103B6A95E42428254A5D9BB1E94FDE52F7FC9C9CFCF4F9C3163C61C416DCA718FF65C57FB85D2E63C3647AEF9F33525D7B505CF6B435E93DB66DC56D2FC59A73FD245074C8C8889B02752DD035E697369EDDAD220B741490B1E379DCAAEBC93A27B53F6DA81154F7850B727D3769D71DBBA62EB51E34BA066B8F62529D578EAFA1A0C1A15855FED1BAF676775E038A7F9DD38CBDB179A6D6C17B6B1A84507CC7AF81FA7D3F95E6A6AEAFCB203B0050606AEDDBA756BDCF1A6C6AA29BAFE9ADFC14F84DF93D434B8F1B2C519C9FDFB35EC5E6BEF3967DFE27D45225FF948E07DDF2C9F040707CFA9EB3362DA8CD93D759086D78DFFDB78CC889CA569C8D58395CD8B37DB66A43A32B406E0C3D987ED54185A63AB35C7210D4238C8A9797A563BCF947B902BF06AF0D5BDF1DCE39D40993E7DFA22B3E3EF3675EAD46F4CE00CD5119C2B233D3D5DFEF39FFF8809CD47D69752A33D6B28FEE28B2FEC88D095993AC9FE8EE7CC59F3EEBBEF9E615EA39F09BECB7D3DF09A45CFE27C74A2DFBACEED3A7CF8F02E1F7FFCF1E283070F168D183122ACB213DF6BCD7CE983327D9E7B746EFB210E1DB2F3523EF5D453957ABDD5ABFFBFBDFB00B3AABC1306FEDE9901860E22289648D058B145B1AC2968D4609A292A6349246ABE98982F9BB669BB0846779358369BFD8C4663023E6A04D144578D2524F6D8A2220A36C2824AA8024A9B19A67CEF3BF70C5E2733346760EE9DDFCFE7FF9C7BCF3D7766FCDFCB39E77FDE72A6D75F76D965354ECAB66EC11BFF6DDD143FB7DB3BC37161FDC5AF9FDE1D0E3BEDB0B0FDF0B7870CA682F7E3E33E1E2E3BFAB230FAFBA3C3C19F39B8E94266922E84A68BA2E978928E05E515E54D4571EA59D47CBFDF42693E88668517455B4AADC6B5AB6BC3BAB5F95BCBA49FF5FA8CD7C3F45BA7870F7EE9834DB7D76BDA67C582FBB5E9AFAD6FA5A664ADCB5A78D397A52C8B0D1E0BED63D90A9667E7F737C6FDF8631BDA8FC7F3ABA98F3FFEF851871F7E78878FC57DF4D147D7C5F3B55B15BFEFD23FF5DD7FE24F5EBFFE84FAC6FA509EDB2A33758747DF9AB96BB7FA7073317E50A94B735CDC575656D63CF3E08ACEF2B7A5EE6BF75E766FD358AEF71EF6DE365B79D37D7753AB703AC94845EE69979FB6FE9643CDF7EB5DB9786553AB6D9AA82A6DEF24A7DD956507FB555951B5C91750D281BFAAAA6ABF58703E150BE0EDD2CC951B73F5D557879A9A9AF5CFFBF7EF9FC6A686A79E7A2AC49387FC197B7575B8E28A2B9A6E03B131B1909E79F3CD37F78B07FC23A64E9D3ABB443FA3D5F1DF7BFAB7FEEBCDFDB77EC30D37BC3E76ECD803FEFCE73F3FB87CF9F2F79E77DE797DBA75EBB6B18B0961D1A245EFE88EB7CF3EFB345DA498397366D3C9597A2DB54EDC72CB2D4DF7ACDC90BFFDED6FB5975E7AE9BAF8BE93E249D9DD818E3C2EACCA8E0BBFE96CC78574B1F17F1FFBDFA67D6EDA9FB7948ADCD3AF3C3DCCFBEBBCA6DE3E856A56D784E9B74D0F77FDC75DE1DC5BCE6D5A978E2F1B937E4EDAAFA7D9FF5B4A85749AF4301DAF9A8F1B275E78E2FA0BA0E9FEC18F5DFF5853919DEE2440C9EB96CDE1B059C742FB583AC0FC187F48A74C0B172E9CDED6ED265B2A2F2FBF239E4BFD3CDD2B7A63DFC177230D517BE289271AE277F4778ADF77E98441874FAD7AE182B50FBEF96CCFA307BCBFC37FDF836F4E5F56DD50FDBF2F1F39796E917D46E3E20E726EDC29DFDC59C73CA4715BA3BF3B7AFDAD869EBBF3B9A62ECAA9B04DE37C9B5B6B6BD7D486BE43FA365DF56F2E64D3D8AF3436B8B9FB71EAC29C5A649B8AA2B7AA9B6E7191AEFA3BC9699713E574627CFFBBB9803279F2E4D48DFA905400C79DF48033CE38A3ACAD2BDF73E6CC09B366CD7AC758DF34B6F79C73CE09F3E6CD5B5FFCA6D7E7CF9F1F9E7DF6D9B0A15934AFBDF6DA57EEB9E79E748B9F4F946AE11BFFAD7F3E7E36EFEADF7AFA5C4F3EF9E47F9A3E7DFAD4F1E3C77FE0073FF8419F749B82D6A496F9D42DFD8D37DE1E36107F7FF8FAD7BFDE74303DF7DC73D75FBC58B66C59532BFD873EF4A1365BE95337BC4B2EB924DDB2EB6BF1BBE2A4AC0B1F17D27EFE804F1EB0C16D520FA1D67A0955F6AD0C479C714438FCB4C337EB9EEC479C7EC43BC60CB794BA4C17769B2EECF9D3D6455B1C0BED63E94047C773A98737B5E06D7921E64B5FFAD2E37FFEF39F3FB8298D115BEABEFBEE4B5DAC9F2FA5F3AEF26DF9CB3FF72F67F6BF79E97D47550D3E2694E5CA3AF47755BD3861D1EA86DA4B96FDEAF919C5F4013DFFFCF30FC6981177B25B748FBF2F7CE10B1396ECD4F1F7742CBC6550EA823C648F214D45F10E7BEDD0B44C91C66DB56CA94D134FEDBCFFCEEBB749EF6D7E3C74DFA1FFD0F5B9D9CEFBEDDC5448B725FD9CC34F7FBB4B7DFA7B0A8BF5742B8D14DD7B6DDD89AF862C1812AEBBEEBA0BB6E6EF1C3162441AD73B319E289F1D779637C4EFD38BF1FB54FD2EBE932BF6DA6BAF9B162C585015A3F7FBDFFFFE5C6B33554E9830E11DB77448B765F8CA57BE12D2F894F8FED48D66FD95F0B44C57C08F3FFEF8D05A319D15BEDDE349CB07E2017F56A91E05DFCDBFF542B366CDAA7DF6D9676FD87DF7DDDFF7D8638FED7DC8218774EBDDFB1F5BDF2EBBECB2A693B3E693AFF439A6DB711C70C0014DB392A67B08A68B12CDDDD4D367933EA7638E39A6B593B2DA8B2FBEB836EB867793731AC78576B818B459DB97959715E5E7B92D8E0B5D517B1E0BED6369A77DF9DCA8614BDFFFBEF7BDEFC93973E69CF5918F7CA4A2235A7F53CFBCD4CB203A29FE5B995F2A79DFA6478A0B867DF1BB9565DD574E5C745787FE9EAB16DEB660D9BA37E7EFB27AC164FFD44AE4AA4DF77249D844B158BCE8C61B6FBCBE3D5B88520B707D7DFDBE716738FBEAABAF6E683993F3B469D3DE71A53BDDEA284DE4B1EFBEF9D6955D77DD351C71C411EFB8475D1AF374E79D77FEC3EFBAF2CA2BFF3716BE69ECEBA1E9F7FA4437DDB5D75E7B563CF1BAF4FCF3CF5F9B26AC28F4D7BFFE352C5EBCB8A9ABDDFA93F02143C28927BE3D31513A014BB7D268965AEBD3E794AE04174A276FA935C2F833A02B1D0BED63D996E277E1F9EEDDBBFF362E6B3AE2E7FFFEF7BF6FE8D1A3C72D13274E7CBC94F2B6CD2F931EDFFFD0CFFC7AE11D8DD357BDD2213FFF8535F3EA7FFEFACDDD4359EE9CFB8FBEBFCE3F15681FA9EB576D6DED81F1A0FCF27FFFF77FD7A7712749BACADDF2D646E9607EFAE9EFBC1D6F9AE1B97022AC748531EEC09BBA7E358B85F5FC871F7E78493CE01F154F5A96CAFA167D4EE7C7CFE69BE3C68D5BF7CA2BAFACFF8C528B443A312B94BAE2B5F48D6F7CE31DCFD3095E1ACBDDFC3965DDF056C7CFFB734ECA00FB58FB58B69E9933677EF9B1C71E9B77D75DEDDB90982EC0DC7FFFFD7F5FB468D1974A2D67B9CEF0475CF8EAA46BA62D7FEAEC1BF61A1776EE31B8DD7EEEFC9A25E113B3BEBF6C55DDDA7F9E7DD88DD777C57F147FFCE31F1B671E32D3DEA193D8EFA9FDC271C71D972BA5FFA7934F3EB9CFC08103A7EDBAEBAE877CEF7BDF6B97AE37A9708E05F5C2A79F7EFAC58A8A8ACF74A6897C8AD599679EF9F174DB846F7DEB5BDD3734B67A7334CF381A4FFCC63829735CC071C13ED63E96ADEFF4D34FDFA5B2B2F2B9CF7DEE73034E38E18476297CA74E9DBA64F9F2E58795628FBB4E314066DC7BC69EF3D181237F77FA4B1786F66A017E61CDBC70E2AC1FBEB9AA6EF5255DB5F085AD21EE2057D5D6D68E9A3F7FFE133FFDE94FEB520BEEBB91DEFFE31FFFF88DACF03D41E1DB3EAEBDF6DA3BE389D9A77EFEF39FD7A6EE78EF566A8D4827655A2300EC63D976D2E457F1DC69FFDB6FBF7D4E3C675AB7A5E761E97D37DE7863432C785F2FD5C237E9340327FFF4B3DFDFF4F9EF7F69F0CFE6DF34B22C57963BB0F7EE5B3C09D6A44577D57C7BCEE5AB57D7AFFDC6ECC3A65CDE95FF4114CBC4265D45A94E6C9226DE193162C46F57AD5A75683CE8EF76D4514795A7C93C3657EA3A7DFEF9E72F9F3367CE23DDBA75FB74679DC9B658C593A9BFEDBBEFBEE9F60867F6E9D3A75B1A87BD859F77ED25975CD234F14A3C38FE41661D17705CC03E966DE7B9E79E7B2B7EE7AE880F87DF71C71DFBC673A8F2F7BEF7BDA1B509495B4ABDED1E78E08134B9555D2C7AEF5CB870E13137DD74D3E252CD55A79A35E8C1FFBAFD0F677FF7DC3F3CB272E667AF5F7C6FAF5D7B0C09BB55EEB8C9EFFFCB5BCF852FBF72D99BF72C7BFC859ADCBA8FBF3272F23427394E729CE46CBD02F8E9A79FFE6D3CF01FF8C8238FEC71E4914796A75B3A6CAA34FE3716BE6FC59DEE9DF3E7CF3FF5D65B6FADF58DE99003E4C23DF7DC73CAECD9B3CFACADADAD6C9E846C334EEED2F8B3DA748F4927658E0B382E601F4BE790668E7EFCF1C76FDD638F3D7E1FCFA38E8A05ECE0458B163555BFA9084E9186A6A516DE58E436DD92F2B6DB6E0BD75C734D5DFCBEBEBC7AF5EACF5E71C51517A7D9CC4B394F9D6ECADC07FFFBF6BFBF78C543171FFFED93EAFFB4FCA983AF58706BCF39D57F0F758D0DA1227E68DDCB2A42B75C4558D3501D16D72E0FD357CF0E9397FC29FC70EED5D5772E7BF4A5BFD72E397F87D5F3FFF9A9A3EE58EC9F81931C27395BDF534F3D3575FFFDF73FF0BEFBEEDB73E4C89165ADDDFEA1A5254B968471E3C6AD59B162C53DAFBEFAEA195B72CF3B365D3CB02DDB7DF7DD272D5EBCF80BF100D9FBA0830EDAA4ABC3E9561BF1A46C9DD608C7051C17B08FA5739A3973E6E2279E78E29723468CF84D4D4DCDB2E79F7F7ED0B469D379A9178A00002000494441547ADD72CB2D1553A74E2DBBF3CE3BEB1F7AE8A13571BB39CB962D9B180BE4B3264E9C78E1B3CF3EFB5A57C84FA79F60E14773AF3D78FEBAC5DF78A3F6AD7F7AB576D18E2BEBD7F45AD7505756912BAFEF555EB9B66F79AF97E366772F5AB3E4572F1EE936282D99D8A473E94A139B7CF9CB5FBEB6BCBCFCD458D4764BF7F66DCBCA952BC30F7FF8C3D5CB972FFF5D3C49384BE1BBF58C1D3B7640DFBE7DA7EF169D77DE79A1B2B2B2CD6DE7CC99537FFEF9E757BBD586E3028E0BD8C7527CAAAAAA9E8B8B11315E9E3C79F25E5D350F159DFD0F3C7FD899CFC4C599BEB2505CAEBAEAAA33BFFAD5AF3EF7A31FFDE8A27840EFD15A019C5A7C274C98B02616C03F8985EF4F14BE5B579A4C6CD4A8517BF4EEDDFB81F1E3C71FF9831FFC203760C0807FD82ECD387AE9A597563734349CEBA40CC03E96E23276ECD8CAEAEAEA11D9D33DD3F3AE3AAF4A99AF03D051AEB8E28A4BE3E2EBFFF66FFF5697C696149A376F5E6AF1AD59BB76ED77AEBBEEBA8B14BEDB46CAFB4F7EF293A37AF5EA75CFB871E31A172E5CF88ED75337BCECA4ECA41B6F34733E807D2CC52616BE47143EAFA9A919D55573A1F8053AD495575E79754545C53F5F78E185F5B366CD6A5AF7D24B2FA516DFFAF8F0DB13274EBC5296B6BDF8799C306CD8B09BCE3FFFFCD07CA1229B78A52E75C38B276577CB12807D2C45E9CC8D3C57FC02B497ABAEBAEA8ACACACA332EBBECB27593274F0EFFF99FFF59D3AD5BB773AEB9E69A5FC84EE7F19DEF7CA7EAC0030FFCAF8B2EBAA8F1FAEBAFAFBBF8E28BABD7AD5B3746373C00FB588ADA270A9F3434348C1E356A546BC35FBBC7F8B4E217E05DFAE52F7F39B967CF9E63D2B4FA8D8D8DA7FCEA57BF9A242B9DCFC30F3FFCF30103063C7CE79D7756A46E784ECA00DACFD7BEF6B56FBEFFFDEFFF45B68F3DCF3E968E76EAA9A77E202EB62F5C97CBE5060C193264542B9BF78DF12BC5EFB673D3367E3FD08E7EF18B5FFCBEB2B272602C7CFF47363AADB10B162CF8605CFE54373C80F6F7C8238FBC91968D8D8DEF950D3A406AD1DDB9B9CE8BDFB331AD6D140BE0312DDE33B4AB24A7B3A8CC3EA43505EB3ED5CA76BDB2E59A4DF8999FF2FD87CE25CD7E290B45A15A0A00A0A87C31C6B763BC18E380185F8F716C1BC5EF27B2599F4F8D4F2F8EF1788C618ADF8E978AD9DBB2BFA52646BAEF54BA1276458C1E31E667DBA5F52FC598939D94ED19E3E3319ECF5E6F8CF1CD18DF8BF1508CA5ADBC7F957F1300004089D923C6BFC4787F562BED3674E8D087E3729736B6DF71DEBC79A9A1F02731F68DB124C6E018B314BF1D6B748CD5E1EDC1D53B67CBAFC638ABE079C88AE2DAECF1B9217F65E38B05AFAF2CD8BEA195F7030000949AC363F48C31717D75BBE38E1BAC83BA77EF7E4E5CFC392B7C9BEBA792D6198ADF7475E1A8EC83BA37FB00DA92FAA69F1CE390ECC3BDA7C5EBBFF6BD070000BAA0BFC4F872F3933DF7DC33CDE1D16601DCAF5FBFC3CACACAEE686868E83209EA0C135EA53EE923624C8B717C8C17DAF890527FF5D4D2FB95ECF5B37CBF0100009AC6ECA65A2ACDD8BCEAB4D34EDB2397CBA59AA9B1AD37949797F7DF6EBBED3E121FF6C9561D50EA49EA0C2DBFBBC548B3DEDD90C503213F9E378DD5AD0BF9BEE7A9297E87182F87B7C7F0EEB7093FBBF0FD000000A568768C6FC5F86B8CA75E79E5952377DF7DF7B43EB7A137EDB7DF7E4B1F78E081BFC5870B62CC54FC76BCE1319E88F1688C41213FA1D57DD96B97C5782CC6E290EFF23C2EDBAE6FF601AFDDC8CF2E7CFF71C1845700004069BA2E8B5EC3870F7F3AB4B8BF6F6B860E1DDAB35FBF7EFBBCF5D65BA94EAA55FC76BC54E8A656DD34EB735D8BA48F8FF1EFD9E3B47EEFAC405E1EFE7140766B57355ABE1FA02B48B78EFB46C8CFE0D8727D9A5F21CD8CBF509A00DE95D4C276682BEB538FC3349FCDCB52C4B63066CC980372B9DC5E9BB8F9EE1FFBD8C70E983C79F2FD5D21379DE93EBF6DDDB7B765D1FAC666FE5C452FD0950C8B3137E46F7390C6F014F67849B33A5EA6F00578573E1CF2C3F47E5E702E5D963DFE8F906FD4699026B6952953A6A49EAFEF6818ACAAAA9A10F20D8317C442774257CD4D85AF07404949F73A4F13034E0FF9D6DFE6F9119E8A717D8C1D43FED672B74A15C016199B15BF8F64C5EE91D9FA3466F294186986DD6352912155A0F805A0E3DC12E36731EE8CF17056F026C342BEC537B5087F42F10BB0C52E09F90B8C9F8DF1CB183FCED60FCC960F6545B1E2173A9932290028197DB222F717A1F571686784FCE4172E7C026CB934FFCC41213F696B4B695E855D836ECFA0F805A0438D0DF96ECD6936FC34DEA7B2E0B583B2A277AE34016CB14BC3DB1710E7B4786D8F18D7C4784D9A40F10B40C7BA3C2B7A6F0CF996DF1D0B5E7B31E4BB3AD74913C016FB4E8C79213FDEB7A574E1F1CD90EFFEDC5DAAA0F3D1F5ADC4ADEBBEAEBEC7DA1EE5353D6B24631BEB5EDDFDADD0F6ACE6D05E52B7E62FC63822E45B2176C9D6A72ED197648F6F91A6AEABAE5B5D4D3C2EF4705CE814C785D0181A17CB44514AB7324ADD9ED3AD3A0765EB762E287E3F2D45A0F8652B5BD37BCDECFE2BFAEFB5B8A763EBB63668E9A0D71B1B1B67C8045B4175C1F2D8ECF1EB217F5B8EB46EB614755D6B7BAD9D118F0B231D17B6BD01CB062C88D5EF03325174FAB478BE3AE4C7F8A67DEBCA183D632C9226E87C747B2E71B57D6BCF19B0644063CFD53D25631BEA51DDA37EE0E281831A1A1AC6C9061DECE68293B334D3F3842CD238B4B931BE1CE35C69EABA1A7A369C3360F1807AC7856D2BB5FA0E5A30A8C271A128CD28D8CF3E1F6356C80F2D498F5397E8BD639C2C4DA0F8652B3B6DAFD31E5ED97FE5F777FDDBAE0D43160C693AD8B2754F6E062F1C5CB3FBACDD979785B273468F1EADC58D8ED63CA6F7E1565E5B15E35FC2DBB73FA20B3A69FF9366ACEDB7F6BC5D67EF5AEFB8B08D8ADE45831A86BF307C7979AEFC2CC7859228825B4AF32B4C951EE87C747BEE02C61C3CE6E29BA7DFFCC7DE2B7BFF66E092817B55ACAB28AACBFD4B972E0D4F3CF14418397264183C787051E5BEA1AC61556368FC73435DC3B78F1F7DBC131CB6A6151B786D95F4746D9F3BE47357DDF6E46DF7F779B3CFF503970EDCB7A2B6A297AC6C1DF565F5AB43597830AC0B5F3F76F4B18E0B008A5FDADB49079DF44C5C1C5C8C7F7B555555EA46B4DF6DB7DD367BCA9429EFF369429BD20457699295A51BD8268DF94DADC2AF4B57D776E2C8135F8A8B9132019B65688C9B3661BB2F857C576840F10B9B66ECD8B195D5D5D5FBA5C7B95C6E8FF47CD2A449D53203AD4AF7F54DDD9EE76E609B74FBA3DB43915E0C03D8C616C4F8CA46F6B3FD63BC12F263821BA40C14BFB04962E17B44E1F39A9A9A517171B7CC40AB5277E6E9CDFF7CB293B315E1EDD99F93BDB3133700B64C9AD1F99F62CC09F9199E9B677F4E73E9A4DB1AF688B1BBC21714BFB05972B9DC171B1B1BD73F8F8FCF56FCC246A5A277588CB131F6CAD6A52ED1A91B5EEA12AD2B1EC0BB736FC8DFE7F7C3317A6705F13931CE8CF186F440E764B6673AB5868686135AAC1A75F2C927F79119D868F19B3C16E38B59FC3A2B7A974A0F40BB49B7397A30C64352018A5FD862A79E7AEAE85C2E5738BD731ACBB87D7979F968D901000036876ECF745A0D0D0D1F8DC56FE1AAE62727C6B85986A04DBB64CB013126648F0F0CF9F1C0D3A507A0DD0C8CF1C790BF407F508C5B62FC8FB480E21736D9A851A3D277F39C16ABCBB3E5A7CDFA0C9BB46FBFBF45B1BB426A00DA4DBF6C1F7B905480E217B6D8D0A1438F686C6CFC87B1BD715D6D2E97EB53535393BA3EDF2A53F00FFBF4C293B0B64EC8D2ACD07F952E802D926E15377023FBD910F4B401C52F6C8A58E4FE9FD6D6C7C2B73C7BFD44C52FFC8374C12875BD1BB691EDB657FC026CB11931EA37B24D0F6902C52F6C54EAF21C8BDBD12DC6FB366B2E7E53D7E76F4E9A3449374E789B31BD001D6F8E14407132DB339DCE90214346B598E5B9A5B5F1F5016BD7AEFD806CC13FA894020000C52FC5F0A52C2B3B71239B343509C702F84CD98277F8468C235AAC4B5DA16F8CF133E90178D7C6C418D1CAFA4762DC273DA0F885CDF5858DBCDED4B2D5D8D8786C362B3490D7DA38F81FC7981DE35FA407E05D9B12634D8B75FF15E3F218474B0F287E61939D72CA29C786FCAD03362A757DDE61871D4E9235586F6E8BE7A362BC14635CC84F840540FB4AB33DDF11F23D6C00C52F6CBA58D01EBA99DBEF2D6BD0A61D43BE3502808EDBCF4E9306280EBA8CD2A94C9932E52771F193C27555555513E2627C8C0B264F9E3C41966083BE1CF2F7F11D1063618C0F64CBC296DF3474E045A902D82277C7F87C8C7401FEF16C59A82C3BC79E2155A0F805A0E33C1BE35F63A42104D7C478B3C5EBBD63AC8E3141AA00B6481A729526BEFA61C85F607CB345E1DB2DE85D098A5F003ADC6321DF7B62748CEFC5F86670EF5F80F6947AD7A48B8CA9575A1AEFFBCBD0FA84834027E3AA1440694ADDF23E19F2DDA047480740BB4BC349D285C67D629C2A1DA0F80560DB49AD135F09F9EE79DB4B07408748B794EB1B635FA900C52F005B4F9F56D6A55B1D7D426A00DAC5E056D65D1DF2B7970314BF006C258FB5B1FEE6A0F517A03D3CDEC6FA2BA4063A37135E019496A56DAC5F9505004097A4E517000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC020000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E217000000DEA50A2900E89AC68C1973442E977BB48D97C75755558D2F5C3179F2E49CAC0100C54ACB2F40173565CA94C7E2E2C54DD9B6B1B171A18C01008A5F008A522C6AEFDEC44DEF902D0040F10B40512A2F2FBF7653B6CBE57237C81600A0F805A028FDF6B7BF9D1E17AF6F64B3E50B172E7C58B60000C52F0045ABB1B1F1E68DBC7ECBFDF7DF5F27530080E21780A295CBE56EDBE081A2ACEC1659020014BF0014B5AC4BF3ECD65E4BB33C2F58B0609A2C01008A5F008A5AD6A5B9AD599FEFD0E5190050FC02501272B9DC94365EFA93EC00008A5F004AC28D37DE98BA3E2F6DB17A79434383FBFB02008A5F004A4ACB42F7CEA953A7AE92160040F10B4029B9B6F0492E9733CB3300A0F805A0B45456563E56F8BC478F1EF7CB0A00A0F805A0A44C9A34A93A2E5E4C8F73B9DC9CF87C85AC0000A5A2420A00DAD77DF7DDB74B5D5DDDB71BCB1A4FCA35E47629A6BF7DE9D2A5E189279E08871C72C8F0B3CE3AABB198FEF6C6D0B8241772B7D4D7D75F367AF4E8D9BE890080E217A0834C9B36EDD8DAFADA1B960F595EB77CFBE53BD5F4AC29BAFF87DD3EBA5B589AFD574CBA57771F3C60D980CF0C5A38E8B3F17338FBD8638F35533500B09E6ECF00ED24B5F8D6E7EA7FFBEAFB5E1DB070D7854559F816B3DACADAB078A7C53BCCDD7BEE80FAC6FADFDC7DF7DD7BC80A00A0F8056867EBEAD67D6FD990653D56F75DDD5D36B69DB5BDD6765FBAD3D2CAD02DFC54360000C52F40FBEF514F59B1DD8A7E9BB269C59A8AD07D59F750B1CAE8938EF0E6C037FBE61A73C7C80400B0FEFC4B0A00DA47AE213764635D9DCBD7968701CF0F08DD57BCDD385CD7AB2EAC18B122ACEBBF4E12DB49EA025DD6583640260080665A7E01B65671DC980BDB4DDFEE1D856F925A81D3FAB23ABB640000C52F4091AB78ABA2CD6ECE65B565A1C7921E920400A0F80528F2E277CD86479A54AC3512050040F10B50E452B767000014BF000000A0F80528668DB9C60DBF1E1A25090040F10B50DCD6F5DDF0AD8CEAFBD44B120080E217A0B8D5F5A90BAB765FD5EA6B6B87AE0DD583AA25090040F10B50FCD60C5DD3FAFA9DD684C672DD9E010014BF0025A0C7F2D6EFE5DB63450FB34103007420379504D80ACA6ACBC2805903428F25AD17BF7DFED627F458DA23AC18B122D4F5AA93300080F63E1F9302808ED57341CF30F8D1C16D16BECDBABDD92D6CFF97ED43AFD77B6905060068675A7E013A48F9DAF2D07F56FFD063598F4D7E4F2A7AFBBFD03FF4FA7B2FADC00000ED48CB2F4007E9B5A0D76615BE85522B70CF853D251100A09D68F905E820F595F5A176BBDA77F57E000014BF009D5ABA7D510A0000B63DDD9E81CEA27B8CE363FC7B8C1DDAD85F7DBA8DF756C6D87B033FFBC8189FDDC0EB4363F46965FDA53E160080D2A0E517D8565241DA37C6BA181F8FB13AC6A331FE2BC69BAD14C6212B8EEF8EF1B91837C4F85A8CB9310E8FF14C8C17DBF85D036374DBC0DFB224C61D3146C7F860F6772523637C2CDB577E20C6777D6C00008A5F804D950ACCFE311AB2FD509AD2380D8E2DCB0ACEA362AC8AF1E36CFB0F65EFF95D8C7131DE08F9D6E1B4EDE559E1DAD20D593417B169F6A895D9F36FC7382DC6A2EC795DF6B393276354678F3F1FE30FD9EFFEA18F0D0040F10BB0391E8AB173C8B7B8A6A2B76F56D04E8B313C2B4097146C9FD6A716D8E742BE95F73F37E1779465856BB3BE05CF3F5F50F836FB6DC1E39343BE257AA7ECF72683632CF0D10100287E0136472A62F78FF1488C1121DFD29B1C1BE3E1F0766BEEAE21DFF23B332B5A53EBEDB9315E8DD13BC66E59C1FCC9901F2FFC46F6BE2105856BCB96DF1D0BFE8E3D427EBCF045314E08F9AED5CD85F73305DBFD20C605053F1F0000C52FC0463577794EE379BB153C4ECBC231BFAF85B7BB2FA72ECEDF0AF96ECAE9FD6362CC8B5195AD2FB4386CB8E5B7D9EC2C4E0FF996DD6B637C35E4C712DF9B6D73608CF13196FBD8000014BF009BEBA9AC202DECF63C28468F16DB1D9FEDAF8685FCA454A925776207FE5D6932AE6B0A9E9FAAF0050050FC026C8954ECEE13F25D930F0EF92EC9A9E537CDCCFC648B6DFF1CE31B21DF1A9BE2F1901F933B77033FBF70BC6ECB6ECF43DA784F1A277C40568C1F5EB07EA08F0B0040F10BB025FB9E1DB3A236DDEA6878560CA771BD7342BE5BF2BF166C9F5A5E532BF1B090BF9D519A99794A7867B7E696D26CCEF30B9E17767BBEBB95EDD3F8E13493F4BF677F5F5FFB4A0080D2512605C03690C6EC4E0DF9B1B669CCEE922CE665C56D2A7C8FCAB6ED9EC52305FBACF362BC27E45B8093C1ADFC8EF91BF8FD0DADAC4B935E4DCAFEB637B242B93916F9C800008A9BD60C606B1B9415B67505EBFA64056E7337E5D40AFBE1909F802A7555FE75C88FC31D16F2B7463A22C62505EF1FB191DF5916367EB1EFA0186B5AAC4BF712FE661BC53500008A5F8036A556D5FFD984EDA6B678FE68561CA722764A8BD73EB5919F756F56346F4861E17B76B64C2DBEDFF7910100143FDD9E8162D35A97E58D15B6B59BF93BEAA4B96B3BE594538EADAAAAFA37990080D2A1E517802E6FD4A8511543860C195556567662C8DF377AFBECA58B64070014BF001491FADAFAB0FCF5E561FBE1DB87C686C6A675B9B2DC3BB6A95E591D2AFB56BE63DD5FAEFD4BD8EFF8FD42FFA1FD9B9EFFE9E77F0A879D7658E83BB86FD117BC43870E3DA2B1B13175733F36C62EBE2500A0F805A0C895772F0F8F5EF76838F05307865DF6DF254C1C3B311C79E69161E63D33C3B091C342EFED7A87FB7E715F38EFD6F39AB69FFDC8ECB0DD7BB60B739F9C1BDEF781F785C76F783C0C3B6C5858F0C282D0BD57F750B3BA26CCB863461839666451E5E1D4534F1DDDD0D0F0D1F8706C2C7C0734AF8F8F1B73916F0A00287E012872479F77747873C19BA1ACA22CF4DFA97FD8F7B87DC3F37F78BE69995A8107ECB4BE160C7D87F40D7F7FFEEF61D5D25561D1CB8B42CDAA9AA6D6E37E3BF40BF367CC0F77FDF4AE70C2F74E08AB97AD6E2A9C3BABB163C756565757A719C2CF8C716CAC717729A871531378D313852F00287EA1B3185F5555250B745A4F3FFD74D3CD987A0CEAD169FFC6D5CB57879DF7DF79FDF319B7CF082B16AC686ADD1D346CD03BB67D63EE1B4D45726AFDDDE723FB8487AE79282C9EBD38ECF1813DC26E87ECD654280F3F7278A7FD7F5DBA7469183366CCCC58F8EEBB81CD3658F0C67DCE04DF6CA0BDCF67A40014BFE08041517BE69967C22E3BED1276F978E71B3ABA72C9CA30F789B9E181AB1E08675C794618B0F380B06AC9AAA6D6DE6E3DBA35B5E8CEFAE3AC771E20BA5784DA35B5E195075F092F3FF472D398DFBD8FD9BBE93D977FEAF270D2252775EACFE3C9279F4CADB9FBDAE700008A5F8AC52429A0181C7CF0C1E3C3119DF36F4B9353EDFFF1FDC38C3B673415BE499FC17D9AC6F0A6F5A96BF3019F3C20DCF0D51BD6BF67CF0FEF19EEFEE9DD61C7BD760CE515E561E14B0BC3C19F39383C32F191B0F747F66E1A037CDCB78FEBB4135F8D1C3932DC76DB6D2FC6877BBF8B1F73816F36E0FC0614BFB0554C9E3C796E5C4C90093ABBB3CF3E7BFCCC41338BE6EF4D05ED1D3FBAA36902AC07AF7A309CF1CB33D6BF965A8A5F9BFE5A38E6EBC78427273F19F6386A8FA696E0D43A7CE82987366D93667DBEFD82DBC327C67DA2691C7067B3FDF6DBA7FDC73E69CC6F4D4DCDA8C6C6C6D373B9DC0971396833F63FF63D00A0F805A058BDFACCAB61970377097FFBCBDF9A26BB4AB336F7D9BECFFAD7536B6E5AFFC29F5E681A0B9C667E9EF7D779615DCDBAA622384905F1EE47EEDE348B74673669D2A4EAB8B83B452A84D7AE5D9B6E6B74622C844F8FCB9EBE0D00D03594490140D791EEEF9B5A6B97BDBA2CECB4EF4E4DEB96BDB6ACCDEDD34457CFDFF57CD8EDD0DDC2CE07EC1CEAD7D587BADABAA642B8DF8EFD3A7DE1DB5A213C65CA943B627C69E1C285FD524B705ADDD8D8B8CAB703004A9B965F802EA4CFA03EE183E77C30FCF5A6BF86834E3C288CFEEEE8A631C0637E36A6CDF7A45B1CF5E89D9FC17A970376696A114E91A4EED19D75CCEFC6DC7FFFFD75E1ED16E1AFAC59B3E603656565A7C742F8D3B1281EE0DB02008A5F008AD4A7FFFDD34DB730DA6FF47E4DCF9B27BF7AEDD9D7C203573ED0D4BADB6CE63D339B66764EB73A4A637DDF5AF45653CB6FF3ACD0CDF7FFFDE4F84F167D5EB2AED1D3528C1A35EA4B43870EFD442C8247F8C60080E2178022D5F27EBEC97B0E7E4FF8FCD59F7FC7BAFD3E9A2F909B5B79BB8AAC45F8D62C00801261CC2F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E217000000C52F000000287E01000040F10B0000008A5F00000050FC0214A186F286653DD6F690884EA07B75F7505F56BF52260000C52F403BAB2FAFBFA3FF8AFE0D32B1EDF55BD12F349635FE45260000C52F403BEBD9D0F35FB75BB4DDDA9EAB7B4AC636945A7D072D1CB4265793FB9A6C00008A5F807676F4D147BF5E16CA4E79CFECF7AC1DB260485311C6562E7A170D0AEF7DE9BDD515A1E2F3A3478F9E2D2B0040B30A2900683FC71F73FC1FEEBBEFBE3DFB2FEF7FED764BB63BAC7C5D799F62FAFB57AD5A155E7EF9E5B0E79E7B863E7D8AEA4F0F75E5756BEB2BEA9F0E8DE1ECE38E39EE25DF460040F10BD081520B705C7CA418FFF6AAAAAA097131FE99679EB960F2E4C9137C9A0040A9D0ED19000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF0014182305004057532105002563B718BF8FD1903D1F15E3C1186363CC28D8EECA1853A40B0050FC02508CE6C53829C69C18C363AC8AF15C8CDAACF8FD718C33630C932A00A0ABD1ED19A0B4F4CA968517375F8CF1E518E363CC8FF1963401005D8D965F80D2F2468C81319664CFD345CE3D623C1563EF90EF1A3D22C6F352050074255A7E014ACBE8ACB8FD54F67C568CD9312ECA9EA7AED1C74A1300D0D568F905282D0F84FC98DFF9D9F3FBB3E52F0BB6B92646BFA0FB3300A0F805A00855C6B87913B65B1BE328E9020014BF0014A363627C2118CF0B00A0F80528618FC63820C6F4184363CC6D659B1E31BAC7787F8C6A29030014BF00149BE5213FE6F7A090EF023D2EC6E331FE476A0000C52F00A528B5EAFE6BB69F4F512725004057E6564700A56BD7ACE855F802008A5F29002829B7163CBE5F3A0000F2747B06282DDF09F949AFD6C47838C615318EC85EDB37C6ACE056470080E2178022B72EC68C18C3B3E797C6581CA367F6F8CC909F080B0040F10B4051FA63C8DFE2A8217BDEBB8DED2E942A0040F10B40B13A2EC66E31E6857CCBEF7829010050FC0294B2CA6C79748CFF1BF2333EA7D99F9F0EF996E143A5080050FC0250CC0687FCC456699CEFAFB3383EC6BD52030074556E7504505A5297E725D9E30905EBEFCD8AE04A290200BA222DBF00A557FC4E8BF1C31833633CD7E2F5749BA33411D61AA9020014BF0014ABDD0A1E5F1FE3F3520200A0DB334029BB5C0A000014BF00A5EE71290000C8D3ED19A0B4A47BFB5E1063DF182BDBD8E635690200BA1A2DBF00A565765600EF1963C71817B558EE1FA35A9A0080AE46CB2F4069B921DBB7A796DF19D9BA275B2C3F254D0080E2178062755D8C4362D4C5688871501BDBDD2B550080E2178062D57C5BA354F4BE251D00008A5F8052F5871857C41814E38E18EF8971708CE121DF2A9CE67A7823C607A50A0050FC0250AC3E16F2637AD3C45787C65823250000667B062835BBC59815E391906FFD9D18E3FFC4182835004057A6E517A0B4FC264655F678488C2FC6E81EE347314E0FF9C9B0DE0C6D4F860500A0F805A0D3FB48B63C2AC627633C15A336C6FFCB0A60DDA00100C52F002563518CEF173C9F2F250080E217805292BA3A5FD7C66BBF0BF9D9A0A76DE4678CAFAAAA924900280DE3A540F10B508A3E14E37B213FA9E10531A684FC58DFCF66AF4FDBC49FE3400900287E01E8B42E8C31277B9CEEEF7B578C7E311E282880DB3249FA00A06439CE03505252C15B912D2F0FF96ECEBBC6F863C8DFFE080000008ADEC742FE7EBFDD0BD6ED9C2D7F10A3528A0080AEA65C0A004A46EAD2DC27C61B315664456EEF2CBE13E399184FC7382FC6C3D20500287E0128462FC4F8708CB5317E18F2E37E0F8D918BB17B8CA531B68BF16A8CD7A40B00008062B55BB6BC365B0ECF967BC718283D004057A5E517A0B4A4F1BE7D43BEC577518C0342BE2BF490181F8DF1A81401000050EC46C618DC46CC971E0000004ADD7029000000000000000000000000000000000000000000000000000013EF7BBF00000088494441540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A068FD7FDE8CD9EF8E2563740000000049454E44AE426082, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('212511', 3, 'source', NULL, 0x7B227265736F757263654964223A22323132353130222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41453336323135452D353838452D343946332D423734332D383330454243423330344130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5BC80E5A78B222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A37392E32323232323232323232323232332C2279223A3131367D2C2275707065724C656674223A7B2278223A34392E32323232323232323232323232332C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934222C2270726F70657274696573223A7B226F766572726964656964223A226D616E616765222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238382E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3138382E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138372E36303530353132333635343432382C2279223A3130302E39303833313534363834373331327D2C2275707065724C656674223A7B2278223A38302E31373533333037303739303031392C2279223A3130302E32393039303332383135323638387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D7D2C7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131222C2270726F70657274696573223A7B226F766572726964656964223A226872222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3439372E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3339372E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339362E34323134343039373232323232332C2279223A3130307D2C2275707065724C656674223A7B2278223A3238392E30323330303334373232323232332C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D7D2C7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E7BB93E69D9F222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3632382C2279223A3131347D2C2275707065724C656674223A7B2278223A3630302C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539392E393730343836313131313131312C2279223A3130307D2C2275707065724C656674223A7B2278223A3439372E37333433373439393939393939342C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F62336D6E2E6F72672F7374656E63696C7365742F62706D6E322E3023227D2C227373657874656E73696F6E73223A5B5D7D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('212512', 2, 'source-extra', NULL, 0x89504E470D0A1A0A0000000D49484452000002A6000000BE0806000000E761CD40000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B00001B104944415478DAEDDD097C54D5BDC0F1FF9D992C6C090442202C52A4802B8BA855A1202250B18A169B44C402DA67DD5ADBBEF7146D2D7EACFADADA576DA9FAEA82C56042D14FA90BE256A3E02E104411102112246058122021093373DFF9E7CE984B4C3090643299F97D3F9F6366EEDC593CDCFF9CFF3DE7DC33220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4178B2A0044366FCEB9FAC081E3675556669E5A51715CE76030914A69EE978B15908E1DB797272595AE32B7EF1B39F2D667A8156208C41040620A34E2D34F677E7FEFDE11F36B6ABA77CFCC7C41BA76FD4852533F118FA786CA69264D4CF6EF3F5ECACA4E96929249C160D0F7597575CA65E3C75FBA86DA2186400C0124A680CBA64D33EFFAE28B0BE60C18906FF5EBF7AFDADE09B49EE2E28B65F3E619871213F7CF3CFBEC594F5223C4108821A03E2F5580786D5077EE1C3FE79453EEB43232969B06D5A6525A596AEA06E9D1E33D6F49C9F7BE3F6BD60FD7CF9FBF781DB5420C811802484C11D70A0B6F1B5D5A3AE6316D5075C8B1BE9A83A9B2FD93F1F2C5DAC952B27EACECDBF96DF1FAAA25B9CB2E2AAF991213CB242DED03EFB66D174EB9FCF259CFE4E6E67E49AD1043208680300F558078535595B948871E1B6A50FDD59DE4B3B77364EFB693C55FD3A176DBC17D3D656BE1F7654FF1A9545E0BE8DCB948060D9ADF2131B1F2116A83180231049098226EAD5A75D7797E7FD7DE3A1FAE21BB3E1F2187AABA34F8D88E0DDF15DB26645A42BF7E4B3C3EDFC1C12FBFFCF277A80D6208C41040628AB864DB093FCBCC5C6A357691C6C1F25E8D3E577B7FB437082DA34F9FE7F5CF0FA8096208C41040628AB8545DDDFD0C5DCEA6D14637E8FB8646999069296969ABBA793C3593A8096208C41040628AB85459D93BBDA1797188BC2E5D3E936030E1446A82180231049098222ED976828785BFA3E4CBA7F6DFC16265106208C41040620A3424A143F9911F4FAAA092006208008929D0FABAF75F2309C9FBBFB6DDB282923EF07DB13C7E2A09208600909802ADAF63D7ED92D66FEDD7B66B43DB7B68011504104300484C81C8F1D7247F6D5B3090585B00104300484C810834A61DA4F8C3EFC99EADC31B7C6CE31B3365DF97C75351003104A095F8A80240E4C0EE7E52BC664AA3BF58A3F4F7BF8B3EB854BAF72F945E43DE106F42351507104300484C8196113894243B379D23BB8B463479E1EFDD5B87CBFED26F49E689AF494AC6A7542288216208400B61281F714D7B78766D39EDA87F8DA6B6E767E5D423FEFC22400C114300484C81266BEEC518017F02950862881802D04218CA475C1B78663E9500104300A2043DA6000000203105000000484C01000040620A000000D4C7C54F0000006D60FAF4E97DFD7EFF54CBB2C69ABBFA9369BA7E5A6753AA4CD961DB76A179EC4DAFD79BBF70E1C26D24A631E68C85975FD6B928382BB95C4E4F2EB7527D07ED044F8D48D06BDB810E96BFBA8BECAC49B13F0874F3DDFDEA4D0BDF27640000404BCBC9C9996AFE5C1FF4FBBF6B12CF86D65C4B366580796C80F93B351008FC213B3BBBC0DC7F342F2F2F97C4B49D3BEF7739BFEF506A5F9FB022D8715F1F91D253450EF6B0A5C69C9304CDE1E0A9B12C5F952474D8257D53B65A7DBB6E084CBDF8869C2F2D4BEE59F297BCFB08210000D05C26B91C60D9F643B66D4FAADD60128DA330CE3C6F9C798D6B4CA23A6BF1E2C59B484CDB9931F3B2CF4BD9224FFB8AEDD46DA345CAF5BCA38159B59A9CD6684931FB0C14291E27925A64F7CC5C21FF3BF59AAC9F275404272ECE5DBC8190020000C7222B2B2BDB63DB0F042DAB5B789BD7B6E5E41D3BE4CC6DDB64D0AE5DD2B5AA4ABA54574B6562A29425274B51D7AEF25EBF7EB22A33530E79BDE1A78DF67ABDAB737272AE8DC5DED3984D4CCFFD5DD62369AB64F6CE5162ED1829477D999726B1A6583D575BFDFBBCE35B3BF5C69CFFA6F71400001C43527AA1C7B2728326170D27A4DFDBB041267EFAA9A457547C6DFF8E3535B52573DF3E397BEBD6DA24F5F9A143E585214324E0F4B276B66DFB09939C269BE4F49158AAAB98BC2A7FCC5FB39FE8F69975D5A68B4D523AAA79FF975F8E10D930CD4EF054D97FB8F867D9B7125E0000E02892D26C93942EB14349A9269BF72C5B26D30B0B1B4C4A1BA23DA9BABF3EAF5F79F957DB4D72FAB0494EAF20318D62E7DE9D3DAFC71A99BEFE872215BD5BE6352BD345D66789CF572173A75D95733561060000BE89CE2935D9E803E1A4744869A9CC7DF5D5C392CBA3A1CFD3E79FB273A73B397DD024A743494CA3D079F7649DDE7D9375EDE62962E97CD196A4AFF7E9259260F9EDFB63E900000000AD96643D129E53AA3DA5BF5CB1A2760E6973E810FF4D6FBEE94E6E7558FF6112D328D469A767E98E51B6A7A57A4AEBD39ED32FCE968E8712ED45841B0000688C2E091514394F6FEB9C524D269B9B94BA93D31BDF7AABF6754346C7CA907ECC24A613EFC899631DB2BBEB9CD0D6A4AF7FA8A31C1F6B733ADA8BECECEC5F69B08F1B378E1F87008821209A63E5FAF00DBDD0E95887EF1BA3AF77E1FAF55FDDB76DFB9A58A8F798F9624A2AB3FF73DB18B182DED67FAFADE3A5D3C0A5C19BCDCD5C4237E2EE34C127191919E5E64BE359CBB216FAFDFE158B172F3E108D1FB6A44464DB3691D34F3F7CBBDF2FB277AF487AFAD1BD9E394996C4C4861FFBDBDF4466CE6CFCF1F03EA3478B9C78A24861A1C8F0E1CEF6CF3F1739EE380EAE788AA15EBD7A556465652DF1783CB9D11C436E0B173AC76F538FD537DF14D9BF5F64F2E4BA6DC1A088C7430CE1A862A5CAB437AF9AF6665E5363457FD12918089CABB76BAFC0DFB8B1553EE06493F02E1D3C38BC94D4689DD39A9F9F5F4462DAC626FC317B846F8374AB5DA73402F61FA76BE27AFAC7C201D05E992F8854F3E70AF3A57185D7EBDD63FE2D9E31DB16252525153CFEF8E355D1F239172C10193850E4B4D3449E7842A47B77A7517CFC7191F1E3457EF21367BFDDBB4556AF766E57563AF757AE14B9E00211FD3E1B30C06960B76E15B9ED3667BFE26273C6DCAFEEBD3A751279FF7D9173CEA9DB567F9F0F3F14B9FC72E7F68D378ABCFAAAD308EBB6E5CB1B6FB011933A9998996E6268BA89A17D2686FE65EE3F196D31E4A631A4B1D05802F8DC73871FC36FBF5D978CAA22F36DBD6C99C8534F39C73D318426D25F619A6262658A3991AB34B1F2A2B9FF687272F2AB8DC54AE867466BB3C561252592A65FECAD40AFD61FB97DBBBC5B77904E33E55E12D3B6FE9FD823D7EF1B2056242726EC1D6CFBD30BDBFF011023D24C9969BE346656555555982F8DC5E60BE15F252525CF151414F8DBEA4369EFA6F698DE7CB3C84B2FE919B439567D4ECF4A8F1E7549A9D284F58413449E7D56E4B2CB44BA741179EB2D2731D52475CC1867BFA54BEB9EF3E49322279D54D710EA459AA9A975FB141438AFABEFAF3DB4E6FB4B0E1D12D9B44964D72E91BE7DEB7A86FAF7A7418D737AB9E80C1343334C0C55E5E4E4FCC3DCFF675BC7507D1B3638230D8DB9F0422791DCBCD9399E93939DED1A4F1A031A63D75D470CA1599D221DCD9F4BB49850A931EDCDF366DB82FAB162B68D0DDF3E430FCA56A4AFEF4A4CC792984681844A19BBFB84C8BE67D90049EBF1919C4F621A7DBD40E124B557AF5E7B4C036B5242F97B5BF4023DF698C86F7EE334A40F3DE4F49A262589DC7AABD3806A43E77345609F3EE6584E70F6D1C64E135B6D20D7AC697C68515F274CA70C68E378EAA9CEFDA1439DDE5AA50DEA8E1D4ECF51B76ECEF6471F753E9BBE67D8451799CAFABBB30FE2B777C8C4CF95E6EF952686B427F525FD7DEE68E8490D4F813912EDF15413273A31A1468C70924CBD7FEEB9C4105A8C7E335F62E2E5928C8C8C4AD3DE2C37F7EFD3583149EBF0F04E03F7EC69D50F31A0ACCC7D77787BAFD498484C13F7591995E97644DFF3600FF39F803DC27C69CF2536A3569AF9C2C8367FB3CD97842E72BCA9B4B434226FAC43889A546AE3F4FAEB220F3EE8346C7FFEB3C8BC794EE376CD35221326E8959BCE7D6D74B53766FB76A7C74793D1708FA9EEA7DC3DA6DA8B73E79D4EC2ABD6AD737A62B571D5214B9D673F678EF358E7CE2283063949AFF600E93EDAA0EA67D3A151A5AFF5EB5F47B6413D70E0801043514D7B52A799389AA63164FEAD3E8B540CD5A7276A3A57BB29D78F7CFCB1D35BAA31A1B417544FF0860D3B7CBFF61E43A5A59D64D5AA55C45014D09E54132793CCCD491A2BC6574949D7AAD63D9FABF7FA3D484CA380B7DAEE78A85384CFDC7588C8B67408F9378464BBF9E218F4DE7BEFD52682ADEDACB39C796CAFBC2232638636204EB9E38EBA7DB4B7E5A69B9CC454870075EE9B0E11EAF0A0366C4DE931D5FDB521543A6D407B89B401D5B96EDAB0BAE930A5EE9F9B2B72E595CE7B4C9DEA3CA6C9B07E9E8E1D23FB6FB2D1B92080186A3F8E8F540CD5A7B1A4C3EE7A02A7C7724646C3FB69423AA281D559B427D4B526794CC4D0EBAF7F4B563B93D389A1286C72C2375A6A89A8C6E8D251EE1020318D021EBF788389917D4F7D3FCBF925873B88BF883AE62F6093986E1E3E7CF8C0487D506D2F34A10C2799DAD8E9C5197A5B1BCF7FFFDB994F1AA643809ABC8E1BE7ECABBD31EE1E539D2757BF61D5463ADC8BBA76ADF35EFADA7A3B33B36E3F6D641F78C079FC8A2BBEDE78EABE914E4AD5E0C183B5612586A22F8602B66162C6573F86468D1A35B02D3EB426A63A4FBB572FE758BEA391A34663262CDC5EEB367DBE269E7979725862DD9E6368ECD82DB279F30C62A8EDDB1BBDBCCE532F568226846AB7ED4F4A6AD5E4B4F2F09E8BAAF65EE931919806BDE2F7D4882F92C9A9793FB1C5AE5E94BF682EB11B39D9D9D94D4E4CCD974299F972784597944A4A4A5AA6F3E366CF9E1D91391F3A34FF8B5F38BD2F59597573D694368ADA38BA1BD0FACFD57972FA5C6D58B5E1D4BF7A45BE26A9EE2B84758E6AF875DCBD3D9AC4BA7B7BF4E2292D37DC70E4CFAD89F1D12E61D51C9DCD87CDCFCF2786A220864CBCE8851B41132FFA4DEA357FDB3486DCF4244DA7B78487DC350EB4B3DD9CD77C452F2A0C9F0C86E9CA164AB7E963FA3ABAD493FB386FCF31949E5E2123478E949B6FBE99188A7C7BE34E463DF563A5AAAACA9CDAC8207DB0CC9CE9B466625A967C5827E92E12D368484C93A522A14252AB239898FAAA6A4F897613BA6D2BD4AB63B936E9FA72CB4C59D4A14387574C435AD6169F4B87E6C34BC76862F9DA6B5FBFE8C22D3C6CFFC61BCE73B4674893D38A0AE74A64EDA5D1C6B2FEDC355D4BB1A1DE1E6DC48736E18773B507D6DDF8BEFBEEE1178320E6699F62C0940EAEDED1A88821B75B6E11B9D77599A90EBD4F9922F2FCF37543FABA8494165D01A3674F2716C2173FE914009D2FAA71161E7A2786700CED8DDF15279E23C58A496A0BC389E9E6B4B4165F5CDFADA86B57F7DD4212D3281048904F3A96CA77AA2378D146A71DB2CDB2DBFF01D0DE859252FD7278CA94E79393939F8B863518B537E7AEBB447AF71639FBECC67B47754D44ED4DD5354A35019D3FBF6EC999F05A8ADAF0694F8D5E70A1FBBBE9C51B61EEDE9E867A9C0E985A3A7830743217747A90162F767A80F4FD9536E4DACB14EE9942CC4B7425A3511543613A64AF8BDE0F1A54B74D93D1BBEF1619354A64EE5C6754227CDC6B0C8417D1D72453AF98D784557B4DC3EB99124338C6F6C6D7D4583149ECEB667F5D5252DEEBD74FC66ED9D26A9FEB3DF7309AC8EB24A6D170B0F8E5D994AD72C6DEC1915BC9B4DB46DB7C4D59AF13AA6D76E6AA67A6051E8F27BC145459347D3E1D62D4A5A2C24BCD2C59E20C196A63A9F34AC33D34DA23AA8DAC967003A9C3943A17353C1CA8438ADA0BA3F4A45BAF306E688171BDA25F1BC5867A79C2AB0368C21C6E74B5072ADCB3A36B3BEA851B7AC5B15E240262A8ADE90999FE7293267D7A52569F2690FA0316EFBCE31CFB6E9A406AC278FBED222FBEE86CD393C46F420CA1A562C5E7F32D0904027FD29B6BCCC1B7A763C75659645F87F1576666EAF49AF0C8E15324A651A0C341EF026B53E0579F8F970E914A4DBB1659DD63E10068877E6DCE428BCC99EA53D1FAEB3461035D9788D41F3E3C126D847FF4A3A37FBFD9B38FFC538AFA19DC9FC33DDCD8588F2E88A1B6A2276B975E7AE47D747A4C435364525244AEBA4A64D6ACA35BF49E18424BC5CAC2850BB7E5E4E41498A47642C0B2E485C183657A61CB0FB22E1B3244FC5E6F38295D110BBF46191389A91E00D366E77C9C5A648F2A8FC0F5A2DD36DA1F5935529E9FBFA888B88D2C1374BFA5161A9698481D8018723BDA5F622286D0C2B1F257536A57A17EC12490DFDDB2A545E79A16A7A6CAB343877ED55B6A92E8FF8B89B88D950328E1A0DCD5FF356BBF045BFFBD06BC6CF93C96E721C216000034242F2F6F89F953A0B7B5D7F4BE73CEA95D3AAA25E81251F79F734E205877F1EF8A9292927C12D3283B00122BECB5BD3F90565DC9B6DF6BF61BDE6AD9152B070000006835B324B484D3F69414F9E3E8D1CD4E4E35293549AEFD454A8A37B4E980C94F7F5C5050E027318D32965FA6F77E47AA3A6FAF5DFEA4C575DE2145196B3C4363E900000000AD43E77CDAB67DA3B9599B336C484F97B9E79D573B0C7F2CF479B74F9810589B91F1D532892627B9362F2F6F7DACD49927D60E00EB90FD93414BACFD89FB5AF6B593CA65C790459260D9F2CB583A00000040EB59B468918EB0FE389C9C6ACFE99CC99365E1F0E1F517C76F94EE973F6C98DC3279B2BBA754570C98637292DC58AA2F5F2C1E00D9D9D9C9272D907B375E2A5D2A32A5D9D3D93B9758EB86FCC34E15BF3D2F6F517E2E610600009A2A3F3FFFF1ACAC2CBDB2FF41CBB2BAEA9CD3E7860EADBD286A5849899C515C2C03F7EC91AE5555B5BF12A5C3F59A8CEAE2F92BFBF695957DFA04ABBD5EED4C0CF794EA7AAA379A9CE7F158AB2B5F2C1F004317590F947C47766D3F53328FB16FD8DFFF6579B9E747F648B1E596FC183C00000040EB0B759CBD6312D387751929DDA609EAAACCCCDAF20DDC59CC0A9D5218ABA3B7BE583F00FABC633D9CB1DA0E6C99248965C74B46539F9FF689FDC680973D291EBFDDC51C00E3F2F219BE070000C72EB4CEE8F9263F9966728B6B4C823AEE2872B115A63CBA63C78EDC58BECEC5172F07C0B79FB1AE09786D39D05B8A779F2C29077ADA9DFC5D24239068F9BC35B2DB77400E74DE21C53DD64975972FAC4112D0B313FBFE583F00000040C4F313FD819EA7A64F9FDE37180C4E3309AAFE08F528537A99A2134F75D85FAFE6D755F9F557269F8A85C5F3E33E316DE80048DD169C9652AC0780A507803F54079D4CD15F402E730E003B6E0E000000D036F40782CC9FFB4205F192987200000000443F0F55000000101159A61CE7BAAF1D84BF6FC2F396C54BCE46620A00001019634CF9DC755FA714760CDD0E2F6FA9734C4F0B25B0E152634A3FD7FDBB4CE9168B15E48BE38363B029E9A6BCE9DA7653E8AC247C05FE99A69C250CFD030080E6196ECAFC50FE3138B42D68CA00532E30E574531E30A5D49495A184B532B45F852BA1D515866E8BD54A8AF5C454CF4CBA9832DE94BDA6AC0E9D89CC0EFDE3EFAFB7FFB07A49E845A1FD0000008E95F6868E3065A13843F7F798B233F49826A54B43C5ED5953FE18BA9D19DA4FCD34253B94D49298B633CB437FBB9B5262CA2BA6740E25AAEE03A04FE880E91BFA87D7B397BCD073BE30657228B17D97D8020000472939945CCE31E56953768B33DF543BC8B45774AA381D694FB89EF3A52B5799E1BA7D4AAC26A5F1909836E50CA626947CEA01A1BF675B60CAEDA1339AA75D6728DAFD7EA9D40DF303000034C53E531E136764767928FF7821B43D9C70A6D77B4ECF500EA2CFE96FCA2C717A59CF8AE58A8AE5C4F444530686CE2AC2FFA889A1B39601A17FEC8B4D992B4ECFE8845022AABDA96F859E5B2DCE1CD49AD0D9CD6E620B00001C835C53FE29CE34411DC1FD2F53DE0E3DA6B989F684DEE1DA5F87F1DF17A767756B281759EA7A0E89693BB32E54944E320E5FD4E41ECA770FE7A78712543D13F95DE8AC242394B04A28B965281F00001C8B4952F7C33E43433947380FD1DCA453BDFDFF6DCAFDA6FCC29479A6BC64CAFF88D3A14662DACE9D24DF7C65BDF6ACEA4F8269D7F9BE50325B2475F3542F21A60000C031E81E4A3035BFD02BEE5F09E515E1CEAFE47AFB6B67D9D5A6DC22CE352E4AAFD6FF9B38530034697D2494DC9298B633BACED7F626ECA7DDE73F15679DB0D389210000D042742AE022533E746DDB164A50556757EEA149ACF6A8DEE3DAB726F477B32953C419C52D89C58A8A87C4F43FC4199AFF267A76A2DDE87A65DC0DE20CE59F2DCE4551F152570000A0757C58EFFE7CD7ED03A6BCE64A6297D7DB7796EBB65EC51FB3F34C6339D9D2330E5D205FE76754B9B66BF2B9B181A4F42CD7D9C9BDE24C4ED649C7E1ABF00712530000A00D04E3E57F349613533DE358DAC076ED09FD73BD6D3A6FE3997ADBEADF9F475C000000B41E0F5580786259FE403098484544C3E97FEDBF831DA02688211043008929E2526262D9E6F2F213A88828505E3EA4C4A439ABA9096208C41040628AB864DBBEE7CBCA4E0952136D6FE7CEB1BA60740135410C811802484C1197AAAB53FF5E5C3CB5D2B6BD5446DBF297944CD60B149FA62A88211043008929E2D2C489130BFDFEE4F7B76EBDA49ADA683B1B365CB73C10482A3AFFFCF3DFA13688211043008929E296DF9F70DD679FCD3C585E7E02170DB4817DFBBEBDA9B878EA89C160F0E7D4063104620870632C067127373777D79557CE5EB973E7D8C9DDBAADE9909CBC8B13B48835A8833FFEE083BF249BAF9E6B274E9CB8821A2186400C0124A6887B0B162CD83C63C6D585DBB74FBCC8B67DC5DDBAADED6E593615D37A0EAC5BF7CBA5EBD7FF748836A813264C788E2A2186400C01F5595401E2D98B2FBE38D4E3F1FCC9EBAD19DEB3E71B9B32320AD2D3D2561FEFF1D4F013B4CD140C2696EFD933ECA39292F37797968E19120CFA8A75E871D2A4491F513BC410882180C41468C44B2FBD34DCB2AC1F989BE34C19654A32B5D26C7E530AC559CEE6692ED22086400C010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022E0FF0121C2023A02FEDB030000000049454E44AE426082, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('247534', 1, '请假流程.bpmn20.xml', '247533', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274223E3C2F73746172744576656E743E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231223E3C2F73657175656E6365466C6F773E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F6578636C7573697665476174657761793E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4C656176654C697374656E6572496D706C223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274223E3C2F73746172744576656E743E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9223E0A20202020202020203C657874656E73696F6E456C656D656E74733E0A202020202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A20202020202020203C2F657874656E73696F6E456C656D656E74733E0A2020202020203C2F757365725461736B3E0A2020202020203C656E644576656E742069643D2273656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A2020202020203C73657175656E6365466C6F772069643D227369642D46333946364639322D463330412D344630452D423946382D45304444454231313530363522206E616D653D22E5AEA1E6A0B82220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D2273656E64223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572223E3C2F73657175656E6365466C6F773E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223136312E3130323038303930333236363036222077696474683D223238342E36303837323832303738373235362220783D223234382E32343130373732313432383638362220793D22302E30223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2232392E39393939393939393939393939372220783D223236362E373539353935363738323937332220793D2237312E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223333382E32343130373732313432383638362220793D2234362E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273656E64222069643D2242504D4E53686170655F73656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232372E39393939393939393939393939372220783D223436352E302220793D2237322E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635222069643D2242504D4E456467655F7369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223436352E302220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E3637393931353936313034392220793D223232342E3032333738383033373133343735223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223235332E33343530333333323234383436352220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223239362E373539353935363738323937332220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223333382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E, 0);
-INSERT INTO `act_ge_bytearray` VALUES ('247535', 1, '请假流程.process_leave.png', '247533', 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D00004B3D4944415478DAEDDD09985C559D37E0282232A3830B88382AE038E0363A220CA2A3068619409045A8AEBED59DA4D982B208B20884C1B083AC437001648DC8221F46C8B048164242482420888160420264212121040890B0DEEF9C9ABA6DA5D3DDE9AE7477AABADEF779CE53D55DD5DDC9A97BCFF9FFEE3A6000D0AF5D71C5159BEFBFFFFE0F6FBDF5D6AF872F534DD3B49E6A5B6EB9E55B43860C993176ECD82F196D0100FAA961C3866DBADD76DBBDB6C71E7BA4D3A64D4B57AC589102F48437DF7C33FDCB5FFE92EEB7DF7EE917BEF085D7E3462CA32E00403FB4EFBEFB8E8FA112A037C57019C69BA9465D00807E68F3CD377F31EEA904E84D3366CC483FF5A94FAD34EA0200F44F0E7F05FAE4B0D801FF77DE250000FD315802F405C1120040B004102C0100E8FB60592A24D3C6C646553508968225008060597931F9894F7C62B5EF0F1E3CB83578AEBFFEFAE957BFFAD5F4B1C71E537D836009008060D9B56059FEDADB6FBF9D0E1B362C1DE0D05C102C0100E8BFC1F2FAEBAF4FB7D8628B74BDF5D66BDDD3181D74D041C5E73BEFBC73FAFAEBAFAFF25A564C1E76D861E9E73EF7B9E2F34B2EB9A4DD6079CC31C7B4FE5CF9EFB9E28A2B56F99D8B172F8EF7C36BFDDE11471C517C7FE6A5975E4A9B9B9B5B5F1F356A54EB6BF16777DB6DB7D6D7E2D76BFAFFADE93540B00400102CBB5714AE71AFE46F7FFBDBE2D70F3CF0C02A3F17C3E371C71DB7CAEFF8F8C73FDEFAFA17BEF085F4CF7FFE73BB7FF3F9E79F5FED7BF136293118B6FD770D1D3AB4F8F5B3CF3E5B0C956D436EF6F559679DD5E16BDDF9BF038225008060D945F3E7CF6F3D5C35EEB99B3B776EBBC1320B73E5C1B26DE8ECCA61B2D9EB1FFDE84757FBDEBFFDDBBFB57EDDDEEFDC7AEBADDBFD7D5FFFFAD75B4362DBB0D8D9FFAFB3D700C1120040B0AC40477BFBE25EC933CE38A3F8FCC1071F5C6D6F5F3C6CB5BBC172A38D366A77EF61BCE17A3CECB56D40CC0E837DE185178AAF8F1C39B2DD7F676C1D5D2CA8EDFFAFABAF018225008060D989DD77DFBD35987DEC631F4BAFBBEEBAD6D76288CC5E8BE7509687BDF818DF9B7D6FF6ECD9C5EF975F1576F9F2E5ABFCADF8F580367B16B3F328E3E1AFFBECB34FEBF78F3CF2C8E261B1E57B17070E1CB8DADF8B162D5A94EEB2CB2EADAF4D9C38B14BFFBFCE5E03044B0000C11240B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B034E4020008960082250000822520580200205802822500008225205802002058020896000008968060090080600908960000089680600900806009205802000896008225000082252058020020580282250000822580600900205802089600000896806009008060090896000008960082250080600920580200205802822500008265ED9A3B776E3A65CA9474DCB871E9983163B43E6C63C78E4D274E9C98CE9A35CB82285802002058D66EA89C346952BA78F1E2F4F5D75FD7D6415BB264493A61C28474E6CC991648C1120000C1B2F6C43D9542657584CBB8C718C1120000C1B2E6C43023D855478B87C6225802002058D69C1866843AC152B0142C0100044B7A3D58BEF2E2C274CEB4ABD3C7C69E566CF179FC9E4028580A960000089682E51A03CFF2650BD2E97F3839FDF3EDC7ADD2E2F7E26B42A1602958020020580A969DB6798FDDB65AA8CCDAFCC7460B8582A560090080602958761E7866DCF3D30E83657C4D28142C054B0000044BC1B2D3367DCC291D06CBF89A5028580A960000089682A56029580A9600000896F45EB08C5781ED2858C6D78442C152B0040040B0142C3B6DB326FFACC360195F130A054BC1120000C152B0ECB42D5DF0683AFDEEE1AB1F061BBE175F130A054BC1120000C152B05C637BEAC191AB05CBF83D8150B0142C0100102C05CB35879E952BD359F7FF72F5C360C3F7E26B42A1602958020020580A961DB6E5CB16A433275FD2E13996F1B5F81EC150B0142C0100102C05CBD5F6522E9C353EFDCB5DC33A0C95598BEF89EFB5F752B0142C0100102C05CB2EEDA5B4F752B0142C0100102CE9345876652F65677B2F8544C152B0040040B0ACF3605969A8CC9A9028580A9600000896CEB1D4044BC1120000C112C152B044B0040040B52B580A9608960000089682A526580A960000D449B09C33674E7AF5D557A7A79D765A7AC41147A443860C491B1B1BD3418306A5871D76587AE69967165F7FE69967044BAD6E82E5ECD9B3D38B2EBA283DF4D043D3E6E6E6344992E27A115B535353FAFDEF7F3F3DF7DC738BEF132C0100A8DB6079F3CD37A7279E78627AE49147A6975D76593A75EAD474C18205E98A152B8AAFC7C7C58B17A70F3DF4507AEDB5D7A6471D75543A7CF8F0E2CF09965A7F0D9637DC70437AD04107AD1224D7D40E3CF0C0F4CA2BAF142C0100A89F60F9C4134FA4C71D775C7AECB1C71643E35B6FBDD5E59F7DE49147D261C38615DB8C1933044BADDF04CBB85E1C7CF0C15D0E93EDB5FDF7DF3F7DF4D147054B0000FA77B01C397264B1781E3D7A74B702655B77DD7557F150C05B6EB945B0D46A3E58C643BD0B85C22A21311EEE7AF6D967A7E3C78F4FE7CE9D9BBEFCF2CBC5F7BEFAEAABC53DFB93274F2E1E2A1B0F192FFFB9B8A7B396F65E0A9600008265B7C41018CF179B3973668FFCBEA79F7EBA784E66AD1E1A2B580A96D16F7FFBDBD5CE9FBCEEBAEB8A878177C5B265CB8AEF8F3F571E307FF18B5F08960000F4AF6079CD35D7144365578BE5AE8ABFAF56C3A5602958C63D95E5A1F2E8A38F2EEE9DAC44FCB978887979B8AC853D978225008060D9E573C70E38E0801EDB53D9DE9ECB430E39A4E6CE2D132CEB3B58C6F5A27C2F63BC305576B86BA5E261B2F12ACAE587C53EFCF0C382250000B51F2CE32D436EBBEDB65E2D4EE33997C71F7FBC60A9D54CB02CBF504FDC53B9B6A1B23C5C96EFB98C17F4112C0100A8E960196F9D106F27F2C61B6FF47A811A83E5F5D75F2F586A551F2CE37A517E4E65A587BF7676586CF9DED06A3E2456B00400102CD7E8F0C30F2FDE52A42FC443614F38E104C152EB956019DFD753E27D2AB3D0172FBCD3DBE1B59AF75A0A9600008265A766CF9E5D3CDC6F6D6E2BD25D471D7554AF9DCBD99DD070F7DD770B96FD28583EFBECB3C5DB7BC410D859C0ECCA671FD78BEC823D71AFE2D2A54B7B65398C578B2DBF15493CA753B00400A0E68265BCC7DECF7FFEF33E2D5263E17FE9A597AED342392BE463C818376E9C6059C3C1325E7578C58A15AD5FAF5CB932BDE9A69BD2471E79A4E2CF3EAE17D9FBCE3DF7DC5E5D16FBF26F09960000F44AB08CB701993A756A9F16A9F1B0DB934E3AA92A8265D6E25EDBF6F6620996D51B2CDF7CF3CD4E6F8DF3D4534FA5BFFAD5AF8A17CAE9EE671F6FBB93BD3E61C2845E5D16E35ED6EC6FC52B270B960000D45CB01C326448BA70E1C23E2D526318887B8BAA295896EFC52A0F1982657506CB78D8EBDB6FBFBDC6CFF99D77DE295E8DF88E3BEEE8D667DFDCDCDCFAFD9EBE684F5B0B162C68FD5B854241B00400A0F682652C64CB0F23EC0BF1EFC5C2BD1A8365F95EAC7898A460595DC172F9F2E5E98B2FBED8EDCFFB85175E48AFBAEAAA6220EDCA675FFE754FDD62A423718F6AF9DF132C0100A8B960B9AE0AD93515F7D5D204CBEA69A3468D4A478C1851BCE04D2517C9893F5BC932D0D7EB8360090040CD05CB75B5C7325E69B31AF758C643837FFBDBDFB65E55B4378365BCF268F9EF8F9FE999679ED9EE7BE3219AF1F5B877EBF6DB6F4F070F1E9CDE7AEBADE9EEBBEF9EB6B4B4F4E8BF2BFE9DF3CF3F7F8DEF39F6D8638BCFE38572E2679A7D3FBB2A6B6FECB18C7D76CC31C7A4F7DF7F7F973FEBB8C7F1473FFA51FAFDEF7FBF78D5D5AE7CF6D91561EDB1142C010004CB2E88B73A5817E7581E78E08155152CDB06CABE3AC7327E8E53A64C29EE518BCFE3855C3A7ADF85175E580C215988CBBE7FE28927B67EBD68D1A274A79D762A86CE18F076D86187E2FF2F7E9D85D1912347A61B6EB861EBCFDC7BEFBDABBCBED9669BA5DFFCE6378BCF63BBE5965BD22DB7DC72B57FCF15575CD1FA3CFECEEC790C9ABD7D8E65BCFFE3E9A79FDEE9DECB787E65FCB7C4C3AEE3FBBBF3D93BC752B00400102CBB215EFD72E2C4897D7E55D8B8D7A91A8265DCDB17434747F73DECAD60397DFAF46260DB64934D8AE16D830D36287EFDF9CF7FBE1820DB1E029AFD3BE2E77EFCF1C7B73EDF679F7D56FBDD317CC6D7E29ECDEC7DF1FCC2F818C3630C9C9FFCE427570989E561307E1D435BF6F5FAEBAFDF1A5EE39556E3BF37BEE75BDFFA563150C6E7714F60F6B38F3EFA68F1F1E28B2FEED5ABC2C650396CD8B0F477BFFBDD6A17F2896170FFFDF74F4F38E184F4F9E79FEFF667EFAAB08225008060D90DF11E7AF1B0C7BE14834DFCBBEB52477B28FB2A58DE79E79DC5C0D6F6FB1B6DB451BAD75E7BB57E9D85B4183A0794ED9D8CCFE3EF8881303EBFE79E7B56DBA3180360F63C06D9F878FDF5D7172F60139FCF9B37AFF87ABC204EBC5051B68732BE76C00107149FC7E01AC3687B7B50CBF7586EBAE9A6AD87EBC6BD9B712F685FDDC7326E18F9F18F7F9CCE9933A7B837F7A73FFD69313476B4C1A42B9FBDFB580A960000826537C473D662A1FDD65B6FF559917AF8E18717F770D582751D2CE35EB9182EE3E1B2DB6CB34D3120C6F7C4AFB3F73CF3CC33C5C23FEED97CE9A5975AC3610C7E975C7249F1F9CD37DFDCE11ECB2C1CC6F7B40DA5F1DF19FF5E7BC132EEB17CF0C1075B0FE7CDBE1FFF665FDCC7B25C7CFD820B2E2886B3F8B8A60D065D592FB2B017CF075EBA7469AF2C5FF1F32D3FECB65AD70BC1120040B05CA378FFBE78385E5F8821E9073FF8415A2B7A3358C6CF305E502686BDECFCC6F8BDA38E3A6AB5C366E36B3134C620173FAB6CEF6276186DB6F730DB03197F4FDC839885BD6C2F65DC63195F9F356BD66A41F11BDFF8C66A7B2CE3F9966DF7A0C68BF6C4F75C7EF9E5ED86D2BE38C7B2B380D993EB4516F86218EF0DF150DCEC6FC44377AB95600900205876A9B88D45745FECB58CA1E4CA2BAFACFB60F9F8E38F175B16C64E3DF5D4E2F318F8E6CF9FBF5AE88B6DD2A449C5433DE339946B0A7103CAF63AC6809905C6189076D96597D50E6FED6AB08C17078A7BF306B439D4B63C586687EFB6FD7FF445B0ECADD017F75AF6F4457CE2EF8BBF37FB1BD5BC5E08960000826597C4ABB45E7BEDB5BD5A9CDE71C71DE9D0A1437B74AF522D06CB786E630C7BF1D0D61FFEF087C53D9159108BA12D1E221B837EDB9F8B812D5EF1B5A38BEE94B70F7DE843C5DF1FCF758CBF3F7B7FDC63D9D11ED4F642693C34330BC09D9D6319FF6DD961B1F1023F3168965FBDB6168365B65E64C1EFE8A38FEEB15B8FC48D03F10256E57B2BAB79BD102C010004CB2E890122DEEA208688DEF0F4D34F172FA8F2F0C30FA7B5A4A783653C576F40E9B62231FCC5F3EBCA5F2FBF6D47F9F993F16AB131B095DFC3327E7FDF7DF76D7D1E4364B63771ABADB62A1EFE1A836876FB9101A5732CB3E7F182406BDADBD9B6C5C368B3436DAFB9E69A55F6A8C620191F870F1FBEDA6D506A3558C6F5A2FC9E96F1FFB6B6E13286CA33CE38A3F577C6DF5FEDEB85600900205876D9D5575FDD2BF7B58CF7AD8C7BE06AE910D8DE3E1436BB8D4816CAE2B996F15613034A7BFF3AFA99AEEC058CC1AF3BEFEF4EB08C2DBB426DF9057BCA2F26D45B6D5D04CB6CBD28BFEF65DC7359E961B1F1E7CAF75456FB21B082250080605991CB2EBBACB8172D5E30A6A7F654C6C309CF3AEBACB416F566B0D46A235866EB4579188CE746C6F355E3555DBB7AF5D778CE66F93995B1D5CA7A21580200089615EDA18987E7C5431DD7E6823EA3478F2EEE018D4579AD122C05CB8EF65C660133DE7B72C28409C5BD91D961B2F170D7050B16140F791E316244F1963EE53F17D7AF5A5A2F044B0000C1B2E273CBE2E1ABF1A222F7DD775FB77E369E2F76C4114714AF2C5A6BE7540A96826557D68BB601B33B2DAE53B5B65E0896000082E55AF9F5AF7F5D2CA4E3E1B1F18223F7DC734FF1EAA5AFBDF65AF1F5780E5FBC05C51FFFF8C7F4E28B2F2E16CD3150C6BD31B574F557C152B0AC64BDE86EA0ACD5F542B00400102C7B44BCDAE805175C901E7AE8A1AB9D2716AF261B2F3C130F098C7B74FA13C152B0B45E08960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A56009008060896029582258020020580A9682258225000082A560A909968225000082A560A9099682250000822582A56089600900205822580A9608960000089682A526580A960000089682A526580A9600000896089682258225008060896029582258020020580A969A602958020020580A969A6029580200205822580A9608960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A560090080604925C68D1B27D4099682A5600900205852B9499326A58B172F16ECD6715BB4685131E4235802002058D69CD9B367A713264C489F7BEE39016F1D87CA9933675A20054B000004CBDA0D97E3C78F2F1E8AA9F57D132A054B0000044B40B0040040B004044B0000044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B0142C0100044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C01005807C172C58A152A5EA057BDF9E69B822500407FB5E9A69B2E9A366D9AAA17E8553366CC4837D9649365465D00807EE8C31FFEF0B93BEFBCF32BCA5EA037EDB9E79EAF7DF4A31FFD99511700A07F7AFFFAEBAFFFF0F6DB6F3FFF81071E783D1EAE46EF58B972A54EA0EE0E7F9D3163C65B3BEEB8E3820D36D860761C6F0CB90000FD385C8676CABBDEF5AE2706FCDF39505A0FB6F7BFFFFDE90E3BEC10F7D8A4EBADB75EBFF97F353636FA7CB535B677BFFBDD31509E27540200400572B9DCFB9324393B04B015F97CFED5D08EEE4FFFBF52B0040000A0378410B947085E4FC5F0155BF8FAE5534E39E5DD82250000009D2A140AFF1A02D7A42C509605CBD1FDEDFF2A58020000F4A02449360E41EB9278D86BDB50596AA70B960000007414B006E6F3F9651D04CA6C8FE5E182250000001D4A92E4A010B41676142C1B1A1A76162C010000E8542E97FB58085B7776B0C7F28B82250000005D0D5CC3437BAB3C58C6D02958020000B046F1DE9521703DDDD0D0B06F78FC7529582EE9A7015AB0040000E885B015AF0C7B65D9D7FBC5C363054B000000D6A8A1A1E11B216CCD6F6969F960F9F7070E1CF81EC1120000804EEDB6DB6E1B84A03523B47DEAE5FF2C58020000F46CC83A33B49BEBECFF2C58020000F4847C3EFFE510B29E4B926453C1120000806EC9E572EB8580F560682DF5F67F172C0100007A4092243F0E01EB0FF5F87F172C010000D652A150F8E7788FCAD0B6102C010000E8AE772549726F08573FACD70E102C010000D62E547D3FB4FB4F39E594770B96000000744B5353D32742A85A9CCFE73F57E7E15AB0040000A830508D0EED64FD2058020000745B128440F5E7A14387AE2F580A96000000DD0D951B8730B530B46DF58660090000504990FA4D68E7E909C1120000A09210B57B68B372B9DC867A43B0040000E896A6A6A67F08216A6E6803F58660090000504980FA656897E909C1120000A0DB1A1A1ABE1502D4BC5C2EB791DE102C010000BAA5A5A5E57D213CCD0C6D4FBD215802000054129CCE09ED463D2158020000745B3E9FDF2604A745B95C6E13BD215802000074CBC08103DF1382E5C3499234EB0DC1120000A092C0342CB43BF48460090000D06DB95C6EEB10989684C74FE90DC1120000A0BBDE15C2D27DA11DA62B044B0000804A82D261A14D8A01536F0896000000DD120F7D2D1D02BBB5DE102C0100002A094977264972A29E102C0100002A094883E2ED45E26D46F48660090000D02D83060DFA6808488B42FB8ADE102C0100002A094737254972B69E102C0100580B699ABE67CE9C39374F9D3AF5ED71E3C6A563C68CD1FAB08D1D3B369D3871E2F3A1355B1AFB563E9FDF2B84A3BFB6B4B4BC4F6F08969817CC0B00B01662F13069D2A474F1E2C5E9EBAFBFAEAD83B664C992F4DE7BEF7D291413FB5922FB462E97DB2804A379A17D536F08969817CC0B00B096E21669C543551411AF8F1933668625B2CF42D1E5A1FD424F08969817CC0B00D003E2614E26F0EA68A18078D312D9FB1A1A1A760CA1E8993DF7DCF3037A43B0C4BC605E00801E10CFE73079574D01A150EF65B95C6EC310889E2C140ADFD11B8225E605F30200F47101F1CA8B0BD339D3AE4E1F1B7B5AB1C5E7F17B267E05442DC9E7F3E72749729D9E102C312F981700A08F0B88E5CB16A4D3FF7072FAE7DB8F5BA5C5EFC5D74CFE0A881A0995DB8530B43004CB8DF586608979C1BC00007D5C40CC7BECB6D58A87ACCD7F6CB4C95F0151F5860E1DBA7E08968F86D6A837044BCC0BE60500580705C48C7B7EDA6101115F33F92B206A20049D1CDA683D2158625E302F00C03A2A20A68F39A5C30222BE66F2574054B35C2EF7F910821687C77FD41B8225E605F302002820141074CB29A79CF2EE1080A624497288DE102C312F981700601D1610F16A7F1D1510F13593BF02A25AE5F3F92343009A109EBE4B6FAC55881C1D83E41ADA343D655E302F981700504074D8664DFE598705447CCDE4AF80A8D230B445684B72B9DC67F4C65AF7E5B6A1BDD959B00C217E0F3D655E302F981700504074D8962E78349D7EF7F0D50F770ADF8BAF99FC1510551A86EE0E61E7383DD163FD796727C172CAC08103DFA397CC0BE605F302000A884EDB530F8E5CAD8088DF33F12B20AA510894FB87B0F3602E975B4F6FF458B0DCB6A3609924C9DE7AC8BC605E302F00A080E8BCAD5C99CEBAFF97AB1FEE14BE175F33F92B20AA4908931F0B61E7B9102EBFAC377A3C5CB677AEE5347B2BCD0BE605F302000A884E27B5E5CB16A433275FD2E1B934F1B5F81E058002A25A8440F9FF922439434FF44AB05CED5C4BE7569A17CC0BE60500E8B88058B9325D386B7CFA97BB8675583C642DBE27BED7566A05441584CAEF85B03363B7DD76DB406FF45A1F8FB2B7D2BC605E302F00C01A0B88356D8DB6955A01518D0A85C28742D05910DAD7F546AF06CBAF959D5BB9AB1E312F9817CC0B00D06E01D195ADD19D6DA5560C2820D6C2072BFDC11072AE0AA167842EEC7D0D0D0D77C560696FA579C1BC605EA0BAE64280AA2A202A2D1EB2A61850405428EEFD4A4B8FDD0D3A3B87A0F3542E977BBFB5BAF73FA70F7FF8C3C53D96BAC2BC605E302F503D732140D515109A02621DD839B465A15D547AECF20561060D1AF4F721E4CC29140ABB58A3FBEE732A054B17EE312F68E605AA602E045040680A88BF4DA4D9041AB7D22EE9EA849ACFE72F4A92E45A6B73757F4E981734F302C6584001A12920FA6A225DD3F7DB86CA7821996773B9DC87ADCDD5FB39615ED0CC0B1863010584A680E82DBBAE61C2CC5E6FF73C931026DF9B24C963215CE6ACC9D5FB39615ED0CC0B1863A1263435357D221496870F1932E4B6E6E6E6A70B85C26BA54BE1AF0CCFE796EEB9766C7C9FDE52402820AA6E225DD344D9E1D6DA102A4F8DEBB7B5B8BA3F27CC0B9A7901632CD59BA1424EBA39B459A12D2F65A815F182887595A14251B9F7D0A143A71D72C8212F8E1831E285A953A7A60B162C4857AC589146F171F1E2C5E9942953E65D70C1057F09C1737EE89C7BC2CF355B9414100A88756AE76E6E7D5DEDFD6190FB97B03E2F6E6E6EDECC5A5CBD9F13E605CDBC803196EACB50A18D2905C8B48BAD7F66A8F01FDB2284C93F1E79E491AF3CF4D043E95B6FBD9576550899330E3CF0C099E1774CCAE5729FB16829201410EB6C22DDA3829F5B1E27D4B0EEAE17D6E107423BD01A5CBD9F932E342F68E6058CB15457860AEDCE6E84C9F65AFFC9502D2D2D830E38E080D76EBBEDB6B7BB1328DBFACD6F7EF34048DD8BECBD544028206A62225DE5E777DC71C72BC3C036CE1451DD9FD300876C991734F302C658AA423E9F0FA553E392F290D8D4D4949E7DF6D9E9F8F1E3D3B973E7A62FBFFC723127BDFAEAABC5A340274F9E9C5E74D145E9A04183DA86CBE5359FA1860D1BD6F2831FFCE0F5993367A63DE1C9279F7CAAB9B9797EE898831410266F0544AF5BD3C509BAE4EFFEEEEFF60ADEDE7CF3CD0F324D54EFE7D483BF07F382790163AC3196B50B957B8430F86679A0BCEEBAEB8AA70C76C5B265CB8AEF8F3F571E306B36431D73CC3187066F74B503BA6AD1A2450B4BE1B26EF75C2A2014107D3891F6C8A13B215CEE6E42ADFECF6980ADEAE605CDBC803196751D2A1BCB43E5D1471F5DDC3B5989F873C71D775CDB70595B196AE8D0A1FF74F0C107BFD1537B2ADBDB73593A2CF6B30A084D01D1E3DA5E6CE05DA10D293D7647DB9F7311039F13E605F302C658632C1D289D53D97AF8EBF0E1C35B0F77AD543C4CF6CC33CF6C7B586CED64A8638E3966CEE8D1A3D3DE74F5D5578F8D27A32A20340544AF4CA47B944D88578696961EBB3AA176F47326549F13E605F302C658632CED285DF9B5754FE5DA86CAF270D966CF656D64A8534F3DF507C71E7BEC3B6FBCF146DADB060F1E3CA31E0F8955402820FA68221D50DACA9A96B5AE4CA8E51369D60697BDEE3C139F13E605F302C658632CAB86CABDCBCFA9ACF4F0D7CE0E8B2D3FE7B22632D409279CF06CBCA5485FB8EFBEFBEEADC7BD960A0805442FE868826B6F62EC6C426DEFFD57B4F37EE799F89C302F981730C61A63F95BB06CDD5B192FBCD31B6EB8E186DAD96B79E38D376E77F8E187BFB336B715E9AEE6E6E6A7E3F1C80A084D01B1D613E9AEDD9820DB9B50BB3A91B69D501D0AE473C2BC605EC0184BDD6A6A6AFA4476C19EB85771E9D2A5BD929BE2D562DBDC8AA47A33D425975C72E315575C91F6A533CE38239E6B796C7FD95211DABF2B201410BDBD0C5530A1AD6942EDEE445AFEF797D4DBD65A9F13E605F302C65863AC653293CFE70FCFC2DEB9E79EDBABD929DEE7B22C58566F863AF5D453E74E9D3AB54F83E5F8F1E3EF0B9D32BA3F2C7465C73C8F090BD8D714100A88DE5A86DA4CA45D9DC83A9A50DF5DE144DA762B71DD4CA83E27CC0BE6058CB1C658CB64D9EB3767EF99306142AF66A7C993279707CBEACD50471C71C4EB0B172EECD36019FE5E3C14765E7F5AE8CADA9DED6DDD50402820D676191A50F9791DED4DA87F5D8B89746DFF3DFD7A5DF739615E302F608CA5FF2F93E1EB59D96B3D7DD19EB6162C5850FEEFA8DE0C3564C8907756AC58D1A7C1F2B5D75E7B3E74CA8A7EBAD0B56EDD285FF814100A88B55C86D676AB687B13EADA4CA46D27D45DEB7082F139615E302F608C35C6D6E93219EF2D997DAFA76E31D2D9AD47CAFE0D2BAABAD3D685F877FBF34257BE7523EE3E574028202A5D86F6DE7BEFB1A549EFA2B5FC53EF6E67EBEC5F4BDF5F1B17957ED707EB7182C95A2E971BFB918F7CC4E7444DCC0B715928140A5D7EFFADB7DE9A6EB5D556DDFAFDE79F7FFE1ADF73ECB1C7169FDF74D34D69DCC89D7D3F5E5D51B0B4DE980BA9F2B1BCB5F55576CA5AD5765A4B4B4BDAD77B2CC3DF7BB33B1F567F687D5D40DC7DF7DDC5C1326EE1B8FDF6DBE3FD438B85C1EEBBEF9EC6CFBCA70B945A2B206A6DF9F9F6B7BF9DBEF7BDEF4DD7626B68675B69BB73E3E80EB7D2D6DB3ADD59F339695D6DEB3258EEB4D34EEDBE16C7E7EDB7DFBED8B2B963B3CD362BB6F83CB6ABAEBAAAF83BE6CF9F5FFC997BEFBDB7F8FDF2F77FF39BDF6C7DFF2DB7DC926EB9E596ABFD1BE2C503B3E723478E6C7D1EE709F382662ED46AA5D9635972C41147BCD1D7E7582E5AB468613F3EC7326BD3F2F9FC1E03070E7C4F7C5F5F07CB38485E78E185C505310B71D9F74F3CF1C4D6AFC367512C2EE2C41F03DE0E3BEC50FCF797170871B2DF70C30D5B7FA63F1410B5B80C9526AEE5037AE7BC924A26D47A3FC7D2E7444DCD0B6DC7E44D36D9A4C3D7E3DC316BD6AC74975D76592D58DE7CF3CDE9673FFBD9D57E5FF9581EBF3EFDF4D35BBF5E7FFDF55BE79EA79E7AAAF87BE27BBEF5AD6F15E783F8FC89279E68FDD9471F7DB4F878F1C517DB6369BD31C65295CB64787CD239966D9C75D6594BFBFAAAB093274F9ED9DFAE0ADBC90038A0AF0B8851A346B5EE218D03E5F1C71FDFFA7C9F7DF669B78088AFC53D9BD9FBB2ADD1313CC6C0F9C94F7E5201B18E97A1B65B45D76222BD6240FB57C2EBCE845AB75785F539518BF342DB3D927159DA60830D3A7D5F0C901FF8C007560B961B6FBCF16A73C9F2E5CBD371E3C6B56E608CBFFF80030E283E8FEF8D73497BE1B67C83E3A69B6EDA7AB44DDC381937623A14D67A638CA55A974957856D4718D4EFE8EBFB589E77DE7953FBCB7D2CCB3EE4294992ECDDC100D867054416D2E25EC301657B27E3F33BEFBCB31808E3F37BEEB967B5093E1600D9F3E9D3A7171FAFBFFEFAF4D9679F2D3E9F376F9E02621D2E43156C1D5DD3BDB9BA7AE3E8B6B61D5087F7EEF23951ABF342DB3665CA94E272F4A10F7D6895235ADAB6B84131B6B6C1F24B5FFA52BB1B29E3EF8C61B4ED9C12E79E8D36DAA8DDF7C70D8E0F3EF860F179FC7765DFBFE4924B9C6369BD31C652D5CBA4FB58B6E38F7FFC63EE88238E48DF7AEBAD3E0B962D2D2D0B42A76CD14F16BACEB6A8F57901B16CD9B262B88C13F436DB6C530C887142CF26ECD89E79E699E2C019F76CBEF4D24BADE13006BF389967C5C1800EF6582A20D6CD32D4CDADA45DBDE1737727D4EC10A4BDEB7082F1395193F34247E757C60D8CF1796787C366CF63988C2DBB904FFCB9B6A1347EEF1BDFF8C66A1B1C6320DD6BAFBD56D9001ACFB98FEFB9FCF2CBDB9D53EAFD1409EB8D3196EA5F269B9A9A3E11DE53BC6E4C789E2E5DBAB4577253ACED070D1A541E2CAB3B439D7AEAA9AF3DF4D0437D122A1F7EF8E1A5A143EEABB785B32F0B881826E3641E43630C7271F779B67731B678F853B6F730DB031907D1B807319BD4B3BD94718F657C3D9E6BA380A83A1D6DADEDEA44DADD0935FB7B26529F1335362FB43D0C369EEE908DC1E79C73CE2AEF89A730ECB6DB6EC5D6DEC57B4E3EF9E4F4A8A38E6A3DBAA5BBF3423CB77FF6ECD9AB1D29533E2F6447DF641707322F608CA51AC55B8F64812FEE88E90D37DC704379A89C54F59D72F5D5579F7BDC71C7F5C95ECB430E39E4A9F021342B207A776B746C93264D2A1611D956E7CE425CF9041F03665618C495245EBCA1EDE1AD0A88AA11B7D6B63D1467C880EEDF9BABBD09757037B60AE373A20682E580D29128D9D78F3CF2C82A1754CBC2676CE557145FD33996D9112BEDCD29F19CFAC71F7F7C8DA748C4B9203BAA2586DB384F7476A8AE7901632C55102CF7CE425FDC6BD9D317F189BF2FFEDEB27B68D646863AE9A4935E1E3D7A74AF86CADFFFFEF7CFC6BD95DD3CCC4101B116E75B965F4EBEB36019CFB58987CEC6731DE39ECEECFD718F657BEF574054DD845A7E1183F289B13B377CEEE8E7DCF8D9E7443F981706747001B7B80131BE16E6E6550E7FCD0266769BA86C8360DC4BD9DE38DFD1C6CAB62D1E05931D2973CD35D7ACB24134DBA33A7CF8F0D5AE626E5EC0184B350AD9E69E2CF81D7DF4D13D76EB91381EC71D7FE57B2B6B26438D1A35EA3F0E39E4907766CE9CD92BA1F2E9A79F7EABB9B9F9F990B43FAB80E8BD969D3FF9F9CF7FBE18D8CAB738C7EFEFBBEFBEADCF6388CCF626C61B5FC7C35F6310CD6E3F926DD9CE9EC70B022920AA56DB4381DE55DACADADDCBA6B7FDB95D4DA43E276A7B5E88175E8B174C8BE7D577F49EB8B1308EC36DFF4D7143637635EF78718AEE84D88EE685D8B20BCC959F6F5F7E2D80BE6E82A531D618CB5A04CB2D425B9205C058D7AE6DB88CA1F2CC33CF2C0F95CB6B2E4385C2FF8A78219FC58B17F768A88CBFEF80030E585A8F87C0AEAB2DD3E55B9CD7F49E18FCBAF37E0544CD4CA83DB1F5D715EF7C4EF4B37941132C8DB1C6587A563E9F6FCC2EE493EDB9ACF4B0D8F8736DF654A6359BA1468E1C794B0C973DB5E7F2E9A79F4E0F3AE8A01743879FA08030792B206A664275C3679F13E605F302C658632C5D1402604B79B88CE746C6530DE2555DBB7AF5D778A19EF2732A63ABF90CF5AB5FFDEA67210CBE13CFB95C9B0BFADC71C71D2B870C19F262EC680584024201D167D6F6901D87FCF89C302F981730C61A63E9A6B8E732B465E5C13006C5782AC18409138A7B23B3C364E3E1AE0B162C28DEBD61C48811F1768CAB04CA78F86BBFC950975F7EF976279D74D2F371576CBC6A5C77C40BB3849F7B71F0E0C1D3EAF59C4A058402A24A26D4EE6E657571029F13E605F302C658632C158AE75C96DF86A4C236A95F66A80B2FBCF0BF8317E2E1B1F1AA9ED3A64D4B172E5C583C172F8A8FF11CCA183EE3EEDEC30E3B6CC5C1071F3C3D26EC7ABCFAAB0242015145BA7B088F437E7C4E9817CC0B18638DB1F44CC0DCAF1430DFEC4EA0AC8B0C75EDB5D77EE5BCF3CEBBF6E4934F9E3574E8D0E5CDCDCD6F9776EFBE75E081072E0FC1F3A1D0CE8C29DDA2A4805040D4DC84BA6D68CB07B8E1B3CF09F382790163AC31961E13B2D22742C03C2A64A49B437B2AB4156541725E68A3433B56864201A180A805BB9626CA5D3B797D8989D4E78479C1BC8031D6184BEF2B85C9D4D19D28201410B5A8A3ADB50EF9F139615E302F0896C658632C7D249FCF7F2D3B3C364912E7F1A2805040F48B09D544EA73C2BCA00996C658632C7D1B2C47951D0A3B4D8FA0805040D4FA847A9189D4E7847941332F18638DB1F49D1024B76D7B319F10342D7F28201410352B1E76910E7019759F13E605CDBC608C35C6D297C172743B57829DE65C4B14100A885AF6415D501B9F539C7474837941332F608CA5E643E5B61DDD7A244912178D4201A180805E9F882CAFE605CDBC803196DA5FD6EEECE4FE9553F4100A080504287A302F981730C64267CB59877B2B9D6B89024201018A1ECC0BE6058CB1D095E56C7467A1D215625140282040D18379C1BC803116BA65D0A0417F1F96BD57F4040A080504287A302F981730C6424572B9DCFBC3B2B75C4FA080504080A207F3827901632C5464CF3DF7FC4092242FEB0914100A0850F4605E302F608C858A343535FD4358F65ED21328201410A0E8C1BC605EC0180B15C9E5721B8565EF453D81024201018A1ECC0BE6058CB150919696960FE6F3F9657A0205840202143D9817CC0B1863A1228542E14361D97B414FA080504080A207F3827901632C542497CB7D382C7B4BF5040A080504287A302F981730C64245060F1EFC91B0EC3DAF275040282040D18379C1BC8031162A9224C9C661D95BA2275040282040D18379C1BC8031162A92CBE53609CBDE623D81024201018A1ED6DAB871E38CC9D5D1568479E14D4BA43116FA4A92249B86656F919E4001A18000450F6B6DE2C4890B172F5E6C5C5EC76DC18205378679618625D2180B7D2597CB7D2C2C7B0BF5040A080504287A586BE3C78FDF6BC284092F3EF7DC73AF199FD7CD86C638278C1D3BF699D0F6B3441A63A1AF3437376F1696BD67F5040A080504287AE811613CDA63CC9831D3E29114F1307DAD4F5BECF319E60463AC5E601D2C771F0F6D819E4001A18000450F8031162A92CBE5FE312C7BF3F50475ABA1A161670330287A008CB150B9A6A6A64F84656F9E9EA09E07DF49A1BDA32740D103608C858A97BB4F8636574F50AF2BC0C038F8C69624C9BFEB1150F4001863A1FB72B9DCA7C2B2F78C9EA05E07DE7BCA82E5183D028A1E00632C745FA150D83C2C7B4FEB09EA4E0892BB66A1D25E4B50F400186361AD96BB2D427B4A4F508F0BFFA4B6C132B4D17A06143D00C658E89E5C2EB76558F6E6E809EA6DC0DDAF9D50596C8542E15FF510287A008CB1D075A186FE7458F666EB09EA6DC0FD4B47C13249921BF410287A008CB1D075B95CEE3361D99BA527A81B2138EEDD51A8CC5A3E9FFFA29E02450F803116BAA65028FC7358F666EA09EA46088D0FAF29588676B39E02450F803116BA5C636F1596BDBFEA09EA5692241B879560899E00450F8031162A93CBE5B60E75F5137A82BA3568D0A08F8601F8393D018A1E00632C542684CACF86656F869EA06E3537376F16568267F504287A008CB150997C3EFFB9B0EC3DAE27A85BB95CEE1FC34A305F4F80A207C0180B15D7D49F4F92E4313D413D0FBE9F0C6DAE9E00450F8031162A1342E517C2B2375D4F50B70A85C2E66125785A4F80A207C0180B9589B7EB8BF78AD713D4AD5C2EB7655809E6E80950F4001863A1324D4D4DFF12C2E5A37A82BA1556807F0A03F0937A02143D00C658A84C92245F0ACBDE9FF50475AB5028FC73580966EA0950F4001863A132F97CFECB61D97B444F50B7DCCC15143D00C65858EBE5EE2BA1FD494F50B7DC7307143D00C65858EB9A7A9BB0EC3DA427A85B2E8D0C8A1E00632CAC9D42A1F0D5B0EC3DA827A85BAE60058A1E00632CACF572B76D68D3F40475CB89C6A0E80130C6C25AD7D4DB8565EF013D413D0FBE4E3406450F803116D642A150F8B7B0ECFD514F50CF2B81E3C141D103608C85B55BEEB60F6DAA9EA06ED96D0F8A1E00632CAC754DFDB5B0EC4DD113D4FB4A60EB0A287A008CB150A124497608CBDEFD7A827A1E7CBF1EDA643D018A1E00632CA8A9A1224992FC7B580926E90950F4001863A1320D0D0DDF08CBDE7D7A827A5E09BE15C2E5BD7A02143D00C658A878B9FB666813F504F5BC120C0CED1E3D018A1E00632C54C6CE1AEA5E5801760A03F0383D018A1E00632C545C537F3B2C7B13F40475ABA1A161E7B0228CD113A0E80130C642C5CB9DA300A96FF97CFEBFC24AF0073D018A1E00632C54A6A1A161C72449C6EB09EA565801760D03F09D7A02143D00C658A8B8A6767A19F5AD50287C279FCFDFAE2740D103608C858A97BBFF086DAC9EA06E8550B947580946EB0950F4001863A132AE5B82C1B7B171CFD06ED513A0E80130C6426542A8FCCFB0ECDDAD27A8E79560EF7C3E3F4A4F80A207C0180B9571414CAC04F9FCF7C24A708B9E00450F8031162A532814760975F55D7A827A1E7CF70BED663D018A1E00632C54C69D16B01224494358096ED213A0E80130C64265DC6901C1320803F0F57A02143D00C658A878B9DB3DB4FFD513D4AD7C3EDF14B2E5757A02143D00C658A8B8A6760B3FEA7EF01D14DA483D018A1E00632C54264992EF8670799B9EA09E5782216100BE464F80A207C0180B152F77EE0D4F7DCBE7F3FB877079959E00450F8031162AAEA9F70ACBDEEFF504F53CF81E18DA157A02143D00C658A84C92247B8770394A4F50CF83EFC1A15DAE2740D103608C858A97BB7D42FB9D9EA06E254972483E9FBF544F80A207C0180B9509F5F4F7C2B2778B9EA09E57821F8495E0177A02143D00C658A84C9224FB86BAFAFFE909EA79F03D2CB49FE90950F4001863A1E2E56EBFD06ED613D4AD24498EC8E7F323F404287A008CB15099504FE7425DFD5B3D413DAF04478695E07FF404287A008CB150F172970FED463D413DAF043F0AED423D018A1E00632C54269FCF37264972839EA06E8515E098B0229CAF2740D103608C858A6BEA242C7BD7EB09EA560895C785F5E05C3D018A1E00632C54BCDC1542FB8D9EA09E83E509612538474F80A207C0180B15D7D44D49925CA727A8E7C177586867EA0950F4001863A1322154368765EFD77A827A1E7CFF3BB4D3F504287A008CB150F1723728B4917A82BA95CFE77F9224C9A97A02143D00C658A8B8A61E1C6AEA6BF504F53CF89E12DA703D018A1E00632C542684CA2161D9BB464F50CF83EF69A19DAC2740D103608C858A97BB96D0AED613D4AD2449CEC8E7F327E90950F4001863A132A19EDE3FD4D557E909EA79F03D2BAC0427EA0950F4001863A1E2E5EE80D0AED413D4F34A704E68C7EB0950F4001863A13249921C94CFE77FA527A8E795E0DCB0121CA72740D103608C858A97BB8343BB5C4F50B742A83C3F84CB63F404287A008CB150F1723734B4CBF404F5BC125C18DA8FF404287A008CB1509924490EC9E7F397EA09EA7925F89FB0121CA92740D103608C858A97BBEF87F64B3D41DD0AA17244089747E80950F4001863A1E29AFA0761D9FB859EA09E07DF9F8576989E00450F8031162A9324C9A1215CFE5C4F50CF83EF2FE216163D018A1E00632C54BCDC1D1677D8E809EA7925B82C5EC54A4F80A207C0180B95C9E7F3878765EF123D413DAF04BF8A3774D513D06B05CEE858E4ACA14DD353008225B52B5EB3245EBB444F50CF83EF95A11DA027A0D7D6B16D437BB3B3601926A23DF4148060494D2F773F0CED623D413DAF045787D6A227A057D7B33B3B099653060E1CF81EBD04205852BBE2EDFBE26DFCF404752BAC00D7861561B09E805E2D72B6ED28588675706F3D04205852F3CBDD8F42BB504F50CF2BC1AF4361DBAC27A0D7D7B5F6CEB59C666F25806049EDCBE7F347879AFA023D413D0FBEBF09ADA027A0D7D7B5D5CEB5746E25806049FF1042E531615E3F5F4F50CF2BC10D612568D413D0FBC2BA36CADE4A00C1927EB9DC1D1BDA797A827A5E096E0AE1B2414F409F04CBAF959D5BB9AB1E01102CE93773FC71616E3F574F50CF83EFCDA1EDA727A0CFD6B9E2B996F656020896F41F2154FE3884CB9FEA09EA79F0BD25AC04DFD31354BB344DDF3367CE9C9BA74E9DFAF6B871E3D23163C6687DDCC68E1D9B4E9C38F1F9D05CF00B102C61D5E5EEF8D0CED113D4AD78CE97DB1D500B62A89C346952BA78F1E2F4F5D75FD7D6515BB264497AEFBDF7BE1442A6231D00C112FE56539F106AEAB3F504F53CF8DE1ADA9E7A826A17F7540A9555132E5F1F3366CC0C4B252058C2FF09A1F2C4B0EC9DA527A8E7C177B45B1E500BE2E1AF425DF5B4102CDFB454028225B42E77C3423B534F50B742A8BCBD50287C474F50EDE2397E025D55054B851B2058C2DF6AEA93922439434F50CF2BC15D6E7B407F0A96AFBCB8309D33EDEAF4B1B1A7155B7C1EBF270C0A96806009BDB8DC9D1CDA697A827A5E09EE0EC1F23FF504FD21582E5FB6209DFE8793D33FDF7EDC2A2D7E2FBE26100A96806009BD219FCFFF24D4D4A7EA09EA79F01D1BDA7FE809FA43B09CF7D86DAB85CAACCD7F6CB4402858028225F4D672373CB453F404752B4992F10D0D0D3BEA09FA43B09C71CF4F3B0C96F1358150B004044BE8A5E5EE94182EF504F5BC124C08E1F2DB7A82FE102CA78F39A5C360195F1308054B40B084DE100F838D87C3EA09EA79F09D18DA37F50482A5265802822554BCDC9D162FE0A327A8E795E0BE8686866FE809FA43B08C5781ED2858C6D70442C112102CA19796BBD343FB6F3D413DAF04F72749B2839EA03F04CB59937FD661B08CAF098482252058426F88F7B08CF7B2D413D4F3E03B35B4EDF504FD21582E5DF0683AFDEEE1AB1F061BBE175F1308054B40B0845E5AEECE0C6D989EA09E578207F2F9FC767A82FE102C637BEAC191AB05CBF83D6150B004044BE8C5E5EEAC24494ED413D4F34AF060A150F8AA9EA05F04CB952BD359F7FF72F5C360C3F7E26B02A160090896D01B42A83C3B9FCF9FA027A8E7C1F74FA17D454F50EBC172F9B205E9CCC99774788E657C2DBE4728142C01C1127A61B93B27B4E3F504F5BC123C92CFE7BFAC27A8D960B97265BA70D6F8F42F770DEB3054662DBE27BED7DE4BC112102CA1272549726EA8A98FD313D4ADB0023CDAD4D4F42F7A825A0C966BDA4B69EFA560090896D047CBDD79A11DAB27A8E795607A92245FD013D462B0ECCA5ECACEF65E0A8882252058424FC8E7F3E7879AFA183D413D0FBE8F8715E1737A825A0C969586CAAC098882252058424F08A1F28250531FAD27A8E7C1F7AF6125D84A4F508BC152132C01044BAA64B9BB30B41FE909EA79259895CBE53EA327102C35C112102CA132F97CFEA224498ED213D4F3E03BBB50287C5A4F20586A82252058426542A8FC9F102E8FD413D4F3E0FB54685BE809044B4DB004044BA878B9BB38B41FEA09EA7925782697CB7D4A4F20586A822520584265F2F9FC8824498ED013D4F3E03BAFA9A9E9137A02C152132C01C1122A5EEE2E09E1F2703D413DAF040B42FBB89E40B0D4044B40B0848A97BB9F8576989EA09E578285B95CEE637A02C152132C01C1122A93CFE77F9E24C9A17A827A1E7C9F1B3468D047F50482A5265802822554BCDCFD32B4EFEB09EA7925589224C9C67A02C152132C01C1122A93CFE72F0D35F5217A827A1E7C97E672B90FEB09044B4DB004044BA878B9BB2CB4A17A827ADEBAB2ACA5A5E5837A02C152132C01C1122A5EEE2E0FED603D413DAF042F353535FD839E40B0D4044B40B084CAE4F3F95F254972909EA09E07DFE5B95CEEFD7A826A3070E0C0F7089682258060490D2E77578476A09EA09E578257BFFBDDEFFE9D9E605D4B92A4391603A1ED27580A9600822535B6DC5D19DA017A827A5E0956B6B4B4BC4F4FB0AEE472B9CF1C7BECB1F73DF9E4938B9E7FFEF9B1871F7EF88361B9BCA4ED722958D65EB00C9FE3B6F97C7E94A51C102CE9EF9224B92ACC79FBEB09EA79F07D63E8D0A1EBEB09FA5A3CEC75D0A0413FB9E5965B9E7FEBADB756A47FB3ECF6DB6FBFBBB9B9796A0C9D8265ED05CB1828431B1DDA9B0A3C40B0A44E96BBAB436BD113D4F34AF05628DED7D313F4A52449FEFDA73FFDE99C175E78E1F9B4032FBFFCF213279C70C282ECD058C1B2FA8365DB4099354B3C20585207CBDD35A1BE19A227A8E795E09DF0F02E3D415F88B7B639EAA8A3AEFBD39FFED461A06CE3CDBBEFBE7BC1C1071F7CE95D77DD25D05569B0CCE7F35F8B87BCB60D9482252058522F42A8BC36CC8583F504753DF8C67019DADBA5A2F08D78DE65682BE2857D427B25AC282FC7DB92C47B5E86C717427B3EB425A13D17DAA2D09E0D2DEE599A17DADCD09E09EDA9D0E684F66468B342FB6BF83D4F84C7C7C3E363E1F12FE1F73D1A1E1F098F0F87C787428BE7D63D10DA1F439B12DAFDA1DD17DAA4F033F786C709E1717C781C171EC784C7BBC3CFDE151EEF0C8FB787C7FF0D8FB785C75B4B45EEEFC2E3FF0B8F37877653683786767D68BF09EDD7A18D8C83403C74211E171FAFE6152F151D6F701B1E2F0D8FBF088F3F8FE7FB85C711E13DFF131E2F0A8F1784C7F3C3E3B9E1F1A7E1F1ECF09EB3C2E319E1F1F4F0786A783C25BCF693F07872783C293C0E0B8F2784C7E3C3E371E1F1D8F0787478FC51783C323CFE303C1E1E1E0F0B8F3F088FDF8F37D98DF7438A57188B2783C7E3F6E396B03868C50BDD84C7A6F09884C7C6F0D0101E73E171DFF0F8BDF0B87778DC2B3C7E373CEE512814BE131E770B8FBB84C7FF6A6868D839FCCEFF088F3B86C781E1F15BE1F19BE1F11BE1F1EB312884C7EDC3E376A5F3E4B6098F5F098F5F0EBFF34BE1F18BE1F10BE1F173E1F1B3E171ABF0BBFF393CFE5378FC742E97DB323C6E1E1E3FD5D4D4F489F0F88FCDCDCD5B5F76D965E98A152BDE4ABBE9E5975F7EE997BFFC653A77EE5CA1AE8A8265477B28DBB678BE6C5806368C170A1B3468D0DFC72B51EFB9E79E1F88B73A0ACF378A2D6E7408CBCC87C2F30F0F1E3CF82361B9DA383CDF24B6F0331F0D5F6F1A9E7F2C2C479B85DFF9F1B84CC5652BB6F0F527E3B21697B9F07C8BD2F2F7E9D8E232190FA92E2D9F5B85E75B9796D9CFC516BEFE7C6959FE62F85DFF525ABEBF1C5BF8997F2D2DF7DB84E75F2DAD0BDB85E7FF165B691DF95AF8991DE27A13D79FB8373EAE4BA5F5E95BE1EB6F97D6B11DC3F39DE27A575AF7760E5FFF675C1FE37A199EEF5A5A47BF135B78CFEE71DD8DEB7078BE67697DDE3BB6F0F53EA5F57CDFB847BFB4EE3784E7F9D84A6342129E174AE344BC30D6A0D84AE3C79078B8561C53E2D812C7987889FCD84A63CED0F0FC90380EC5F1283C3F34B6D2F87478787E4469CC3A323C3F2A8E63A5B1ECE8F0F531A5F1EDB8F0FCC7A531EF84D8C2D72796C6C23826FE77697CFC4969AC1C1EC7CDD2F8795A692C8D63EA99A5765669AC3DA734EE9E1B9E9F175B693CBE203CBFB03446FF4F787E711CB7638B6378683F2B8DE7BF08ED97718C2F8DF3F186E69797C6FE7845C72B4BF3C1D5A5764D699E1819E78DF0FCBAD21C12E792EBC3D73794E6969BC2F3DFC6F926CE3BA5B9E796D23C14E7A3DF97E6A6DB4AEBCCE8D29C15E7AE3B4AF3589CCFFE506A7797E6B9B1A5392FCE7DF7C479B03417C63971629C1F4BF3E4E4D29C797F69FE9C5A9A4BE39C3AAD34BF3E546A7F2ACDBB8F84F6E7D25CFC97529B5E9AA31F0F6D4669DEFE6B68334B6D56695E9F5D9AE3E35CFF7469DE7FA65403C45A607EA92E88F5C1C2525B54AA1B16976A88584B2C2DD5152F946A8C1763BD51AA3B96C71AA4D4623DF25AA9368935CAEBA57AE5CD527BAB54C7BC638316EBB0A68EE3C4203D41BD7BD729A79CF2EE78CE5B3CDF72B7DD76DB201682591198158059E197157D59B197157A5981575EDC65455D56D065855C56C465C55B56B865455B56AC65855A56A065C55956946505595688654558567C658557567465C5565668B529B00E2C1556C5A22A2BA8B2422A2BA2B2E2292B9CB282292B96B222292B90B2E2282B8AB282282B84B222282B7EB2C2272B78B262A74D919315385961532C6AB262262B64B222262B5EB2C2252B58B262A5AC48C90A94AC30C98A926231921522590192151F658547567094171B5991F1ECF0E1C397CD9B37EF9DEE06CB65CB96A523468C28160BD51A2E972C59120B99F4E69B6F4E5F7DF5D574F3CD374F77DA69A734AC2FC576EBADB7165F6FFB73F17BE79C734E875F5779B0EC6A5B512A0A5F2D1589CBB30D56A542F2C5B20D574BCB365E2D2EB56C23D6C2B20D59F34BCB56F906ADA7CB366ACD2EB56CE3D6CCB20D5C334ACB6EB6A16B7AD9C6AE3F9796F36CA3D79FCA367C4D2BDBF8F5C7D23A926D049B9C6D082BAD4B13B30D62A575ACB851AC1414C6661BC7E2FA986D202BADA3B7671BCA4AEB6E716359697D1E956D342BADE7C50D67A540936D3CBBB134261437A295C6895F970A9E6C63DA35651BD4AECC36AA95C2D5E5651BD77E996D602B85B29F651BDAE298956D6C8BE358692C2B6E742B8D6FC50D6FA531EFEC6C035C692C2C6E842B8D8FA7661BE3E2B8996D902B8DA5C58D72B195C6D8E2C6B9D2B85BDC40175B693C2E6EA82B8DD1C58D7571DC2E8DDDC58D76A5F1BCB8E12E8EF1A5F05CDC80571AFB5B37E2C57921B66C635E69BE286ED02BCD2149B661AF34B71437EE95E69B7DB38D7CA579A8B8A1AF34371537F6C516E7AC6CA35F691E2B6EF88B2DCE6FD906C0D29C57DC0818E7C1D25C58DC18589A1F8B1B04E39C195BB661B0349716370E96E6D76DB28D84A579B7B8A1B034177F31DB60589AA38B1B0D4BF37671C3616CA5F9BC7503629CEBB38D88B1C51A20DB9818EB82581FC40D42B1C57A21D60D716351AC21622D113724C5BA22B65863C48D4CB1DE887547DC00156B90D8623D12374EC5DA24D628E1F97B63BD12EB96D8E2293DB18E19E0082CD6ED1ECBEBE218A12700FA48C889EF993C79F25D2B57AE7CBB2BA1F2FEFBEF5F70E08107BEF2939FFC247DFAE9A7AB3A6C3DF0C003E9669B6D16F7CA1603E2E38F3F5E7CBCE4924B5A4363F6DEEDB6DBAE356C5E75D555E9C61B6F9C3EF8E083C5AF77DF7DF7D6D7E2EFA8F643614B05F0948E82A5A51E80FEAE743443414F00F4B11B6EB861BFD9B367BFD651A07CF6D967579E7EFAE98BE35E8AB825BBD62EDE1343E1C891238B8F03070E4C274D9AB44AB09C356B563A6AD4A8D660B9C30E3BA4A3478F4EAFBBEEBAD69FBFE9A69B6AEAE23D71AF4B698F9D600940BD05CB781459A22700D68178A8530857F7AF58B1E2CD2C50BEF1C61BEFFCFEF7BF9FB7FFFEFB0F89873865EFADE660397FFEFCE21EC60D37DCB01820B36078E9A597B606C7B8D7B23C58C6F79F7CF2C9AD0174BDF5D64B43902E06B6C9932717BF1FC3672DDE6EA4B4077392600940BD88A721C4C3E3F504C03A74DA69A7B5C4301582D4E2CB2FBFBCDDF313AA7D8F6576F8EB2DB7DCD21A2CE31EC9B67B31B3E74F3DF55471EF64FCDE17BFF8C562D08CDF5FBA7469F17B219CD5EC7D2CCB26D9B807738A251C80FEAE749E7B5E4F00AC63E57B276B3158B60D93F1F9F5D75F5F0C8CF1BCCB458B16AD122CB7DF7EFBF4F6DB6F2F7E2FEEF1DC6AABAD8A87C25E73CD35AD17028A2DFE5CAD064B00A8A360192FA4D8A02700AA5CAD04CBE9D3A7A72FBDF452EB61B0D91EC8F8FD2C58CE9B37AF78E5D8183AE3A1A2F171CB2DB74C0F3DF4D0E2F3B8D733BE77DCB87135BDC71200EA45E9EAFC393D012058F648B08C81F2B39FFD6CEBC57AE20578E2633CF475409BDB8DC4C367A74C99527CCCAE021B1FE3F996D9457C044B00A87EA5FBA6EFA7270004CB1E0996F150D6F818F748C6C7679E7926BDFBEEBB573BC7B2FC671E79E49162A08CF7BEAC95ABDE0A9600F037F1DEC2F11EB67A0240B05CEBB67CF9F2F489279E281EF65AFEFDECFE94F1DE95EDDDC73286D1E1C38717EF6579D2492715BF9F05D478BEA5600900D5ADB1B1F196102EBFA7270004CB3EBF8A6C2DFFFB054B00582558FE2EB47DF4048060A909960050917C3E3F2A4992BDF5048060A90996005091C6C6C65B43DB534F0008969A60090015C9E7F3B72549F25D3D0120586A82250054A4B1B1717408977BE80900C152132C01A0D260F9BFA1EDAE2700044B4DB004808AE4F3F9DB0B85C277F4048060A90996005091C6C6C63B42B8DC4D4F0008969A6009009506CB3B9324D9554F0008969A60090015C9E7F377150A855DF4048060A90996005091C6C6C63F8470F95F7A0240B0D4044B00A83458DE9D24C97FEA0900C152132C01A02221548E696868D8594F0008969A60090015696C6C1C17C2E54E7A0240B0D4044B00A8480895E31B1A1A76D4130082A526580240451A1B1BEF096DA09E00102C35C112002A0D96139224F9B69E00102C35C112002A1242E5BD0D0D0DDFD2130082A526580240451A1B1B2786F64D3D0120586A822500541A2C272549F2EF7A0240B0D4044B00A83458DED7D0D0F00D3D0120586A822500541A2C2787F6753D0120586A822500541A2CEF4F9264073D0120586A822500541A2CA7E4F3F9AFE90900C152132C01A0D2603935B4EDF5048060A90996005069B07C209FCF6FA72700AADCB871E304BAEA692B42B07CD3520900ADC1725A68DBEA09802A3771E2C4858B172F16EAAAA02D58B0E0C6102C67582A01A035583E582814BEAA2700AADCF8F1E3F79A3061C28BCF3DF7DC6BC2DDBADB531943E5D8B1639F096D3F4B2500B406CB87F2F9FC367A02A0068430B3C7983163A6C5C330E3397EB5D8468D1A95D6EABFBDD4EF33844A00582D58FE29B4AFE809007ADD73CF3DB7EF881123D230F16CA13700A0FFC8E7F30F170A857FD51300F4AA344DDFF7C20B2F2C0BD2A14387FEAF1E0180FEA3B1B1F191102EBFAC2700E855F3E6CDFB755A72FFFDF72F4892646FBD0200FD2658FE39CCED5FD21300F49A575E79E5CB6FBFFDF63B699933CF3C735E4B4BCB07F50E00D4BE7C3EFF685353D3BFE809007ACDA2458BE6A46DBCF8E28B8BC20474B1DE0180DAD7D8D8F897102EBFA82700E81573E7CE3D39EDC0A851A316B9993200F48B60393D49922FE809007A5CC88E1F5BB972E51B1D05CB77DE79E7F51FFDE8478F0E1C38F03D7A0B006A5708958FE572B9CFEB09007ADCFCF9F3A7A46B3067CE9C7961323A4A6F0140ED6A6C6C9C11E6F3CFEA09007ADCE4C993D7942BD3152B564C089351DAD2D2F23E3D0600B52984CA2772B9DCD67A02801EF7939FFCE4B0CE0E858DB972D8B06137D9630900B5ADB1B1F1AFF97C7E2B3D0140AFB8F1C61BFFDA51AA7CF2C9272F0D13D114E7580240CD07CB998542E19FF50400BD2297CB7D2604C815ED5CB8677A5353D374578505807E112C67C5395F4F00D06BCE3BEFBC4B42907CBB3C585E71C51557E6F3F98BF40E00F48B60F96498D7FF494F00D06BE2A1AE77DD75D7E22C54BEF8E28BD7C72D9B2D2D2D1FD43B00D02F82E5EC42A1F0693D0140AF3AFCF0C3775AB66CD9CAD0D2A143878E4D92646FBD0200FD2658CEC9E5725BEA09007ADD65975D76E7881123D27C3E3F4A6F0040BF0A964F85B6859E00A0D7C5435FE33D2B9DDC0F00FD2E583E5D281436D71300F4D5C493EA0500E877F3FB33B95CEE537A0200C11200A8747E9F1BDA27F5040082250050E9FC3E3F97CBFDA39E0040B004002A9DDF1784F6713D0180600900543ABF3FDBDCDCBC999E0040B004002A9DDF17E672B98FE90900044B00A0D2F97D5192249BEA0900044B00A0D2F9FDB94183067D544F002058020095CEEF8B73B9DC267A0200C11200A8747E5F9224C9C67A0200C11200A8747E7F7EF0E0C11FD1130008960040A5F3FBD25C2EF7613D0180600900543ABFBF5028143EA42700102C01808AE4F3F9652D2D2D1FD4130008960040A5F3FB4B4D4D4DFFA02700102C01808A2449F2F29E7BEEF9013D0180600900543ABF2FCFE572EFD7130008960040A5F3FB2B83060DFA7B3D0180600900543ABFBFFADDEF7EF7EFF4040082250050E9FCFE5A2E97DB504F002058020095CEEF2B5A5A5ADEA72700102C01804AE7F795BBEDB6DB067A0200C11200A8747E7F3D97CBBD574F002058020095CEEF6F0C1D3A747D3D0180600900543ABFBF3970E0C0F7E80900044B00A0D2F9FDED534E39E5DD7A0200C11200A8747E7F273CBC4B4F0020580200E677006A63E2D1344DD334ADFF35550E00000000000000000000000000000000000000000000000000000000000000B04EFD7F52A9DA10FF9FDF790000000049454E44AE426082, 1);
-INSERT INTO `act_ge_bytearray` VALUES ('247539', 1, 'var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('247541', 1, 'hist.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('247542', 1, 'hist.detail.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('247554', 1, 'var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('247556', 1, 'hist.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('247557', 1, 'hist.detail.var-userLeave', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302553', 1, '请假流程.bpmn20.xml', '302552', 0x3C3F786D6C2076657273696F6E3D27312E302720656E636F64696E673D275554462D38273F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274222F3E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D223062373632356665646161303565383566323832343836653163396339316239222061637469766974693A63616E64696461746547726F7570733D226533343665393633363834383463386661376632313763653535306130313836222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231222F3E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9222061637469766974693A61737369676E65653D223938623035316230333638316465363032383939336135643134616339336362222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4222F3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64222F3E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274222F3E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D226438313861633661383663663161363464323138346266303639396436376138222F3E0A2020202020203C6578636C7573697665476174657761792069643D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A2020202020203C656E644576656E742069643D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222F3E0A2020202020203C656E644576656E742069643D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D41323335414337362D354242452D344133382D383243342D31304545383141463834363522206E616D653D22E5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D44413934353339452D463639342D343041312D424534412D42434343314439424431314422206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D34454238313431392D314141372D343937452D413545452D4535414546313743354530422220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223137322E3130323038303930333236363038222077696474683D223431312E36303837323832303738373235362220783D223138342E37343130373732313432383638362220793D22312E34323130383534373135323032303034452D3134222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223230332E32353935393536373832393732352220793D2237312E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223237342E37343130373732313432383638362220793D2234362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222069643D2242504D4E53686170655F7369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431392E37343130373732313432383638362220793D2236362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222069643D2242504D4E53686170655F7369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223530342E37343130373732313432383638362220793D2237322E3035313034303435313633333036222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222069643D2242504D4E53686170655F7369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E303030303030303030303030303134222077696474683D2232382E302220783D223432352E37343130373732313432383638362220793D223133352E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222069643D2242504D4E456467655F7369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223435392E333632383732303836303831372220793D2238362E3432393234353537393833383138222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223530342E373431333631313932383236322220793D2238362E3134303231303631373337343835222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222069643D2242504D4E456467655F7369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337342E37343130373732313432383638362220793D2238362E3236373439303636383038333235222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223432302E31353431323036393235343737342220793D2238362E3436343038333932393839333932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222069643D2242504D4E456467655F7369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E303837373235313633333532342220793D223130352E3730343339323530323536373534222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433392E383533313635313630393039322220793D223133352E3030303434383731313033393938222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E32343236393939353539333433372220793D223232342E34363130303430343232343934222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223139332E34393435373938303736303230372220793D223137322E3130323038303930333236363038222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223137322E3130323038303930333236363038222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E3730333730333939383138333738222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223233332E32353935393536373832393732352220793D2238362E3035313034303435313633333034222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223237342E37343130373732313432383638362220793D2238362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E, 0);
-INSERT INTO `act_ge_bytearray` VALUES ('302554', 1, '请假流程.process_leave.png', '302552', 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D000062194944415478DAECDD097C54D5FDFF7F5CEBBFF5E752BF55DBAAB5D65A977EADD6B57611BFB5162B5AA424933B4920ECC862485804110822A8280209680111152C8A451414902433804650401417108CB2C85264515C5204BDFFF3B9B967B8339949662699C9CCDCD7D3C779CC649604CFDC39E7BCEF39F7DE162D80CC77FCB5D75E3BFBDC73CFFD5ADD3729140A8542698A72D65967FDF7861B6E582CFD0C5D2D0000191E2ACF38E38C8D37DD74D3772B57AE346B6A6A4C00001AEBE0C183E63BEFBC63B66BD7CE3CEDB4D33E215C020090C18E3BEEB87B6EBCF1C6830C81000089D2B66DDB43279D74D2787A5D00003237586E90994A00001265DDBA75E6F1C71FBF9D5E170080CCC5F257004042C9B2D816B5C75D0200804C0D960000241AC112000082250000044B0000D03CC1D21E48983939398CAA0080600900000896F10F26CE38E38C3A8FB76FDF3E103C8F39E618F3B2CB2E33DF7BEF3D465F0040B004000004CBE882A5F3B96FBFFDD6BCF3CE3BCD162CCD050082250000C8DC60F9AF7FFDCB3CFBECB3CDA38E3A2A30D328BA74E962DDBFFEFAEBCD03070E043DA70713BD7AF5322FB8E002EB7E595959D860D9AF5FBFC0FB9CBFE7D1471F0DFA9DBB76ED32FFF18F7F041EEBD3A78FF57AEDF3CF3F37F3F2F202CFCF9D3B37F09CBCF7C61B6F0C3C273F37F4FFD7D07300008225000004CBD806050DCE4ACE9E3DDBFAF98D37DE087A9F84C701030604FD8E9FFCE42781E72FBAE822F3EDB7DF0EFB3777EFDE5DE731B94C8A04C3D07F57B76EDDAC9FB76FDF6E85CAD090AB7F1E3D7A74C4E762F97F0700102C0100205846E9934F3E092C579599BB2D5BB6840D963ACC39836568E80CF7BE480391534F3DB5CE63575E7965E0E770BFF357BFFA55D8DF77CD35D70442626858ACEFFFAFBEE70000044B00000896718834DB27B392F7DC738F757FD5AA557566FB64D96AACC1F2C4134F0C3B7B2817DC9665AFA101512F83DDBB77AFF5FC934F3E19F6DF2925D2C98242FFFFA27D0E0040B004008060598F9B6EBA2910CC4E3FFD7473E6CC9981E72444EAE7E4184A67D8935B79AD7EACBABADA7ADC7956D82FBEF822E86FC9CFA1338BFA384A59FE7AEBADB7061E2F2C2CB496C53A67175BB66C59E7EF899D3B779A7FFDEB5F03CF2D5BB62CAAFFBFFA9E0300102C01002058020040B0040000044B0000C1120000102C0100044B000040B004008060090000C112000082250000205802000896000080600900205802000082250000044B000008960000102C010000C1120040B0040000044B0000C1120000102C0100044B000040B0040080600900000896000082250000205802000896000080600900205802000082250000044B000040B00400102C010000C1120040B0040000044B0000C1120000102C01002058020040B004008060090000089600008225000020580200089600008060090000C112000082250000044B000040B00400102C010000C1120040B0040000044B0000C19260090000C11200008225000020580200089600008060999E0EAAFFE67C38C79C5F35DF5C5CB1D82C2F2FA724B1489D2F5CBAD07C7FC3FB6C8C00C1120000102CD39384CA05CB169853374F35C7EF1D4F69863279EB64F365FFCBE6860D1BD82001822500002058A61F99A92454A646B8ACACAC648304089600008060997E642926C12E358A2C8D0540B004000004CBB42361865047B004089600008060898407CB29DBC79A152B869A2BCB075945EECB630442822540B0040000044B826514A1F24173F5A281E6DB2F0D082AF2983C4728245802044B000040B02458D65BE6BD35A24EA8D465FE5B77130A099600C1120000102C0996F5079EE5958323064B798E5048B00408960000806049B0ACB7AC5C7C47C46029CF110A099600C1120000102C0996044B822540B0040000044B243058960F8A1C2CD5738442822540B0040000044B8265BD65D9B2211183A53C4728245802044B000040B02458D65B6654DF67AE7AB9EE7258794C9E2314122C01822500002058122C1B0E3D2B86D50996F21881906009102C010000C19260D960E099B067BCB9E4D5BBEA044B794C9E2314122C01822500002058122C239629DB1F6CF0184B790DC1906009102C010000C1926059679672CE7BF7986B160E8C182A7591D7C86B99BD245802044B000040B0245846354BC9EC25C11220580200008225EA0D96D1CC52D6377B4948245836C6A64D9BA804102C010000C132DD8365BCA152174222C1325E23478EB406F9720B102C010000C1328D83258560D91CEEBFFF7EF388238E302FBDF452EB76D8B0617C4141B0040000044B82258560195BA8D46152662C8F3CF248C22508960000806049B0A4102C630F950D3D0E102C010000C1926049215806C8CC647DE1513FCF31972058020080B409969B376F3667CE9C698E1E3DDAECD3A78F59505060E6E4E498F9F9F966CF9E3DCDE1C3879B53A74E353FFEF86382258560D944A1B2A1D0C8CC6578D5D5D5E6B871E3ACB6292F2FCF340CC36AAFA4E4E6E69A3D7AF430C78C1963BD0E044B0000089649307FFE7CB3A4A4C4ECDBB7AF3979F26473C58A15E6B66DDBCC9A9A1AEB79B9DDB56B97B97AF56AF389279EB05E77C71D77984F3EF924C19242B06CC4F2D7686722637D7D269B356B96D9A54B9740888CA674EEDCD99C366D1A099260090000C13211366CD86005CA01030658A1F1D0A14351BFF7ADB7DE32EFBCF34E2B64AE5DBB9660492158C6182A639D81747BB85CBF7EBDD9B56BD798026568E9D8B1635AB757044B00009072C172EEDCB9D6523199AD8C2550865AB4689135D84BD7D94B8225C1321D42A5DB97C54E9F3E3D68A9AB5EEE7AEFBDF79A3E9FCFDCB2658BB97FFF7EEBB55F7DF595B5E2A2AAAACA5A2A2B4BF99DEF93DFC3EC25C11200008265138529398652662C9BC2A64D9BCC5EBD7A998F3EFA28C19242B08CA0A113F524FBF7A48BD9B367D70994722CB82CCF8FC6BE7DFBACD7CBFB9CBFE7E1871F2651122C01002058C66BCE9C3956A88C7650162DF97D72120D99592058520896E1C360532D6375CBCCA5B427CE30585C5C6CCD4EC643DE27CBFE9DBF8F994B8225000004CB387CF0C10766F7EEDD9B6CA632DCCC65A74E9DCC356BD6102C2904CB9010A843E5B7DF7E6B9D7C466E6311FABE4C3FE6528EA9742E7F95B352EBE5AEF19265B2A3468D0A5A169B4EED15C1120000A444B01C326488754C6522C9319772EC26C19242B0AC3BB328A1F0BCF3CEB306F2721B6DB88CF4BE4C0E97CE33BFCA4C656343A5335C3A672EE5843E044B8225000004CB283DFFFCF3D660EA9B6FBE49F820A5A8A8286D9698112C0996C90A953A2CD983F8A8C3A53354EAD2AD5BB73ACB6C336959AC5C52C4794C65BCCB5FEB5B16EB3CE6D2ED4B6209960000102CA376D75D775997144906399DFF6DB7DD46B0A4B83658460A7BE142627DE132DAD767DA3197CED94A39F14EA2C3ABDB672D09960000102CA3F2F1C71F5B27EC69CC65456225CB61E518A9E61E9C2E5EBC986049B04CE836142954465A9E1A6D588C3584A6CBB2D886EAB4BABA3A68B672CF9E3D09F977C8D9629D972269EEF68A60090000523E58CA6540927D2990C71E7BCC1C33664CB30E96F4805106B2959595044B826542B6A178C25D43A131D650E9FCFB471E79644ACF5C3654A772ED49FD9A44B721C9FC5B044B000090F6C1B2A4A4C45CB1624552072AB2EC562E3F920A03585DBA76ED5A67A6846049B06CEC3614EF72D448E1F1E0C1837185CA8696E1A64B9D4ABBA19F5BB2644942FF2D55555581BF2567CC265802000082653DE478C71D3B762475A022D7B5CCCBCB4BA901AC73A6440F64099604CBC66E43F184CAFAC2E5B1C71E1B77A86CECBF2715EA54DA0DFD58539FB427D4B66DDB027FCBEBF5122C010000C1B23EEDDBB7376B6A6A923A5091BF27D7884BC501AC73A6846049B06CEC3624A531212E5CB86C4CA88C75596EAAD5A9B334D5254622914B8F38FF1EC1120000102C1B18C8A5FA00B2B90AC132F582653A6C37BAB46DDBD61A94FFEA57BF6AD4774596BF86CE54CACFF278635C7AE9A5D6EF4AA73A4D76D02358122C010020584649CE7CC88CE5E1D2A1430773F6ECD9E6810307121A2C4BDE29317BCFEF1DF8593ED39B87DF1CF6B5BD5EE8653DFFD0AE87CC1E737A98577AAF34BB3DD3CDBCA8D545E655B95735E9BF4BFECEADA36E6DF0357F2EFCB375BFD3139DCC71BBC7051EEF30AD83EB672C9DDB5043678165C632B63A65C69260090000523458CA49299AE3184BB954402A0D609D61404BF48CA57C8EFD7CFDCC31DBC658F78B2B8B23BEAEEDBD6DAD60A9439C7EFC86FE37047E1EFDD168F3BC6BCFB342A704BC9F5FF973F3B27697593FEB30DA7E6A7BF398E38E09BCA7EFCB7D839E3FF1F413CD5F5CF30BEBBE942E4F75314F39FB943AFF1EEF246FE0BEFC4E7D5F82A65B8365B86D88632C6BF52DF599031F596A8E98FE5AC432FFB56AEB755D074D8858A71C6349B0040000291A2C070E1C98F4B3C22E5FBEBCD9CFB2A8078C050505D6C5D043C3402283E5909543ACC076FC8F8EB7C2DBD1DF3BDAFAF9F4F34FB702A4F3B55D67750DCC6CCAE7FE97E2BF04EEFFE6E6DFD4F9DD123EE53999D9D4AFCB7D24D7BA95F02881F3E4334E0E0A89CE30283FB71EDA3AF0F351C71C1508AF23DE1B61FD7BE535E7FEE15C2B50CAFDA16F0E0DBC77F0EB83ADDB760FB4734DB0AC6F1B8A778630D3CE0A2B81F1B197DE89EA753D4A1E0BAAD39D7BBF32074F5E6695821EFD382B2CC1120000A462B02C2B2B33A74E9D9AD481CAA449939AFDBA7091669792112C7BCEED6905B6D0C78F3BE138F3E2D617077ED6214D42A7737652EECBEF904028F70B1716D699519400A8EF4B9095DB82E905E6A80F4759F7477E30D27A7EECCEB1E6ED2FDD1E98A194E7AECEBFDABA2FC155C268B81954E78CE509A79E1058AE2BB39B320BEA8619CB68B6A178660A13751DCB279F7CB2D9AE632981F1AD8DFF3117BCFE719D59CA992FBF673DBF7EF3EEDA99CD092FD6A953FDFFD66D7019D7B12458020080540C96D5D5D5668F1E3DCC43870E256DA0D2B1634773FDFAF5293FA06AEE60294B64255CCA72D9332F39D30A88F21AF959BFE6EE75775B033F99D97C60C703817028C12F6B6C9675BFF38CCE11672C753894D7848652F977CADF0B172C65C672E02B0303CB79F5E3F237DDB214361E0DCD18461B1A630D973AD40E1A34A859FEBF75B03C70E06083AF1B3AEDD5C0CF4BDEDC6C963CF69A552484DEFEE03CD330BC56D893E5F47BF6EC49C8BF77DFBE7DD6F1E73A58A6437B45B0040000CD1A2C459F3E7DCCD5AB57276590F2C61B6F58C1321D243258CA67F8872E7FB0C29E3EBE511EBBAED7757596CDCA73121A25C8C971987A76512FA3D5B3877A06527E8FCC20EAB0A7672965C6529E1FF6F6B03A41F19CABCFA9336329C75B86CEA0CA497BE4354699113694BAE918CB78459AB98C352C46FBFAE60E953A30CEF6AD0FDC1FFCCF6541C7554E7B716DD860596307D1E232BF39C87E4FFBAE7D02816FE6CC9909F9F7CA325CFD37D2A5BD2258020080660F9632882A2C2C4CCAACA51CAB346DDA345707CBBB56DD65151DC66E1A7293755F02DF3D1BEEA913FAA41495175927EE9163281B0A71CE594709983A30CA6CE505D75F5067796BB4C1524E0E2467B36D11B2D4D6192CF5F2DDD0FF0F8265DD99CBD065A95DBA748979796BB870D9AD5BB7A867489B2B58FE7BC90741CFE9E32F438365B8F73B439FCC5A36F5497CE4F7C9EFD57F235DDA2B8225000068F660691DBBA406A32FBCF042420728322094BDFFD11E939689C1528E6D94B0274B5B5BDED6D29A89D4414C429B2C91BDA6C33575DE27814DCEF81AE9A43BCEF2FD93BE6FFD7E39D6517EBF7EBDCC58469A410D174AE5A43C3A00D7778CA5FCDBF4B25839C18F044DE7D96B0996F52F8BD527F47186C4584EC813E97DA97449918682E553E5EB1A0C96FD27F9AD194E6BD6B24BAF40F02B2E2E6EB24B8FC82546060C1810345B992EED15C1120000A444B0946388E44C8C1B366C48C8E0E4A38F3EB26601D6AC59933603AAA60E96F76FBD3F705911097F57E45C11F4BCF3B21DCEE327E56CB112D89CD7B094C72FF9FB2581FB1222F56CE2A9E79E6A2D7F9520AA2F3FD2C23EC652DF9713023534DB195A6419AD5E6A9B3F393F68465582A4DCDE38F8C63A9741215846BF2C5642A1ECE489F51222A1EF6BECF533131D2CFB4D5A12B414564EEA134BB01C5CF6A269E41E3E0672F8F0E18D0E97122A478D1A15F89D72ADDD746AAF08960000202582A5983E7DBAB51C4FAE33D99476EEDC699D0823DD969425F23A9672B21D1DCAE458CBDF77FA7D60F62FD27BA2990594E017CBEB63099652F4196A9D27EC719E4C285125538365B870998865B6A9162C9F5BB631E8B97FBEF076BDC1B272F516EBB223424268F1C425567BE5BC8EA8CC5CC6BB2C56DEE79CA964092CC11200008265234D9E3CD9ECD4A993F9C1071F34C9EFDBB871A3152A478F1E9D7603AA44064B0AC13211E1B2A9436A22826543AF0B0D96CF541C0EA4231F7F2D70FFAEA9AF5AED554E8E1174CCA59CD047CEEA1A0D799D2CD1771E5329251DDB2B8225000048A960A9672EF3F2F2CC7FFFFBDF8D3AA18F0CD8BC5EAF35F84B47044B8265323576F96AAA2D7F0D0D8C53E7BD1DF6B9CFBF3A600E7C64A9351329AF9BF8DCE1E5A79B77EEB71E7B7FD39EA06331777F5E1358F6DB7DD894A070A903A65C7B72C99225D66CA45E262BCB5DB76DDB6656555599A5A5A5D6F27FE7FB64F96BBAB657044B00009072C152C831975DBB76B5CEE2BA6AD5AA98DEBB62C50AEB782F39F1453A1FA344B024583657B88C75C631954ED41329583E5DB92EE2F3727D4B798D94D0F7C9352CAD1D5E0BDE09BC46CAE819CBCD11D3ABACFBABDF7EC75AC6EF0C89B196746FAF08960000202583A53663C60C6BC0267BF6EFBBEF3EF395575E313FF9E413B3A6A6C67AFEEBAFBF3677ECD861CD003CF8E08366FBF6EDAD019AECF54FF7B329122C0996E9B02C365597BF3607DD5EC51A2833A1BD2258020080940E965A7575B53976EC58B367CF9E758E4792E5AE32B3294BCF64A63353102C0996A91E2E9F7CF249EB7583060D2201B9BCBD2258020080B408966E44B02458A6C2B2D848CB5BF5D95F099520580200008225C19242B08C79E692E5AF20580200008225C19242B08C3B5C122A41B0040000044B822585601977B8BCF4D24B099520580200008225C19242B08C8F1C5329DF7D39010D40B0040000044B8225856019974D9B36112C41B0040000044B82258560D938044B102C010000C19260492158122C41B0040000044B8225856049B004C1120000102C41B02458122C0182250000044B102C0996044B80600900000896044B0AC1926009822500002058122C29044B8225089600008060098225C1926009102C01002058826049B0245802044B000040B02458520896044B102C010000C19260492158122C41B0040000044B102C0996044B8060090000C112044B8225C11220580200008225C19242B0245882600900000896044B0AC13211C1B262E52673C4F42ABBBC6695F9AF55078AF3B1BEA53EB3A8D41FF43BE4B1818F2C0DBC2E5CD1EF7D70D6CA7AFF3D2BDEDD6EBD6EE7DEAFF87008960000806089508B2B1613EA089629192C6B0E1C0CFB9C04BCFE939634F83BE4758FBDF44E54AF1B3AEDD5A0C724400E9EBCCC2ACE007AD7D4576BEF97F9AC9F41B0040000044B280B972D34A76E9E4AB06BE6327BD36CB3B2B2920DB281A5B095ABB758816EC99B9BA30A8C6F6DFC8FB9E0F58FEBCC52CE7CF93DEBF9F59B775BB7231F7FADCEFBBFFDF6DBC0EFF9E70B6F5BF73FDCBAD7FA79F11B9B825E03822500002058BADAC6EA8DE6CBFE970997CD1C2A2B2A2BCC0D1B36B8721BECDEBDBB1524EB2B1D3A74300F1C386885BA6897A4EA607920C2CC67A4194B09AD258FBD66153D3B59A45EA3672D6569AE5E8E2B3F1797F9694808960000806089EAEA6AD3E7F3594B3129C92F3253E9D65029962D5BD660B09C3D7B7660E650CF34F69FE437EF7BEAF57A03E36CDFFAC0FDC1FF0C5ED63AEDC5B56183A55E822B817190FD9ED019CF221536CBFEFD268D07C1120000102C01A48AAE5DBB460C95050505E6538BDFB102608D3D6B39755EEDD254098EF2F3FB9BF634182CFFBDE483A0E7F4F197E18EB10C7D7FB8E7E4F84B102C010000C112401ACC5A8E7A648E15E4F67D511308753A580A39DE511E7BE05F6FC4142C9F2A5FD760B0945951E719689D339EF7CE5CC10747B0040000044B00A924DCB19685E3CBCD810F2FA913F89CC152CC78F9DD3A3397A1C1B2DFA42541C1504EEA43B004C11200008225800C9DB5340CAF15DE463D32376CE00B0D96424ED453DF8CE573CB36063DA7CFF41A2958CA1968F549822484164F3C1C70E5ECB09FECFA920F8D60090000089600524D8F1E3D42CE047B206CB0D4A1B03EF51D2319FABAD060F94CC5E140AA2F45A2AF63293EFFEA8039EFD50FADC70898044B000040B0049042E40CB93A583EF7DC731183E023CFBF1555600C37B3A983E1C047965A3391F2BA89CFAD093CB779E7FEC0B25AE7B198BB3FAF09BAB6A5044A799FDC07C1120000102C01A4107DAC65B8D9CA5867229FAE5C17F179E7753143DF27D7B014D317BC13788D94D133965BD7B194FB124EE577481005C1120000102C013413B986EAB871E3CC9E3D7B9A797979A661188119CBDCDC5C6B69EC983163ACD701044B000040B00410306BD62CB34B972E112F3112AE74EEDCD99C366D1A9507822500002058026EB67EFD7AB36BD7AE3105CAD0D2B1634773EDDAB5542608960000806009B8CDF4E9D38396BAEAE5AEF7DE7BAFE9F3F9CC2D5BB698FBF7D71EAFF8D5575F99DBB66D33ABAAAAACA5B2F9F9F941EF93DFC3EC2508960000806009B8C8ECD9B3EB04CA9933679ABB76ED8AEAFDFBF6EDB35E2FEF73FE9E871F7E98CA05C1120000102C0137CC543AC3607171B1353B190F79DF800103827E1F33972058020000822590C1E4984AE7F2D7E1C3870796BBC64B96C98E1A352A6859EC9A356BA86C102C010000C112C844CE33BFCA4C656343A5335C3A672EE5843E00C1120000102C810C239714711E5319EFF2D748E4F7398FB964492C0896000080600964F06CA59C7827D1E195594B102C010000C112C820D5D5D541B3957BF6EC49C8DF91B3C53A2F4522C77402044B000040B00432805C7B5287BD3163C664CCDF02C1120000102C012449CF9E3D03616FC9922509FD5B55555581BFD5BD7B772A1F044B000040B00432415E5E5E20EC35F5497B426DDBB62DF0B7BC5E2F950F8225000020580299C079EDCAA6BAC4482472E911FDB7A400044B000040B0043240B2831EC112044B000040B00498B164C612044B000040B0047018C75882600900000896001A85B3C282600900000896001A85EB5882600900000896001AA5BABA3A10F6727373CD3D7BF624E4EFECDBB7CFCCCFCF0FFCADF5EBD753F9205802000082259029BA74E912087C3367CE4CC8DF98356B56E06F74ECD8914A07C1120000102C814CE20C7D326BD9D427F191DF27BF57FF8D69D3A651E92058020000822590693A77EE1C087EC5C5C54D76E911B9C4C880010382662B0F1C3840858360090000089640A691631E9DD7B41C3E7C78A3C3A584CA51A346057EA7FCFE356BD650D92058020000822590A9A64F9F1E08817AE632DE65B1F23EE74C254B6041B0040000044BC025264F9E1C1406E5D84839A18F9CD5351AF23A3966D3794CA594D1A34753B920580200008225E0D6994B1D30E5DA934B962CB16623F5325959EEBA6DDB36B3AAAACA2C2D2D350B0A0A82DE27CB5F25AC02044B000040B0045C468EB9745E86249E2227EAE1984A102C010000C11270B9193366C41C302550CA2C25677F05C1120000102C01045457579B63C78E357BF6EC59E7F849AFD76B76EFDEDD5A2A2B339D00C1120000102C0100044B000040B00400102C010000C1120000822500006E0A963535358C7800000973F0E0418225000099EC88238E78F7F5D75FFF8A610F002051DE7FFFFDFF1E75D4511FD1EB020090B94A2EBCF0C2F719F6000012E5D24B2F7D57F537F7D2E5020090B98E5765E5CF7EF6B355555555DB65B91200008D25FDC9DAB56B3FF9F5AF7FBD46F533EBECFE0600006478B82CB13B7E9342A1345CE41A90D40385527F39E288233E54B70F102A01000050AFACACACE355C87A4095831E8FE72B757BBB1BFEBFED6009000000008857CB962D8F360CA3AF0A585B2564D9658F7AEA08822500000000A0A150D54E95771C815297675C5407044B0000000088555656D6B92A50CD0F132875E94FB00400000000846518469E1C47594FA8945240B00400000000D417A66409ECC79182A5C7E3B99A600900000000A8574141C1499196C3CA1962099600000000806883D50C550E3882658DCBFEFF099600000000102FFB243E9FCAD257C330CAED60B99260090000000068504949C9912A542D53E576FD980A98EAC79CE9044B00000000408354882C9460A9EE1EE17CBC65CB9647132C0100000000F5722C81FD85DBEB82600900000000310AB70496600900000000885AA425B0044B00000000408358024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B000000348112B3E4E899EB673E3BEFB579DF2EAE586C969797539258A4CE172E59B87BB17F711E5B6392B77D96C0122C41BF40BF000040D390C1C382650BCCA99BA79AE3F78EA7344399BC75B2B968C9A2CF2B2A2ADAB145264FE812D8BEA53EB3B0D4B7BC7082EFA948A56F99BF8DF5BA09BE87EAFBDD85E37D57C9EBFA942EFB11C112F40B14FA050040C6933DD20C1E9ABF4CD932E5407979F93AB6C8E408B704D60E960DCE5ECAEB5479DEF99804C8BE65BEA5529C01B46FA97F817DFF4B553E2358827E8142BF0000C848B2E4860E3C358A1A401C648B4CBC484B60AD6039BEE2E2C289FED6A1B39445137CDDE4F9E28915E7C96DD184CA19E17EEFE180EABF43EE178DAB38A7F6F5FE56CED7102C41BF40A15F00006414399E83CE3B6506100CD49320D2596075B02C29997D6C7DEF0F9DB12C9E50715D51A97FB6147B76727F51A96F6F60D96C59E52CEB7E6016D3B7956009FA050AFD0200C095038829DBC79A152B869A2BCB075945EECB6374FC0C20D2497D6781B542DF84CA7C4778F4072F6BADEC1B2E58964CF71F673FBE4D05CAAA70C7651696FA76A8E0393293EA926049BF40BF40BF0000404C038829DB1F34572F1A68BEFDD280A0228FC97374FE0C20D241436781AD1B2C2B0DE773FAF8CB70C75886BE3FCC739FC9F197044BD02F50E8170000AE1D40CC7B6B449DC1832EF3DFBA9BCE9F01445A88B40436EA6059E6EFDC60B02CAD5C6BCD50863993AC0A96930996A05FA0D02F00005C3B80585E3938E200429EA3F3670091EAEA5B021B3958FAD6075D6264A2BF35C1926049BF40BF40BF0000409C0388958BEF88388090E7E8FC1940A4B28696C0460A9685657E8FF3397DA6D748C1B2A8D47FBDBE6EA584501524AB03CFC9D961C72DFB31C112F40B14FA050000030806100C20D250434B60C305CB065F17122C8B26F83BE8E7F4A548F4752CE57ECF49FEE3D5CF6DADC7322460122CE917E817E8170000886D00513E28F200423D47E7CF00225545B304362458F60FF79C04C3A252DF2A6B26D25AD6EA1FAE9F2B9EB4F44C79AC5F99FF7CE7B198B73DFCCAC9CE6B5B4AA094F7C9FD340C91F32548365056B2C5D12FD02FD02F00001840442CCB960D89388090E7E8FC1940A4A26897C03A8365515965C7C8BF6FF6B1F66CA559E77DA5FED972BFB0B4B2B77E8D7526D8D2CAA9D6752CD5CF124EE57748104DC36079B92A07EB0B962ABCB766ABA35FA05FA05F0000308088586654DF67AE7AB9EEB227794C9EA3F36700918AA25D028BA8C3E5C27A82E5F2962D5B1E4D2DD12FD02FD02F00001840D4DFB9AD18566700218FD1F133804845B12C8145D4C1F2F248C1D2308C36D410FD02FD02FD0200800144BD65C29EF1E69257EFAA338090C7E4393A7F0610A924D625B088295C863BD67225B395F40BF40BF40B00000610F5766A53B63FD8E0B134F21A06000C2052054B60131A2CEB1C6BC9B195F40BF40BF40B0000441C40C81EE739EFDD63AE593830E2E04117798DBC96BDD40C209A1B4B609312DCE7325B49BF40BF40BF00004083038886F646B3979A01442A62096CD282E5D58E632B5B5123F40BF40BF40B0000841D4044B337BABEBDD40C06184034C2498D083C2C814D92ECECEC45122C99ADA45FA05FA05F406AF585009052038878070FBA30186000112799FD32EDDB98B00436B99FD30F7FF8436BC692AAA05FA05FA05F40EAF48500907203080A03886670BD2AFB541967DF467D421896C036CFE764074B4EDC43BF40A15F400AF48500C00082C200E27047AA3B50D94BFB69B41D2A4B60D3E37302FD02857E01B4B100184050184024AB236DE8F1202C814D8FCF09F40B14FA05D0C60260004161009128AD1AE830F5F3618F3361096C7A7C4EA05FA0D02F803616480BB9B9B967783C9EDE1D3A7498979797B7C9EBF57E6D9F0AFFBFEAFE16FB9A6BFDE575D4160308061029D79136D45146DC5BCB12D8F4F89C40BF40A15F006D2C523743A9B1D4B3AA6C54E50B3B43D5A8F2B1AB329461186DBA75EBB6B27BF7EE9F959696EE5DB16285B96DDB36B3A6A6C61472BB6BD72E73F9F2E55BC78E1DFB8E0A9E9FA8CAF1ABF7E5B12931806000D1ACAE8F71EF6B9DD7B304363D3E27D02F50E817401B8BD4CB50AA94DB01D28CB264668652FF6367AB30F97A6161E197AB57AF360F1D3A64464B85CC759D3B77DEA07EC72B323065D36200C100A2D93AD2D671BCEF0BE95059029B1E9F135548BF40A15F006D2C522B43A9B230863019AE644E862A2828C8EFD4A9D3D7F3E6CDFB36964019EAA9A79E7A43A5EE9DCC5E3280600091161D69D0FBAFBDF6DA292C814DFDCFA9054BB6E81728F40BA08D454AF0783C39B2D2CB1912737373CD7BEFBDD7F4F97CE6962D5BCCFDFBF75B39E9ABAFBEB2568156555599E3C68D33F3F3F343C3E517699FA1EEBCF3CE82DB6EBBEDC0860D1BCCA6F0E1871F7E9C9797F789AA982E0C20E8BC1940245C43272788CAF7BFFFFDBFDF72CB2DDF9E75D6595DE92652F7736AC2DF03FA05FA05D0C6D2C6A271A1B2B50A83079D8172E6CC99D62183D1D8B76F9FF57A799F3360A66D86EAD7AF5F4FE59B682B205A3B77EEDC61874BD7CE5C3280600091C48EB44996EEA87079131D6AEA7F4E2DD8AB4EBF40A15F006D2C9A3B54E63843657171B1353B190F79DF80010342C3657A65A86EDDBAFDA26BD7AEDF34D54C65B8994B7B59ECF90C20280C209A5CE8C90664F96A8716B12F630D7D1F2731E07302FD02FD026863696311817D4C6560F9EBF0E1C303CB5DE325CB64478D1A15BA2C367D3254BF7EFD3E9A3F7FBE9948D3A74FAF908351194050184024A4236DEDE810A7A962DAB7D176A891DE4787CAE704FA05FA05D0C6D2C6220CFBCCAF8199CAC6864A67B80C99B94C8F0C3562C488DBFAF7EFFFDD37DF7C63265AFBF6EDD7B971492C0308061049EA485BD87B594D4789A6437576A4BAB4773CCF71267C4EA05FA05F006D2C6D2C8243651BE73195F12E7FAD6F59ACF398CBB4C85083060DDA2E97144986575F7D75A91B672D194030804880481D5CB88EB1BE0E35DCEB1F0DF37A8E33E17302FD02FD026863696371385806662BE5C43B89306BD6ACF499B57CFAE9A7AFE8DDBBF7778DB9AC48ACF2F2F236C97A6406101406108DEE485BC5D04186EB50A3ED48433B549602F139817E817E01B4B170ADDCDCDC33F4097B645671CF9E3D09C94D72B6D8904B91A46E862A2B2B7BFAD1471F3593E99E7BEE91632DFB67CA9E0A55FEC000820144A2B7A1383AB4863AD4583B52E7DFFFD46D7B6BF99C40BF40BF00DA58DA58B649CDE3F1F4D6616FCC983109CD4E729D4B47B04CDD0C3562C4882D2B56AC486AB0F4F97CAFAA4A999F091B9D63CD73B9DAC0AE6600C1002251DB5048471A6D4716A9433D32CE8E34742FB16B3A543E27D02FD02F80369636966DD2F1FCB3FA354B962C496876AAAAAA7206CBD4CD507DFAF439B063C78EA4064BF5F76429ECD64CDAE81C6561B8BD1B0C20184034761B6A11FF711DE13AD40F1AD19136F6DF93D1DF753E27D02FD02F80361699BF4DAA9F37EAE79AFAA43DA1B66DDBE6FC77A46E86EAD0A1C377353535490D965F7FFDF56E55293519BAD105F66E38373E06100C201AB90D3576AF68B80EB5311D696887DACA851D0C9F13E817E817401B4B1BEBD26D52AE2DA91F6BAA4B8CD477E911C7BFA126A52BAD39C8DFCDE48DCEB97743A6CF1940308088771B6AD3A64D85DDE98D6BE49F3A32CCDED90FECC71B639CFDBB4E726307A34B565656C529A79CC2E784B4E817645BB83CFBF2A85FDFED996EE6A9E79E1AD3EFBF75D4AD0DBEE6CF857FB6EE777AA293396EF7B8C0E31DA6752058F2BDA12F44AAB7E58192ACECA44BCA565A41418199EC194BF5F70EC6F261654249F600A2D70BBDACC6F2A15D0F993DE6F430AFF45E690D0C2E6A75917955EE554D3E4049B70144BA6D3FD75E7BAD79ECB1C79A8DD81B5ADF5EDA582E1C1D712FADDBBED3F5153E274AB4A53983E579D79E17F639699FCFBEFC6CABE8BEE3C4D34FB48ADC9792FB48AEF53BEED9708FF59EBE2FF7B51E77BEFE17D7FC22F0FA2E4F75314F39FB943AFF06EF246FE07EFBA9ED03F7A59FA05FA0D01752D2A5306369EBD3A7CF37C93EC672E7CE9D3B32F8184B5D567A3C9ED62D5BB63C5A5E97EC60298D64DB7BDB5AC1528738FDF80DFD6F08FC3CFAA3D1D6E0423A7E09783FBFF2E7E665ED2E0B1A2048677FCC71C704DE9309038874DC86EC8EEB8B168939AE249E0ED5EDC758F23921ADFA85D036F9F81F1D1FF179E93B86BD3DCCBCE0FA0BEA04CBCE333A9BA79D775A9DDFE76CCBE5E7D6435B077E3EEA98A3027DCF88F74658BF475E73EE1FCEB5FA03B93FF4CDA181F70E7E7DB075DBEE8176CC58F2BDA18D454A6E93EAF6438EB10C317AF4E83DC93E2B6C5555D5864C3B2B6C3D0D608B640F20BACEEA6AF69EDF3BD041FFA5F82F81FBBFB9F937610710F29CCC6CEAD7E9BDD1121E25709E7CC6C90C209A791B0ADD2BDA888EF4D116E1CF84174B879AB267C22B2AADBCA1B0AC72965526F89E92D2B7CCDF4697A0C74A7DA62AFF71BE5F1E2B2CF52DD7AFD3A5FBD029A62E1D7A0E92F799A5CFAD7DBEBECFE9AABFB62F94D7F5295DF6233EA7C488F479398BFEACD5FD87EAFB5D85E37D5745F979A55DBF103A2329DBD2D1DF3BBADED74980FCDEF1DFAB132C7F70CA0FEAF42563778E356F7FE9F6C00E46F9FD57E75F6DDD97D74A5F122EDC3A77389E70EA0981D536B273527662B214D6D58378FA42DAE5266B9713B14D7256D8301E7DF4D105C9BE8EE5030F3CB02253AE63E9F890971B86D126420398B401840E69326BD8C2313B29F77BCEED690542B95FB8B0B04E072F03007D7FC8CA21D66DC1F40273D487A3ACFB233F18C900A219B7A138F68E36746DAE682F1C1DEAF216297CEDAE92E9FEE3227574AABC1B6587787B439F93FDFB9E77BE463ABEBE65BEA5523A0EFF57E52F2FB9F6CBDAD7F917D89DA8FCFC199F53930F606E8FE675F57D5EC13B1BEAFDBCD2AE5F082DFD7CFDACEDE8FB277D3F68454B68911D8A524283E54F7FFDD3B03B29E5774A180DED53A4EF39EE84E3C2BE5E76380E7C65A0755FFE5DFAF1ACB1591C63E9DE60495F48BBDCE4ED7222B649AE6319C6EBAFBF9ED5A74F1FF3D0A143490B96050505DB54A59C9D210D617D7BD4923E8018B36D8C152EA5833EF39233AD80281DBAEEB0A5DCBDEE6EABE19499CD07763C10088712FCA433D783831611662C194034CF3614E35ED2682FF81C6B87AA9720B549A7EF6951A9FF7AE9988A27545C17558738BEE2E2C289FED6417B58873CB87196AF7AA2F57B26569C27B745132A67D409B6252547EADFD3EEF6095297FBCEBBA46597DAD7FB5B395FC3E7D4440398309F970C408A26F8BAC5F2791596FAEFB0B6977115E744F8BCD2B25F88747CA5EC6094FBF52D87D5F7254C4AD127F291F785865279EC9CABCFA9B3C35102E9C5AD2F0EDA012AC7DCCB6B8C32236C9FE2F643245C1A2CE90B699713D62E27629BCCCDCD3D43BDC63A6F8CBA6FEED9B32721B969DFBE7D667E7EBE3358A676861A3162C4D7AB57AF4E4AA85CB366CD1E5521AFBAED4B96CC01848449E9CC25344A902BAE2C0ECC2E4A91E54F7AF650CF404A232A3388BA53D7B394326329CFCBB1360C20524EA4BDB5D176A4B176A8FAEFA555475A5232FB587BAF68544B69748728EF8B654FAB84561560674BB1F7AAEE2F2AF5EDBD216FD070796DC1F0994B034B726BDFBB95CFA9E906304DF5790596679555CE0AF379A56DBF10BA0C560E77D06DF02D77DF12F41A3984E1C21B2EB44AB893F7B4BAA395795DAFEB02AB5B62ED17E4D8FE92774AEAAC9471F60B7AF58D3E3910FD02E80B699793D12EC74A2E3DA203DFCC993313929D66CD9AE50C95AFA4FC06307DFAF43103060C48CAAC65F7EEDD3F561F421EC132B17BA3A5149517598308BDD7B9BE10E7ECE02560EA8181CC56CAC91B4297B732804819B2E72E74294E8716B15F9B2B5C87DA3E86BDC2A9DDC195FAEF08EC212DAB7C5FDD7FB8DE8E6E4265BEA3D3F3072FC7A9EC1BAE43D44B70D563DB544758E5DC4BDB71D853BE5F5E7AEDE7BDC72EDAAB3ACC917C4E4DFBF936F5E7A5DF5F58EADBE1F8BCD2BA5F70B6DDCEF67CD0F241412754D3E1538AF38CE20D1D63A957AC84EB53E498FABB56DDD5E02112D217E8552D126EA59FA86FA92EFD02E80B6997532058B6D1A14F662D9BFA243EF2FBE4F73AAEA1991E196AC89021FBE7CF9F9FD050F9FCF3CF6F97D9CA189739102C1B71BCA5F374F2F5054B39D64696CECAB18E32D3A95F2F3396E15ECF0022E53A54E7490C9C1D632C177C8EF4BEB4BDF07351596547E9B8A4B3B23B3AEBB804E9F0E4E77E65FEF31BEE102B8DE0905A7BDC48B8634342DF1FFA39DD36E6C5EFBA8F7EEE1D3EA7440E609AECF392E73E93E37C32A55F6811E1046EB203519EFBE59F7E19B4FC55074C7D9928BD43506629C3B5F391765686165905A357CAE44FCE0FDA21AA67546F1C7C639DB398D32F80BE907639D1ED723C54B6F1EBE0575C5CDC64971E914B8CC8C49F73B6326D32D4DCB973FFDCBD7BF7EF366CD8909050B969D3A643797979BB55D23EDF8D5FB2640D20F4F193A79F7FBA15D89C7B9CE5F14BFE7E49E0BE84483D9B2817BE96E5AF1244F5E547F49E6D7D5F4E08C4002265852E053AC2DECB1AEB69D343DFD72A5D3B52E9C86A97BF2E38C1D151050E7897E334ECC7C6C7D42196F93B37D8219656AE759E81D6B9A7F62FDE0107F89C92388069E4E7A5063093D3BD5F9013AFC909D3E4B8FA48AF919D85D20EEB338AEB223B1AF5D9BCDBDCD326A6101BA95F90A24F30E73CDEDE792E80641782257D216D2CED722382E5D9AA7CAA03E0F0E1C31B1D2E25548E1A35CA192ABF48BB0CF5F8E38F3F2A27F2D9B56B5793864AF97D9D3A75DAE3C625B0CDB567DAB9C7B9A1D748F08BE5F50C20D2A6436D8ABDBF6979C63B396B5C51A96F55988E2EE84C6A4565953D42672EC32CE1591F746AF489FED68DE9103B0C7DF2453EA7440E609AF6F3CA8460492158BA3C5CD2C6D22E279CC7E3C9D127F2D13397F12E8B95F785CC549A699BA19E7CF2C939122E9B6AE672D3A64D66972E5D3E53153EC8CD5F3206100C20D2AC434DCB0B3EEB13F5C812D8081D5D9D5374CB0906EAEB100BCBFC9EA03DADF619EA22758872065A7D9220E93C5507581D784ECE6A376ED98FDDFE3925720093A0CF8B7E817E01F4857041BBDC182A001638C3A51C1B2927F491B3BA467BF65739518FF3984A29699FA1A64E9D3A5185C1EFE498CBC69CD067C18205FFEDD0A1C36752D16EFF923180600091448D5DB293914B7E9C9D59B41D6283AF0BE9108B26F83BE8E7F429D4F5F5B7E47ECF49FEE3D5CF6DE5B19F9D7FA597CFA969073089FCBC123190A15FA05F007D21ED726AB5CB8D253397AAEC730643098A729DCB254B9658B3917A99AC2C77DDB66D9B59555565969696CAE5188302A52C7FCD980C3565CA942B860C19B25BA662DF7AEBAD9802E5DAB56B650AF7B3F6EDDBAF74EB31950C201840A448871AEB5ED68C3D39416D47E71B1C658718F6E2C3D2A1C9125B6B0FAAB51CC73F5C3F573C69E9997A59ADF31892DB1E7EE564E735B9A42394F7C97D3EA7261BC024EBF3A25FA05F007D2132B85D6E0A72CCA5F332247196573232433DF4D04377297B6579ECA38F3E6AAE5CB9D2DCB16387595353638548B9956328257CCA746FAF5EBD6ABA76EDFAAE246C379EFD95010403881412EB129E8C5EF213CB1ED4704B6935E77531EBBCAFD43F5BEE179656F6D6AFB1CE60575A39D5BAFE96FA593A55F91DD281F23935CDE79AE4CF8B7E817E01F485C8D076B98903663B3B601E8C2550BA22433DF1C413973EF0C0034F0C1D3A7463B76EDDBEC8CBCBFBD69EDE3DD4B973E72F54F05CADCA2849E97CA51840308048BB0EF57255BE68C1059FF99C40BF40BF00DA58DA5834199595CE5001B3AFCA48CFAAF2B12A358E20B95595F9AAF42743810104038874D0CAEE285BD5F3FCA774A47C4EA05FA05F006D2C6D2C12CF0E9326AB3BC1008201443A8AB4B796253F7C4EA05FA05F2058D2C6D2C622493C1ECFD57A79AC61181CC70B06100C2032A243A523E57302FD028560491B4B1B8BE406CBB98EA5B02BA9113080600091EE1DEA383A523E27D02F50E81768636963913C2A485E1E7A321F1534D9FEC000820144DA926517FA5217E07302FD02FD02FD026D2C909C60393FCC99605772AC25184030804867275105E9F13949A74335D02F50E817401B8BB40F959747BAF48861189C340A0C2018400009EF88D85EE91728F40BA08D45FA6F6B0BEBB97EE5726A080C201840000C7A40BF40BF00DA58A0BEED2CE26C25C75A820104030880410FE817E817401B0B44B39DCDAF2F54728658308060000130E801FD02FD0268638198E4E7E7FF406D7B5F52136000C1000260D003FA05FA05D0C60271C9CACA3A5E6D7B5F50136000C1000260D003FA05FA05D0C60271B9E5965BFE9F6118FBA909308060000130E801FD02FD02686381B8E4E6E69EA0B6BDCFA909308060000130E801FD02FD02686381B86465659DA8B6BDCFA809308060000130E801FD02FD02686381B81414149CE4F178F651136000C1000260D003FA05FA05D0C60271F17ABD27AB6D6F2F350106100C2000063DA05FA05F006D2C1097ACACAC1FAA6D6F0F350106100C2000063DA05FA05F006D2C1097F6EDDB9FA2B6BDDDD404184030800018F4807E817E01B4B1405C0CC3F81FB5ED7D4A4D800104030880410FE817E817401B0BC4252B2BEB476ADBDB454D800104030880410F1A6D71C562DAE4D42835AA5F38C816491B0B248B6118A7A96D6F27350106100C2000063D68B4054B17EC98BA792AED723397C73E7CEC69D52FAC638BA48D0592252B2BEB74B5EDEDA026C000820104C0A0078D56EE2BFFFBCBFE973F537DC3D7B4CFCDB3A3D1EA132ACA37575454B4638BA48D0592252F2FEFC76ADBDB4E4D800104030880410F9A846A8F5A979797AF949514B24C9F92D42275BE8E3E8136965A40336C773F51651B350106100C2000063D00401B0BC4252B2BEBA76ADBFB849A806B6567675F4F030C30E80100DA58207EB9B9B967A86D6F2B35013737BEAFA8F21D350130E80100DA5820EEEDEE4C55B6501370EB17A0A534BE520CC3F803350230E80100DA58207659595967A96D6F333501B736BC7E47B02CA74600063D00401B0BC4CEEBF5FE4C6D7B9BA809B88E0A92AD74A864D61260D00300B4B140A3B6BBB355F9989A801B37FE574283A52AF3A91980410F00D0C602B1C9CACAFAB9DAF63EA226E0B606B75D98506915AFD77B09350430E80100DA58207A6A0C7D8EDAF6AAA909B8ADC17D2752B0340C6316350430E80100DA58207A595959E7AA6D6F233501D750C1B14DA450A98BC7E3F935350530E80100DA58203A5EAFF7976ADBDB404DC03554685CD350B054E5596A0A60D00300B4B140D463ECF3D4B6F7013501D7320CE37FD497E0536A0260D00300B4B1407CB2B2B27EA5C6D5EBA909B8567E7EFEA9AA01FE0F350130E80100DA58203E2A549EAFB6BD75D4045C2B2F2FEFC7EA4BB09D9A0018F400006D2C101F8FC77381DAF6DEA726E05A5959593F555F824FA80980410F00D0C602718FA92F340CE33D6A026E6E7CCF54650B350130E80100DA58203E2A545EA4B6BD77A909B896D7EBFD99FA126CA22600063D00401B0BC4472ED727D78AA726E05A5959593F575F828FA80980410F00D0C602F1C9CDCDFD5F152ED75213702DF505F8856A803FA42600063D00401B0BC4C7308C8BD5B6F7363501D7F27ABDBF545F820DD404C0A00700686381F8783C9EDFA86DEF2D6A02AEC5C55C01063D00401B0B347ABBBB549537A909B816D7DC0118F400006D2CD0E831F56FD5B6B79A9A806B716A6480410F00D0C6028DE3F57A2F53DBDE2A6A02AEC519AC00063D00401B0B347ABBBB5C9595D4045C8B038D01063D00401B0B347A4C7D85DAF6DEA026E0E6C697038D01063D00401B0B3482D7EBBD526D7BAF531370F39780F5E000831E00A08D051AB7DD5DA5CA0A6A02AEC5B43DC0A00700686381468FA9AF56DBDE726A026EFF12B0770560D00300B4B1409C0CC3F89DDAF65EA326E0E6C6F71A55AAA80980410F00D0C6028CA981B81886F107F52578859A0018F400006D2C109FECECECDFAB6DEF556A026EFE12FC4985CBA5D404C0A00700686381B8B7BB3FAAB28C9A809BBF042D55F1531300831E00A08D05E2C3640D5C4F7D01FE4F35C095D404C0A00700686381B8C7D4D7AA6D6F093501D7CACECEBE5E7D11CAA90980410F00D0C602716F77AC0284BB793C9E1BD497E0656A0248EEA0A7A8B4F286C2B2CA595699E07B4A4ADF327F1B5D821E2BF599AAFCC7F93BE4B1C252DF72FDBA7045BF57DD7FA8BE7F4FE178DF55F2BA3EA5CB7EC4A703806009C42E3B3BFB3AC3307CD4045C4B7D015AA906782135012477D05332DD7F5CB8E7EC10F96E43BFC30E96B747F33A559E773E2601B26F996FA994E0F0EA5F60DFFF5295CFF8A400102C81A8C7D41C5E0677F37ABD7FF3783C2F511340F30F7A8A4AFDD74BC02B9E50715D54C1727CC5C58513FDAD4367298B26F8BA59BF6762C579725B34A17246E8FB4B4A4A8E3C1C50FD77587F7F5CC539B5AFF7B772BE060008964083DBDD9F55A9A026E05A2A54B6565F82F9D404D0BC839E9292D9C7DAB38B512D49D5C152DED7D0EB9C3396125A55809D2DC59E9DDC5F54EADB1B58365B56392BB024B7F6BD5BF9C400102C81FA71DE12D0F8E6E4DCA2CA0BD404D0BC831E3D731898692CAB7C5FDD7FB8DEC038A132DF111EFDC1CB5A2BFB860B967A09AE7A6C9B0A9455E18ECB2C2CF5ED50C173249F14008225101D152AFFA2B6BDC5D404DCFC2568E3F178E6521340F30D7A8ACA2A3B4A0094D06707C6FE56F853C1517EEE57E63FBFE16059690487D4DAE32FC31D6319FAFE30CF7D26C75FF24901205802D1E18498E04BE0F1B4555F8239D404D03C831E0984B5CB5F179CE0087CFD03A17382BF95FDD8F898826599BF7383C1B2B472ADF30CB441339E65BEC97C520008964074BC5EEF5FD5B87A1135013737BEED5479969A00923FE891B3AF1695FA5685098CFD9D8F159555F6089DB90CB314767DD0254626FA5B132C01102C81E4E04A0BE04B6018D9EA4BF00C350124F37BE7B54ED2234B60C306BE906029E4443D615E17089685657E8FF3397DA6D748C152CE40AB4F1224215405C9EAC0737276D871CB7ECC270580600944872B2D8001AEA21AE07F5113406A0C7A9CA1B03EF51D2359E77521C1B26882BF837E4E5F8A445FC752EEF79CE43F5EFDDCD67A8C800980600944B3DDDDA4CA8BD4045CCBE3F1E4AA6C39939A00522758F69DE01B1C65B0EC1FEE390986B2C4D69A89B496B5FA87EBE78A272D3D532FAB751E8B79DBC3AF9CECBCB6A5044A799FDCE7130340B0041A1C5373093FB8BEF1CD57E5496A0248A56019DD4C64B8A5B49AF3BA9875DE57EA9F2DF70B4B2B7BEBD75867822DAD9C6A5DC752FD2CE1547E8704513E3100044BA07E8661DCACC2E53C6A026EFE1274500DF0E3D404C0A00700686381B8B73BAE0D0F77F3783C1D55B87C8C9A0018F400006D2C10F798FAEF6ADB7B9E9A809B1BDFCEAA3C4A4D000C7A00803616888F61186D54B89C4B4DC0CD8D6F5755A6501300831E00A08D05E2DEEE6E55E5396A02AE651846778FC7F34F6A0260D00300B4B1407CD478BAADDAF6E6501370F397E036F52578989A0018F400006D2C101FC330FEA1C6D5FFA626E0E6C6B7972A13A90980410F00D0C602716F77ED5479969A806B1986D1C7E3F194521300831E00A08D05E2A3C6D3596A5C3D9B9A809BBF0485EA4B309E9A0018F400006D2C10F776E751E5696A026EFE1214A9F210350130E80100DA58203E1E8F27C7308C59D4045C4B7D01FAA92FC283D404C0A00700686381B8C7D486DAF6FE454DC0B554A81CA0BE0763A80980410F00D0C602716F775E559EA226E0E66039487D09EEA32600063D00401B0BC43DA6CE350C632635013737BE77AA328A9A0018F400006D2C101F152AF3D4B637839A809B1BDFBB5419494D000C7A00803616887BBBCB57E5496A02AEE5F17886198631829A0018F400006D2C10F798BABD1A533F414DC0CD8D6F892AC3A90980410F00D0C602F151A1B283DAF61EA726E0E6C6F76E5586521300831E00A08D05E2DEEE0A54994E4DC0B50CC3B8C7E3F10CA12600063D00401B0BC4478DA73BAA71F563D404DCDCF88E565F82C1D404C0A00700686381B8B7BB4EAA4CA326E0E62FC17DAADC414D000C7A00803616888F61185D3C1ECF546A026EFE128C515F8201D404C0A00700686381B8B7BBAEAA4CA126E05A2A543EA8C2653F6A0260D00300B4B140DCDB5D375526531370F397E021558AA80980410F00D0C602F1310CA3BBC7E3F9273501377F09C6AB2F4121350130E80100DA5820EEEDAE872A8F5013702D152A4B55B8EC434D000C7A00803616887B4C7D9BDAF61EA626E0E6C677A22ABDA80980410F00D0C602F1310CA3A70A9793A809B8B9F17D58F6B0501300831E00A08D05E2DEEE7AC9840D3501377F0926CB59ACA80980410F00D0C602F1F1783CBDD5B657464DC0CD5F82A97241576A0248D80067BE0C721A282BA929002058227DC9394BE4DC25D404DCDCF84E53A513350124EC3B76B92A07EB0B96AA236A4D4D0100C11269BDDDDDAECA046A026EFE124C57A5809A0012FA3D5B584FB05CDEB265CBA3A925002058227DC9E5FBE4327ED4045C4B7D019E505F84F6D40490D041CEE59182A5FA0EB6A18600806089B4DFEE8A5479889A809BBF0433D4C0368F9A0012FE5D0B77ACE54A662B01806089F4E7F1788AD5987A2C35013737BE4FA9E2A52680847FD7EA1C6BC9B1950040B0446650A1B29FEAD71FA426E0E62FC12CF525C8A12680C453DFB5B9CC560200C11219B9DDF557E5016A026EFE123CA3C2653635012425585EED38B6B215350200044B644C1F3F40F5ED63A809B8B9F17D569576D40490B4EF9C75AC25B3950040B044E650A172A00A97F753137073E33B477D09DA521348752566C9D133D7CF7C76DE6BF3BE5D5CB1D82C2F2FA724B948BD2F5CB270F762FF624EF805806009046F7777A8721F3501D79263BEB8DC01D28184CA05CB169853374F35C7EF1D4F69A63279EB6473D192459F575454B0D20100C112383CA61EA4C6D4F752137073E3FB822AB750134875325349A84C8D3265CB9403E5E5E5EBD82A01102C815A2A540E56DBDE686A026E6E7CE773C903A403598649A84B9DA282E541B64A00044B20B0DDDDA9CA286A02AEA542E54B5EAFF76FD404529D1CE347A04BA960C9C00D00C112383CA61E6218C63DD404DCFC2558C4650F9049C172CAF6B166C58AA1E6CAF2415691FBF218619060098060092470BB1BAACADDD404DCFC2558AC82E55FA8096442B09CB2FD4173F5A281E6DB2F0D082AF2983C472024580220580289E0F17886A931F5086A026E6E7C2B54F93335814C0896F3DE1A512754EA32FFADBB0984044B00044B2051DBDD70554AA809B8966118BEECECECEBA8096442B05C5E393862B094E70884044B00044B2041DB5D89844B6A026EFE122C51E1F25A6A0299102C572EBE2362B094E70884044B00044B20116419AC2C87A526E0E6C677992A7FA42640B0A4102C01102C81B8B7BBBBE5043ED404DCFC2578353B3BFBF7D404322258960F8A1C2CD5730442822500822590A0ED6EA42A77511370F397E035C3307E474D201382E5B2654322064B798E4048B00440B0041241AE6129D7B2A426E0E6C677852A575113C8846039A3FA3E73D5CB7597C3CA63F21C819060098060092468BB1BA5CA9DD404DCFC2578C3E3F15C414D201382A51578560CAB132CE531C220C11200C11248E07637DA308CC1D404DCFC2558E5F57A2FA3269009C172C29EF1E69257EFAA132CE531798E4048B00440B004124185CA7B3D1ECF206A026E6E7CDF54E5526A02E91E2CA76C7FB0C1632CE535844282250082259080EDEE3E55EEA026E0E62FC15B1E8FE737D404D23558CA4CE49CF7EE31D72C1C183154EA22AF91D7327B49B00440B0049A92611863D4987A003501D7525F80B5B9B9B9FF4B4D201D836543B394CC5E122C01102C81246D770FA8D29F9A809BBF04EF1A8671113581740C96D1CC52D6377B49402458022058024DC1E3F13CA8C6D4FDA809B8B9F17D5F7D112EA026908EC132DE50A90B019160098060093405152AC7AA31753135013737BE1FA82FC179D404D231585208960040B0448A6C770FA952444DC0CD5F828D595959E752132058520896000896407C3C1ECF38C330FA52137073E35BEDF57ACFA12640B0A4102C01102C81F8A850395E85CB426A026E6E7C3F56E56C6A02044B0AC11200C112887BBB9BA0CAEDD404DCFC25D89C9595751635018225856009806009C4C7E3F1941A86D1879A809B1BDFADB9B9B9675013205852089600089640DCDB5D990A97BDA909B8F94BB04D959F5013205852089600089640DCDBDD44557A511370F39760475656D6E9D4040896148225008225101F8FC733C9308C9ED404DCDCF8FE273F3FFF546A02044B0AC11200C112887BBB7B44951ED404DCFC25F8D4308CFFA12640B0A4102C01102C81F8783C9E7FAA3175776A026E6E7CF7646565FD909A00C19242B00440B004E2DEEE26ABD28D9A809BF7AEEC2B282838899A00C19242B00440B004E2DEEEA6A8D2959A809BBF049FE7E6E69E404D806049215802205802F1F1783C530DC3E8424DC0CD8DEF17595959C7531348052D5BB63C9A6049B004008225D270BB7B5495CED404DCFC25F8EAE69B6FFE3E3581E66618469E0C06546947B024580200C11269B6DD4D53A5133501377F09FE5B5050701C3581E6929595756EFFFEFD5FFDF0C30F77EEDEBDBBA277EFDEABD4765916BA5D122CD32F58AACFF1728FC73397AD1C00C11299CE308CC7549FD7919A809B1BDF6FBA75EB760C3581649365AFF9F9F9C3E6CC99B3FBD0A14335E661FB5E7AE9A5C57979792B2474122CD32F584AA05465BE2A0719E0012058C225DBDD74550AA809B8F94B70480DDE8FA226904C8661FCE1FEFBEFFF68EFDEBDBBCD08F6EFDFBF7ED0A041DBF4D2588265EA07CBD040A90B5B3C0082255CB0DD3DAEC6371DA809B8F94BF09DBA39829A4032C8A56DFAF6ED3BF3CD37DF8C1828431C5CBC78F1B6AE5DBBFE73D1A24504BA140D961E8FE76A59F21A1A280996000896700B152A9F507D617B6A02AE6E7C255CAAF2AD3D28FC468EBB54A5464EECA3CA97EA8BB25F2E4B22D7BC54B77B55D9ADCAA7AAFC47959DAA6C57456696B6AAB24595CDAA7CACCA47AA7CA8CA46553E50BF67BDBA7D5FDDBEA76EDF51BF6FADBA7D4BDDAE51B7AB559163EBDE50E5755596ABF29A2AAFAAF28A7ACF5275BB44DDFAD46DA5BA2D57B78BD57B17A9DB85EAF62575FBA2BA9DA76E5FB007B9CFA9DB7FABDB6755794695A755F9972A4FA932439527A51190A50BB22E5ECEE625A78A960BDCAADB7FAADB87D5ED2439DE4FDD96AAD78C57B7E3D4ED5875FBA0BA1DA36EEF57B7F7AAD78C56B7F7A8DB91EA7684BA2D51CF0D53B743D5ED10757BA7BA1DA46EEF50B703D46D7F755BAC6E8BD46DA1BABD5DDDF656B7BDD4ED6DEAB6875C6457AE872467189383C165DDBEEC0993464B4E74A36E73D5ADA16E73D44DB6BACD52B7FF50B76DD56D1B75FB77757BB3BA6DEDF57AFFA66E6F54B77F55B7376467675FAF7EE79FD5ED75EAB6A5BAFD93BAFDA3BAFDBDBABD468282BABD4ADD5E611F27F75B757BA9BAFD8DFA9D17ABDB5FABDB8BD4ED05EAF67C757B9EFADDBF54B7BF50B7E7646565FD5CDDFE4CDD9E959B9B7B86BAFD695E5EDEAF264F9E6CD6D4D41C3263B47FFFFECF1F79E411F3BEF5F711EA522858469AA10C2D72BCACDA06FE3F3951587E7EFE0FE44CD4B7DC72CBFF934B1DA9FB274A919D0E6A9B3959DDFF61FBF6ED4F51DBD5FFA8FB3F92A2DE73AAFAF93475FF74B51DFD58FDCE9FC83625DB9614F5F399B2ADC936A7EE9F6D6F7FE748916D529654DBDBE779EAFEAFEC6DF60229EAE70BED6DF9D7EA77FDAFBD7DFF468A7ACF25F676FF5B75FF32FBBB7085BA7FA514FB3B72B57ACFEFE47B23DF1F998D97EF92FD7DFA93FAF95AFB3B769DBAFF7FF2BDB3BF7BD7AB9FFF22DF47F95EAAFBADECEFE8DFA4A8D7DC24DF5DF90EABFBB7D8DFE73652D4CFB7DADFF37FC88CBEFDDDCF56F73D52EC36C150F7BD763B2127C6CA9762B71F1D64B996B429D2B6481B23A7C89762B739DDD4FDEED20E497BA4EEF79462B74FBDD5FD3E769B55A8EEF79576CC6ECB8AD5CFFDECF66D80BA3FD06EF30649513F0FB6DB426913EFB2DBC761765B395CDA4DBBFDBCDB6E4BA54D1D6597D1765B7B9FDDEE8E51F71F9062B7C763D5FD87EC367ABCBA3F41DA6D29D286AB32D16ECF1F56E51169E3ED765E2E683EC56EFBE58C8ED3ECFE60BA5D1EB7FB8927A5DF50F767DA7D88F425FF523FCFB2FB9667D4FDD9D2DF48BF63F73D73EC7E48FAA3E7EDBE699EFD9D996FF759D2772DB0FB31E9CF5EB6CB62BB9FABB0FB3CE9FBFCD20FDA7DA1F489CBA47FB4FBC92ABBCF7CCDEE3F57D87DA9F4A92BEDFE75B55DDEB4FBDDB75479DBEE8BDFB1CBBB761FFDBE2AEBEC7EFB035536D865A3DDAF57DB7DBCF4F59BEC7E7FB33D0690B1C027F6B840C6073BECB2D31E37ECB2C7103296D8638F2BF6DA638CCF64BC618F3BBE9031885D643CF2B53D369131CA017BBC72D02E87EC71CC77ECD042338EA9A59DC8A726E076479494941C29C7BCC9F19637DE78E3F76420A807817A00A8077E7AD0A7077B7AA0A70778CEC19D1ED4E9019D1EC8E9419C1EBCE9819B1EB4E9C19A1EA8E9019A1E9CE941991E90E981981E84E9C1971E78E941971E6CE98156C800ABB33DB0B206557A40A507527A10A5074F7AE0A4074C7AB0A407497A80A407477A50A407447A20A407417AF0A3073E7AC0A3073B21831C3DC0D1031B6B50A307337A20A307317AF0A2072E7AC0A2072B8E418A1EA0E881891E945883113D10D103103DF8700C3CF480C339D8D0838CEDC3870FDFB775EBD6EF620D96FBF6ED334B4B4BADC142AA86CBFB36DF270319B3F38CCEE643BB1E327F78D60FCDF3AE3DCFBCD27BA555BA3DD3CD7A3EF47DF2D82D77DF12F1E7140F96D1961A7B50F8953D48FC42EFB0B207929F39765CED71ECBCDA6517BD136B876347D627F6B6E5DCA1B5C9B153ABDA2E7AE7D606C70EAE75F6B6AB7774BDEBD8D9F5B6BD9DEB9D5E6F3A767CAD74ECFC7ADDFE8EE89D60557A4798FD5D5AA67788D9DF316BA7981D142AF4CE31F93EEA1D64F677F425BDA3CCFEEE5A3BCBECEFF35CBDD3CCFE9E5B3BCEEC40A3779E3D6DB709D64E34BB9D98610F78F4CEB4C71D3BD4A6E99D6A76B89AE2D8B9F688DEC16687B2897A479BB4597A679BB463765B66ED74B3DB376BC79BDDE6DDAB77C0D96DA1B513CE6E1F47E89D71D26EEA1D72765B6AED949362B7B1D6CE39BBDDB576D049B1DB636B479DDD465B3BEBA4DDB6DB6E6BA79DDD9E5B3BEEA48DB7C3B3B503CF6EFB033BF1A45F90A277E6D9FD85B543CFEE430CBD63CFEE5BAC9D7B767FF30FBD93CFEE87AC1D7D76DF64EDEC93227D96DEE967F763D68E3F29D2BFE91D80769F67ED04947ED0EE0BAD9D8176FF68ED10943E538ADE3168F7A5D6CE41BB7FFDADDE4968F7BBD68E42BB2FFEB5DE6168F7D1D64E43BBDFB6761C4AB1FBF3C00E44E9EBF54E44293206D03B13655C20E303D9212445C60B326E909D45328690B184EC48927185141963C84E26196FC8B8437640C918448A8C4764E7948C4D648CA2EE1F2BE31519B74891437A641CD382155868DE19CB99D246501340924907D0AFCC7F7EDF327F1B5586F72DF599AABC1BE9F545E32ACE91D7C87B02BF63BA3F70D6D0BE65BEDFDBBF635A437F5B5E5738C1F75043AF2B9CE86F1DEEF19E93FCC75BBFA3AC328B4F32762A271E5D5555B5E8BFFFFDEFB7D184CAD75E7B6D5BE7CE9DBF1C366C9879EFBA7B533A6C0D583AC03CF1F413CD71BBC75901F1AE557759B75963B302A151BFF6ACDF9E15089BB98FE49A3F38E507E6C057065A3F5FD4EAA2C073F23B527D29AC3D005E1E2958B2D5038D57545A7983EA7766596582EF2929761F6A95A0C76AFBC3FFD4E9FB4A7DCBF5EBC215FDDE86FAC8C2F1BEABE4757D4A97FD884F06A865AF66F052134082158EAF38AD4F69C585B74FF05DA63AA3B685657E8F744A45A5BE31CE8068EF710CB05FFFBCEEEC8A26F8BAA9DBAF5579BDA8D47FBDDD013E553CC1F7B7A2872A7F5A52E23F3A9A60D97782AFB8E1D7F9736B3BCE0527149556FC51FDED7FD7FE3B2A0DBBD37EDED181BFCEA71C9B59B366B5ABAEAEFE3A52A0DCBE7DFB7F478E1CB94B6629644F76BA9DBC474261FBA9EDADDB5FFEE9976651795150B01CF6F630B3EBACAE8160F9F32B7F6E767FB6BBD9615A87C0FB3B3DD129AD4EDE23B32EF68C1DC1126862CEBEB24E9F56CF8ED99060797B547DA4EADF9C8F4980EC5BE65B2A2538BCFA17D8F7BF54E5333E25B83C58CA2A32839A0012A86892FF5CD5E12C9212668FEA8B819F2754E6EBB0793868FA8F2E9AE06F253396D6EF52F7E535DD26CFFFBE7ADDB5A1B39875FE76ED6B16E93DBC81805AEAAB72FCDDFEEAB16FEA74E2EA6F174FAC38AFF6FEEC6325BC3A83A50AC79DD5FDBED67D159CF9A463274B9DE6CE9DFB5A4D4DCD411D28BFF9E69BEF9E7FFEF9AD1D3B76EC204B9CF46B533958DEB3E11E6B86F198E38EB102A40E8639A53981E028B396CE6029AF6F7547AB40003DF2A823CDD6435B9BBDE7F7368B2B8BADC7257CA6E3E546EC19CC5708964082FB577B076BF1848AEBA20A96E32B2E96D538A1B394F64E5B53FABCDA9DB89533EAF689B53B7E6B03AAFF0EEBEFDBAB89A46F76BE067023390C4196C75313400249400B3793581B2C2B1BDCB32321D27AED38FF2556075656D9431EB796D2AA9F655633D27B0B4B7D3B0A4B2BDFACF3771D339676D8FCBAC1FF0F7B6F7160296C84A5B288DDDD77DF5D505555656EDCB871D7942953C21E9F90EA33967AF96B97A7BA0482A5CC4886CE62EAFB23DE1B61CD4ECA633FBEF0C756D094C7EFDF7ABFF5D86FDBFE366DAF63E9E864650673395B389088BE75F6B1F60EDAA896A4EA6029EF6BE875CE194B09AD2AC0CE9662F797FB8B4A7D7B03CB66CB2A670596E4D6BE772B9F0EDCC83ECEDD434D0049A03A9B4F55792574C6D2DA5B5A56D9517E76767812E46489A9F5BCA31393A5B4B5B38EB57B6AADD95039BEA4B4B2B73D1B796DE06FD6CE821E52B7E323CE585A4B78FCF3F47B6449ADFD6FEAA16723F512A0704B618BCA7C3DAD9F2756FC8E4F397ECED9C9740C96A16152EE174C2FB002A31C7739FAA3D141C1F2ECCBCF367BCCE9613D26339EA79E7BAAB514367F727EE0444052E47DE91A2C0124B44FB5660E03338D6595EFABFB0FD71B18559FE8088FFEE0FEB8B26FB860A977AAAAC7B6E9BE3374C65376E2AA3E79249F0A5C1E2CE5448AD9D40490A44E5085B3EA903D9B2F068263A97F41E87B824ED0E3E8148515F8A4439DB4F44CDD4986F99B9B5579AB6EE75A67C632E8D8106B4FB0FD6F94632C6B7F56FF76158C9D274B501DF15AD98BCBA79B78E9122C87AC1C623EB0E381C032583D03298FEB6039F28391D6996325745ED6EE32EBF694B34F31FFD4ED4FD67D99F594D7DEFED2ED693D63092031023B636B77C04ADFD8DFEACFEC434AC21D225237581E5E31E43CFE32DC3196E1FAE090E73E939DAF7C327033FBECFC9CD811485AB074063A47C7661DBF58EAFB32F43DB26C47661303338DD62C62ED718D72863CB9ED35B1E294A60E968EC74D99C13CFCEF0D0EBFF66BFEC3A74BB0741E5779DA79A7054ED62327E0915B59FADA22E47223B27CB69FAF9F75ABCF022BB772BCA53E890FC11240701F56BB6A46767A3A025FFF40E8B4CF45202B75620A9665FECE0D06CBD2CAB5CE33D006CD7896F926F3E9C0CDECEBA6B7A326806405CB883396FE91FAA43CCEF7C88900FA8E5BF6E3D08ECF19FCACD7440896F65EDD6FEA5B0A2BB3A5A1C761460E96F2FF50DBA9EA633399B124583A83A52C65955B999194DBBBD7DD6DF67AA1579D632C9DEF19B47C901528E5DA97E972D65B8225D02CFDE897AACF5A152630F60FE9FB7A84CE5C86590ABB3EE81223F679030896407CE4DAC2720D5B6A02485EB0FC7D482765ED319599C94827E1B1CF38D7A1760F6DC585FA843DCE33C8D63363B9BFCE2C63C88CA55C4A24DCC97B74672927EBD167A0959312102C099691CAD89D63CDA16F0EB596BD3A1FD7D7A7946B5786BB8EA584D11B07DF685DCBF2AF03FF6A3DAE03AA1C6F49B004DC4D9FA847769686ED5B4382A5EE57C3BC2E102CE5B25FCEE7F4995E23054B39AF813E49908450D9511C784ECE0E6BEF0406DC2A2727678E0A976DA90920D1A17262C5EF5427F69C55225D6EA4F6E769211DE315FAA43EB581D2FFEBDAE5B1F67258FB3224F67B2BA30EB8D15CC7F2F0BF69BF3E13AC5CCB32CC6BB6F109132CE3398B6C3AFFFB0996408AF4AF8E50D870DF17FE18C93AAF0B0996B273573FA72F45E23C3CC4EE23DBD69EC19D8009D706CBE754B9959A0012ACF69223C1D7B78A74B911BD1CF6B6875F39F9F05959F512D6CA1B0E77A4872FF41C69C6B231C152CF92AABF3D3CB413951306D9C7787EC98C25C1D28D856009A44EB0547DDAE0288365FF70CFD92B73565933918E7E4FF7777A59ADF39014E9A39DD7B6944029EF93FB7C2A70238FC733D7308C36D4049020766755157A8AF2C3B381FE79218F3DA167269D41547ED6CB52EDF7E5D60DA9BE89D176C27AEF6B7D64C94F6199EF96A0F7D94B6F45E178DF55CEEB6A826049B004D03CC132BA99C8704B6935E77531EBBCCFDE81AA2FEB6597CFFA96564EB5AE6369F7CFF23B2488F2A9C08D7272725E50E5166A0248A0862EC60C102C09960000A4338FC733CF308C9BA9090020585208960000C425272767BE0A97ADA9090020585208960000C41B2C5F54E5266A02000896148225000071F1783C2F79BDDEBF51130040B0A4102C0100884B4E4ECE02152E6FA4260080604921580200106FB05C6818462B6A02000896148225000071F1783C8BBC5EEF5FA9090020585208960000C4252727E765152E6FA0260080604921580200106FB05C6C18C65FA8090020585208960000C44585CAF2ECECECEBA9090020585208960000C4252727A75285CBFFA32600806049215802001017152A7DD9D9D9D751130040B0A4102C0100884B4E4E8E5F9596D40400102C29044B0000E20D964B0CC3B8969A0000822585600900405C54A85C9A9D9DFD276A02000896148225000071C9C9C959A6CA1FA9090020585208960000C41B2C5F310CE30FD40400102C29044B0000E20D96AF666767FF9E9A000082258560090040BCC1B24A956BA8090020585208960000C41B2C5F330CE377D40400102C29044B0000E20D96CB3D1ECFD5D40400102C29044B0000E20D962B54B98A9A000082258560090040BCC1F20D8FC77305350100296E71C562025DEA941A152C0FB25502001008962B55B99C9A008014B760E9821D53374F25D4A54079ECC3C79E56C1721D5B2500008160B9CAEBF55E464D00408A2BF795FFFD65FFCB9FA970F935E1AEF9662AFFFFF6EE36468ABB8E03782488A8B5A156A4B5A9ADB5D6A6565A35A6698CF1348D29A610129DECC371B889C9455B28B7D437C5946C62782349E9EE1E8D2410638C8AC4E4FA82B424ECED5A1A20C6A78AD807A56839D0A3553815E15A03EBCCEECEB2777060266CCD6D3E9FE49F9DDDDB79E037243FBEFC67E61AA1B2B2FBD54AA5F2157F2B01A01D2C7F954AA53EA91200B34018661ED8BD7BF72FA2CB30A37BFC66E3181919A9CFD6636FD5FD45A112002E0896BF0EC727540280AE3B7EFCF8974BA5523D6C3C37AB0600F48E542AF59B6C367BB74A00D055F57A7DFE8913274E86EA8383833B5504007A473A9D7E3E0C9777A904005D353636F6837ACBBE7DFB8E653299E5AA02003D132C7F1BF6F6C52A0140D79C3A75EAAEB367CF9EAB77D8B061C3582E975BA03A0030FBA552A903FDFDFD1F570900BA667C7CFC707D9A898989F1B0011555070066BF743AFDBB305CDEA9120074C59123471EABCF60646464DC2F5306809E0896073399CCC75402802B2ECC8ED74D4E4EBE3953B03C77EEDC1BF97CFE405F5FDF5CD50280D92B0C95BF0F82E00E9500E08A3B7AF4E8FEFA651C3E7C782C6C4643AA0500B3573A9D7E31ECE7B7AB040057DCDEBD7B2F972BEB67CE9CF959D88CEAB95C6EBE8A01C0EC1486CA978220F8A84A0070C5AD5FBFFEA14B5D0A1BE5CA75EBD6FDC48C2500CC6EE974FAE5542A759B4A00D015DBB76F7F79A65479E8D0A1EF868D68BF7B2C0160D607CB3F64B3D98FA804005D1104C1AD61803C739107F71CECEFEF3FE8A9B000D013C1F28F51CF570900BA66E3C68DE530489EED0C965BB76EDD964AA536A90E00F444B03C14F6F50FAB04005D135DEABA6BD7AED7E250393131F1A3E87F3673B9DC02D501809E0896AF64B3D95B540280AE5AB56AD5174E9E3C39198EFAE0E0602593C92C571500E89960793808820FA904005DB765CB96674AA5523D954A8DA80600F454B0FC53386E560900BA2EBAF435FA9D956EEE07809E0B967FCE66B337A904006F55E3A9AB0200F45C7F7F3508820FAA040082250090B4BF1F09C78D2A018060090024EDEF478320B8412500102C0180A4FDFD58383EA0120008960040D2FEFE97152B565CAF120008960040D2FEFED72008AE530900044B0020697F1FCF64328B540200C1120048DADF8F0F0C0CBC5F2500102C0180A4FDFDB5200816AA040082250090B4BFBF9EC964DEA7120008960040D2FEFEB7952B575EAB120008960040D2FEFEF72008DEAB120008960040D2FE7E229BCD5EA312000896004022A954EA642E975BA0120008960040D2FEFE8FFEFEFEAB550200C11200482493C9FC73D9B265EF510900044B0020697FFF57100457A9040082250090B4BF9F1A181878B74A002058020049FBFBBF972E5DFA2E950040B0040092F6F7D34110BC532500102C0180A4FDFD4C2E979BAF120008960040D2FE3EB964C99277A8040082250090B4BFBF1104C13C950040B0040092F6F737070707DFAE120008960040D2FEFE9FBEBEBEB92A018060090024EDEF670B85C21C950040B0040092F6F773E1CBDB540200C11200D0DF01981D8DC7300CC3308CDE1BFE95030000000000C07985426DEE50B9B63C1E6B8AD51F36964BD5C9A1F2E80BFFCB36D63C51591C6DA7B9BDC29CCE87B384DBA9E74BB56F47CB8F946BB75FB0EE70ED818B6DF3C1CDB5ABA275D79447834BED3BFE4EF8FA7A389E6C1D7BFDE162F553E1EBCED6FBB1700C3BDB0000005D0B9785399D21AE15C67647A12F0A9AF18843DBDA62E5F3D382E5A2E8F3706C8BC35E1C4A1BCBC3957BD76E7EF6C6E6E7D5C7A606C35A7FF4F9EAD2D357E74B95CFE68BD59F36F7339A696DF3A978BFE1F8F9C58265B8CDCF34026CB13AD80E9B4F54EF89C269FB3BA56ACD99060000E8A256F87ABE15E24EE74BB51D71E0CC6FAADCD20C90D57B9A3390D5CF4D5F3FFCFE7D0F0D57AE5D5DDAB3B050D831AF19EE2A8B5B3396F735835FEDFE0B436D6DEEDAE1CA6DCDE51DF3D616AB5FEA0C966BCAB5AF85CB43ADED2DEA5C7775A972473394EE59D8F879A9FA703B58B6963BFE6C3B9D650000802E07CB30C4A51ACBCD7079AC1DCA36D5EE6E04CBD2E8AAE812D9F3A1B03027BFB976EBD48039FAC530D4ED0FBFF7FD8E99C697E2E5301C7EFA52C751F85E6D7EF4DABE1476864B653B02E3A98EE5B1F63E872BF70E95ABCF761CC33667190000E0FF142CF3C5DA57DBDF29561F9FB25E7174209E358C66365BF7365E1008E359CC6826B211401F1FBD21DA4FBE3CFAF57836B21904E33038F552D87CB9FA601C18A3F5DB97D6761C673C4BB9A65C5D1607DFC6BE8AB5FBA7CF76020000D0856039FD52D8E8F36F3CF9DC35EDE0D7113EA7AF1B5F8E3AB469CFF59DB394F1BD99AD07ECB4673FDB61B335A318DD63D97C5F7D257CFF5CE70385C29079203E9EA9C73B9A892E956DBF2F561FED7870CF531DF7674EE44BD5EF38CB0000005D0E96179BB1EC089D13D1ECE44CEBC7C1320EA2D14C64E7CFDBF75D4E7BCA6B1C2CA319CCF3FBAA3D7D91EF1C8FDF3F323C7A53637FADD0D83EFE69F755C6F76E364367ED5BCE320000C05B1B2C1B612C7A204FF4B4D5F8E9AB975A3F0C9EDF6C2F97475FB8DC8CE5CCC1325A7FCAAF3E393D7DC6B263DD89F3FBAF3E9A2F557F19EEEBC7D1BD9CD1A5B951B86CCE62D6EE74967BDF7F01C2B8EC92D1A67BA30000000049454E44AE426082, 1);
-INSERT INTO `act_ge_bytearray` VALUES ('302558', 1, 'var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302560', 1, 'hist.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302561', 1, 'hist.detail.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302573', 2, 'var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302575', 2, 'hist.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302576', 1, 'hist.detail.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B7874002030623736323566656461613035653835663238323438366531633963393162397074000331313174000633303235363678, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302588', 1, 'hist.detail.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302598', 2, 'source', NULL, 0x7B227265736F757263654964223A22333032353937222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F6C656E6F73702E636E222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D33304636324437352D353136352D344532322D383433412D394441393335424135303331222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3137352E352C2279223A3134317D2C2275707065724C656674223A7B2278223A3134352E352C2279223A3131317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3338352C2279223A3135357D2C2275707065724C656674223A7B2278223A3238352C2279223A37357D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E393233383535393435353934382C2279223A3132352E303334373433383734303737367D2C2275707065724C656674223A7B2278223A3137352E38313234373231373934303531382C2279223A3131382E313536363632333735393232347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D7D2C7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539382C2279223A3132397D2C2275707065724C656674223A7B2278223A3537302C2279223A3130317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3536392E333832383132352C2279223A3131357D2C2275707065724C656674223A7B2278223A3338352E36303534363837352C2279223A3131357D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302601', 1, 'var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302603', 1, 'hist.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302604', 1, 'hist.detail.var-baseTask', NULL, 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302616', 1, 'var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302618', 1, 'hist.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302619', 1, 'hist.detail.var-leaveOpinionList', NULL, 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302630', 1, 'source', NULL, 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302632', 1, 'source', NULL, 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302633', 1, 'source-extra', NULL, 0x89504E470D0A1A0A0000000D4948445200000288000000CD08060000003B43814C000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000011F04944415478DAEDDD0B7454F59D07F09BC924194208E115E3A22B56A4BADAB55A1F548F055F80407B5C2B25984A715DDB7A56DAD5FA586B7DD5F6D45D75ABDBDD565B151FA841E8FAA8D64715A85B05179422281110C16208C86308904C1E33D97B69E8491110C883103E9F73AE776632B933FE90BFDFFBFFFFEFFF060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005D44961200FBC203CB1EF87A8F648F9F146C2EE81FAF8B6B8B3A486376637D2637F34AF6E6ECEF8C183162A98A000222D0293C52F1C87D7DAAFA5C92EC970C36166D0CEABAD5294A07C94DE50685C9C2A0EFAABED5F1A678D9D9679FFDACAA00DBCB5602A023453D87C51F15DFBAF2332B83649F6490CE492B4A074AC7D3414D414DB0B9E7E6BCA2B545C3CA2E2C7B72F2E4C9EB55066829A60440478A8695A39EC328A4B0EFA4F253C1BAE275D5B158EC56D500B6175702A02345730E971FB47CD70DD3E67850B8B430C85D9F1B64356505754575C1A6819B82869E0D0AD88636F4DDD0BFEFEABE435502D89E1E44A063CF4AEBE259BB9A731885C33E6FF609F23ECE0BB2D25941900982BCF5795B5FCBD998A3806DA83E519F17EE4A54021010814EAD60794110ABFF64D31485C5E867000888C0016657BD8451EF22000222708089E61CEECDCF001010010010100100101081034EBADBCE17CECEE46614084040040E345B0EDDB2C320988967822D03B628108080081C6852C5A920D537B5C3D76B8B6B15084040040EC886A9F1934D53769D5BC7030888C001275EF3E7BBA824D6243EF1B3BC7579419F397DB6BE070001113800E457E66F0D80D1FD97772637991BF49DDD37E8BEA2BB351101DAF3845D09807DDA08D5C483C28AC2AD3D84BB23BAE55EE1E2C220B13611540FAA0E1A7A342822401BD38308EC53518FE0EE86C396A29EC6BEFFD75701010444A0AB897A04F79A651101DA852166609F5A75CE2A4500E864F420020020200200202002002020020020200200D06AAE6206000E68AFBFFEFA3F2C5DBAF4E2952B579EB67AF5EA1E1B376ECC49A552415E5E5E537E7E7E436161E187E1FEC5850B17DE3575EAD4A50222004017D4D4D4149F356BD68DD3A74FBFE2BEFBEE2B38E18413822143860403060C088A8A8A823010066148CCDAB469536E6565E5C0F0BD030B0A0A2EBBE28A2B962493C96F4C9A34E90D011100A08BD8B061C37161287C69DEBC79C55FF9CA57826BAEB926C8C9C9F9C4FB1289C4D6AD5FBF7EC171C71D175C7AE9A5B11933667C76EAD4A97FB8FCF2CBA7AD5EBDFAD2F0F1E6AE58237310018003C61B6FBC31E68E3BEE989B9B9B5B7CFBEDB707C3870FDF6138DC91ECECECE0ECB3CF0EEEBEFBEEF8E0C183CFEBD1A3C7FCD2D2D201022200C07E1C0E1F79E491F230DCC5C78F1FBF7518796F44BD8A65656589281C868F5FEB8A2151400400BABC6858F999679E796CF8F0E1B1D1A347B7C931CF39E79CD8B871E37AE5E6E6BE3066CC9802011100603F115D90326DDAB497060D1A146FAB70B8CDB061C3BA9D79E6997DF3F2F2FE5D400400D84FCC9E3DFB96B7DF7EBBF8820B2E6897E38F1D3BB64F3C1EFFFA85175EF879011100A09D959696FE60DCB871E70D1D3A74AF575E79E59557BE336AD4A8BD9E73F869A239895FFBDAD7EAC3877708880000EDEFD6A6A6A6274B4A4A9263C78E9D1C86C5117B32DF2F5A047BD9B26505679E7966BB7EC961C386F5C9CACA3A31FC6E03BB42D1AD834887995CF5D2590B6A975D5E99FA78F087756BFAAC6FAC8ED766EAB2F2623941AF7861E380C4411B8A737ACF39A5E0EFFE73EC4167BEA86200B4D03D0C606561582CCBCECEAE2E2D2D7D3A7CFE585E5EDECC071F7C30B5B35F5ABC78F1A5D122D8BBBB94CDDE8A96C039EAA8A33E7CE79D77CE0BBA404FA28048BBFBD6E23BAF5ADB90BC7ED2EADF169D52787470E141E70483BA1D1A94E4F60EF26389A026930A36346C8A2FAEFD53BFD7AB178EFC65D53323CF7FE7FA4DBD730AEFBA6FD0B537AA2000DB290CB78BC2B078512A346EDCB827C2E74FAE5AB5EAD999336736B67C63F8DAE033CE38A343BED4B061C3BA870171888008BB7059C5ED7FBF2ABDFEF90FEB561D7CF521E3B2BED4F3B8203B2BFB13EF8B42627E5E22E89FD72F38A3E884E0FABF1D1FBCBA717E8FBB3E7AE286910BAEBA6C407EC9C89F1F71D51C15ED1CA2F940E1AE229D4EBFD055EF2000EC571261501C1FEEC7979494443D8B2F656565DDBFAD67B1B2B2B2E0B0C30EEB902F127E4E34C9F1D8AE5054019176F1CD25B7DFF4D6E6A537FE53C9E8D8C5079DBBC360B82B51988CB647D6BCD8F7BF2B9F9CFDED2577DC76CF91575DAFB29DC2AD5B1B8F783C3376ECD877C286F87FC2A7331389C4EC5D0DF3D0F9D4ADAB0BDE7AEBAD28F4DFAC1A741151CFE2056160BC20954A45FF6DBF5F5D5D9D535858D8211FDEB367CF9270D7254E9C0544DADC75CBEEF9C16B9B16DE74CFC0EF657DBEE0C8561DEBA2E2E1C1890547C5BEBDF48EEB2E5B7C678F5F0CFADE7754B873081BE058180E3F173E8CB69B9A8779DE085F7F36168BBD1C9EB52FDC7EA887CEE5E3D91F072BE7AD8C1EDEA41A745147D4D5D5B5DBD5CBDB8BAE660E758905B30544DAD49845375CF9874D0B6F79FCB337664543C66DE1E8FCC382C7C2E38D7BEF87FF3C76D1CD95538EBEF93695DE77CACBCBB3C2B3F2A61DB58D61388CE6DE0CC96432414949C986F07D33C2E7BFC9CECE7EF9D1471F5DA97A9D4BBFC1FD827E95FD8279F3E6DDA21A7462BB7302930EDB9FA6F0A4F5AF724DF87C593C1E1F50535313EB8890585B5BFB51B8EB2920420BA7CEFDE611CB6BAB6EFBE59157C7DA2A1C6E131DEFDE8157C5BEF1DE8F7F387CE195CFBF78EC7FCC57F14EAF57B89D1F6DE9743A1AEA49878F1755565606C11714A733C8EB93171C73C231C1B5D75E7BB36AD059856DC70E03629807A3118A4C180273C37D76B88F5E4B86FB97C3EDD1BCBCBC17A2692F975F7E79AABABA3AAF2302623299DC18EE1A044468A15B4EFEF317179F95D3DA61E59D897A1227F6FF6ACEA455CF3D1D3E1DA0E2ED63C2840989542A551236B42561239BD87E1FBEE5A0BD3C743411F5D879F3E60503BEEC8F0FD82BD162D4D1C966B716BD85D19CBF17C26D4AB76EDD5E0E4361B2E52F1416162E5BB162C5D1252525EDFEE5162C58B0283AF71210A1D997E64D2CCBC9CAFE4C3467B03D45C79FB2E6954386CC9F78D9EF8FFBD92F547EC7C68C1953929D9D9DD855C80BF745D1F3F071F4FC2FFB686277243A1BDFD17E0F4543D12D7FB1E2F8E38F3F6A43B0C11F12B037725B84C269E1F65C229178765717C885A1F1B773E7CE3DFA94534E69F72FF7FCF3CF47DD94D30544D8F637363BE7966B0EBD303B5AF4BABD7DFF6F2FCABE71F9FDD7850FBB7440DC55C88BC5623D5B3EDF3EE46D3BC6AE425EF87B3BFBE8A8A1AD6ADE52E1EF5485EFDDB6AF6B7EFDD36ADFD8DCBE441FB830FCBD7BC3467A7274667FC92597340988C01E9F6D3635453D8333C3F6EFA1E6256C92BBF37B15151577E5E4E4FC4B434343767B2E969D4EA7575455559D14EEBBC4C5940222AD367076D9213599DA43A365693AC2A9859F0B1A9B322547CD2A1D50F1C5F2E5FB63C06B3154BB7DB06BB9DF69C8DB16EE7611F2AA5A04BD1D86BCE6B93A7F793D6CD45253A74EADDA9D7FB7D2D2D21D05C4C6F038B1E8EAE6E6B6E5854C2673E79A356B66BA9A1968851BC2B66579229198B6374B694517C85D79E5958BA64F9F7EECF0E1ED37CA3569D2A437C3EF5918B6A34B0544081DDCAD68FC909E9F8FEFE95A87AD716EEF53729E5EFFDAC5413B2ECF3161C284A2542A55149EAD168541A7287CA96FB815B445C0DB4D3B0D79E1F7D9B85DE8DBE390D7866AC22D1A568987DF2B0A9DF785DFE3DEAED24802FB567979F98F5A7B8C6432F9F5279F7C72CEE9A79F9ED31E17ABD4D6D62E0E03E869615B3CBAABD45D40A4D57283F8974F2BFC5CAC233FF3E41E4707CF6F7863D4A705C49DF5E2853F3A24DCF29A876B0BB61BA68DD6B0EABB6D2E5EB4644B4B6D11F05A0CD56EFF7A2A3C4BAEDACF169C8E5ADBBF1A46F6B702E84C1E78E081F913274E7C74CA9429632FBEF8E26E6D7CF8E4F5D75FFF5AD8066E09C3EC5C01119AAD6FDCF499E80AE38E54940C63E9CCF5C7949696DE1E85B9F02F665174D145D0DCCBD762FF57A16EFB70D772B87607A249D06B9B8762A3D0B3367AAD0B06BCD6308C0CEC17162C5870694D4DCDC9C5C5C5478C1A35AAADAE346EBCF3CE3B1FAAACAC8CD67F3DBD2BD54B40A4D55299FAA27E39451DFA9915731606FD66A5A31EBFAB7614FC5A58BB2DE8B508777FE9C50BF7D1E2CDA9743A5D153EDEBC0F8769F7375787757ACA3032B0BF884E62FBF7EF3FFC89279E9813B6FF3D468F1EDDBD95874C46E170EEDCB96785FFEFF87257BB37BD8048AB353435E6E6C7121DFA99434EFB5270CFAAA783BF9915DC103E5DB92DF46D0B8389442269A8B3FD949797DFA10AC0FE26BA60A5ACACECA45FFFFAD7CF5556561E3C7EFCF87ECDB7C7DB23D19CC3685839EA398CC261D8262EEF6AB5121069FD7F4459F1BA9A4C2AAF2343625149EF60F5A9B18657BFFBD88FFC0900B0272171E8D0A15FA8AFAFFFB759B366FDE3F9E79FDF3072E4C87ED9D99F7EA165B494CDC30F3F3CE777BFFBDDE9D19CC36858B9ABF51C0A88B499BCAC9C0D1F37244B0ECB2BE9B0CFDCD0B029C8C98A57AB3E007BAA79CEF4F7C68E1D3BE9B1C71EBBBDBCBC7CC8A04183169F75D65985871F7E786EAF5EBD0ECACFCF8FD7D6D6AE4E2693EBDE7DF7DD779E7DF6D982AAAAAAE3A3F9EE61303C6FCA9429B3BB728D04445AAD29C8CC7DB766F9B96140ECB0756E16D7FE29FC67D65BAA0FC0DE0A43DEC270776E5959D921151515A3172D5A343C0C80C7067F5E8122BAD0319AA7581B6E3DC2ED956811EC0365EEB58048AB6D694ABDF84AF2CD53CFED35B877477DE6AB1BE7276B33752FA93E00AD150D3B87BB7B9A37423125A0B5B2D2F1A76624E7C5D24DE90EFBCCE7D6CFCAE4A4B7DE8713001010E96C960E7E74654DBAEE8FD3936F75C89CC0FFDD387FF39674ED92CE7C9B3D00101039E03564D277DFB0FCFE9A8EE845FCFEF25F6EAC6F4AFF97AA0380804827F6FE298F3FB5BEB1FABDBB2BA7AD68CFCFB967D5532B3FAEDFB0E2902DABCA551D0004443AB9EC74D3845FADFA4DF7B736BDD72E6B42BD53B3BCE6EE8FA6259A62C12533CF705B37001010E9F4A239810D41E3C46F2CFEC99695756BEADAF2D8D1F1C655DCBCB9B12973C5E2131FAF506D001010D94FBC7FD294F2BA4CDDBF8E5878F586B99B2AD6B5C531176EF9605D74BCDA74EAA74B4F7E7CB22A038080C87E66C9C9E50FA69AEAAEB8B0E287C18F3F7CF88FADB970E5A71F4D79FBABEFFE205D9FA9BF6EE9C9536E535D00687F16CAA65D443D8947CD2A9D3D69F50BBF9AF2F1F4F77F72F8B752A37A7FF198DDFDFD979373165FF3C1BD0D9B1BB6546765678D5D7262B96165001010D9DF35AF5378CEC039A5177CF7FD9F7DEBEA0F7EDEEBB8EE03579CDF6748E2841E47161F9CDBA7283F96E85E93496D595B9FDCF076CD07EB9F5AFB6AF5ECEA770FABCFD4AF09B282FBFBD7544D76410A00088874314B4F2A8FEE78326DE0ECB243E66E7EEF82B9D515A7356505BDB28260DBBD9BB7ED3F6C0A82DF47774859D2BC08F612E5030001912E1C14076FBDD7E55DCD1B00D049B94805000001110000011100000111000001110000011100000111000001118076905202404004F6B9744E3A95579BA7109D40A226313FDC55A904202002FB54434EC30B3D933D332AB1EF1DFCA7832B9A9A9A66AA04202002FB54417DC1C4DE55BD3775DBD24D31F6A1FCEAFC5F75DBD4EDAC4C2673836A00DBCB5602A0233DF4D043D513C64F985BB4AE6864BC31BEA63EB7BE5B3A27EDBEF01D2395A849BCD9FF83FE2F1557168F88C562970D1B366CB6B200DBCB5202605F983163C621E974FAD6F0E1D0A6A6A6012AD261AAA261E5A8E770C488114B9503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E854FE1F5EFD99B91416FC3A0000000049454E44AE426082, NULL);
-INSERT INTO `act_ge_bytearray` VALUES ('302635', 1, 'source', NULL, 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D, NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('142518', 20, 'source', NULL,
+ 0x7B227265736F757263654964223A22313432353137222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F636573735F6C65617665222C226E616D65223A22E8AFB7E58187E6B581E7A88B222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41343530344644322D303230342D343246352D393036312D344134323938324442343938222C2270726F70657274696573223A7B226F766572726964656964223A227374617274222C226E616D65223A227374617274222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A36302C2279223A3235382E373033373033393938313833387D2C2275707065724C656674223A7B2278223A33302C2279223A3232382E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834222C2270726F70657274696573223A7B226F766572726964656964223A227573657231222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223062373632356665646161303565383566323832343836653163396339316239222C2263616E64696461746547726F757073223A5B7B2276616C7565223A226533343665393633363834383463386661376632313763653535306130313836222C226E616D6556616C7565223A22E589AFE7BB8FE79086222C222424686173684B6579223A2231494C227D5D7D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3231392E39393939393939393939393939342C2279223A3238332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3132302C2279223A3230332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3131392E31393533313234393939393939372C2279223A3234332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A36302E363438343337352C2279223A3234332E373033373033393938313833387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31342E3939393939393939393939393939367D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835222C2270726F70657274696573223A7B226F766572726964656964223A227573657232222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A223938623035316230333638316465363032383939336135643134616339336362227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3631302E3039303838323633363434362C2279223A3238332E373033373033313034313134327D2C2275707065724C656674223A7B2278223A3531302E30393038383236333634343631372C2279223A3230332E37303337303331303431313432337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935227D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3735352E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3731352E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3731352E313133303933303035303039392C2279223A3234342E31343432323136333535323135377D2C2275707065724C656674223A7B2278223A3631302E3537383039383232383233392C2279223A3234332E383437313639393931393532327D7D2C22646F636B657273223A5B7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831227D7D2C7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334227D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431302E353435343431333138323233312C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3337302E353435343431333138323233312C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731222C2270726F70657274696573223A7B226F766572726964656964223A2275736572222C226E616D65223A22E8B083E695B4222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332227D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E35343534343133313832323332352C2279223A3434382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3334302E3534353434313331383232332C2279223A3336382E373033373036363437323739327D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345222C2270726F70657274696573223A7B226F766572726964656964223A22656E64222C226E616D65223A22656E64222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3930382E353435343431333138323233322C2279223A3235372E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3838302E353435343431333138323233322C2279223A3232392E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3837392E3932343335323534333835352C2279223A3234342E313431393535363839373437337D2C2275707065724C656674223A7B2278223A3735352E363139363535303932353931322C2279223A3234332E37343938323733303636323033327D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3434312E313234353432383830373233312C2279223A3236342E343831303438303538363234377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A3733362E303435343431333138323233312C2279223A3430382E373033373036363437323739327D2C7B2278223A39392C2279223A34302E3030303030303030303030303033367D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E9878DE696B0E794B3E8AFB7222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334302E3534353434313331383232332C2279223A3430382E373033373036363437323739337D2C2275707065724C656674223A7B2278223A3136392E39393939393939393939393939372C2279223A3238342E363634363432313339373631367D7D2C22646F636B657273223A5B7B2278223A302E393939393939393939393939393939392C2279223A34302E30303030303030303030303030397D2C7B2278223A3136392E39393939393939393939393939372C2279223A3430382E373033373036363437323739337D2C7B2278223A34392E39393939393939393939393939372C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D34363841393635452D393339422D343733312D413232392D353137384436413042423834227D7D2C7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732227D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3330342E39393939393939393939393939342C2279223A3236332E373033373033393938313833387D2C2275707065724C656674223A7B2278223A3236342E39393939393939393939393939342C2279223A3232332E373033373033393938313833387D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E58F96E6B688E8AFB7E58187222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C2275707065724C656674223A7B2278223A3339302E35343534343133313832323331342C2279223A3235382E343330323636363433303536327D7D2C22646F636B657273223A5B7B2278223A35302E3030303030303030303030303131342C2279223A37397D2C7B2278223A3339302E35343534343133313832323331342C2279223A3439342E373033373036363437323739327D2C7B2278223A3839342E353435343431333138323233322C2279223A3439342E373033373036363437323739327D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46313234303339432D394237422D344134382D384531332D413635353335384246443345227D7D2C7B227265736F757263654964223A227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236342E363438343436383730303037352C2279223A3234342E313133343337353334343137367D2C2275707065724C656674223A7B2278223A3232302E36323838393638373939393234352C2279223A3234332E39323238373637313139357D7D2C22646F636B657273223A5B7B2278223A34392E3939393939393939393939393938362C2279223A33392E3939393939393939393939393938367D2C7B2278223A32302E352C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733227D7D2C7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E353435343431333138323233312C2279223A3232332E34303037363130373131373438387D2C2275707065724C656674223A7B2278223A3339302E353435343431333138323233312C2279223A3137322E363031353334383239363530357D7D2C22646F636B657273223A5B7B2278223A3230352E38303433363431303339333632382C2279223A3137312E303333383031323134313530327D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232222C2270726F70657274696573223A7B226F766572726964656964223A226368696C64222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C2269737472616E73616374696F6E223A2266616C7365227D2C227374656E63696C223A7B226964223A2253756250726F63657373227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D39443541314632382D393042372D343644322D414637462D353446464637383631343146222C2270726F70657274696573223A7B226F766572726964656964223A22737374617274222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A34382E3531383531383436343031303338342C2279223A3130312E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A31382E3531383531383436343031303338342C2279223A37312E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333222C2270726F70657274696573223A7B226F766572726964656964223A22616C6C6D616E61676572222C226E616D65223A22E680BBE7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A7B2261737369676E6D656E74223A7B2261737369676E6565223A226438313861633661383663663161363464323138346266303639396436376138227D7D2C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A6E756C6C7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138392E39393939393939393939393939372C2279223A3132362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A38392E39393939393939393939393939372C2279223A34362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C2273657175656E6365666C6F776F72646572223A22227D2C227374656E63696C223A7B226964223A224578636C757369766547617465776179227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635227D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237352C2279223A3130362E30353130343034353136333330337D2C2275707065724C656674223A7B2278223A3233342E39393939393939393939393939372C2279223A36362E30353130343034353136333330337D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3334382C2279223A3130302E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3332302C2279223A37322E30353130343034353136333330347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3236392C2279223A3136337D2C2275707065724C656674223A7B2278223A3234312C2279223A3133357D7D2C22646F636B657273223A5B5D7D5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539362E333439383035343232313539342C2279223A3137322E31303230383039303332363630387D2C2275707065724C656674223A7B2278223A3138342E37343130373732313432383638362C2279223A312E34323130383534373135323032303034652D31347D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3237332E38323738383237343432393137342C2279223A38362E30353130343034353136333330347D2C2275707065724C656674223A7B2278223A3233342E323333353534303139323935382C2279223A38362E30353130343034353136333330347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32333041443633362D423038332D344132412D383446342D464445353430464443314333227D7D2C7B227265736F757263654964223A227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530392E35363538353533373434373936372C2279223A3234342E3134363035383632333436327D2C2275707065724C656674223A7B2278223A3431302E3533343738323038383137322C2279223A3234332E383533313435353137393831367D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A34392E39393939393939393939393939352C2279223A33392E3939393939393939393939393938367D5D2C22746172676574223A7B227265736F757263654964223A227369642D37363845453443392D333233432D343744422D423438302D344230323746333136433835227D7D2C7B227265736F757263654964223A227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3530342E32343839303939393834363832362C2279223A38362E34323734383336353430383030367D2C2275707065724C656674223A7B2278223A3435392E36333934393434333031303534362C2279223A38362E31343333343732343931383630327D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341227D7D2C7B227265736F757263654964223A227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3434302E30383436333334333233383532362C2279223A3133342E333339333232313439353833337D2C2275707065724C656674223A7B2278223A3433392E38353834353834393631383834362C2279223A3130362E303930353433323636373635397D7D2C22646F636B657273223A5B7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244227D7D2C7B227265736F757263654964223A227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339302E39383338303830363836333436332C2279223A3336372E38363338363638373439393039357D2C2275707065724C656674223A7B2278223A3339302E36363935373435363738313135342C2279223A3236342E34383130343334333933333531377D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E3530303030303030303030303030347D2C7B2278223A35302E3030303030303030303030303131342C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42324633433135342D434432322D343230412D424538422D363836444534373531423731227D7D2C7B227265736F757263654964223A227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E4B88DE5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D66616C73657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3337302E363730303939393039323233372C2279223A3234342E31303931303034353732383030387D2C2275707065724C656674223A7B2278223A3330352E33373533343134303839393932352C2279223A3234332E37393833303735333930383735357D7D2C22646F636B657273223A5B7B2278223A32302E352C2279223A32302E357D2C7B2278223A32302C2279223A32307D5D2C22746172676574223A7B227265736F757263654964223A227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535227D7D2C7B227265736F757263654964223A227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5908CE6848F222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22247B666C61673D3D747275657D222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365222C2273686F776469616D6F6E646D61726B6572223A66616C73657D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E323935353338353539393932382C2279223A3232342E34393134393033323031333735337D2C2275707065724C656674223A7B2278223A3139332E35383236343937343733333034362C2279223A3137322E313532383934353937323330387D7D2C22646F636B657273223A5B7B2278223A32302E31363137303636333435343032382C2279223A312E323837353339313237343833333730337D2C7B2278223A362E3530383031393933353239333633372C2279223A3137302E38303635303532363235393035357D5D2C22746172676574223A7B227265736F757263654964223A227369642D30353145353938322D454646442D343337372D423137392D333730343841323346433232227D7D2C7B227265736F757263654964223A227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3431392E333839353234303834323934342C2279223A38362E34363037373339383738363638347D2C2275707065724C656674223A7B2278223A3337352E333639393734303934323739332C2279223A38362E32373032313331363533393932347D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A32302E3530303030303030303030303031342C2279223A32302E357D5D2C22746172676574223A7B227265736F757263654964223A227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('142519', 14, 'source-extra', NULL,
+ 0x89504E470D0A1A0A0000000D49484452000003BF00000221080600000086FB0D1D000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000020004944415478DAECDD097854D5F9C7F17726FB4A080989088208B20B620444145454A854AD08844544C5B58A50A46E55B0EE555BFBB7D52A5A5141826241C50A8A821659944D0908B21804214080908410B2FECF7B3213424820099964327C3FCF739FC9EC933377EEBDBF7B368700A7A0952B575E565454342E3737B77B767676A3C2C24207A50200288FC3E190D0D0D08C9090901F9C4EE7DF3B77EE3C935201807AB83DA708702AF9F2CB2F3B040505CD34C1F7EC264D9A38A3A2A2A4418306620E66281C0040B90A0B0B25333353D2D3D365E7CE9D66175294626E4EECD9B3E7B7940E00107E01AFF3BFFFFDEFB70505051F9C79E69901CD9A35B367F20100A8AA6DDBB6C9962D5B0A222222EE3CEFBCF326532200503FF85104385582AFB978AF73E7CE41717171045F0040B5698BA1989818A709C1FDEFBCF3CE6D93274F5E4DA90000E117A873F3E6CD6B6B2E3EEBD2A54BA81EB0000070B2020303253A3ADAB975EBD67EC3860DFB70EAD4A9BB291500F06E7474C4A9708032F9ACB3CE0A22F802006A527878B898FD4BB0F10EA50100845FA04E7DF6D9675D9C4EE739CD9A35F3A7340000354DC790F0F3F36BF5F9E79FF7A0340080F00BD41987C331F0F4D34F2FA48F2F00C0539A366D1AEC743A8750120040F805EA8C9F9F5FBFE8E8E8284A0200E029515151FE26FCF6A7240080F00BD49982828273E8EB0B00F0A4888808C9CFCF6F4D490000E117A84B814E27AB3900C0830753C5FB1976360040F8050000000080F00B0000000000E1170000000000C22F0000000000845F0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000845F000000000008BF0000000000107E010000000020FC020000000040F8050000000080F00B0000000000E1170000000000C22F0000000080F00B0000000000E1170000000000C22F0000000000845F000000000008BF0000000000107E0100000000A80C7F8A00404D397CF8B07CB7E53BC94ECB16E761CEADD5967CFF7C713472C8392DCE91D3224EA34000000008BF003C65EFBEBDB2227985EC8DD92B07CE3A2087430E5328B52430275022D32365F5CAD5B2AFCD3EE910DF814201000020FC02A8695AE3BB3A79B56C3D73AB6487675320B52C373857D2E2D3242B324B6483485C789CC484C75030000000A5D02E11C0494BD99A227B62F6107CEB584E688EEC6BBC4F92372553180000006550F30BE0A4EDDABD4BD25BA69FF07121BB43242C254CFC33FCA5C8AF4872E27224F3EC4C29F42FA4106B48465486C4FE144B410000009441CD2F8093969B937BC23EBE213B43A4C10F0D24E04080388A1CE2CC774AE8AFA1D2E8BB46E22870508835F55D04E78A338F4D3B000000E117409D08DF126E436F59FE59FE12921A420101000080F00BA09E6F68729DE29F5D712F8B808C000A09000000845F00F5DB099B35D3E517000000845F000000000008BF0000000000107E01D4AD82A00229721455787F6120ED9E01000040F805E0035B9A43A71D2AF72E3BDF6FE31CCA08000000845F00F5DF810E07A420A4E098DB33DA66485E833C0A08000000845F00BEEB8423410300000035C09F2200E06901990112B93E52FC0EF91D735FE44F91E2CC734A668B4C4EC701000080F00BA0FE711439246C6B98846F09AFB886B750247C73B804EF0A9603ED0E486E542E0507000000C22F80FA21E0408034D8D0C05E566A6394E52FD1CBA325FB8C6CC96895412D3000000008BF00BC3FF8C62C8FB1B5BA55E1AE29F6CFF6977D5DF65190000000A831D4AD00A871B68973E1493E1F3849D9D9D9140200002841CD2F801A971B9D2B3B2FDF4941A0CE7CFFFDF7F2CC33CFC8030F3C209D3B77A64000000035BF0000DFB27CF972F9BFFFFB3FE9DFBFBFFCF39FFF9475EBD651280000809A5F0080EFF8EAABAF64DAB4693266CC185BE3DBBE7D7B79E18517E4E1871F96962D5B7AF4BDD7AF5F2FFEFEFE76294F7A7ABAA4A6A64ABF7EFDCABDFF89279E90112346488B162D243F3FBFC2D7010000845F00C0296CD1A24536F86A536777D04D484890912347DA26D07FFEF39F253E3EDE63EFBF74E9521B70BB74E952729BBE5F70707049385EB162C551E177E1C285F6322B2B4BC2C3C3ED750DC89B376F96DB6FBFDD7E7E000040F80500C0FAF0C30F65EEDCB947055FB7DEBD7B8B9F9F9F3CF5D453F2C8238F486C6CACC73E8706DF3E7DFA9404DAB4B43449494991EDDBB74BD3A64D252C2CECA8C7BB1F7BE79D77CA2BAFBC229B366DB24DB5274F9E2C39393925CF030000845FC0EBA4E6EE93CFD3BF936F337E941FB3B7CA9EBC74C92ECC91206780C4044449FBD0E6D235BC8D0C88EE29F181D11418709266CD9A25F3E7CF978913275658B3DBAB572FC9CBCB93C71F7FDCE301D85D9B5B9ABB29B39B06DB3973E6484C4C8CBD7EE18517DAE769D8BDEAAAABECDF5A53FCEBAFBFDAFF8B26D00000107E01AFF1F9FEE53275F767F2EBE13DD23DB29D5CD5E80219D774B00DB8A1CE601B80F7E765CA4F87B6C9E28C6419B1FE717BDFA0D84BE49A46BD2840A01A66CE9C295F7FFDB54C9A34E98481F6924B2E916DDBB6D900FCE4934F4A444484473E93D6FE6A187707DBD5AB57CBB5D75E6B9B33BB6953E8EBAFBF5E9292926C736777EDAE865C0DC09F7CF289ADFD8D8A8AF268F9EDDBB7CF8E8CAD8B968D5ED760AE9F4FCBA759B366D2B1634739F7DC733DDA641C0000C22F500F68D87D74EB1BB6C6F7BEA689727183CEE2E7F03BE6711A80438382E5F4A058B924AAAB3C7CC648F9FAC0F7F2E2AFEF49D2EEF9F24CCB3BA4791007974065BDF6DA6BB69970556A72B5FFAF863B0DBF1A98DDFD716B8ABBEFAEF6ED7DFAE9A7ED6D6FBDF596DC7DF7DDE53E5E3F8B8662773F6177C0D4D7F164F0D5A0ABC15B6B97BB76ED2ADDBA7593C18307DBF70C0D0DB59F2B33335376ECD8214B962CB127195AB76E6D1FE3E981C3000020FC025E68CEBEC5F2D42FEFC8CDF157C94D71FDCB0DBDC7A34159977776CF93A13F3E26F7371B4E2D3050C9E0BB65CB161B7CAB5A837BDB6DB7D9E76B1F60ED23AC61AFA6681F5FADBD2D5DCB6B77B6C769B65CBA9FB09B06664F282828B0A177F1E2C572F5D557CBD8B163252020E098C7E949015DF4A4828E9A7DEBADB7CA82050BE4B9E79E93EEDDBB4B6262628D9F38000080F00B78A905E92BE5F9ED49F272AB3F4897F0D627F55A3734BE5212C2DBCA9D9B5E90C385793238F6120A182887F6DBD5397CB579AE4E5F54DDA6CB1A805F7AE92579F1C51765C28409E506C0EAD2BEBD5A233D65CA14DBF4594780D69AD4F2E8FD5AFBAABEF8E20B3B389706650D98354DCB4CFFDF56AD5AD9105B95D0AF0386F5EDDBD7F69D9E3D7BB6AD351F3F7EBC47FB4E030050D39C140150755AE3FBD82F53645A9B474E3AF8BAB50B6D6E5FEFE59DB3E4C3BD8B2864A09CE0ABE1EDF0E1C3D5AAF12DEB8E3BEEB0A15783A0BE764DD1A0AB4D9E478D1A2503060CB0AF5F7AB0ABD221596DDDBA55DAB66D2B43860CB101586B81753A249DF7D71D8C6B22F86A60D5E6CDDAF4BBBAB5DD5ADBABB5BE1A84B5E67CCF9E3DAC980000C22FE0ABB48FAF36757EB1E53DB6FF6E4DD2D77BA5D5787976DB34D992B383C2064A05CA175E78C136DBD59ADA9A6872ABC1D7DDEC57A717D2D7AE09DAE7576B48DDB47677F9F2E576202BBDCF1D7C1F7BEC315BCB1B141464FBFAEAC0525A9BAA35C53ADAB3F613D6FFF964E9FFA5270DAEB8E20A1BC66B82865F1D955A3F5F45B5DA0000781B9A3D0355F450CA64DBC7B7A66A7CCBD21AE03B9B5C2B0FFFFC9A4C6F378902C7292F3B3BDB0E50A50151FB9E6A58D580A873E39675FBEDB71FD37FB6A2C76AE08D8E8E967BEEB9479E79E6193BBAB2BEBE36F1ADD60ED5045977B82D4D0791D2D19C6FB8E10679F3CD374BC2EF79E79D6743A44E83A4B5B2A56978D6E7FDED6F7F3BE9F2D33EBEDAD4B9A6826FE900AC7D9CF5F5B5961B00006FE74711C0978D1C3972524D8E4CAAD3197D99BE429E6A719BF83B3CF7F3E91CD64ADEDE3D5742FD82A56DE8195E5FCE3AF0D09E26347FF4168D7736F6991179DDC157A7DCD166CA818181F676ADF9D5DB3232326CB82D2C2CB4B7AF5DBB567EFBDBDF8AD379A461D3F3CF3F7F54F35C7DDE75D75D279D3A752A09AD3ACFAE4E2FB471E3463BAD4FE9E757D639E79C639B2F974743F6E8D1A34BA63FD2F7D4C7EAFBE86D1AD84B2FEEEFCFFDFF56978EEAFCDE7BEFC99831636AB45FB39B86EA37DE78C396A5A7A765AA0FDBC177DE79E731B64000E0BD68F60C5481CEE3ABD3190539033CFE5E0F341B6EA740AA0DB366CDB2CD326BAAD9274E4D35BD1E6960D5BEBDCD9B372FB746D63D28944ED5E3A64D705F7EF9E592EB8B162D929F7EFAA9E4BAD6CC6A70BEF4D24B8F7A2D0D863AF2B3865F13607CA64CB556569B27D7E488D6A569590E1C3850A64D9BC60F0000E0F568F60C5492CEE3BBF570AA9D9AA836F48CEC248FA6FCDBF631AEE9BEC56569CD903B0068EDD5E5975F2E6DDAB4F19AA94CF6A6EC95C0B04089882D1EE068C5FB2BA4F979CD25A665CC318FCDD89521E93BD2E58C738FAE312FCC2F94ECF46C098F09AFD27B17E416885F60F9B5FC8BDF5A2CDD8776AFF07EF7635AF66829F16DE2E5D735BFCAE99D4EB7B7EFDBB64FA29B45FBD46FC4BD1E69D0D240AA4D77ABBB1E69F0D5019534E00E1A34A8C2A6C8DA6459477DD6DA536D826BCB7CF162B9E69A6BE4B4D34EB35306951ECC4A3FCB5D77DD556E2DA87E6E0DC08F3FFEB87DEE95575EE935651A1212629B4957A54C75902B1D304BFB357BD225975C623FA74EEFE49EA71800006F44B367F8B49A6CF63C6BEFD712E1172A97459D576B9F7F67EE5EF935374DBA869FEDD1F7F9E0830F8A036261A1ECDCB9D3D696CD9D3B57525252EC4177A3468D8EDB0FD2D3CD9E43A342E5F5E1AF4BE7DF7616FF407F59F8CA42E93EBCFCA96016BDB1481C0E87C49D1D27DF257D678370DACF69F2DFA7FE2B7987F34A42F1C17D0725E5DB14D9BB75AFECFC71A7FCFCEDCFB274EA527BDFBACFD649E6EE4CF965D52FF2E3FC1FE5AC9E67D9DBD37F4D97E0C823A163F7C6DD927B28571A366D58725BD9C72C7B779974BEBAF8734FB9698A240C4A10A79F535E1BF29A741FD6DD7ED69A5657CD9EDDEB9186CD5F7EF9C5AE475F7EF9A5FCFAEBAF366C9E683D72DBB163873CFBECB3B629F2E0C1838FDB045943A0F69F3D74E890ECDDBB578A8A8AECEDAB57AF9675EBD6D941A6DCB769D3639D4AE878D308858585D9FBFFFDEF7FDBA6C975DD7CDC5DA6FA3FBACB544784D6323A51997EF3CD37B6D9748F1E3D3CFA19F5FBD1ED466666A69C7DF6D972AAA2D93300783F6A7E814AFA36E347B9AAD105B5FA9EDD22DAC9F43D5FC8E8F801B5FEFFEA7432CB962DB38B860077AD93F687ACEE8040D5A12155C36FB7A1DD2420284036FE6FA35CF5F0557260E7011B3283C2824A1EABB5B45AF37BD9BD97C9FA05EB8B83A6BFD3D6B286350A930B6FBAF048C8890EB30139796EB274B9A68B048707DB00DCFEF2F6F2DDBEEFA4E505C5A167DDE7EB4A9EB362E60A896F1B2F0E677160CDDC93693F83FB319B166DB2AFABEFAF35CD1AB60BF30A256D4B9AFD3FA29A4495D4126B6076BF8E2FD340F4D5575FD94583AA06CB8484840AD7239DF647FBF85E7DF5D5951EA0496B797FF8E10769D7AE9D242727DBDBB41678FFFEFD257D817544650DB6DAD7F74434243FF4D043F2E8A38FDACFA8359BDE242B2BABA44CF5FFD2705B5E996A595C7041ED6CB3F47BFDECB3CF6A7C502D000008BF401DF8317BABDCD72CB156DFF3EC9066E67D53EAFC7FD75A277710D683EDF6EDDBDB26A17AE98941744AD3A6C26BE7AD953697B4B181B6A8B0487E4DFE55367EBD519A7569265D071EE9EFB974DA52B9F28F57DAE6CD8BDF5C2CCD3A3713FF207FF9E4F14FA4C3951D6C20D530ECD6E0B406E217E0671FA3A1B420AFC006D91DC93B6C4D6D79F475DCB45659436C930E4DECF5B8D671D2A84523FBB706DFCC5D99367C854485D8DB97BEB3D47E367D4FB7C9C326CBF09787DB80EFEBB43FAE3BB4E91CBD3A48D2C5175F5CB21EB983EFD0A143AB1C3875B4E1BFFEF5AFB6E9B20E92654F8694EA27ABC15B1F53D91337B1B1B1B609F49FFFFC67FB9AC7AB2DAE4B7A92CA5DA61AEE3B77EE5C52A65A9E3A276F6D68D2A4891D5C0B0000C22FE003F6E4A54B6C40ED8E66DA3020420EEECD909933677AD5C1F6AA55ABECE20E099EAC5DD2B07A5AFBD36C8D6C695A935ABAFF6ECA772936B86A88DCF4CD2619F4C220C93F9C2F5FBFF6B50CFCCB401B9A678C9B216DFAB4B18159AF6B18D6C09B919A216929693694EAFBE86B9FDDBBB8F966E99A5FADD19DF7DC3C1BBAD5AE0DBB243C3ADC86E07DBFEC939C8C1CE93BAEAFBD4F6BA4835A06D960ADB5C1FA180DBE9BBFD92CD16714F7F5D5D7BA72C295351E7CB566D09BD699F2688DB0F6CDD5C5AEEB0D1BDA75AB3AC157E908CE3A4AF2CA952B8F1AE04A454646DAD7D44058153AD0D61FFFF8471BAA75D0A9B8B838AF2ED383070F1E55A6DAA45EFB4ED7463F5C3D99A1DF290000845FC0076417E648A8B3760780D2F78B48CE970F967CE0BD2705CCC1F5B7DF7E2B2DFAB5F0C8EB6B48AD88BB49AB6A717E0BB979CACDB2E1AB0D72FE90F3252B2DCB2EFD1FE85FF298A12F0D95590FCDB2E1579B1CFFF8C58FB649B23647D6005A999A5FED3FAC81556913EB3697B6B14177CB922DB2F797BD4707BC3D99F6F597BFB75CCE4F3CDFBE47A7AB8AA7D739907A40125F4A94C090C01A2F330D7FEE9313F5853651D690AA73C7569736B95DB06081ED835A7ADDD01A609DFEA83A7470291DFC4AFBDAD637DAD759478B764FE9E4495AB3AE35FB0000107E011FA041B4B603B0BE5F66477F19D8E41A8FBE8F7B509D13D19A24F7E0416E5A1BA6FD0DD324CD239F4D436AD69E2C1B4A5337A4DA5193D5C1BD07E5F48EA71FF5D8ED6BB6DBD0AACD8CB5FF6F5078906D32AD7FFB07FBDBA6D2DABFD7AD63FF8E92B5374B5AF56A6503ACD6CC96AEF9D57EC01A608F0ADCF98525B5C13BD7ED94D006A1F6B5F5EFC8F8C892C76918D6C1B734F0260C4E3826E436886FE091E0AB74D0A1BA1CF0AA3AB4E6579B2B6BD3FAEA3631D626CD5A7B5C3AF82ABDADEC7A5B591B366CB08339697FF7BAA8F9AD4C99EAEF5297B2FFB79E04D0FED0B54183AFB78C0E0F0000E1173849DAE4599B3E370FAABDA93CF6E7654A58A348B9FED2EBEBEC00BB74E0D54BEDFFA835491A06B47FA1F6D59C3F7FBEC7C26F6CCBE2699E34446AB3620D99DAFC58A73ADAB3F9C808D35A433CFBE1D9B66FF0B9D79D5BD20F57BD3DFA6D19F9FAC8639A4E977EAE8EECDCF692B63628BB9B43EFDFBE5F0EEE3F2851A71F69EEAECDB0DDAF53BAE6578372E99A5F1D304B97997F3C7EF363AD9DAEEAF44B27A273D99E4C0D6A6D84DFF2D623779F5F0DC1D569FAFCE1871F96F4F72D4DFBACBFF2CA2B72DF7DF755E9F5F4F3FCE52F7F915B6EB9457AF6EC5927DB9DCAFC36DD4BD932D526DBB515D8B5C9B3367D060080F00BF88076A1CDEDA057B5197E7F3AB4CDBC6F8B5AFF5FB506CD3D58901E546B8D8E1E4C6BDF5E3DB8D683ECDAE01EE04AFBE416362DB4CD95577EB0D2DEA7FD6D359CEA3CBAC3FE31CCD6108FF9EF187BA9E15547856E7D51EB0A5F5B43AED6E06E5EBCD986081D195A03F0E1ECC3B27BD36E1BB6B5E638A441C851CFD39AE7F26A7E752E621D3DFA8421614FA6ED1F5C12B0566C3D6A102D5F76A2F548FBD83EF2C823767E5F559500AC53FF7CF2C927929B9B7BE44445A9E6CF3AF5918E7EDCB163C74ABD9E36E77FE6996764C4881175167CCBDD69FBFBDB305F99DFA696A706F8DAE8F3ABE5AFFDAE010020FC023EA05B643B599C912CFD1AD6DEA8AFDF66FE68A73BAA6D1A7CDDD3D2E8F4295DBB76F5F8A8CE65E564E6D8519AC7CE1D2B2B3E582105F9C561DC3DBAF3EA0F57CB75CF5C676B4E6D58D9BC473E7BE133898C8B9433BB9D59612DEF8EB53B6CAD704E568E0DB9EEE0ACCEEC7E667140DD9D696B6D75A02A7D7C695AEBEC56BAE6B72C6D429D7B3057F20EE515071513E2B7FFB05D56CF5E2D17DD7A917D7FA503616D5BBDAD64102D5F0CBC55598F3440E908CB1A807500A7CA4E9DF3AF7FFDCB3EBEF4FBEA929E9E5EB24EBFF4D24BF2EAABAF9EF8044566A67D7F9D63D8DBA639D2E05BD932D5A0AF0375D5C648D5DA5C5DA79A020080F00BF880CBA3CE9737523F9182A202F173D4CE3CB79FEF5F2E6FB579A8D6FE47AD35D211717BF7EE6D2F6BAB86B7DCD014112CE3BF1C6FFF3EEB82B3E4F3BF7D2EDF7FF47D49903CADDD69F6EFDE77F6B697B167C54ABF3FF62B996A68CD276B6C13650DB6DACFD75D5B9B9B9D2B118D23242236A224C86A1F5FED1BEC6E7EAC4D98B546D686F08C1C3B976F74B3E8634F12E415D8F0AA531C1D539651A17664670DE5EE707CCDE3D794D4F2F6BAA5972C9DBAD4F651D6E9927CC9C9AE473A82B8CEB3FBF8E38FDB66CC1A428F67CE9C39B6E6B1749F570D7E3AF54F4A4A8AADFDB4272B3232E4F5D75F97D1A34757F85AEE1A5F1D39DA9B826F75CA5483F1F4E9D3252F2FCFA327AFF4C482866C3D69010000E117F001F181D1B6C9F3D707BE974BA2BA7AFCFD1667AC91D88006727A50ACC7DF4BC385060EAD21AAED1ADECAD0409BF8F7C44A3DCECD3DAA7265680D6FB7A1DDAAFCB97A0CEF61E707AE887E86D29FA374F3E68A6AA6EBB39A5C8FF475DC4DA035BCE97CB5E5CDD1AB35BB1A7E4BD7FA6A9FE7DB6EBBCD7E86FBEFBFDF8E22ADC1577DFDF5D7D2AF5F3F69DAB4E931AFA5415B836FEBD6AD2B5DE3ECCD651A1D1D2D6DDBB6952FBFFCD2CECBED293AC2768B162D6AA57935000027C34911009537A2F115F2FCF6245BFBEB69FA3E898D6B67D0A2DFFDEE7776901C6F0CBEDEEC78C1F75454D3EB91BB06586B15274F9E5CD20FBDB4BFFFFDEF72E8D0A192EBFADE43860CB1832F69F3E061C3861D350AB106E9679F7DF698D7D1DB35F8EA28D9B7DE7A6BB941BB3E96A99E34F8E8A38FCA1D08AC26E828CF3A2897BE0F0000845FC0875CDE30411AFA47C89BBB3EF5E8FBBCB37B9E0439026440F405143A4E691A80274E9C689B2F970DC01A8A5353538F1AE44AE7E42D3DD2B5D6986A4DAED682BAE99CC23A3856E900A7A34C3769D244EEB8E30EAF09BE3541FB50EB805D3367CEF4C8EBCF9E3DDB96715D4CAD050000E117F0B067CFBC43FE9DFA89ACCEDAE891D7D711A55FD9315B9E3CF3B65AEB5B0C78B3A8A82879F4D1476DBFDE175F7CD106606DEEFCC20B2F940C68E576EFBDF71EF37CADFDDDB7EFC808DBFAFCA953A7DADBDC0361694DB137D5F8D624AD95DDB469937CFA69CD9EB4D3E6CE3A8A36B5BE0080FA823EBF4015691FDC87CEB841C66E7949A6B579A446FBE4FE7A788FDCB9E905B9BFD9706919DC84C2065C748027ED03AC8157C3EAEF7FFF7B3B98536568AD6F458FD551A2B5C9F38409137C32F82AFDBFC68E1D2B93264DB2D7FBF7EF5F23C157C3B4965BE966E5000078336A7E816A1810DD53C6341928C3373C5E6335C05AE3ABAF3734F632B9A6512F0A192843FBBD8E1F3FDE86D5E79E7BCE36573E19494949B6F657039CAFF777D713001A7E972C59226FBFFD76B5CB4E9FA7E5366FDE3C5B6EDA2C1D0000C22FE0E3AE8BE92DF7354D94DB363E27AFA7CE39A941B0B48FEF2D3F3D6303F5EDA75D43E102C709C05A8BA9CD947524E8EA86B869D3A6C9BA75EBEC6B9D2A03BD6900D6FED35A13AC271134C09637885879F4715ADB3B6EDC385BE61AA409BE0080FA8666CFC049D01AE073C35ACB4329936556DAD7B6B9F2C50D3A57FAF93A9DD1DF7E7DDFFC109D32B5ED233475062A1980EFB9E71E79EDB5D76C087BF8E1876D18AEAC59B366C99A356BEC734FB526BB1A7C870F37DBA98B2FB62700B4165707AC4A4848B0D33FE9B450DAC45C036E6666A61D504C6B8B57AD5A6507CFFAC31FFE600710030080F00B9C82B4CFEF5B6D1E92B9FB97C91BA99FC8A35BDFB001F8A2C8CE72766853890D88925067B06417E6C8FEBC4CD99CB343966424CBE7FB97DB797CDDCD9C19DC0AA81A9DCB5703B0865FED0F5C999A480DBE5A83A9A33B9FCA7D5535C83EF0C003B6D9F7CA952BE5ABAFBE92EDDBB7DB01C434F86AD9E809051D01BB63C78E72F5D557338F2F0080F00BA058BF86DDED929ABBCF06E18FF62E9235DBB6485A5EBA1C2ECC932067809D26A95D680BE916D1CE06E69A1C2C0B385503F0942953E4F1C71FB773021F2FA0CD9F3F5F3EFBEC33F9F39FFF5CA59A625FA64DA1756AA8D2D343010040F8055029F181D1322AAEBF5D0078DEA851A36C935DED035C5100D69ACD8F3EFAC8D676D2571500805313035E0100EA3DADB91C3C78B09D0F78CB962D47DDB77CF972DBBF558371F3E6CD292C000008BF0000D45FBD7AF5B28339697F5E1DC9592D5BB64CDE78E30D5BE34B9F5500004E6D347B0600F88CDEBD7B4B585898FCF5AF7F95B8B838D9B56B971DA1B865CB96140E0000A7386A7E01003E45A7ED39F7DC736DF367BD6CDFBE3D8502000008BF0000DFA3B5BEA52F01000008BF00009F939F9F6F2F030202280C000040F80500F8A68C8C0C7B1919194961000000C22F00C03715161616EFE49CECE6000000E1170000000040F80500A07E4A4F4FB7975151511406000020FC02007C535E5E9EBD64C02B000040F8050078B5ACAC2C993061C231B7A7A5A5C9A041832435359542020000845F0040FDB57AF56A090F0F97B3CE3AABA409B3DB942953E4F1C71F97F8F8F80A9F4FCD2F000028CB9F220000789B175E7841DE7CF34D69DBB6AD3CF9E493929C9C6CC370AB56ADE4C61B6F94EDDBB7CBA64D9B64C08001E53E3F3333D35E46444450980000C0A2E61700E075AEBAEA2A19376E9C6DDAAC7FDF7FFFFDF2DC73CF499B366D6C20EED1A3877CF3CD37153EBFA0A0C05EFAF9F95198000080F00B00F03E5AA3ABFD7A1F7EF8E172FBF53EFFFCF39293932341414114160000A8349A3D0300BCCAA2458B6C13E7E0E060E9D8B163C9ED7ADB575F7D25975D7659C914461F7EF8A124252555F85A63C68C39EAFAC08103E5FAEBAFA7900100380551F30B00F02AA3468DB2E1F6C1071F94F5EBD797DC1E131323C3870F973E7DFA88BFBFBF1C3E7C585AB46851A5D73EDE20590000C0B751F30B00F03A5ACBFBCA2BAFC8C2850B6D13686DE69C9292629B41CF983143F2F3F3E5CA2BAF94CE9D3BDB41ADDC035C1D8F3693EEDEBD3B850B0000E11700AA27242444427342253B389BC2A863813981E20870D4FBFF43C3AD9B065FBDAE41586B7F75B467BDD481AF544242822C58B040020303253737B7C2D7D426D44CF642C5FD00002000494441547D040000E11700AA2D363656CECE3C5B5607AFA630EA58C3030D25BA6174BDFF3FFAF5EB672FB3B2B264C4881147DDA761F89E7BEEB135BFDA7FF7820B2EB0E1B7A8A8E8B8AF79E9A597B282000040F80580EA6BDEBCB9ECFA76979C1579966C0EDA4C81D491E09C6089DB1D276D12DAF8CCFFD4B76FDF63FFCFE060DB24DA5D3BAC35C0DA47383D3DBDC2D7D15A61774D310000383531E0158093A67D293B74E8200D363690F3D3CE9726B94DCCC685CD4B6D093F1C2E6DF6B491B69BDA4AA7F69D243434D47702BD09BAE5D101AFDCF7695366EDFBAB2A9AD757E705F6A5720100005547CD2F801A111D1D2DDDBA7593CD9B374BD1A6226978A82185524BB456B361C38672D67967F944C09B33678E9DD2282C2CACE4B6A64D9BDAC05B9AD60AEBEDEAE28B2FB6CFA948D7AE5D5951000020FC0240CDD01AE0F6EDDB53103829AD5AB5B2CD98DDC1569B37EB28CFA507C15ABD7AB5EDF73B6BD62C7BBD4D9B3636F8676767977B7280F00B000008BF0000AFA2CD9935F8CE9E3D5BAEBDF65A7B5D9B2D97AEF9D581B0F436376DEE7CD14517C9BC79F3C4E9744A616161C97D5DBA74619467000040F8050078A73E7DFAD8CBA4A42459BB76ADFD7BD3A64DB6B65783AF4E7754DA39E79C63C36F593D7BF6A430010000E11700E09DB4E9B3D2797CEFBBEF3EFBF79429538E09BD6E3AE895F63DDFB76F5FC96D5A6BDCA953270A130000301C2B00C0BB68FFDEF8F8F82A3F4F9B3E970DBA5A1BCC28CF00004051F30B00F02A393939B6C676FBF6EDB6EFEFFAF5EB65E1C285F6BEEFBFFFDE36876ED1A245B9CF2D3BEAB3F60306000020FC0200BC7707E51AE0EAFAEBAFB74DA0F5BAD60A87878757F89CD6AD5B1F75DD3DFF2F000000E11700E055742467EDDBABB4D65769E02DDBD757AF77ECD8F1A8DB7454E7264D9AC88E1D3B24363696519E010000E11700E09DB496372D2DED9840AC8B9BCEF9ABC158C3AF0E70A5CDA175D9B66D5BC9730F1C382063C68C9166CD9AD9C79D7BEEB9D5EA4B0C000008BF0000D4B85EBD7AD9E54434E83EF7DC73360477EDDA55BA75EB2683070FB6E15907B9D2BEC3999999B61678C992253273E64CDB2C5A1FD3B2654B0A1A0000C22F0000754B6B76DD7D7ECB2A2828B073FF2E5EBC58AEBEFA6A193B766CB9CD9B75D02C5DB4F9B3F6FDBDF5D65B65C18205363077EFDE5D121313EDFD000080F00B0040AD9B306182FCFEF7BF3F6A44671DE86AD0A041D2BF7F7F5BA3DBAA552B1B62AB328D914E85D4B76F5F5BAB3C7BF66C993469928C1F3FDE86630000E0FB98E71700E055860F1F7ED475AD05BEE79E7BE40F7FF8830DC1DABC79E4C891D59EBF576B7BB5D65783F0534F3D257BF6ECA1D0010020FC020050BBB4CF6E69FFF8C73FE491471E9155AB56C915575C2103060CA891F7D1F07BD55557C90B2FBC606B93010000E11700803A919E9E6E43EA9A356B6C53E79A0ABEA50370972E5D6C1F62000040F80500A0D6E894460F3EF8A06CDAB449E6CC9923EBD6AD93FFFCE73F121717270B172E2C59B66FDF5E23EF77EDB5D7CAB265CB64EBD6AD143E00003E8C01AF00005E45E7E9EDDDBBB7DC79E79D929C9C2CE79F7FBE0DBE3A5D51695A2BDCB469D3937E3FED033C70E04099366D9A3CF4D0437C010000107E0100A81D23468C903BEEB843A64E9D6A03E937DF7C23CD9A35F3D8FB5D72C925F2DE7BEFD901B5E2E3E3F9020000F041347B0600789DF0F0707BA941546B8075A4E79494148FBD9F4E8394909020CB972FA7F0010020FC020050BBB4D9F3A5975E2A93274F96575F7DD54E7BE429DDBB77971F7FFC9142070080F00B0040EDD041AF940E42D5BC79733BFDD1C48913ED00589ED2A44913D9B66D1B850F0000E1170000CFEBD1A34749B3671DD42A3232D2FEAD0353E97D9EAAFD8D888890CCCC4CBE0000007C14035E0100BC8A865CB79C9C1C090D0D2DB9EEC9C1A8F47DF5FD0000806FA2E61700E0D541383B3BBB56DE4B836FE9E00D000008BF0000D40AEDEB9B9191512BEFA54D9EB5E933000020FC020050AB74B02B1DF4AA36ECD8B1C3A37309030000C22F0000E5EAD8B163ADCDBDBB6CD93269D7AE1D850E0000E1170080DAD5B56B5759B972A5E4E5E579F47D0A0A0A6CC84E4848A0D0010020FC020050BBA2A3A3A56DDBB6F2E5975F7AF47D162C58202D5AB4F0E868D2000080F00B004085121313E5A38F3EF2D8A8CF3ACAF3071F7C60DF070000107E0100A8133A0855CF9E3D65E6CC991E79FDD9B3674BF7EEDDA565CB9614360000845F0000EA8ED6CA6EDAB4493EFDF4D31A7D5D6DEEBC7AF56A6A7D010020FC020050F7FCFCFC64ECD8B136FCD65400D6E0ABAF357EFC78090E0EA690010020FC020050F774F0AB499326C992254BE4EDB7DFB67D75AB439F97949424F3E6CD93091326486C6C2C850B0000E1170000EF0AC013274EB435C15A63AB0156A729AA0C7D9CD6F68E1B37CE06600DD2045F00004E1DFE140100A03ED1E03B7CF870B9F8E28B65DAB469B6165707ACD2397A9B366D2A919191121A1A6A036E6666A6A4A6A6DADAE255AB56D9C1B3FEF0873F48EBD6AD2948000008BF804F395C585818E474D2C801F0351A641F78E001D9B76F9FAC5CB952BEFAEA2BD9BE7DBBA4A7A7DBE0ABFD78232222A4499326D2B16347B9FAEAAB99C7171E61F6337A5140490000E117A84BDFEDDFBFBF4DA3468D68DB08F8286D0ADDB76F5FBB0075213333B3C0E170FC4049008077A33A0CBE6EE1EEDDBBB7530C00004F494B4BDB5E5454F405250100845FA0CE9883910F5253534F3397F9940600C013B66FDFEE672E3EA0240080F00BD4992BAEB862754141C1EA8D1B372EA7340000356DCB962D9BF3F2F2365C7EF9E54B290D0020FC0275AAB0B070DC2FBFFCD272FFFEFD347F0600D4984CE3E79F7F6E60F63363290D00F07E7E14017CDDD4A953D36EBCF1C6D5A9A9A9BF8D8A8ACA0A090989A4540000271B7C972F5F9E51545474EB15575CB188120100C22FE015DE7EFBED2D23478E4CDEB163C7D0DCDCDCEF1A356AD4D4E170D0F2010050659B366D5AB176EDDA30F3E7AD7DFBF69D43890000E117F0BA003C62C4888F3233332FDBBA756BF8C18307576CD9B2C53179F2E406E63687CE071A1A1A2ACC098C53D99E3D7BE4D34F3F95D8D858090B0BA34000299EC7373D3D7DBBD977FC989C9C9CB76FDFBE1DE6B661D4F80240FDE2A008702AFAECB3CFBA381C8E81B366CD1A630E624A9A4107040448545494346EDCB8E45243B1DE0E9C0A56AE5C29AB56AD9273CF3D57BA76ED4A8100C574C680D5665968960F18DC0A0008BF40BD337CF8F01E0505054B4EF0B002B3AC3561799DB95C6696F54141414BA74C99924E09C2D72426264E321713CDF2585252D2244A040000F80A9A3DE394B666CD9AED1D3B767CCB04DBEBCDD58A06C2D276D07166E968967E6619919F9FFF8079DE1D1D3A74E8B576EDDA1994247C8559AFFB980B5DBE4A4E4E5E48890000005F41E7469CF2929292529C4EE705E6CF942A3E35DE84E66B294100000080F00BD40BD3A64DD339802FA96A0036C199AE0300000000E117A83FB406D8CFCFEFA2CA06E0A2A2A27C4A0D00000020FC02F58ED600BB02F0D6133D76C68C190C010D000000107E81FA1B80A578C09FE306E0C4C4C48F870C19D291120300000008BF40BDE46A02DDCBE1706C29E7EE22B364996580B9FF3B9D1A66D0A041E1941A00000040F805EA1DAD012E2A2ABACCFCF96B9960EC34C1B89DF973AE5982CD32D15CDF6842F07D7DFAF4F1A7E400000000C22F50AF680DB0B9E865966D6583B1B9AFBF148F10BDC82CF166792E3E3E7E8909C17D2839000000C0BBF85104C0F1252727A777ECD87196F9738409BC6165EE4B31CB9B9D3A75D2DAE1AE66696B96511D3A74E8626EDB6CEEDB4109A23E31EB7A1F29EEF3FE95597F175222000080F00B9C6201B873E7CED3D7AC599351C1FD2B131212DECCCFCFD766CFE7381C8E73CCE548132402CCEDAB8D1C4A11845F000000C22FE0F52A0ABE6E1A704D58F8BC5DBB766F9AF0DBCA2C3A12741F1388479B40516442F04AF318E60606E117000080F00BD47FEBD6ADCB5ABB76ED0C1322BE32577B98E50CB35C6142703F73DB466D2A4D2981F00B000040F8057C8286DC98989857C3C3C37F365713C4D51FD8848B1E9D3A755A61EE4FA39440F805000020FC02F55E4A4A4AA10910AB4DD87D478A4757D7BEC0EDCD32DADC16DEAE5DBB65EBD6ADCBA5A440F805000020FC02F59E0911D9DA1FB873E7CEEF1415159DE10AC0173B9DCE61266C1CD0804C2981F00B000040F8057C820E9A6502C5FBEDDBB75FE270387A9A9B5A9AE55A1338AE37B76D5CBB76ED164A09845F000000C22FE01334E4C6C4C4BC121E1EBEB3A8A8A89709C2679845A7464AE8D4A9D32AFA0383F00B000040F8057C82AB3FF0F2F3CF3FFFD5828202BD494786D641B1746AA48076EDDA2DA73F3008BF000000845FC027B8E607FEA253A74EEF9BABF1523C28561FFA0383F00B000040F8057C8E3675D6FEC0A5E6076E25DED31F38DE15887EE29B22FC020000107E01D44408B6F303474444EC97E2F9815B78417FE0A7CD72403F8B59B69B85E6D8845F000000C22F8093E3EA0FBC34212161727E7E7E94B9A98BD45D7FE08EAEF77FD62CEBCD72B1144FD5442D30E117000080F00BE0E4B9FA037F6202C93BE6AABF59BA99E5D25AEE0FFC86591E7705DE40B32C37CB2F6619609670B3ECE09B22FC020000107E019C341342D2CDF2E939E79CF371515191D6006B4D6C6DF407D666D73A14F57FCD926D962CB3F435CB3E5708769AE50A291EA42B996F8AF00B0000E0AD9C1401507FBCFBEEBBAB9392922E71381CBF33575334AB389DCECF1313135F193E7C78530FBCE5ED66F9872B043F679618B3CC318BBE978E4E9D2FC50373C5F0ED000000C09B51F30BD443C9C9C9EB1312125ECDCFCF2F282A2AEA62C2702F73795BC78E1D836AB03FF008B3AC90E2BEBD6F99E55E57C8EDE90ABD7F334BB4596E31CBFD6629E49BA9FFA8F9050000BE8A9A5FA09E9A32654A4E5252D224A7D3D9DA5C9D6A9660B34CF4F3F35B93989838EA245F5EFBF25E6596F9AE10AC035DA54A715367BDEF3257007ED82C8FB9FE76D35AE278D7DF7AE9CFB705000080BA46CD2F50CF252727679B6596AB3FB08ECCACFD6F4FB63FF03FCDF292144F6B146996196619EC0ABE774A7173E8AE523C12F49BAEE7685FE00CB36C72DDDECB157E2F768566D403D4FC0200005FE5A0084E0D0B162C689A979F77BFF8C9404781E3344AA4D6EC32CBAC82828217FAF5EBB7A936DE70C89021031C0E8706D716AE9B669A65425252524A155E4683EBA2726ED7F97EE7994543D1FFCC32488A6B84DD125C0159F5308BCE499C23C535D3A80712131327998B8966794C5B1650223EBE5F28C89B608E04AE77143A9A5022B5A3488A763BC4F19FDADC2F000008BFA78CCFBFFCFCCA7CC97F7F7FE3FD21071A1EF03F1C729842A92581398187635263BE6DB8B7614B1348EFE8DBB7EF9CDA78DF41830685FBFBFB3F5C545474B72B8CE698F77F313F3FFFC9F7DF7F3FAB06DEE20EB3E8FCC3CF94B95D6B819F74055F0DBDDA6C5A07CA5A6696E6667984B582F08BBA377FFEFCBEF98EFC99FBE2F60599FD4230FB855ADC2F1C0E2C88D915F343D49EA838A7C3797B6DED170000347BF6797A663FD791BB785BAB6D61E98DD29D050105144A2D2AF02FF0CF8CCA6C7E30F2E08F0DF634183A7CF8F08FA74E9DBACFD3EFAB035E2527277FD1B973E7774C00D641A9B446B697D3E91CDCA143879FD7AE5DFB53355E5643F4A552DC145A07BBD2E6CFA5FBFA8E35CB41296EF6ACFD7CB5B9F548B37C60968FCCB2CA1588E1C568F67C6AEC17F21C798B7E69FD4B84D92FF8B35FA8F5FD8233B341E669590DB276344C6B789DD92F7C541BFB050000035EF9BCF4D0F4A9FB1BEF0FCE0ECFA630EA9029FFEE99D1993F98F0F9786DBEEFB469D3B6272525DDE470382E322178B5B9A995F9FBE3C4C4C44F870C19D2B18A2FA735C617BA42EC936582ACD6020F94E2699174EAA314291E806BA1EB3E1D346B346B0250F7B282B25EDE17B72F8CFD42DD3A1476A8CDFE98FDBFD4F67E010008BFF059C187827B1C883A70E207168A04A6074AE0BE4071E6B35A78C2AED37669F0EC5317EF3D7DFAF4453366CC38D7BCFF0D525C33DBCFFCBDCA04E0C9559C1FF859B35C2EC573FDBA69FFE070D77DFA779AEBF616AEBFB59FF04C57580E664D00EA56406EC0A595D92F388A1C47F60BB9EC173C212D2EAD435DED1700E054C41424BEFE05E7F9079DA82F57D8D630094F092F39B829F22B92CCB332E560F38314600DCA0DC93DBBAE3F8309C153FBF4E99374DA69A73D5E5454749F39E81A5D505030223131F1D9E0E0E06774FAA413BC44966B71D33EBE3A17B03685BED22CE3CCF227B3682DB34E8FA4A3423FE80ABEFF602DF02E43860C79C0AC034F5770F744B35E4C2C731BFD807D805F9E5F5855F70B7AAAFC60B38392D93A538A1C4514624DED1782737534FD484A02006A07A7724F71C1A9C112F953E45167F51D050E7B5BC8CE100AC8072D5CB830DF84E0074DE86D67824F92B8E607CEC9C9593574E8D07E557CB99B5CA156FB00BBE7FBED6096D9AED7D5652EA5EEA53B00A77375551E6FD61746A63D45F70BDA3A480371D8CF6114100080F08BFA293435B4C2FB4276107E7DD9FBEFBFBFC984E0A14545451748F13CBC6DCDDF9F9A00FCF9B061C3BA54F1E56E35CBF566D1F0AC4DABB59F6F8A59DEA0A4BD97F9FEF5C4445A651E6BD68DF4A0A0A09994DA29BE5FE0A4280080F08BFACAEF60C5037EFB1FA255FCA960C68C194B939292CE77F5074E3521A76F6161E1778989896F0E1A3428BE922FA301EA5F52DC245A9BD13EECBA6D3C25ECDDCCF73DBB920F5D588966F1F0F5FD4236FB050000E117F5940E680228ED0F5C5050D05A8E345F1EE5E7E7F7F3D0A1439FD679832BF9328BA4B8DFEF0CD7756DF61C4EE97A75F89D51C987528BCF7E010000C22F00DFF0FEFBEF67E9804626F4B676F70736E1E801735D47861E5085975AEEBAFC9D1C3D4016BC4C6868A89EB0483DC1C3B242424216515A000080F08B7AEB78A37632A2E7A94BE7072ED31FD83D3FF0826AF40786177335653ED1A06433CDE3D2292DF60BEC170000845FD45B79E17915DE57105640019DE2CAF607364B9FC2C2C255DA1FB88AF303C3BBBD7582FB3FA188D82FB05F0000107E51AF65B5CE92FCD0FC636ED7DB32CFCCA4806095E90FAC3585A3CCF58D26043F376AD4A8284AA87E4B4D4D5DA4A33957B499080E0E9E4329B15F280C2C948CB33328200000E117F5931EE0E446E51E73BBDE96D7208F024289F2FA039BE5BE9C9C9C1F870E1D7A2D25547FE9DCCFE63B9D5AC1DD7319E599FD82BD3D3C5F0E373A4C01010008BFA8A72B40BE53020E061C737B406680BD0F28AB9CFEC0F1E6EF59DA1FD82C099450FD64BEC37915DC3583D239B5380A1CE5EE17740A24BF437E14100080F08BFA2738355862FF172B0107CA0FBF7A5FE88E50A6BD40F989A89CFEC066B1F3039BA5052554BFECDAB54B07BDDA5E2610A7070707CFA7744EA1FDC26EB35F5852FE7EC1EFB09F345EDC58C253C2D92F000008BFA81FF400267A75B4345CD3F0B8B5BB7A5F83B50D247A653467FB51A1F2FA039BE5C7214386FC8DFEC0F587367D361747055D87C3319F519E4F918301B3BDD77D42C3EF1B1E7F7B5F2812B131426296C6D893A40000107EE1B5C2B68549EC37B112B427A8D2CF09DC17686B02C2B6865180285779FD81CDE5D89C9C9C8D2604275242F5C65B65C2EF348AC4F785EC0EB1FB056D0D5459FE59FED268592389D81C412D300080F00BEF14B93ED2F6E7AA2A7D4EE44F9114208EAB9CFEC03126404D4F4C4CFC9F09C13DF431D4067BAFE0E0E0A5A5AF070505CDA5547C5FC44F11E2CCADFAE18086DEF02DE1E2CCE15002A82AF68500E117B520373AF7A416A032CAE90FDCCBFCBD64E8D0A15FE6E4E4EC3797FD2825EFE31AD579BDFBFAE1C387FB502ABE4F47F63F99FD42915F11850854C1E8D1A37FC3BE10A81BFE14C1A965EF797B2904D41AED0F3C68D0A0D97E7E7EF799AB0F1615155D72DA69A715ECDEBD7BE6B061C37ABDFBEEBBAB2925EF121414F47C7E7EFE6BAD5BB74EFBF1C71FB5D6FEF2A4A4A4E5948CEFDADF693F8500D492BBEEBAABE7A143876675EFDE7DDBD2A54BD9C602B58C9A5F001EA5FD819D4EA706E0C39D3A752AFCE31FFFE8376EDC381D29E77F4C8DE45D6EBCF1C6ABCCC52BB7DE7AAB73E2C4898D478C18F193C3E1983368D0A056940E009CFC36F6E0C1830BCD65E0D8B1639BB18D0508BF007CCCD0A143DB9A9DFBC251A346F93DF4D043CEF8F87839EFBCF3026FB9E516A7BFBFFF275E322D528C59EE2875BD8B59F460A445054B5BB31CAFB9DA9F5C8F53F5A25FD74D37DDD4BBA8A8E83F7A62A277EFDEF6B601030674EBD7AFDF4EF33DCD370767F11EFE085ADEE1C7B95F47633ADEC9927EAED750B46A02C036B666B7B17DCD12CF3616F51D2B2F008FD1601B1414F4C575D75D17D6B76FDFA3B637975E7A69A85E4E993265B1795CCFA4A4A4140F7D0C0D9F3AE2748EEB7A9A2BBC5E6896BF977ADC7AD7CE3FC7157EF5726905AFA9F79F6796B9650E0C74BAA08E660972BDA70E91DE548A47515EE8ADDFD36DB7DD76456161E147B7DF7E7B60E7CE9D8FBA6FE4C8915DD2D3D3D72C5EBCF85373707691D6E47BE863E84197BEF9BC0AEED7832E3D622CDD3C7080EBC445B0EBFE04D7F7A8DFEDB4328F058053791BDBCB2C6D6A601BBB896D2C08BF1ED46AE9F0A6457EF9D78648F0150552704E415161E342290C7138E4B0439CBB0BA560455191E31B47A15FD2A61ED3B6F39502DE137C838383BFF9CD6F7ED3F8B7BFFD6DB9DB1A0DC03939398EE9D3A72F328FEFE5A100ACF3D4FEABCC6DC3CDF2E40976DCA9AE305BFAB3B7708559DDD61C2CF3F8F9A55EFB4157E8BEC52C37B90E1CDCCFF32A37DC70C395870F1FFEF8EEBBEF0E484828FFA4FF9831633A656464FCB876EDDAE97DFAF4F99D6B4EE09A96EA2AA785E59CBCE8EB3A11D1B6CC7D735C976F9A659CEBEFA75D7FEBC90BADE5C8E2D708806DACB5816D2C08BF5EEAAC6543AF8D0E8878D8298ED63D1B7428BCA261B78667873493F8C0680975064B76614ED0FEBCCC663F1CDCEC98B36F71ABFF1DF8616CAB6F13378A38DED8D46DFA54BE5AA0EEE8140E0E8763C1E5975FDE78D0A041C7DDCE98701C92959515F6D1471F2D3101F8020FD600BB69D3AF6BA5F8ACF589C4B8C2B35B8A6B6951EA360D6C7DE448CDF257525CFBAB61F70BD77D7A4071BA591E73056AAFE01A78E5233D28EBDAB5EB711FFBE0830FB69B306142585151D12BE6E0EC4E0F1E9CF529E7B6B432FBABB265BE428A6B24F4BBFDC02C3D5C7F7730CB046F2A7300A70EB6B1A84BC3870F6F5A5858D8CFAC5357FAF9F97531974DCCF550A7D3996D8ED1F699BFBF370F9B9F9F9F3FE7FDF7DFDF44F8AD236D9724B6880A6E30C304DC0E7F3A6364D8C50D3A8B9FC3EF98C769000E0D0A96D383629BF68FEEA10799F2DF7D4B331FDDFAFAA3AD9725DE5EE85F70D3E6F34E9D2F12F0A6E06B36B2CB1212124E1F3C7870A5B631E67151070F1E3CF0C5175F2C3161F95CB3114EF5E0479C689629527CB65A9B81E999EB8AE6B3D5A0ABCDBEDC35B6BAF39F59EA80405C7FCF75056AFF528FCD7705E06BA4B8F637DD9BBE27AD8DD083B29B6FBE39F0440765CA7CA7F2C4134F9C317EFCF8DF989DA696E1231EFA680B75357295BDFB64C5C2320757EE321FE03A119125476AD6F35D65AE4DDA5FE71709806D6CC93EC99F6DACEF1B32644847B30E3D6DC26E9F76EDDAA5F6EEDD3BA655AB5651868486864A4E4E4E68666666E8B66DDB223FFFFCF3F66BD6AC7962D8B061DF9830FCF0A930F2B8570D78D579E5A81B420343D7DD1C7F55C2679D5E08BB24AA6BB9C1B722BF89EED176F9B9AFB7BEB5C96F839C05FE8B5A7D3B74043F01A0F698E01A6E36B88BCF3DF7DC16B7DE7A6B80EECC2BEBA69B6E6A70C10517840506067E3E74E8D0180F7D441D88EA55296EFAA51649F119EE57E4D881A9DCCDB92E731D18E872966BE75F5E388F721D1C9415E36DC1F7C61B6FBCCC7C4F5A1B11D8AB57AF4A3F4F779A4F3FFD7493B0B0B0DF272626DEE1C18F78951CA965EF20159FA88D71DDE77EACBBF95DDB52077600C036B6B876976DAC0FEBD3A78FBF596F9E0B0E0EFEDA1C479D3F65CA94F0471E79A4D5C5175F1CD5A44913BB7E2973BFC4C6C64AD7AE5D23EFBFFFFE33DF7AEBADB01B6EB8A1878ED1327CF8F07FEAB11CE1B7165CB7F6A15161CE90D7DF38FB81905BE37FEBAC4AE82D6B42D361E7BFDFFEF143FE4EBF675A2D1B3A9A9F03E079A3468D0A6ED4A8D182CE9D3BB7BEE38E3B02AB127CDD7EFFFBDF4774EBD6ED34A7D3B9C0031BDF075C3BEB4565C2E86CB37C63968FCBD9E9976DCAB54B8EDFBC6B75A9A09C24C535CC5ED502C57C37979A8B4FEFB9E79E4AD5461C93F0A3A2B476A2A1BFBFFF5FCDCEF55A0F7DCCAC52075B07E4E89AF6B2524B3DB6EC011A00B08D2D96C336D67769136763C985175E38F0E5975F6E78F5D557C705040454EAB97ABCD6AF5FBFC87FFDEB5F91975E7AE9B58181814BBC64260EDF0DBFFD92C7DFB52B2FFDB5F7DA3E16D825BC758DBC66E7B0B35ACCEBF0BC9FBF9FDF246A8001CF07DF90909005679C7146D7DB6FBFDDBF3AC1D76DCC98318D3A75EAD4343838788EBE6E0D7C3C3D6B3D568A9B7055341E80DEBEBC82E7EA08977D5C4B7329AE29AE28B0B5753DEE71291E4044FF5EE12DDFD3E8D1A37F73E8D0A1B9B7DD765B8503AF54864E57650ECE42CCC1D9DB43860C19E0818F5AB6CC2BA22731B4C65D77D2BA9DEFE17A0E5D5E00B08DADB96DAC368D1ECF36D67B83AFB95872EDB5D79E71F7DD779FE9AEE1AD2AAD11BEF9E69B9B0C1B362CCEAC7B0B7D3500D779F8EDB9FCB6B3F6E666BCF88FB3C6069C1E145BA3AF7D46705C7C52DB49790E91E7CF5E3EB42D3F0FC033C2C2C2E69D7EFAE9DDEEBBEF3EA76E3C4F96799DA873CE39A7635E5EDE7F6B20006B0DAEF64B5A7D82C78D2BE736AD7DD651A117BA9627A5FCE6617A5B8EEB2022C52C33E44873E939AE305CA7DB20AD8D30E5397BCC9831013D7BF63CE9D76BDEBCB97E4FA101010133CCC1598F1AFEB87F2F53E669153C2ED555E67A80A635FADDA5B8B6FD59296EE2DE945F2700B6B127BD8D4D73EDD7CE2BB58D7D4E8ECCAD8E3AA24D9D1D0EC7ACDFFDEE778103070E6C5C13AFF99BDFFC26D604E0483F3FBF39BED804BACE07BC0A0F8CF87C506C9F809AAAF12D4B6B8047C45DF1C5D4D47993CDD58BF89900356BECD8B1FF0D0909E9356EDC38A736B1494F4F973BEFBCF398C7FDDFFFFD9FED63E2969D9D2DB7DC72CB318FFBE73FFF29D1D1D1625EAFD1134F3CD171E3C68DEF9A8DFBE09318F932B5826D5F65B67FC16CBB950000200049444154EE50E5A607005AA3AB813CABD46BE9D40F3AB2F3615708D600FC82149F31EFE3FA7BBA59FAD7C577A4FDCF0E1D3AF4A9D6466833BC8ABEA3BFFDED6FB6C6E1A802A8E0B1FA3D9D73CE397EE3C78F0F7AFEF9E7E70E1D3AB4C7F4E9D3D7D7D0479E5BA6CC5BB94E449476B714F7BF3EEC7ACC6A3932D8580FD7090F2DF34BF89502601B5B23DBD84DA5B6B12FB08DAD7B4D9A3479B6478F1E3135157CDDFAF7EFDF30353535D71C7B3DAFE7767CA9CCEAB4E677C8BAC7EEF473385ADCD0F84A8FBECFA3678CBA2CC82F3086E6CF40CDBAEBAEBB6699C07BC5830F3EE87437B3D1FE4A575F7DF5518FD39DFD7BEFBD77D46DB366CD3AEA20C0E170E8C6D6065FA54DA7EFBFFFFE58B361BFD82C6FE8D9CD1AFCE8E12708BFF952FE20557A5BB259EE9523F31F2A9DDE48E7F94D72ED2426B90E1CC6BA0E1EF47983EAE23BD211478B8A8AFEAB536DB86B23F43B1A3B76AC4444441CF5D8975F7EF998E74F9E3CD97E376E0D1A3490912347967C4F5DBA74F1BBE5965B82CD7AF0F94936918A3F4E99EB7D7F2B73C096E3FA0EF4B6DB5D653EC275D9C275D26310BF52006C636B6C1B7B07DB58EFA1A33A878484DC64B4F0C4EB0F1D3A34CE1C8B0D1F366C5817C26F0D395878E891094D873A829C011E7FAFA7CEBC6DB7A3A8E8F6FAF605990DDD9F74C0831A3EF0074E9A09BC534DE0BDFA91471EF12BBB831F3C78B036852EB99E9A9A2A1B366C9075EBD6D9EBDBB66D93A54B97DADBDDF4F1FABCD2B409F5934F3ED9282E2EAE7F0D07E017A5E2E98D94F6019E5DC17D7AE6FB02B3AC2F1594E7B82ED7BB0E0C4A2FF35D8FABF50142CC0EB1BBBFBFFF47F7DE7B6F60D9FE67DDBB7797C68D1B4BE901317EF9E51759B06041C9F565CB96D9EFCC1CD895DCA607757DFBF63DEAB52EB9E492A06BAEB926E62447EA4E3A4E99EB7775BE599696BAED755799EB6D8F9429F37FB91E93C62F1500DB58B6B1BEC8AC0FCF5F7BEDB58EEAF6F13D113D0633EB5B9059C7FFEE4BE5E657576FFCFC2F49E7FF90BD69DCA3678C72381D9ECFE06D42CE68FECACE0F8B626E6E3F3BED8DE4F4FAF20575ECD8516B94124D3018D3A953A78E6639A47376998D656E659E3F72E4C8497B9AEC610BE1251AEF6C2CEFBCF3CE63B57D02C5AC37D13131319B5252520A6BE235274E9CF8567A7AFA88871E7AC8D9B061C363EE773A9DB6BFD292254B4A76EA7ADBC68D1BED4E5D9B40676464E85C73F6BEA0A020DB04BA65CB96C76EA4FCFCE4A28B2E0AFBFAEBAF9B9B0D7093E4E4E44F7D71DD30DF5391F9BD4FEAD0A1C3D8EAFCD6CBD281570A0A0A3E33E51AA80761E5D1E6799F7FFEB9E4E717B728378FB70762975F7EB9BDFEF4D34F4B56D691CCAE27391E7CF0415B335196F9ACFEBB77EF0E4E4D4DEDDFA54B97B757AF5E9DCF2FDEB3EB8A59469BA58959F69BDFC58ECA3EBFAEF60B2BDE5F21C191C112D220A4528FFF79D9CF92BA2155625B1EE92E51545874542D59698BDF5A2C4DDA3711A75FC5C714FA98809000098F09975FD7FC2A917191F6F67DDBF655FA73F9C27EE114FDDDD4E8BE906D2C6A685B3EC22CEDCDB2AB2ADB711DE4CA6C0B5FF8C31FFE107E32838C9E488B162DFC3EFAE8A3D8B3CF3EFB3DB3EEEEF38572AFB3DAC41DF97BC6F76ED0C57132531A55D5F9116D377D93917CBD66EFFAF64599155CFB0E8E3041628459C9D3CC0F668EB96D86090D0BA74C9992E30D9F31635786A4EF489733CE3DE3A8DB0BF30B253B3DDB1E6C5445416E81F805FA557800D37D68F70AEF773FA6658F9612DF26DE1EE49CDEE9F492839CE866D1A7D2F6F5710DA0717171D9AEF5E64DB3235EF4FEFBEF57AB26D204DF7F9B1DF00D8F3DF698A3741FDEB23A77EE2CCD9A3513739061AFEB0E5E77E8AFBEFAAAA4A5A5C9FEFDFB4B1EABCD9F2FBCF0C20A5F4BCF6A9AF78B32070523860C19B261C68C19FFF0D52FAB267EEBB7DD76DB15870F1FB603AF1C6FAA0DAD61B8EAAAABC4ECD82437B73863E7E5E5C9EBAFBF6EFF3E78F060C963030303B5F6E198FE6AA5DD7EFBEDA1999999EDD6AF5F3FBD4F9F3E834EA29F362A4707F4BA4F17B39E680D4C92D3E97CE3DD77DF5DED8D1FF6BB19DF49F419D1156E7FD7CE5B2B0EE791609BF25D4A49E0B5DBEE5FF6C98F5FFC28374FB9D96EFBD37F4D97A8D38F4CCF1D141A24BFACFA45CEEC7E66C96D651FB363ED0E39EFFAF3ECDF1FDCFF81FC7EF6EFED6BBD73EB3B32E6BF638E7A7FF8E6BED06CC332CCEFE523B35D9D56DD7D21DB58D4A056AEE50EB35E6A7338AD9D9F919A9ABAE878DF6F4141C1802E5DBA1C0C080808F6E487D3607DDE79E71D5EBC78F1B5F5313F7955F8DD99B3AFE7C8F82B6BF53D0744F70C5E9C91DCBB9E7F79FA43D0262FA3CC467C544E4E4E96F9B1CC341BF10F77EEDC39A72E3784DF257D278D5A3492669D9BD9839CB0E8307B20F1EDBBDF4AEB8B5BCB853715879B83FB0EDA30AA72B373EDF56DDF6F93F697B7973D9BF6D883A39CAC1C49DF9E2E978FBFBCDC03180E72AA15AAB45DCC60B3DE0C3607C89966BDF9D8DCF64E5542D55FFFFAD7A7376CD830EAD1471F3D6EF075BBFFFEFBE5DE7BEF2DD9E99B75F4A8A6CEF6BB0C0AD2E98D4EF85AFA7E7FF9CB5FA21E78E081C7CC67CF4F4A4AFA978F7F6505D5F9ADEB88A3E6A0ECE33BEFBC33A032734C0E1C3850BEFDF65BDB1CCF6E60F2F365F5EAD5B686420FD2DCB4FF59D966E9E5B9FBEEBB43264E9CD8CFEC905F369FF1368E6B6A459E6B5DB9BBB0B0F06EB39E6C37EBCC5C3DB837BF9385DEF221776FDA6D4F8456A4C3951DEC763C2D25CDB61409082A6E2E1A1C1E2C05F9051277769CF4BAA557C9E357CC5C21F16DE34BB6E5997B326DCDF2BACF8BBB576C5AB4C9EE872EBBF7327B1236EF709E14E6154ADA9634BBDF896A12557202B561D38604DF538756F7BB4F30EE7305E14A9F60641B0B0F1DA3159A7552CF7C68BFEA3BE2E3E3B70F193264AEB96DC6EEDDBB1796DDE70707070FE8D5AB57546D7CB68B2FBEB8E1AA55ABFA137E4FD2AFB96971ED429BD7EA7B768B68A767C99BFBD077A6CD76C2DD07C7E687923674E850ED5FF8566DD7086B2DADD6FCEA41C6FA05EB2561508238FD9DB69635AC515849F0557A30A20731C97393A5CB355DEC81CDCFDFFE6CC3EF77FBBE93961714377D751FC07090E3918DAC76D21D66D69B612654E5989DFF7FCC6DEF1F2F543DF6D86393D6AD5B77FF830F3EE868D2A449A5DEC7DD77E9D34F3FB5CD9FCD81B96DB2E86E0AEDEFEF6F6B7C2BFB7A7A70F0E4934F464F9830E119B3AEE74F9F3EFD751FFE9A4A376B28AACC6FDDDCD62F3B3BFBC3BBEEBAABC26678151C4C698DBE1C3A74C85E775FBA69CDFBADB7DE2A95695AA57D84CC6B053FF0C003379AE7A44D9E3CF9210E6B3C2EA0CC7E419BC38D3697A35D35C236089BDFCBDCBAFC90EE5640C7F3CBCAE280D0E6D236B625913AFD9CD3ED365EAFB7BEA8F53181D94DEFD7ED7B930EC5DB93B8D671F684AC3D3B60F60999BB32ED3628242AC4DEBEF49DA5F6F3F8051C59AF270F9B2CC35F1E2EA151A1AC55A78668397282F1A0F9BDBC7FBC138C6C63E129661D2CDB5FC36EC775898B8B4B77B5029BE6DEE79BBFCFD326C9B5F1D9F418CD7CBE4EBE52D675167EF7E76704C40644D5EE8AB53F37B2C9374511098989937CE4FB7396FAD114991F428CB948345713B52FE590214336EDD9533BFDBA964E5B2A57FEF14A7B20B1F8CDC5B6F6D73FC85F3E79FC137B70A2073D1A86DD1A9CD6C01E70E863349416E415D820BB237987F80796BF5AD6F7839C43BB0EC9CA952BB58F877BFDD32AD09C528134BFA0A020D5E974E69709AAA9E67B3DEA4486795C5A759B2D97B72F7507616D0E6676EEF3CCF57F970E55AFBCF2CAC4152B563CAAC1B7BC7EB9C7336CD83059B46891EDE3EB5A574BEE0B0909D19132ABF47A5A036C8278833FFDE94F7F3765999E949434D35B7E9083060D8A37072FC1C7D9B9C59BEFB33A4D941C27FAAD9B03221DC4EB6FE3C68D0BD026E755A1CDD3AFBCF24AF9F8E38F6D6DC4513B097F7FD1114CDBB76F5FE9D7D303B949932605DE7FFFFDE3478F1EFDEBEBAFBFFE4F5F3F70D1F9A8CD77115FC9839C4AAF07D558679C6582B0D608DB5A2EF37BD1D7ABB5FDC251DBACDC0239A3EB19929371E273B23BD7EF14FF607FDBDFD76EA02283EDBEA149C7A34F92E9C9CE79CFCD93665D9AD9EBBB36EC92F0E870BB7FD026D2FA5E7DC7150F1C14141624412D83EC3E474F94EA63749FB0F99BCDB6B591D2D7BA72C295B51A7C0FEF3D5C76BF5056BE6B1F50AD565DE5ED3F6AEA39665B9163F643A93EF4330E93232718F7997DE16752EA04A309BC3D0F1E3CF811DBD8FAE544FB650F6C834B3F375CF7D727FB3F94EE0EE5DEE7E7E6E6368A8C8CAC9532D4BEE8F9F9F991BEB24ED459F83D5478D811EA0CAED5F75CFECDB70D9B2CB3C790137DEDC7ED2867041073532B6D6AD3A25F0B8FBEB7F6CBD2E0AA070C9BBED924835E1824F987F3E5EBD7BE96817F1968FB6BCD183743DAF469235D0776B5D7350C6BE0CD48CDB04DDC34946ACDAFD6D29EDDFB6CFBBAA56B7E7DE12067EFF2BDB27DD5F60AD73F0D85DAD4AFBCDBCBD2B3C37A205BC65161DAA5AA2331469AF7D3A90B06B937B06DDBB65D60D6A3D166875FE5E0EBFEAC3A98D58B2FBE78D4FFA2ABECF5D75F6FCF6257950EA665C26FD0134F3CF1868E86AE07F4650E608EB7B3897705FE8AB6894D8FB3238B72ED84AAFB3BF5D86FDDEC085FBAFDF6DB1D553D2873D3EFE2CB2FBF2C3949E1A6FDD04C1957F9F5B496DE7C47818F3DF6D8DF870F1F7EB139E0FBF1380FD73357E1D52C92F0137CDF555D07AAF558F7E06D35BD1E9CE43AE3ACABFD42591BBEDA605BEFE8B65F5BEE44C44694FF0334A1B7E939C7FE04A39A46D9E79595F6739ADD962B6D7DA435C6BA0FD8B2648BECFD65EF518FD5E76B6BA0E5EF2D97F313CFB7DBFF4E571557661C483D20892F254A604860AD96CB9EA57B8EBB5FA8681F5085836F8F3DA782FD50853F11297FCEF59A7E4E4D3D3FBAF40946B30DDC69826FEC4D37DDE4CF36B6CAAAB2BDF5C4F34F769F5B27CF3DC1EBB6D293289E1AE5B92C3D4E33E13788F07B9234F86617E6486D06E06E17F5287869FBCC2213809FAC47DFD1C493F8716C4948486899E6E191E85B9CDFC20E40A20737E70F395FB2D2B2ECD2FF81FE258F19FAD25099F5D02C1B7EB5C9B10E5AA20721DA1C590F402A53F35BDF0F721A253492D81DB1B26AD52AF7A89E716536E8FEE63B8B373B5CFF4A6CF863CAD9919557EB745247B8BA81DDB061432B9D7FB753A7EAB778D11A5E0DF6A5CF78EBF5EA045FB7366DDAF8C5C4C414A6A6A60EF7A29D60792720AA727F9FEA7E36734096D7BB77EF6AAFD47A20AB351065E981597927652A7B92A269D3A6CE8D1B370E16DF579503ED13AD07A5D7B9F26AE1469DC4E7FCD9EC17CE4CABE5194A7E5AF8939C37E83C3BBAF2A237161DB57F284D4F82BA696DB1FBB69FBEFAC96EBB577EB0D2EE47DC344CBB4F94EE5CB753421B84DA00AD7F47C61FA9A8D0FD84BEAFEE0B1206271CB3FD6F10DFA0D6F7092AB6476CD9FDC2313F4D57CD53758FD7AA131C2AFB9CE00AF63B153DB63AFBA3B6DEF0E336DFC169663F5668B6B1D57E0DB6B175A6D2DB5B0F3C5F5BE81D6F633BAA9AEBE366B32E35CFCECEF6AF8D00AC2780CCFBE5FACA0A5167E1B7A17F44DE9EBCF480E641F1B5F7A60D02F6ECB8D091FFF5B8A449F5E50B4A4C4C9C58851FC301B383FCDCD52760AE36D3B9F9E69B8B6AE32067FB9AED36B46A33633D60090A0FB22377EADF7A20B2F1EB8DB67FAF5BC7FE1D256B6F96B4EAD5CA0658AD992D5DF3ABFD80CB9EE5AFEF0739217121D2A16B071D04CA23EB5F054D7B34247F57C9F527BFEC01969E403181F5CDAFBFFEFA61133683ABD2C7A9E400D604DE37DE78E398A65E7AFDBDF7DE936EDDBA552B04CF9F3F7FF5AE5DBB5AE8FA5EA6E6F7B83B9BE335E9D3A6E7E6BEED151EBD0507A79BDF55BA077FEF4595FCAE32CD679DE7FEAD9B1D60AF356BD6CCFCE28B2F8A2EBBECB26A9D9D2D3D1A6999F7B2F755662096B27EF8E187822D5BB6E49ACFF99F32DF51D9F748338FA96E33FE131D5C54691D28E73B4FF59611F54BAD27953E6032FF67966BBFF0B67BBF70CB2DB714D566F8D5EDFBDEAD7B4B5AEEE8767ECFE63D127BD69141F3747C885F7FF8F5A811FC7520441B1ACC6D7A9FBE8E8EE0AF2757DDB30768771A77602E7D5254F721A54F8AEA5812BACCFCE3F17B49947EEDDA10D428C8A3FB056F51956E01A57EA7C1AE0180AAA59CE7BF5989A7E9A04385E5EC0B77666666469A6DAC3FDBD82A7F0F556E7AEFEDDBE0DADE96BBB6E39F98658ABB19BE39BE4FCDC8C888AB8DF06BD67D9DAF3A93F07B925A069F96F963F6D6E8DA0CBF3F1CDCAC5FDC061FFBEDE838F93AEFE98C909090F99E3C30AFF047595824B31F9E2D6D2E6923E75E776E493F5CF5F6E8B765E4EB238F3A9B5FF6B93A6A73DB4BDADAA0EC6E0EBD7FFB7E39B8FFE051A337D7F7831C4FABA0EF55CAF19AA5990D6A81D998FAB97650FEE67ABAB99C5FFA048ADE3774E8D085FFFCE73FBF34212B40A762A88AB973E7DA0D6779F44060D6AC59556EF2B570E1C255FFFEF7BFCF30017A9009D0F3E5D470C87C3FFF35DF4D5239BFF5F9C3860DEB636E9BBF7FFFFE82EBAFBFBE4A7BC31D3B76C8BC79F38E9A6FD2EDC08103B6A95E42428254A5D9BB1E94FDE52F7FC9C9CFCF4F9C3163C61C416DCA718FF65C57FB85D2E63C3647AEF9F33525D7B505CF6B435E93DB66DC56D2FC59A73FD245074C8C8889B02752DD035E697369EDDAD220B741490B1E379DCAAEBC93A27B53F6DA81154F7850B727D3769D71DBBA62EB51E34BA066B8F62529D578EAFA1A0C1A15855FED1BAF676775E038A7F9DD38CBDB179A6D6C17B6B1A84507CC7AF81FA7D3F95E6A6AEAFCB203B0050606AEDDBA756BDCF1A6C6AA29BAFE9ADFC14F84DF93D434B8F1B2C519C9FDFB35EC5E6BEF3967DFE27D45225FF948E07DDF2C9F040707CFA9EB3362DA8CD93D759086D78DFFDB78CC889CA569C8D58395CD8B37DB66A43A32B406E0C3D987ED54185A63AB35C7210D4238C8A9797A563BCF947B902BF06AF0D5BDF1DCE39D40993E7DFA22B3E3EF3675EAD46F4CE00CD5119C2B233D3D5DFEF39FFF8809CD47D69752A33D6B28FEE28B2FEC88D095993AC9FE8EE7CC59F3EEBBEF9E615EA39F09BECB7D3DF09A45CFE27C74A2DFBACEED3A7CF8F02E1F7FFCF1E283070F168D183122ACB213DF6BCD7CE983327D9E7B746EFB210E1DB2F3523EF5D453957ABDD5ABFFBFBDFB00B3AABC1306FEDE9901860E22289648D058B145B1AC2968D4609A292A6349246ABE98982F9BB669BB0846779358369BFD8C4663023E6A04D144578D2524F6D8A2220A36C2824AA8024A9B19A67CEF3BF70C5E2733346760EE9DDFCFE7FF9C7BCF3D7766FCDFCB39E77FDE72A6D75F76D965354ECAB66EC11BFF6DDD143FB7DB3BC37161FDC5AF9FDE1D0E3BEDB0B0FDF0B7870CA682F7E3E33E1E2E3BFAB230FAFBA3C3C19F39B8E94266922E84A68BA2E978928E05E515E54D4571EA59D47CBFDF42693E88668517455B4AADC6B5AB6BC3BAB5F95BCBA49FF5FA8CD7C3F45BA7870F7EE9834DB7D76BDA67C582FBB5E9AFAD6FA5A664ADCB5A78D397A52C8B0D1E0BED63D90A9667E7F737C6FDF8631BDA8FC7F3ABA98F3FFEF851871F7E78878FC57DF4D147D7C5F3B55B15BFEFD23FF5DD7FE24F5EBFFE84FAC6FA509EDB2A33758747DF9AB96BB7FA7073317E50A94B735CDC575656D63CF3E08ACEF2B7A5EE6BF75E766FD358AEF71EF6DE365B79D37D7753AB703AC94845EE69979FB6FE9643CDF7EB5DB9786553AB6D9AA82A6DEF24A7DD956507FB555951B5C91750D281BFAAAA6ABF58703E150BE0EDD2CC951B73F5D557879A9A9AF5CFFBF7EF9FC6A686A79E7A2AC49387FC197B7575B8E28A2B9A6E03B131B1909E79F3CD37F78B07FC23A64E9D3ABB443FA3D5F1DF7BFAB7FEEBCDFDB77EC30D37BC3E76ECD803FEFCE73F3FB87CF9F2F79E77DE797DBA75EBB6B18B0961D1A245EFE88EB7CF3EFB345DA498397366D3C9597A2DB54EDC72CB2D4DF7ACDC90BFFDED6FB5975E7AE9BAF8BE93E249D9DD818E3C2EACCA8E0BBFE96CC78574B1F17F1FFBDFA67D6EDA9FB7948ADCD3AF3C3DCCFBEBBCA6DE3E856A56D784E9B74D0F77FDC75DE1DC5BCE6D5A978E2F1B937E4EDAAFA7D9FF5B4A85749AF4301DAF9A8F1B275E78E2FA0BA0E9FEC18F5DFF5853919DEE2440C9EB96CDE1B059C742FB583AC0FC187F48A74C0B172E9CDED6ED265B2A2F2FBF239E4BFD3CDD2B7A63DFC177230D517BE289271AE277F4778ADF77E98441874FAD7AE182B50FBEF96CCFA307BCBFC37FDF836F4E5F56DD50FDBF2F1F39796E917D46E3E20E726EDC29DFDC59C73CA4715BA3BF3B7AFDAD869EBBF3B9A62ECAA9B04DE37C9B5B6B6BD7D486BE43FA365DF56F2E64D3D8AF3436B8B9FB71EAC29C5A649B8AA2B7AA9B6E7191AEFA3BC9699713E574627CFFBBB9803279F2E4D48DFA905400C79DF48033CE38A3ACAD2BDF73E6CC09B366CD7AC758DF34B6F79C73CE09F3E6CD5B5FFCA6D7E7CF9F1F9E7DF6D9B0A15934AFBDF6DA57EEB9E79E748B9F4F946AE11BFFAD7F3E7E36EFEADF7AFA5C4F3EF9E47F9A3E7DFAD4F1E3C77FE0073FF8419F749B82D6A496F9D42DFD8D37DE1E36107F7FF8FAD7BFDE74303DF7DC73D75FBC58B66C59532BFD873EF4A1365BE95337BC4B2EB924DDB2EB6BF1BBE2A4AC0B1F17D27EFE804F1EB0C16D520FA1D67A0955F6AD0C479C714438FCB4C337EB9EEC479C7EC43BC60CB794BA4C17769B2EECF9D3D6455B1C0BED63E94047C773A98737B5E06D7921E64B5FFAD2E37FFEF39F3FB8298D115BEABEFBEE4B5DAC9F2FA5F3AEF26DF9CB3FF72F67F6BF79E97D47550D3E2694E5CA3AF47755BD3861D1EA86DA4B96FDEAF919C5F4013DFFFCF30FC6981177B25B748FBF2F7CE10B1396ECD4F1F7742CBC6550EA823C648F214D45F10E7BEDD0B44C91C66DB56CA94D134FEDBCFFCEEBB749EF6D7E3C74DFA1FFD0F5B9D9CEFBEDDC5448B725FD9CC34F7FBB4B7DFA7B0A8BF5742B8D14DD7B6DDD89AF862C1812AEBBEEBA0BB6E6EF1C3162441AD73B319E289F1D779637C4EFD38BF1FB54FD2EBE932BF6DA6BAF9B162C585015A3F7FBDFFFFE5C6B33554E9830E11DB77448B765F8CA57BE12D2F894F8FED48D66FD95F0B44C57C08F3FFEF8D05A319D15BEDDE349CB07E2017F56A91E05DFCDBFF542B366CDAA7DF6D9676FD87DF7DDDFF7D8638FED7DC8218774EBDDFB1F5BDF2EBBECB2A693B3E693AFF439A6DB711C70C0014DB392A67B08A68B12CDDDD4D367933EA7638E39A6B593B2DA8B2FBEB836EB867793731AC78576B818B459DB97959715E5E7B92D8E0B5D517B1E0BED6369A77DF9DCA8614BDFFFBEF7BDEFC93973E69CF5918F7CA4A2235A7F53CFBCD4CB203A29FE5B995F2A79DFA6478A0B867DF1BB9565DD574E5C745787FE9EAB16DEB660D9BA37E7EFB27AC164FFD44AE4AA4DF77249D844B158BCE8C61B6FBCBE3D5B88520B707D7DFDBE716738FBEAABAF6E683993F3B469D3DE71A53BDDEA284DE4B1EFBEF9D6955D77DD351C71C411EFB8475D1AF374E79D77FEC3EFBAF2CA2BFF3716BE69ECEBA1E9F7FA4437DDB5D75E7B563CF1BAF4FCF3CF5F9B26AC28F4D7BFFE352C5EBCB8A9ABDDFA93F02143C28927BE3D31513A014BB7D268965AEBD3E794AE04174A276FA935C2F833A02B1D0BED63D996E277E1F9EEDDBBFF362E6B3AE2E7FFFEF7BF6FE8D1A3C72D13274E7CBC94F2B6CD2F931EDFFFD0CFFC7AE11D8DD357BDD2213FFF8535F3EA7FFEFACDDD4359EE9CFB8FBEBFCE3F15681FA9EB576D6DED81F1A0FCF27FFFF77FD7A7712749BACADDF2D646E9607EFAE9EFBC1D6F9AE1B97022AC748531EEC09BBA7E358B85F5FC871F7E78493CE01F154F5A96CAFA167D4EE7C7CFE69BE3C68D5BF7CA2BAFACFF8C528B443A312B94BAE2B5F48D6F7CE31DCFD3095E1ACBDDFC3965DDF056C7CFFB734ECA00FB58FB58B69E9933677EF9B1C71E9B77D75DEDDB90982EC0DC7FFFFD7F5FB468D1974A2D67B9CEF0475CF8EAA46BA62D7FEAEC1BF61A1776EE31B8DD7EEEFC9A25E113B3BEBF6C55DDDA7F9E7DD88DD777C57F147FFCE31F1B671E32D3DEA193D8EFA9FDC271C71D972BA5FFA7934F3EB9CFC08103A7EDBAEBAE877CEF7BDF6B97AE37A9708E05F5C2A79F7EFAC58A8A8ACF74A6897C8AD599679EF9F174DB846F7DEB5BDD3734B67A7334CF381A4FFCC63829735CC071C13ED63E96ADEFF4D34FDFA5B2B2F2B9CF7DEE73034E38E18476297CA74E9DBA64F9F2E58795628FBB4E314066DC7BC69EF3D181237F77FA4B1786F66A017E61CDBC70E2AC1FBEB9AA6EF5255DB5F085AD21EE2057D5D6D68E9A3F7FFE133FFDE94FEB520BEEBB91DEFFE31FFFF88DACF03D41E1DB3EAEBDF6DA3BE389D9A77EFEF39FD7A6EE78EF566A8D4827655A2300EC63D976D2E457F1DC69FFDB6FBF7D4E3C675AB7A5E761E97D37DE7863432C785F2FD5C237E9340327FFF4B3DFDFF4F9EF7F69F0CFE6DF34B22C57963BB0F7EE5B3C09D6A44577D57C7BCEE5AB57D7AFFDC6ECC3A65CDE95FF4114CBC4265D45A94E6C9226DE193162C46F57AD5A75683CE8EF76D4514795A7C93C3657EA3A7DFEF9E72F9F3367CE23DDBA75FB74679DC9B658C593A9BFEDBBEFBEE9F60867F6E9D3A75B1A87BD859F77ED25975CD234F14A3C38FE41661D17705CC03E966DE7B9E79E7B2B7EE7AE880F87DF71C71DFBC673A8F2F7BEF7BDA1B509495B4ABDED1E78E08134B9555D2C7AEF5CB870E13137DD74D3E252CD55A79A35E8C1FFBAFD0F677FF7DC3F3CB272E667AF5F7C6FAF5D7B0C09BB55EEB8C9EFFFCB5BCF852FBF72D99BF72C7BFC859ADCBA8FBF3272F23427394E729CE46CBD02F8E9A79FFE6D3CF01FF8C8238FEC71E4914796A75B3A6CAA34FE3716BE6FC59DEE9DF3E7CF3FF5D65B6FADF58DE99003E4C23DF7DC73CAECD9B3CFACADADAD6C9E846C334EEED2F8B3DA748F4927658E0B382E601F4BE790668E7EFCF1C76FDD638F3D7E1FCFA38E8A05ECE0458B163555BFA9084E9186A6A516DE58E436DD92F2B6DB6E0BD75C734D5DFCBEBEBC7AF5EACF5E71C51517A7D9CC4B394F9D6ECADC07FFFBF6BFBF78C543171FFFED93EAFFB4FCA983AF58706BCF39D57F0F758D0DA1227E68DDCB2A42B75C4558D3501D16D72E0FD357CF0E9397FC29FC70EED5D5772E7BF4A5BFD72E397F87D5F3FFF9A9A3EE58EC9F81931C27395BDF534F3D3575FFFDF73FF0BEFBEEDB73E4C89165ADDDFEA1A5254B968471E3C6AD59B162C53DAFBEFAEA195B72CF3B365D3CB02DDB7DF7DD272D5EBCF80BF100D9FBA0830EDAA4ABC3E9561BF1A46C9DD608C7051C17B08FA5739A3973E6E2279E78E29723468CF84D4D4DCDB2E79F7F7ED0B469D379A9178A00002000494441547ADD72CB2D1553A74E2DBBF3CE3BEB1F7AE8A13571BB39CB962D9B180BE4B3264E9C78E1B3CF3EFB5A57C84FA79F60E14773AF3D78FEBAC5DF78A3F6AD7F7AB576D18E2BEBD7F45AD7505756912BAFEF555EB9B66F79AF97E366772F5AB3E4572F1EE936282D99D8A473E94A139B7CF9CB5FBEB6BCBCFCD458D4764BF7F66DCBCA952BC30F7FF8C3D5CB972FFF5D3C49384BE1BBF58C1D3B7640DFBE7DA7EF169D77DE79A1B2B2B2CD6DE7CC99537FFEF9E757BBD586E3028E0BD8C7527CAAAAAA9E8B8B11315E9E3C79F25E5D350F159DFD0F3C7FD899CFC4C599BEB2505CAEBAEAAA33BFFAD5AF3EF7A31FFDE8A27840EFD15A019C5A7C274C98B02616C03F8985EF4F14BE5B579A4C6CD4A8517BF4EEDDFB81F1E3C71FF9831FFC203760C0807FD82ECD387AE9A597563734349CEBA40CC03E96E23276ECD8CAEAEAEA11D9D33DD3F3AE3AAF4A99AF03D051AEB8E28A4BE3E2EBFFF66FFF5697C696149A376F5E6AF1AD59BB76ED77AEBBEEBA8B14BEDB46CAFB4F7EF293A37AF5EA75CFB871E31A172E5CF88ED75337BCECA4ECA41B6F34733E807D2CC52616BE47143EAFA9A919D55573A1F8053AD495575E79754545C53F5F78E185F5B366CD6A5AF7D24B2FA516DFFAF8F0DB13274EBC5296B6BDF8799C306CD8B09BCE3FFFFCD07CA1229B78A52E75C38B276577CB12807D2C45E9CC8D3C57FC02B497ABAEBAEA8ACACACA332EBBECB27593274F0EFFF99FFF59D3AD5BB773AEB9E69A5FC84EE7F19DEF7CA7EAC0030FFCAF8B2EBAA8F1FAEBAFAFBBF8E28BABD7AD5B3746373C00FB588ADA270A9F3434348C1E356A546BC35FBBC7F8B4E217E05DFAE52F7F39B967CF9E63D2B4FA8D8D8DA7FCEA57BF9A242B9DCFC30F3FFCF30103063C7CE79D7756A46E784ECA00DACFD7BEF6B56FBEFFFDEFFF45B68F3DCF3E968E76EAA9A77E202EB62F5C97CBE5060C193264542B9BF78DF12BC5EFB673D3367E3FD08E7EF18B5FFCBEB2B272602C7CFF47363AADB10B162CF8605CFE54373C80F6F7C8238FBC91968D8D8DEF950D3A406AD1DDB9B9CE8BDFB331AD6D140BE0312DDE33B4AB24A7B3A8CC3EA43505EB3ED5CA76BDB2E59A4DF8999FF2FD87CE25CD7E290B45A15A0A00A0A87C31C6B763BC18E380185F8F716C1BC5EF27B2599F4F8D4F2F8EF1788C618ADF8E978AD9DBB2BFA52646BAEF54BA1276458C1E31E667DBA5F52FC598939D94ED19E3E3319ECF5E6F8CF1CD18DF8BF1508CA5ADBC7F957F1300004089D923C6BFC4787F562BED3674E8D087E3729736B6DF71DEBC79A9A1F02731F68DB124C6E018B314BF1D6B748CD5E1EDC1D53B67CBAFC638ABE079C88AE2DAECF1B9217F65E38B05AFAF2CD8BEA195F7030000949AC363F48C31717D75BBE38E1BAC83BA77EF7E4E5CFC392B7C9BEBA792D6198ADF7475E1A8EC83BA37FB00DA92FAA69F1CE390ECC3BDA7C5EBBFF6BD070000BAA0BFC4F872F3933DF7DC33CDE1D16601DCAF5FBFC3CACACAEE686868E83209EA0C135EA53EE923624C8B717C8C17DAF890527FF5D4D2FB95ECF5B37CBF0100009AC6ECA65A2ACDD8BCEAB4D34EDB2397CBA59AA9B1AD37949797F7DF6EBBED3E121FF6C9561D50EA49EA0C2DBFBBC548B3DEDD90C503213F9E378DD5AD0BF9BEE7A9297E87182F87B7C7F0EEB7093FBBF0FD000000A568768C6FC5F86B8CA75E79E5952377DF7DF7B43EB7A137EDB7DF7E4B1F78E081BFC5870B62CC54FC76BCE1319E88F1688C41213FA1D57DD96B97C5782CC6E290EFF23C2EDBAE6FF601AFDDC8CF2E7CFF71C1845700004069BA2E8B5EC3870F7F3AB4B8BF6F6B860E1DDAB35FBF7EFBBCF5D65BA94EAA55FC76BC54E8A656DD34EB735D8BA48F8FF1EFD9E3B47EEFAC405E1EFE7140766B57355ABE1FA02B48B78EFB46C8CFE0D8727D9A5F21CD8CBF509A00DE95D4C276682BEB538FC3349FCDCB52C4B63066CC980372B9DC5E9BB8F9EE1FFBD8C70E983C79F2FD5D21379DE93EBF6DDDB7B765D1FAC666FE5C452FD0950C8B3137E46F7390C6F014F67849B33A5EA6F00578573E1CF2C3F47E5E702E5D963DFE8F906FD4699026B6952953A6A49EAFEF6818ACAAAA9A10F20D8317C442774257CD4D85AF07404949F73A4F13034E0FF9D6DFE6F9119E8A717D8C1D43FED672B74A15C016199B15BF8F64C5EE91D9FA3466F294186986DD6352912155A0F805A0E3DC12E36731EE8CF17056F026C342BEC537B5087F42F10BB0C52E09F90B8C9F8DF1CB183FCED60FCC960F6545B1E2173A9932290028197DB222F717A1F571686784FCE4172E7C026CB934FFCC41213F696B4B695E855D836ECFA0F805A0438D0DF96ECD6936FC34DEA7B2E0B583B2A277AE34016CB14BC3DB1710E7B4786D8F18D7C4784D9A40F10B40C7BA3C2B7A6F0CF996DF1D0B5E7B31E4BB3AD74913C016FB4E8C79213FDEB7A574E1F1CD90EFFEDC5DAAA0F3D1F5ADC4ADEBBEAEBEC7DA1EE5353D6B24631BEB5EDDFDADD0F6ACE6D05E52B7E62FC63822E45B2176C9D6A72ED197648F6F91A6AEABAE5B5D4D3C2EF4705CE814C785D0181A17CB44514AB7324ADD9ED3AD3A0765EB762E287E3F2D45A0F8652B5BD37BCDECFE2BFAEFB5B8A763EBB63668E9A0D71B1B1B67C8045B4175C1F2D8ECF1EB217F5B8EB46EB614755D6B7BAD9D118F0B231D17B6BD01CB062C88D5EF03325174FAB478BE3AE4C7F8A67DEBCA183D632C9226E87C747B2E71B57D6BCF19B0644063CFD53D25631BEA51DDA37EE0E281831A1A1AC6C9061DECE68293B334D3F3842CD238B4B931BE1CE35C69EABA1A7A369C3360F1807AC7856D2BB5FA0E5A30A8C271A128CD28D8CF3E1F6356C80F2D498F5397E8BD639C2C4DA0F8652B3B6DAFD31E5ED97FE5F777FDDBAE0D43160C693AD8B2754F6E062F1C5CB3FBACDD979785B273468F1EADC58D8ED63CA6F7E1565E5B15E35FC2DBB73FA20B3A69FF9366ACEDB7F6BC5D67EF5AEFB8B08D8ADE45831A86BF307C7979AEFC2CC7859228825B4AF32B4C951EE87C747BEE02C61C3CE6E29BA7DFFCC7DE2B7BFF66E092817B55ACAB28AACBFD4B972E0D4F3CF14418397264183C787051E5BEA1AC61556368FC73435DC3B78F1F7DBC131CB6A6151B786D95F4746D9F3BE47357DDF6E46DF7F779B3CFF503970EDCB7A2B6A297AC6C1DF565F5AB43597830AC0B5F3F76F4B18E0B008A5FDADB49079DF44C5C1C5C8C7F7B555555EA46B4DF6DB7DD367BCA9429EFF369429BD20457699295A51BD8268DF94DADC2AF4B57D776E2C8135F8A8B9132019B65688C9B3661BB2F857C576840F10B9B66ECD8B195D5D5D5FBA5C7B95C6E8FF47CD2A449D53203AD4AF7F54DDD9EE76E609B74FBA3DB43915E0C03D8C616C4F8CA46F6B3FD63BC12F263821BA40C14BFB04962E17B44E1F39A9A9A517171B7CC40AB5277E6E9CDFF7CB293B315E1EDD99F93BDB3133700B64C9AD1F99F62CC09F9199E9B677F4E73E9A4DB1AF688B1BBC21714BFB05972B9DC171B1B1BD73F8F8FCF56FCC246A5A277588CB131F6CAD6A52ED1A91B5EEA12AD2B1EC0BB736FC8DFE7F7C3317A6705F13931CE8CF186F440E764B6673AB5868686135AAC1A75F2C927F79119D868F19B3C16E38B59FC3A2B7A974A0F40BB49B7397A30C64352018A5FD862A79E7AEAE85C2E5738BD731ACBB87D7979F968D901000036876ECF745A0D0D0D1F8DC56FE1AAE62727C6B85986A04DBB64CB013126648F0F0CF9F1C0D3A507A0DD0C8CF1C790BF407F508C5B62FC8FB480E21736D9A851A3D277F39C16ABCBB3E5A7CDFA0C9BB46FBFBF45B1BB426A00DA4DBF6C1F7B905480E217B6D8D0A1438F686C6CFC87B1BD715D6D2E97EB53535393BA3EDF2A53F00FFBF4C293B0B64EC8D2ACD07F952E802D926E15377023FBD910F4B401C52F6C8A58E4FE9FD6D6C7C2B73C7BFD44C52FFC8374C12875BD1BB691EDB657FC026CB11931EA37B24D0F6902C52F6C54EAF21C8BDBD12DC6FB366B2E7E53D7E76F4E9A3449374E789B31BD001D6F8E14407132DB339DCE90214346B598E5B9A5B5F1F5016BD7AEFD806CC13FA894020000C52FC5F0A52C2B3B71239B343509C702F84CD98277F8468C235AAC4B5DA16F8CF133E90178D7C6C418D1CAFA4762DC273DA0F885CDF5858DBCDED4B2D5D8D8786C362B3490D7DA38F81FC7981DE35FA407E05D9B12634D8B75FF15E3F218474B0F287E61939D72CA29C786FCAD03362A757DDE61871D4E9235586F6E8BE7A362BC14635CC84F840540FB4AB33DDF11F23D6C00C52F6CBA58D01EBA99DBEF2D6BD0A61D43BE3502808EDBCF4E9306280EBA8CD2A94C9932E52771F193C27555555513E2627C8C0B264F9E3C41966083BE1CF2F7F11D1063618C0F64CBC296DF3474E045A902D82277C7F87C8C7401FEF16C59A82C3BC79E2155A0F805A0E33C1BE35F63A42104D7C478B3C5EBBD63AC8E3141AA00B6481A729526BEFA61C85F607CB345E1DB2DE85D098A5F003ADC6321DF7B62748CEFC5F86670EF5F80F6947AD7A48B8CA9575A1AEFFBCBD0FA84834027E3AA1440694ADDF23E19F2DDA047480740BB4BC349D285C67D629C2A1DA0F80560DB49AD135F09F9EE79DB4B07408748B794EB1B635FA900C52F005B4F9F56D6A55B1D7D426A00DAC5E056D65D1DF2B7970314BF006C258FB5B1FEE6A0F517A03D3CDEC6FA2BA4063A37135E019496A56DAC5F9505004097A4E517000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC020000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF000000287E01000040F10B0000008A5F00000050FC02000080E217000000DEA50A2900E89AC68C1973442E977BB48D97C75755558D2F5C3179F2E49CAC0100C54ACB2F40173565CA94C7E2E2C54DD9B6B1B171A18C01008A5F008A522C6AEFDEC44DEF902D0040F10B40512A2F2FBF7653B6CBE57237C81600A0F805A028FDF6B7BF9D1E17AF6F64B3E50B172E7C58B60000C52F0045ABB1B1F1E68DBC7ECBFDF7DF5F27530080E21780A295CBE56EDBE081A2ACEC1659020014BF0014B5AC4BF3ECD65E4BB33C2F58B0609A2C01008A5F008A5AD6A5B9AD599FEFD0E5190050FC02501272B9DC94365EFA93EC00008A5F004AC28D37DE98BA3E2F6DB17A79434383FBFB02008A5F004A4ACB42F7CEA953A7AE92160040F10B4029B9B6F0492E9733CB3300A0F805A0B45456563E56F8BC478F1EF7CB0A00A0F805A0A44C9A34A93A2E5E4C8F73B9DC9CF87C85AC0000A5A2420A00DAD77DF7DDB74B5D5DDDB71BCB1A4FCA35E47629A6BF7DE9D2A5E189279E08871C72C8F0B3CE3AABB198FEF6C6D0B8241772B7D4D7D75F367AF4E8D9BE890080E217A0834C9B36EDD8DAFADA1B960F595EB77CFBE53BD5F4AC29BAFF87DD3EBA5B589AFD574CBA57771F3C60D980CF0C5A38E8B3F17338FBD8638F35533500B09E6ECF00ED24B5F8D6E7EA7FFBEAFB5E1DB070D7854559F816B3DACADAB078A7C53BCCDD7BEE80FAC6FADFDC7DF7DD7BC80A00A0F8056867EBEAD67D6FD990653D56F75DDD5D36B69DB5BDD6765FBAD3D2CAD02DFC54360000C52F40FBEF514F59B1DD8A7E9BB269C59A8AD07D59F750B1CAE8938EF0E6C037FBE61A73C7C80400B0FEFC4B0A00DA47AE213764635D9DCBD7968701CF0F08DD57BCDD385CD7AB2EAC18B122ACEBBF4E12DB49EA025DD6583640260080665A7E01B65671DC980BDB4DDFEE1D856F925A81D3FAB23ABB640000C52F4091AB78ABA2CD6ECE65B565A1C7921E920400A0F80528F2E277CD86479A54AC3512050040F10B50E452B767000014BF000000A0F80528668DB9C60DBF1E1A25090040F10B50DCD6F5DDF0AD8CEAFBD44B120080E217A0B8D5F5A90BAB765FD5EA6B6B87AE0DD583AA25090040F10B50FCD60C5DD3FAFA9DD684C672DD9E010014BF0025A0C7F2D6EFE5DB63450FB34103007420379504D80ACA6ACBC2805903428F25AD17BF7DFED627F458DA23AC18B122D4F5AA93300080F63E1F9302808ED57341CF30F8D1C16D16BECDBABDD92D6CFF97ED43AFD77B6905060068675A7E013A48F9DAF2D07F56FFD063598F4D7E4F2A7AFBBFD03FF4FA7B2FADC00000ED48CB2F4007E9B5A0D76615BE85522B70CF853D251100A09D68F905E820F595F5A176BBDA77F57E000014BF009D5ABA7D510A0000B63DDD9E81CEA27B8CE363FC7B8C1DDAD85F7DBA8DF756C6D87B033FFBC8189FDDC0EB4363F46965FDA53E160080D2A0E517D8565241DA37C6BA181F8FB13AC6A331FE2BC69BAD14C6212B8EEF8EF1B91837C4F85A8CB9310E8FF14C8C17DBF85D036374DBC0DFB224C61D3146C7F860F6772523637C2CDB577E20C6777D6C00008A5F804D950ACCFE311AB2FD509AD2380D8E2DCB0ACEA362AC8AF1E36CFB0F65EFF95D8C7131DE08F9D6E1B4EDE559E1DAD20D593417B169F6A895D9F36FC7382DC6A2EC795DF6B393276354678F3F1FE30FD9EFFEA18F0D0040F10BB0391E8AB173C8B7B8A6A2B76F56D04E8B313C2B4097146C9FD6A716D8E742BE95F73F37E1779465856BB3BE05CF3F5F50F836FB6DC1E39343BE257AA7ECF72683632CF0D10100287E0136472A62F78FF1488C1121DFD29B1C1BE3E1F0766BEEAE21DFF23B332B5A53EBEDB9315E8DD13BC66E59C1FCC9901F2FFC46F6BE2105856BCB96DF1D0BFE8E3D427EBCF045314E08F9AED5CD85F73305DBFD20C605053F1F0000C52FC0463577794EE379BB153C4ECBC231BFAF85B7BB2FA72ECEDF0AF96ECAE9FD6362CC8B5195AD2FB4386CB8E5B7D9EC2C4E0FF996DD6B637C35E4C712DF9B6D73608CF13196FBD8000014BF009BEBA9AC202DECF63C28468F16DB1D9FEDAF8685FCA454A925776207FE5D6932AE6B0A9E9FAAF0050050FC026C8954ECEE13F25D930F0EF92EC9A9E537CDCCFC648B6DFF1CE31B21DF1A9BE2F1901F933B77033FBF70BC6ECB6ECF43DA784F1A277C40568C1F5EB07EA08F0B0040F10BB025FB9E1DB3A236DDEA6878560CA771BD7342BE5BF2BF166C9F5A5E532BF1B090BF9D519A99794A7867B7E696D26CCEF30B9E17767BBEBB95EDD3F8E13493F4BF677F5F5FFB4A0080D2512605C03690C6EC4E0DF9B1B669CCEE922CE665C56D2A7C8FCAB6ED9EC52305FBACF362BC27E45B8093C1ADFC8EF91BF8FD0DADAC4B935E4DCAFEB637B242B93916F9C800008A9BD60C606B1B9415B67505EBFA64056E7337E5D40AFBE1909F802A7555FE75C88FC31D16F2B7463A22C62505EF1FB191DF5916367EB1EFA0186B5AAC4BF712FE661BC53500008A5F8036A556D5FFD984EDA6B678FE68561CA722764A8BD73EB5919F756F56346F4861E17B76B64C2DBEDFF7910100143FDD9E8162D35A97E58D15B6B59BF93BEAA4B96B3BE594538EADAAAAFA37990080D2A1E517802E6FD4A8511543860C195556567662C8DF377AFBECA58B64070014BF001491FADAFAB0FCF5E561FBE1DB87C686C6A675B9B2DC3BB6A95E591D2AFB56BE63DD5FAEFD4BD8EFF8FD42FFA1FD9B9EFFE9E77F0A879D7658E83BB86FD117BC43870E3DA2B1B13175733F36C62EBE2500A0F805A0C895772F0F8F5EF76838F05307865DF6DF254C1C3B311C79E69161E63D33C3B091C342EFED7A87FB7E715F38EFD6F39AB69FFDC8ECB0DD7BB60B739F9C1BDEF781F785C76F783C0C3B6C5858F0C282D0BD57F750B3BA26CCB863461839666451E5E1D4534F1DDDD0D0F0D1F8706C2C7C0734AF8F8F1B73916F0A00287E012872479F77747873C19BA1ACA22CF4DFA97FD8F7B87DC3F37F78BE69995A8107ECB4BE160C7D87F40D7F7FFEEF61D5D25561D1CB8B42CDAA9AA6D6E37E3BF40BF367CC0F77FDF4AE70C2F74E08AB97AD6E2A9C3BABB163C756565757A719C2CF8C716CAC717729A871531378D313852F00287EA1B3185F5555250B745A4F3FFD74D3CD987A0CEAD169FFC6D5CB57879DF7DF79FDF319B7CF082B16AC686ADD1D346CD03BB67D63EE1B4D45726AFDDDE723FB8487AE79282C9EBD38ECF1813DC26E87ECD654280F3F7278A7FD7F5DBA7469183366CCCC58F8EEBB81CD3658F0C67DCE04DF6CA0BDCF67A40014BFE08041517BE69967C22E3BED1276F978E71B3ABA72C9CA30F789B9E181AB1E08675C794618B0F380B06AC9AAA6D6DE6E3DBA35B5E8CEFAE3AC771E20BA5784DA35B5E195075F092F3FF472D398DFBD8FD9BBE93D977FEAF270D2252775EACFE3C9279F4CADB9FBDAE700008A5F8AC52429A0181C7CF0C1E3C3119DF36F4B9353EDFFF1FDC38C3B673415BE499FC17D9AC6F0A6F5A96BF3019F3C20DCF0D51BD6BF67CF0FEF19EEFEE9DD61C7BD760CE515E561E14B0BC3C19F39383C32F191B0F747F66E1A037CDCB78FEBB4135F8D1C3932DC76DB6D2FC6877BBF8B1F73816F36E0FC0614BFB0554C9E3C796E5C4C90093ABBB3CF3E7BFCCC41338BE6EF4D05ED1D3FBAA36902AC07AF7A309CF1CB33D6BF965A8A5F9BFE5A38E6EBC78427273F19F6386A8FA696E0D43A7CE82987366D93667DBEFD82DBC327C67DA2691C7067B3FDF6DBA7FDC73E69CC6F4D4DCDA8C6C6C6D373B9DC0971396833F63FF63D00A0F805A058BDFACCAB61970377097FFBCBDF9A26BB4AB336F7D9BECFFAD7536B6E5AFFC29F5E681A0B9C667E9EF7D779615DCDBAA622384905F1EE47EEDE348B74673669D2A4EAB8B83B452A84D7AE5D9B6E6B74622C844F8FCB9EBE0D00D03594490140D791EEEF9B5A6B97BDBA2CECB4EF4E4DEB96BDB6ACCDEDD34457CFDFF57CD8EDD0DDC2CE07EC1CEAD7D587BADABAA642B8DF8EFD3A7DE1DB5A213C65CA943B627C69E1C285FD524B705ADDD8D8B8CAB703004A9B965F802EA4CFA03EE183E77C30FCF5A6BF86834E3C288CFEEEE8A631C0637E36A6CDF7A45B1CF5E89D9FC17A970376696A114E91A4EED19D75CCEFC6DC7FFFFD75E1ED16E1AFAC59B3E603656565A7C742F8D3B1281EE0DB02008A5F008AD4A7FFFDD34DB730DA6FF47E4DCF9B27BF7AEDD9D7C203573ED0D4BADB6CE63D339B66764EB73A4A637DDF5AF45653CB6FF3ACD0CDF7FFFDE4F84F167D5EB2AED1D3528C1A35EA4B43870EFD442C8247F8C60080E2178022D5F27EBEC97B0E7E4FF8FCD59F7FC7BAFD3E9A2F909B5B79BB8AAC45F8D62C00801261CC2F0000008A5F00000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000050FC02000080E21700000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000014BF000000A0F805000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E217000000C52F000000287E01000040F10B0000008A5F00000050FC0214A186F286653DD6F690884EA07B75F7505F56BF52260000C52F403BAB2FAFBFA3FF8AFE0D32B1EDF55BD12F349635FE45260000C52F403BEBD9D0F35FB75BB4DDDA9EAB7B4AC636945A7D072D1CB4265793FB9A6C00008A5F807676F4D147BF5E16CA4E79CFECF7AC1DB260485311C6562E7A170D0AEF7DE9BDD515A1E2F3A3478F9E2D2B0040B30A2900683FC71F73FC1FEEBBEFBE3DFB2FEF7FED764BB63BAC7C5D799F62FAFB57AD5A155E7EF9E5B0E79E7B863E7D8AEA4F0F75E5756BEB2BEA9F0E8DE1ECE38E39EE25DF460040F10BD081520B705C7CA418FFF6AAAAAA097131FE99679EB960F2E4C9137C9A0040A9D0ED19000000C52F000000287E01000040F10B0000008A5F00000050FC02000080E21700000014BF0014182305004057532105002563B718BF8FD1903D1F15E3C1186363CC28D8EECA1853A40B0050FC02508CE6C53829C69C18C363AC8AF15C8CDAACF8FD718C33630C932A00A0ABD1ED19A0B4F4CA968517375F8CF1E518E363CC8FF1963401005D8D965F80D2F2468C81319664CFD345CE3D623C1563EF90EF1A3D22C6F352050074255A7E014ACBE8ACB8FD54F67C568CD9312ECA9EA7AED1C74A1300D0D568F905282D0F84FC98DFF9D9F3FBB3E52F0BB6B92646BFA0FB3300A0F805A00855C6B87913B65B1BE328E9020014BF0014A363627C2118CF0B00A0F80528618FC63820C6F4184363CC6D659B1E31BAC7787F8C6A29030014BF00149BE5213FE6F7A090EF023D2EC6E331FE476A0000C52F00A528B5EAFE6BB69F4F512725004057E6564700A56BD7ACE855F802008A5F29002829B7163CBE5F3A0000F2747B06282DDF09F949AFD6C47838C615318EC85EDB37C6ACE056470080E2178022B72EC68C18C3B3E797C6581CA367F6F8CC909F080B0040F10B4051FA63C8DFE2A8217BDEBB8DED2E942A0040F10B40B13A2EC66E31E6857CCBEF7829010050FC0294B2CA6C79748CFF1BF2333EA7D99F9F0EF996E143A5080050FC0250CC0687FCC456699CEFAFB3383EC6BD52030074556E7504505A5297E725D9E30905EBEFCD8AE04A290200BA222DBF00A557FC4E8BF1C31833633CD7E2F5749BA33411D61AA9020014BF0014ABDD0A1E5F1FE3F3520200A0DB334029BB5C0A000014BF00A5EE71290000C8D3ED19A0B4A47BFB5E1063DF182BDBD8E635690200BA1A2DBF00A565765600EF1963C71817B558EE1FA35A9A0080AE46CB2F4069B921DBB7A796DF19D9BA275B2C3F254D0080E2178062755D8C4362D4C5688871501BDBDD2B550080E2178062D57C5BA354F4BE251D00008A5F8052F5871857C41814E38E18EF8971708CE121DF2A9CE67A7823C607A50A0050FC0250AC3E16F2637AD3C45787C65823250000667B062835BBC59815E391906FFD9D18E3FFC4182835004057A6E517A0B4FC264655F678488C2FC6E81EE347314E0FF9C9B0DE0C6D4F860500A0F805A0D3FB48B63C2AC627633C15A336C6FFCB0A60DDA00100C52F002563518CEF173C9F2F250080E217805292BA3A5FD7C66BBF0BF9D9A0A76DE4678CAFAAAA924900280DE3A540F10B508A3E14E37B213FA9E10531A684FC58DFCF66AF4FDBC49FE3400900287E01E8B42E8C31277B9CEEEF7B578C7E311E282880DB3249FA00A06439CE03505252C15B912D2F0FF96ECEBBC6F863C8DFFE080000008ADEC742FE7EBFDD0BD6ED9C2D7F10A3528A0080AEA65C0A004A46EAD2DC27C61B315664456EEF2CBE13E399184FC7382FC6C3D20500287E0128462FC4F8708CB5317E18F2E37E0F8D918BB17B8CA531B68BF16A8CD7A40B00008062B55BB6BC365B0ECF967BC718283D004057A5E517A0B4A4F1BE7D43BEC577518C0342BE2BF490181F8DF1A81401000050EC46C618DC46CC971E0000004ADD7029000000000000000000000000000000000000000000000000000013EF7BBF00000088494441540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A068FD7FDE8CD9EF8E2563740000000049454E44AE426082,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('212511', 3, 'source', NULL,
+ 0x7B227265736F757263654964223A22323132353130222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D41453336323135452D353838452D343946332D423734332D383330454243423330344130222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E5BC80E5A78B222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A37392E32323232323232323232323232332C2279223A3131367D2C2275707065724C656674223A7B2278223A34392E32323232323232323232323232332C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934222C2270726F70657274696573223A7B226F766572726964656964223A226D616E616765222C226E616D65223A22E7BB8FE79086E5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238382E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3138382E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D38323934394441432D433932442D344241422D393932342D314632373945353044424338222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3138372E36303530353132333635343432382C2279223A3130302E39303833313534363834373331327D2C2275707065724C656674223A7B2278223A38302E31373533333037303739303031392C2279223A3130302E32393039303332383135323638387D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39434334443631332D313435312D343133432D414638352D383046383839314244313934227D7D2C7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131222C2270726F70657274696573223A7B226F766572726964656964223A226872222C226E616D65223A22E4BABAE4BA8BE5AEA1E689B9222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A7B227461736B4C697374656E657273223A5B7B226576656E74223A22637265617465222C22696D706C656D656E746174696F6E223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C22636C6173734E616D65223A22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572222C2265787072657373696F6E223A22222C2264656C656761746545787072657373696F6E223A22227D5D7D7D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3439372E32323232323232323232323232332C2279223A3134307D2C2275707065724C656674223A7B2278223A3339372E32323232323232323232323232332C2279223A36307D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D43423837323236392D433930412D343839342D394538382D304538384238364543384446222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3339362E34323134343039373232323232332C2279223A3130307D2C2275707065724C656674223A7B2278223A3238392E30323330303334373232323232332C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D32323745363933372D423435362D343735432D424332332D453842383539374238354131227D7D2C7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22E7BB93E69D9F222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3632382C2279223A3131347D2C2275707065724C656674223A7B2278223A3630302C2279223A38367D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D37363332463035442D343046342D343145362D383039352D323634444444333541324332222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539392E393730343836313131313131312C2279223A3130307D2C2275707065724C656674223A7B2278223A3439372E37333433373439393939393939342C2279223A3130307D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D42383042363037442D363646352D343834422D383041312D373935334238444445363943227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F62336D6E2E6F72672F7374656E63696C7365742F62706D6E322E3023227D2C227373657874656E73696F6E73223A5B5D7D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('212512', 2, 'source-extra', NULL,
+ 0x89504E470D0A1A0A0000000D49484452000002A6000000BE0806000000E761CD40000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B00001B104944415478DAEDDD097C54D5BDC0F1FF9D992C6C090442202C52A4802B8BA855A1202250B18A169B44C402DA67DD5ADBBEF7146D2D7EACFADADA576DA9FAEA82C56042D14FA90BE256A3E02E104411102112246058122021093373DFF9E7CE984B4C3090643299F97D3F9F6366EEDC593CDCFF9CFF3DE7DC33220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4178B2A0044366FCEB9FAC081E3675556669E5A51715CE76030914A69EE978B15908E1DB797272595AE32B7EF1B39F2D667A8156208C41040620A34E2D34F677E7FEFDE11F36B6ABA77CFCC7C41BA76FD4852533F118FA786CA69264D4CF6EF3F5ECACA4E96929249C160D0F7597575CA65E3C75FBA86DA2186400C0124A680CBA64D33EFFAE28B0BE60C18906FF5EBF7AFDADE09B49EE2E28B65F3E619871213F7CF3CFBEC594F5223C4108821A03E2F5580786D5077EE1C3FE79453EEB43232969B06D5A6525A596AEA06E9D1E33D6F49C9F7BE3F6BD60FD7CF9FBF781DB5420C811802484C11D70A0B6F1B5D5A3AE6316D5075C8B1BE9A83A9B2FD93F1F2C5DAC952B27EACECDBF96DF1FAAA25B9CB2E2AAF991213CB242DED03EFB66D174EB9FCF259CFE4E6E67E49AD1043208680300F558078535595B948871E1B6A50FDD59DE4B3B77364EFB693C55FD3A176DBC17D3D656BE1F7654FF1A9545E0BE8DCB948060D9ADF2131B1F2116A83180231049098226EAD5A75D7797E7FD7DE3A1FAE21BB3E1F2187AABA34F8D88E0DDF15DB26645A42BF7E4B3C3EDFC1C12FBFFCF277A80D6208C41040628AB864DB093FCBCC5C6A357691C6C1F25E8D3E577B7FB437082DA34F9FE7F5CF0FA8096208C41040628AB8545DDDFD0C5DCEA6D14637E8FB8646999069296969ABBA793C3593A8096208C41040628AB85459D93BBDA1797188BC2E5D3E936030E1446A82180231049098222ED976828785BFA3E4CBA7F6DFC16265106208C41040620A3424A143F9911F4FAAA092006208008929D0FABAF75F2309C9FBBFB6DDB282923EF07DB13C7E2A09208600909802ADAF63D7ED92D66FEDD7B66B43DB7B68011504104300484C81C8F1D7247F6D5B3090585B00104300484C810834A61DA4F8C3EFC99EADC31B7C6CE31B3365DF97C75351003104A095F8A80240E4C0EE7E52BC664AA3BF58A3F4F7BF8B3EB854BAF72F945E43DE106F42351507104300484C8196113894243B379D23BB8B463479E1EFDD5B87CBFED26F49E689AF494AC6A7542288216208400B61281F714D7B78766D39EDA87F8DA6B6E767E5D423FEFC22400C114300484C81266BEEC518017F02950862881802D04218CA475C1B78663E9500104300A2043DA6000000203105000000484C01000040620A000000D4C7C54F0000006D60FAF4E97DFD7EFF54CBB2C69ABBFA9369BA7E5A6753AA4CD961DB76A179EC4DAFD79BBF70E1C26D24A631E68C85975FD6B928382BB95C4E4F2EB7527D07ED044F8D48D06BDB810E96BFBA8BECAC49B13F0874F3DDFDEA4D0BDF27640000404BCBC9C9996AFE5C1FF4FBBF6B12CF86D65C4B366580796C80F93B351008FC213B3BBBC0DC7F342F2F2F97C4B49D3BEF7739BFEF506A5F9FB022D8715F1F91D253450EF6B0A5C69C9304CDE1E0A9B12C5F952474D8257D53B65A7DBB6E084CBDF8869C2F2D4BEE59F297BCFB08210000D05C26B91C60D9F643B66D4FAADD60128DA330CE3C6F9C798D6B4CA23A6BF1E2C59B484CDB9931F3B2CF4BD9224FFB8AEDD46DA345CAF5BCA38159B59A9CD6684931FB0C14291E27925A64F7CC5C21FF3BF59AAC9F275404272ECE5DBC8190020000C7222B2B2BDB63DB0F042DAB5B789BD7B6E5E41D3BE4CC6DDB64D0AE5DD2B5AA4ABA54574B6562A29425274B51D7AEF25EBF7EB22A33530E79BDE1A78DF67ABDAB737272AE8DC5DED3984D4CCFFD5DD62369AB64F6CE5162ED1829477D999726B1A6583D575BFDFBBCE35B3BF5C69CFFA6F71400001C43527AA1C7B2728326170D27A4DFDBB041267EFAA9A457547C6DFF8E3535B52573DF3E397BEBD6DA24F5F9A143E585214324E0F4B276B66DFB09939C269BE4F49158AAAB98BC2A7FCC5FB39FE8F69975D5A68B4D523AAA79FF975F8E10D930CD4EF054D97FB8F867D9B7125E0000E02892D26C93942EB14349A9269BF72C5B26D30B0B1B4C4A1BA23DA9BABF3EAF5F79F957DB4D72FAB0494EAF20318D62E7DE9D3DAFC71A99BEFE872215BD5BE6352BD345D66789CF572173A75D95733561060000BE89CE2935D9E803E1A4744869A9CC7DF5D5C392CBA3A1CFD3E79FB273A73B397DD024A743494CA3D079F7649DDE7D9375EDE62962E97CD196A4AFF7E9259260F9EDFB63E900000000AD96643D129E53AA3DA5BF5CB1A2760E6973E810FF4D6FBEE94E6E7558FF6112D328D469A767E98E51B6A7A57A4AEBD39ED32FCE968E8712ED45841B0000688C2E091514394F6FEB9C524D269B9B94BA93D31BDF7AABF6754346C7CA907ECC24A613EFC899631DB2BBEB9CD0D6A4AF7FA8A31C1F6B733ADA8BECECEC5F69B08F1B378E1F87008821209A63E5FAF00DBDD0E95887EF1BA3AF77E1FAF55FDDB76DFB9A58A8F798F9624A2AB3FF73DB18B182DED67FAFADE3A5D3C0A5C19BCDCD5C4237E2EE34C127191919E5E64BE359CBB216FAFDFE158B172F3E108D1FB6A44464DB3691D34F3F7CBBDF2FB277AF487AFAD1BD9E394996C4C4861FFBDBDF4466CE6CFCF1F03EA3478B9C78A24861A1C8F0E1CEF6CF3F1739EE380EAE788AA15EBD7A556465652DF1783CB9D11C436E0B173AC76F538FD537DF14D9BF5F64F2E4BA6DC1A088C7430CE1A862A5CAB437AF9AF6665E5363457FD12918089CABB76BAFC0DFB8B1553EE06493F02E1D3C38BC94D4689DD39A9F9F5F4462DAC626FC317B846F8374AB5DA73402F61FA76BE27AFAC7C201D05E992F8854F3E70AF3A57185D7EBDD63FE2D9E31DB16252525153CFEF8E355D1F239172C10193850E4B4D3449E7842A47B77A7517CFC7191F1E3457EF21367BFDDBB4556AF766E57563AF757AE14B9E00211FD3E1B30C06960B76E15B9ED3667BFE26273C6DCAFEEBD3A751279FF7D9173CEA9DB567F9F0F3F14B9FC72E7F68D378ABCFAAAD308EBB6E5CB1B6FB011933A9998996E6268BA89A17D2686FE65EE3F196D31E4A631A4B1D05802F8DC73871FC36FBF5D978CAA22F36DBD6C99C8534F39C73D318426D25F619A6262658A3991AB34B1F2A2B9FF687272F2AB8DC54AE867466BB3C561252592A65FECAD40AFD61FB97DBBBC5B77904E33E55E12D3B6FE9FD823D7EF1B2056242726EC1D6CFBD30BDBFF011023D24C9969BE346656555555982F8DC5E60BE15F252525CF151414F8DBEA4369EFA6F698DE7CB3C84B2FE919B439567D4ECF4A8F1E7549A9D284F58413449E7D56E4B2CB44BA741179EB2D2731D52475CC1867BFA54BEB9EF3E49322279D54D710EA459AA9A975FB141438AFABEFAF3DB4E6FB4B0E1D12D9B44964D72E91BE7DEB7A86FAF7A7418D737AB9E80C1343334C0C55E5E4E4FCC3DCFF675BC7507D1B3638230D8DB9F0422791DCBCD9399E93939DED1A4F1A031A63D75D470CA1599D221DCD9F4BB49850A931EDCDF366DB82FAB162B68D0DDF3E430FCA56A4AFEF4A4CC792984681844A19BBFB84C8BE67D90049EBF1919C4F621A7DBD40E124B557AF5E7B4C036B5242F97B5BF4023DF698C86F7EE334A40F3DE4F49A262589DC7AABD3806A43E77345609F3EE6584E70F6D1C64E135B6D20D7AC697C68515F274CA70C68E378EAA9CEFDA1439DDE5AA50DEA8E1D4ECF51B76ECEF6471F753E9BBE67D8451799CAFABBB30FE2B777C8C4CF95E6EF952686B427F525FD7DEE68E8490D4F813912EDF15413273A31A1468C70924CBD7FEEB9C4105A8C7E335F62E2E5928C8C8C4AD3DE2C37F7EFD3583149EBF0F04E03F7EC69D50F31A0ACCC7D77787BAFD498484C13F7591995E97644DFF3600FF39F803DC27C69CF2536A3569AF9C2C8367FB3CD97842E72BCA9B4B434226FAC43889A546AE3F4FAEB220F3EE8346C7FFEB3C8BC794EE376CD35221326E8959BCE7D6D74B53766FB76A7C74793D1708FA9EEA7DC3DA6DA8B73E79D4EC2ABD6AD737A62B571D5214B9D673F678EF358E7CE2283063949AFF600E93EDAA0EA67D3A151A5AFF5EB5F47B6413D70E0801043514D7B52A799389AA63164FEAD3E8B540CD5A7276A3A57BB29D78F7CFCB1D35BAA31A1B417544FF0860D3B7CBFF61E43A5A59D64D5AA55C45014D09E54132793CCCD491A2BC6574949D7AAD63D9FABF7FA3D484CA380B7DAEE78A85384CFDC7588C8B67408F9378464BBF9E218F4DE7BEFD52682ADEDACB39C796CAFBC2232638636204EB9E38EBA7DB4B7E5A69B9CC454870075EE9B0E11EAF0A0366C4DE931D5FDB521543A6D407B89B401D5B96EDAB0BAE930A5EE9F9B2B72E595CE7B4C9DEA3CA6C9B07E9E8E1D23FB6FB2D1B92080186A3F8E8F540CD5A7B1A4C3EE7A02A7C7724646C3FB69423AA281D559B427D4B526794CC4D0EBAF7F4B563B93D389A1286C72C2375A6A89A8C6E8D251EE1020318D021EBF788389917D4F7D3FCBF925873B88BF883AE62F6093986E1E3E7CF8C0487D506D2F34A10C2799DAD8E9C5197A5B1BCF7FFFDB994F1AA643809ABC8E1BE7ECABBD31EE1E539D2757BF61D5463ADC8BBA76ADF35EFADA7A3B33B36E3F6D641F78C079FC8A2BBEDE78EABE914E4AD5E0C183B5612586A22F8602B66162C6573F86468D1A35B02D3EB426A63A4FBB572FE758BEA391A34663262CDC5EEB367DBE269E7979725862DD9E6368ECD82DB279F30C62A8EDDB1BBDBCCE532F568226846AB7ED4F4A6AD5E4B4F2F09E8BAAF65EE931919806BDE2F7D4882F92C9A9793FB1C5AE5E94BF682EB11B39D9D9D94D4E4CCD974299F972784597944A4A4A5AA6F3E366CF9E1D91391F3A34FF8B5F38BD2F59597573D694368ADA38BA1BD0FACFD57972FA5C6D58B5E1D4BF7A45BE26A9EE2B84758E6AF875DCBD3D9AC4BA7B7BF4E2292D37DC70E4CFAD89F1D12E61D51C9DCD87CDCFCF2786A220864CBCE8851B41132FFA4DEA357FDB3486DCF4244DA7B78487DC350EB4B3DD9CD77C452F2A0C9F0C86E9CA164AB7E963FA3ABAD493FB386FCF31949E5E2123478E949B6FBE99188A7C7BE34E463DF563A5AAAACA9CDAC8207DB0CC9CE9B466625A967C5827E92E12D368484C93A522A14252AB239898FAAA6A4F897613BA6D2BD4AB63B936E9FA72CB4C59D4A14387574C435AD6169F4B87E6C34BC76862F9DA6B5FBFE8C22D3C6CFFC61BCE73B4674893D38A0AE74A64EDA5D1C6B2FEDC355D4BB1A1DE1E6DC48736E18773B507D6DDF8BEFBEEE1178320E6699F62C0940EAEDED1A88821B75B6E11B9D77599A90EBD4F9922F2FCF37543FABA8494165D01A3674F2716C2173FE914009D2FAA71161E7A2786700CED8DDF15279E23C58A496A0BC389E9E6B4B4165F5CDFADA86B57F7DD4212D3281048904F3A96CA77AA2378D146A71DB2CDB2DBFF01D0DE859252FD7278CA94E79393939F8B863518B537E7AEBB447AF71639FBECC67B47754D44ED4DD5354A35019D3FBF6EC999F05A8ADAF0694F8D5E70A1FBBBE9C51B61EEDE9E867A9C0E985A3A7830743217747A90162F767A80F4FD9536E4DACB14EE9942CC4B7425A3511543613A64AF8BDE0F1A54B74D93D1BBEF1619354A64EE5C6754227CDC6B0C8417D1D72453AF98D784557B4DC3EB99124338C6F6C6D7D4583149ECEB667F5D5252DEEBD74FC66ED9D26A9FEB3DF7309AC8EB24A6D170B0F8E5D994AD72C6DEC1915BC9B4DB46DB7C4D59AF13AA6D76E6AA67A6051E8F27BC145459347D3E1D62D4A5A2C24BCD2C59E20C196A63A9F34AC33D34DA23AA8DAC967003A9C3943A17353C1CA8438ADA0BA3F4A45BAF306E688171BDA25F1BC5867A79C2AB0368C21C6E74B5072ADCB3A36B3BEA851B7AC5B15E240262A8ADE90999FE7293267D7A52569F2690FA0316EFBCE31CFB6E9A406AC278FBED222FBEE86CD393C46F420CA1A562C5E7F32D0904027FD29B6BCCC1B7A763C75659645F87F1576666EAF49AF0C8E15324A651A0C341EF026B53E0579F8F970E914A4DBB1659DD63E10068877E6DCE428BCC99EA53D1FAEB3461035D9788D41F3E3C126D847FF4A3A37FBFD9B38FFC538AFA19DC9FC33DDCD8588F2E88A1B6A2276B975E7AE47D747A4C435364525244AEBA4A64D6ACA35BF49E18424BC5CAC2850BB7E5E4E41498A47642C0B2E485C183657A61CB0FB22E1B3244FC5E6F38295D110BBF46191389A91E00D366E77C9C5A648F2A8FC0F5A2DD36DA1F5935529E9FBFA888B88D2C1374BFA5161A9698481D8018723BDA5F622286D0C2B1F257536A57A17EC12490DFDDB2A545E79A16A7A6CAB343877ED55B6A92E8FF8B89B88D950328E1A0DCD5FF356BBF045BFFBD06BC6CF93C96E721C216000034242F2F6F89F953A0B7B5D7F4BE73CEA95D3AAA25E81251F79F734E205877F1EF8A9292927C12D3283B00122BECB5BD3F90565DC9B6DF6BF61BDE6AD9152B070000006835B324B484D3F69414F9E3E8D1CD4E4E35293549AEFD454A8A37B4E980C94F7F5C5050E027318D32965FA6F77E47AA3A6FAF5DFEA4C575DE2145196B3C4363E900000000AD43E77CDAB67DA3B9599B336C484F97B9E79D573B0C7F2CF479B74F9810589B91F1D532892627B9362F2F6F7DACD49927D60E00EB90FD93414BACFD89FB5AF6B593CA65C790459260D9F2CB583A00000040EB59B468918EB0FE389C9C6ACFE99CC99365E1F0E1F517C76F94EE973F6C98DC3279B2BBA754570C98637292DC58AA2F5F2C1E00D9D9D9C9272D907B375E2A5D2A32A5D9D3D93B9758EB86FCC34E15BF3D2F6F517E2E610600009A2A3F3FFFF1ACAC2CBDB2FF41CBB2BAEA9CD3E7860EADBD286A5849899C515C2C03F7EC91AE5555B5BF12A5C3F59A8CEAE2F92BFBF695957DFA04ABBD5EED4C0CF794EA7AAA379A9CE7F158AB2B5F2C1F004317590F947C47766D3F53328FB16FD8DFFF6579B9E747F648B1E596FC183C00000040EB0B759CBD6312D387751929DDA609EAAACCCCDAF20DDC59CC0A9D5218ABA3B7BE583F00FABC633D9CB1DA0E6C99248965C74B46539F9FF689FDC680973D291EBFDDC51C00E3F2F219BE070000C72EB4CEE8F9263F9966728B6B4C823AEE2872B115A63CBA63C78EDC58BECEC5172F07C0B79FB1AE09786D39D05B8A779F2C29077ADA9DFC5D24239068F9BC35B2DB77400E74DE21C53DD64975972FAC4112D0B313FBFE583F00000040C4F313FD819EA7A64F9FDE37180C4E3309AAFE08F528537A99A2134F75D85FAFE6D755F9F557269F8A85C5F3E33E316DE80048DD169C9652AC0780A507803F54079D4CD15F402E730E003B6E0E000000D036F40782CC9FFB4205F192987200000000443F0F55000000101159A61CE7BAAF1D84BF6FC2F396C54BCE46620A00001019634CF9DC755FA714760CDD0E2F6FA9734C4F0B25B0E152634A3FD7FDBB4CE9168B15E48BE38363B029E9A6BCE9DA7653E8AC247C05FE99A69C250CFD030080E6196ECAFC50FE3138B42D68CA00532E30E574531E30A5D49495A184B532B45F852BA1D515866E8BD54A8AF5C454CF4CBA9832DE94BDA6AC0E9D89CC0EFDE3EFAFB7FFB07A49E845A1FD0000008E95F6868E3065A13843F7F798B233F49826A54B43C5ED5953FE18BA9D19DA4FCD34253B94D49298B633CB437FBB9B5262CA2BA6740E25AAEE03A04FE880E91BFA87D7B397BCD073BE30657228B17D97D8020000472939945CCE31E56953768B33DF543BC8B45774AA381D694FB89EF3A52B5799E1BA7D4AAC26A5F1909836E50CA626947CEA01A1BF675B60CAEDA1339AA75D6728DAFD7EA9D40DF303000034C53E531E136764767928FF7821B43D9C70A6D77B4ECF500EA2CFE96FCA2C717A59CF8AE58A8AE5C4F444530686CE2AC2FFA889A1B39601A17FEC8B4D992B4ECFE8845022AABDA96F859E5B2DCE1CD49AD0D9CD6E620B00001C835C53FE29CE34411DC1FD2F53DE0E3DA6B989F684DEE1DA5F87F1DF17A767756B281759EA7A0E89693BB32E54944E320E5FD4E41ECA770FE7A78712543D13F95DE8AC242394B04A28B965281F00001C8B4952F7C33E43433947380FD1DCA453BDFDFF6DCAFDA6FCC29479A6BC64CAFF88D3A14662DACE9D24DF7C65BDF6ACEA4F8269D7F9BE50325B2475F3542F21A60000C031E81E4A3035BFD02BEE5F09E515E1CEAFE47AFB6B67D9D5A6DC22CE352E4AAFD6FF9B38530034697D2494DC9298B633BACED7F626ECA7DDE73F15679DB0D389210000D042742AE022533E746DDB164A50556757EEA149ACF6A8DEE3DAB726F477B32953C419C52D89C58A8A87C4F43FC4199AFF267A76A2DDE87A65DC0DE20CE59F2DCE4551F152570000A0757C58EFFE7CD7ED03A6BCE64A6297D7DB7796EBB65EC51FB3F34C6339D9D2330E5D205FE76754B9B66BF2B9B181A4F42CD7D9C9BDE24C4ED649C7E1ABF00712530000A00D04E3E57F349613533DE358DAC076ED09FD73BD6D3A6FE3997ADBEADF9F475C000000B41E0F5580786259FE403098484544C3E97FEDBF831DA02688211043008929E2526262D9E6F2F213A88828505E3EA4C4A439ABA9096208C41040628AB864DBBEE7CBCA4E0952136D6FE7CEB1BA60740135410C811802484C1197AAAB53FF5E5C3CB5D2B6BD5446DBF297944CD60B149FA62A88211043008929E2D2C489130BFDFEE4F7B76EBDA49ADA683B1B365CB73C10482A3AFFFCF3DFA13688211043008929E296DF9F70DD679FCD3C585E7E02170DB4817DFBBEBDA9B878EA89C160F0E7D4063104620870632C067127373777D79557CE5EB973E7D8C9DDBAADE9909CBC8B13B48835A8833FFEE083BF249BAF9E6B274E9CB8821A2186400C0124A6887B0B162CD83C63C6D585DBB74FBCC8B67DC5DDBAADED6E593615D37A0EAC5BF7CBA5EBD7FF748836A813264C788E2A2186400C01F5595401E2D98B2FBE38D4E3F1FCC9EBAD19DEB3E71B9B32320AD2D3D2561FEFF1D4F013B4CD140C2696EFD933ECA39292F37797968E19120CFA8A75E871D2A4491F513BC410882180C41468C44B2FBD34DCB2AC1F989BE34C19654A32B5D26C7E530AC559CEE6692ED22086400C010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022E0FF0121C2023A02FEDB030000000049454E44AE426082,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247534', 1, '请假流程.bpmn20.xml', '247533',
+ 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274223E3C2F73746172744576656E743E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231223E3C2F73657175656E6365466C6F773E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E3C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F6578636C7573697665476174657761793E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4C656176654C697374656E6572496D706C223E3C2F61637469766974693A7461736B4C697374656E65723E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274223E3C2F73746172744576656E743E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9223E0A20202020202020203C657874656E73696F6E456C656D656E74733E0A202020202020202020203C61637469766974693A7461736B4C697374656E6572206576656E743D226372656174652220636C6173733D22636F6D2E6C656E2E6163746C697374656E65722E4163744E6F64654C697374656E6572223E3C2F61637469766974693A7461736B4C697374656E65723E0A20202020202020203C2F657874656E73696F6E456C656D656E74733E0A2020202020203C2F757365725461736B3E0A2020202020203C656E644576656E742069643D2273656E6422206E616D653D22656E64223E3C2F656E644576656E743E0A2020202020203C73657175656E6365466C6F772069643D227369642D46333946364639322D463330412D344630452D423946382D45304444454231313530363522206E616D653D22E5AEA1E6A0B82220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D2273656E64223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572223E3C2F73657175656E6365466C6F773E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F6578636C7573697665476174657761793E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E3C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223136312E3130323038303930333236363036222077696474683D223238342E36303837323832303738373235362220783D223234382E32343130373732313432383638362220793D22302E30223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2232392E39393939393939393939393939372220783D223236362E373539353935363738323937332220793D2237312E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223333382E32343130373732313432383638362220793D2234362E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273656E64222069643D2242504D4E53686170655F73656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232372E39393939393939393939393939372220783D223436352E302220793D2237322E3035313034303435313633333033223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338223E3C2F6F6D6764633A426F756E64733E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635222069643D2242504D4E456467655F7369642D46333946364639322D463330412D344630452D423946382D453044444542313135303635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223436352E302220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E3637393931353936313034392220793D223232342E3032333738383033373133343735223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223235332E33343530333333323234383436352220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223136312E3130323038303930333236363036223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223239362E373539353935363738323937332220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A20202020202020203C6F6D6764693A776179706F696E7420783D223333382E32343130373732313432383638362220793D2238362E3035313034303435313633333033223E3C2F6F6D6764693A776179706F696E743E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E,
+ 0);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247535', 1, '请假流程.process_leave.png', '247533',
+ 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D00004B3D4944415478DAEDDD09985C559D37E0282232A3830B88382AE038E0363A220CA2A3068619409045A8AEBED59DA4D982B208B20884C1B083AC437001648DC8221F46C8B048164242482420888160420264212121040890B0DEEF9C9ABA6DA5D3DDE9AE7477AABADEF779CE53D55DD5DDC9A97BCFF9FFEE3A6000D0AF5D71C5159BEFBFFFFE0F6FBDF5D6AF872F534DD3B49E6A5B6EB9E55B43860C993176ECD82F196D0100FAA961C3866DBADD76DBBDB6C71E7BA4D3A64D4B57AC589102F48437DF7C33FDCB5FFE92EEB7DF7EE917BEF085D7E3462CA32E00403FB4EFBEFB8E8FA112A037C57019C69BA9465D00807E68F3CD377F31EEA904E84D3366CC483FF5A94FAD34EA0200F44F0E7F05FAE4B0D801FF77DE250000FD315802F405C1120040B004102C0100E8FB60592A24D3C6C646553508968225008060597931F9894F7C62B5EF0F1E3CB83578AEBFFEFAE957BFFAD5F4B1C71E537D836009008060D9B56059FEDADB6FBF9D0E1B362C1DE0D05C102C0100E8BFC1F2FAEBAF4FB7D8628B74BDF5D66BDDD3181D74D041C5E73BEFBC73FAFAEBAFAFF25A564C1E76D861E9E73EF7B9E2F34B2EB9A4DD6079CC31C7B4FE5CF9EFB9E28A2B56F99D8B172F8EF7C36BFDDE11471C517C7FE6A5975E4A9B9B9B5B5F1F356A54EB6BF16777DB6DB7D6D7E2D76BFAFFADE93540B00400102CBB5714AE71AFE46F7FFBDBE2D70F3CF0C02A3F17C3E371C71DB7CAEFF8F8C73FDEFAFA17BEF085F4CF7FFE73BB7FF3F9E79F5FED7BF136293118B6FD770D1D3AB4F8F5B3CF3E5B0C956D436EF6F559679DD5E16BDDF9BF038225008060D945F3E7CF6F3D5C35EEB99B3B776EBBC1320B73E5C1B26DE8ECCA61B2D9EB1FFDE84757FBDEBFFDDBBFB57EDDDEEFDC7AEBADDBFD7D5FFFFAD75B4362DBB0D8D9FFAFB3D700C1120040B0AC40477BFBE25EC933CE38A3F8FCC1071F5C6D6F5F3C6CB5BBC172A38D366A77EF61BCE17A3CECB56D40CC0E837DE185178AAF8F1C39B2DD7F676C1D5D2CA8EDFFAFABAF018225008060D989DD77DFBD35987DEC631F4BAFBBEEBAD6D76288CC5E8BE7509687BDF818DF9B7D6FF6ECD9C5EF975F1576F9F2E5ABFCADF8F580367B16B3F328E3E1AFFBECB34FEBF78F3CF2C8E261B1E57B17070E1CB8DADF8B162D5A94EEB2CB2EADAF4D9C38B14BFFBFCE5E03044B0000C11240B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B034E4020008960082250000822520580200205802822500008225205802002058020896000008968060090080600908960000089680600900806009205802000896008225000082252058020020580282250000822580600900205802089600000896806009008060090896000008960082250080600920580200205802822500008265ED9A3B776E3A65CA9474DCB871E9983163B43E6C63C78E4D274E9C98CE9A35CB82285802002058D66EA89C346952BA78F1E2F4F5D75FD7D6415BB264493A61C28474E6CC991648C1120000C1B2F6C43D9542657584CBB8C718C1120000C1B2E6C43023D855478B87C6225802002058D69C1866843AC152B0142C0100044B7A3D58BEF2E2C274CEB4ABD3C7C69E566CF179FC9E4028580A960000089682E51A03CFF2650BD2E97F3839FDF3EDC7ADD2E2F7E26B42A1602958020020580A969DB6798FDDB65AA8CCDAFCC7460B8582A560090080602958761E7866DCF3D30E83657C4D28142C054B0000044BC1B2D3367DCC291D06CBF89A5028580A960000089682A56029580A9600000896F45EB08C5781ED2858C6D78442C152B0040040B0142C3B6DB326FFACC360195F130A054BC1120000C152B0ECB42D5DF0683AFDEEE1AB1F061BBE175F130A054BC1120000C152B05C637BEAC191AB05CBF83D8150B0142C0100102C05CB35879E952BD359F7FF72F5C360C3F7E26B42A1602958020020580A961DB6E5CB16A433275FD2E13996F1B5F81EC150B0142C0100102C05CBD5F6522E9C353EFDCB5DC33A0C95598BEF89EFB5F752B0142C0100102C05CB2EEDA5B4F752B0142C0100102CE9345876652F65677B2F8544C152B0040040B0ACF3605969A8CC9A9028580A9600000896CEB1D4044BC1120000C112C152B044B0040040B52B580A9608960000089682A526580A960000D449B09C33674E7AF5D557A7A79D765A7AC41147A443860C491B1B1BD3418306A5871D76587AE69967165F7FE69967044BAD6E82E5ECD9B3D38B2EBA283DF4D043D3E6E6E6344992E27A115B535353FAFDEF7F3F3DF7DC738BEF132C0100A8DB6079F3CD37A7279E78627AE49147A6975D76593A75EAD474C18205E98A152B8AAFC7C7C58B17A70F3DF4507AEDB5D7A6471D75543A7CF8F0E2CF09965A7F0D9637DC70437AD04107AD1224D7D40E3CF0C0F4CA2BAF142C0100A89F60F9C4134FA4C71D775C7AECB1C71643E35B6FBDD5E59F7DE49147D261C38615DB8C1933044BADDF04CBB85E1C7CF0C15D0E93EDB5FDF7DF3F7DF4D147054B0000FA77B01C397264B1781E3D7A74B702655B77DD7557F150C05B6EB945B0D46A3E58C643BD0B85C22A21311EEE7AF6D967A7E3C78F4FE7CE9D9BBEFCF2CBC5F7BEFAEAABC53DFB93274F2E1E2A1B0F192FFFB9B8A7B396F65E0A9600008265B7C41018CF179B3973668FFCBEA79F7EBA784E66AD1E1A2B580A96D16F7FFBDBD5CE9FBCEEBAEB8A878177C5B265CB8AEF8F3F571E307FF18B5F08960000F4AF6079CD35D7144365578BE5AE8ABFAF56C3A5602958C63D95E5A1F2E8A38F2EEE9DAC44FCB978887979B8AC853D978225008060D9E573C70E38E0801EDB53D9DE9ECB430E39A4E6CE2D132CEB3B58C6F5A27C2F63BC305576B86BA5E261B2F12ACAE587C53EFCF0C382250000B51F2CE32D436EBBEDB65E2D4EE33997C71F7FBC60A9D54CB02CBF504FDC53B9B6A1B23C5C96EFB98C17F4112C0100A8E960196F9D106F27F2C61B6FF47A811A83E5F5D75F2F586A551F2CE37A517E4E65A587BF7676586CF9DED06A3E2456B00400102CD7E8F0C30F2FDE52A42FC443614F38E104C152EB956019DFD753E27D2AB3D0172FBCD3DBE1B59AF75A0A9600008265A766CF9E5D3CDC6F6D6E2BD25D471D7554AF9DCBD99DD070F7DD770B96FD28583EFBECB3C5DB7BC410D859C0ECCA671FD78BEC823D71AFE2D2A54B7B65398C578B2DBF15493CA753B00400A0E68265BCC7DECF7FFEF33E2D5263E17FE9A597AED342392BE463C818376E9C6059C3C1325E7578C58A15AD5FAF5CB932BDE9A69BD2471E79A4E2CF3EAE17D9FBCE3DF7DC5E5D16FBF26F09960000F44AB08CB701993A756A9F16A9F1B0DB934E3AA92A8265D6E25EDBF6F6620996D51B2CDF7CF3CD4E6F8DF3D4534FA5BFFAD5AF8A17CAE9EE671F6FBB93BD3E61C2845E5D16E35ED6EC6FC52B270B960000D45CB01C326448BA70E1C23E2D526318887B8BAA295896EFC52A0F1982657506CB78D8EBDB6FBFBDC6CFF99D77DE295E8DF88E3BEEE8D667DFDCDCDCFAFD9EBE684F5B0B162C68FD5B854241B00400A0F682652C64CB0F23EC0BF1EFC5C2BD1A8365F95EAC7898A460595DC172F9F2E5E98B2FBED8EDCFFB85175E48AFBAEAAA6220EDCA675FFE754FDD62A423718F6AF9DF132C0100A8B960B9AE0AD93515F7D5D204CBEA69A3468D4A478C1851BCE04D2517C9893F5BC932D0D7EB8360090040CD05CB75B5C7325E69B31AF758C643837FFBDBDFB65E55B4378365BCF268F9EF8F9FE999679ED9EE7BE3219AF1F5B877EBF6DB6F4F070F1E9CDE7AEBADE9EEBBEF9EB6B4B4F4E8BF2BFE9DF3CF3F7F8DEF39F6D8638BCFE38572E2679A7D3FBB2A6B6FECB18C7D76CC31C7A4F7DF7F7F973FEBB8C7F1473FFA51FAFDEF7FBF78D5D5AE7CF6D91561EDB1142C010004CB2E88B73A5817E7581E78E08155152CDB06CABE3AC7327E8E53A64C29EE518BCFE3855C3A7ADF85175E580C215988CBBE7FE28927B67EBD68D1A274A79D762A86CE18F076D86187E2FF2F7E9D85D1912347A61B6EB861EBCFDC7BEFBDABBCBED9669BA5DFFCE6378BCF63BBE5965BD22DB7DC72B57FCF15575CD1FA3CFECEEC790C9ABD7D8E65BCFFE3E9A79FDEE9DECB787E65FCB7C4C3AEE3FBBBF3D93BC752B00400102CBB215EFD72E2C4897D7E55D8B8D7A91A8265DCDB17434747F73DECAD60397DFAF46260DB64934D8AE16D830D36287EFDF9CF7FBE1820DB1E029AFD3BE2E77EFCF1C7B73EDF679F7D56FBDD317CC6D7E29ECDEC7DF1FCC2F818C3630C9C9FFCE427570989E561307E1D435BF6F5FAEBAFDF1A5EE39556E3BF37BEE75BDFFA563150C6E7714F60F6B38F3EFA68F1F1E28B2FEED5ABC2C650396CD8B0F477BFFBDD6A17F2896170FFFDF74F4F38E184F4F9E79FEFF667EFAAB08225008060D90DF11E7AF1B0C7BE14834DFCBBEB52477B28FB2A58DE79E79DC5C0D6F6FB1B6DB451BAD75E7BB57E9D85B4183A0794ED9D8CCFE3EF8881303EBFE79E7B56DBA3180360F63C06D9F878FDF5D7172F60139FCF9B37AFF87ABC204EBC5051B68732BE76C00107149FC7E01AC3687B7B50CBF7586EBAE9A6AD87EBC6BD9B712F685FDDC7326E18F9F18F7F9CCE9933A7B837F7A73FFD69313476B4C1A42B9FBDFB580A960000826537C473D662A1FDD65B6FF559917AF8E18717F770D582751D2CE35EB9182EE3E1B2DB6CB34D3120C6F7C4AFB3F73CF3CC33C5C23FEED97CE9A5975AC3610C7E975C7249F1F9CD37DFDCE11ECB2C1CC6F7B40DA5F1DF19FF5E7BC132EEB17CF0C1075B0FE7CDBE1FFF665FDCC7B25C7CFD820B2E2886B3F8B8A60D065D592FB2B017CF075EBA7469AF2C5FF1F32D3FECB65AD70BC1120040B05CA378FFBE78385E5F8821E9073FF8415A2B7A3358C6CF305E502686BDECFCC6F8BDA38E3A6AB5C366E36B3134C620173FAB6CEF6276186DB6F730DB03197F4FDC839885BD6C2F65DC63195F9F356BD66A41F11BDFF8C66A7B2CE3F9966DF7A0C68BF6C4F75C7EF9E5ED86D2BE38C7B2B380D993EB4516F86218EF0DF150DCEC6FC44377AB95600900205876A9B88D45745FECB58CA1E4CA2BAFACFB60F9F8E38F175B16C64E3DF5D4E2F318F8E6CF9FBF5AE88B6DD2A449C5433DE339946B0A7103CAF63AC6809905C6189076D96597D50E6FED6AB08C17078A7BF306B439D4B63C586687EFB6FD7FF445B0ECADD017F75AF6F4457CE2EF8BBF37FB1BD5BC5E08960000826597C4ABB45E7BEDB5BD5A9CDE71C71DE9D0A1437B74AF522D06CB786E630C7BF1D0D61FFEF087C53D9159108BA12D1E221B837EDB9F8B812D5EF1B5A38BEE94B70F7DE843C5DF1FCF758CBF3F7B7FDC63D9D11ED4F642693C34330BC09D9D6319FF6DD961B1F1023F3168965FBDB6168365B65E64C1EFE8A38FEEB15B8FC48D03F10256E57B2BAB79BD102C010004CB2E890122DEEA208688DEF0F4D34F172FA8F2F0C30FA7B5A4A783653C576F40E9B62231FCC5F3EBCA5F2FBF6D47F9F993F16AB131B095DFC3327E7FDF7DF76D7D1E4364B63771ABADB62A1EFE1A836876FB9101A5732CB3E7F182406BDADBD9B6C5C368B3436DAFB9E69A55F6A8C620191F870F1FBEDA6D506A3558C6F5A2FC9E96F1FFB6B6E13286CA33CE38A3F577C6DF5FEDEB85600900205876D9D5575FDD2BF7B58CF7AD8C7BE06AE910D8DE3E1436BB8D4816CAE2B996F15613034A7BFF3AFA99AEEC058CC1AF3BEFEF4EB08C2DBB426DF9057BCA2F26D45B6D5D04CB6CBD28BFEF65DC7359E961B1F1E7CAF75456FB21B082250080605991CB2EBBACB8172D5E30A6A7F654C6C309CF3AEBACB416F566B0D46A235866EB4579188CE746C6F355E3555DBB7AF5D778CE66F93995B1D5CA7A21580200089615EDA18987E7C5431DD7E6823EA3478F2EEE018D4579AD122C05CB8EF65C660133DE7B72C28409C5BD91D961B2F170D7050B16140F791E316244F1963EE53F17D7AF5A5A2F044B0000C1B2E273CBE2E1ABF1A222F7DD775FB77E369E2F76C4114714AF2C5A6BE7540A96826557D68BB601B33B2DAE53B5B65E0896000082E55AF9F5AF7F5D2CA4E3E1B1F18223F7DC734FF1EAA5AFBDF65AF1F5780E5FBC05C51FFFF8C7F4E28B2F2E16CD3150C6BD31B574F557C152B0AC64BDE86EA0ACD5F542B00400102C7B44BCDAE805175C901E7AE8A1AB9D2716AF261B2F3C130F098C7B74FA13C152B0B45E08960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A56009008060896029582258020020580A9682258225000082A560A909968225000082A560A9099682250000822582A56089600900205822580A9608960000089682A526580A960000089682A526580A9600000896089682258225008060896029582258020020580A969A602958020020580A969A6029580200205822580A9608960000822582A56089600900806029586A82A5600900806029586A82A5600900806029586A82A560090080604925C68D1B27D4099682A5600900205852B9499326A58B172F16ECD6715BB4685131E4235802002058D69CD9B367A713264C489F7BEE39016F1D87CA9933675A20054B000004CBDA0D97E3C78F2F1E8AA9F57D132A054B0000044B40B0040040B004044B0000044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C0100102C01C1120000C11240B00400102C01044B0000044B40B0040040B004044B0000044B40B0142C0100044B00C1120000C112102C0100102C01C1120000C112102C0100102C01044B0000044B40B0040040B004044B0000044B40B0040040B004102C0100044B00C1120000C112102C01005807C172C58A152A5EA057BDF9E69B822500407FB5E9A69B2E9A366D9AAA17E8553366CC4837D9649365465D00807EE8C31FFEF0B93BEFBCF32BCA5EA037EDB9E79EAF7DF4A31FFD99511700A07F7AFFFAEBAFFFF0F6DB6F3FFF81071E783D1EAE46EF58B972A54EA0EE0E7F9D3163C65B3BEEB8E3820D36D860761C6F0CB90000FD385C8676CABBDEF5AE2706FCDF39505A0FB6F7BFFFFDE90E3BEC10F7D8A4EBADB75EBFF97F353636FA7CB535B677BFFBDD31509E27540200400572B9DCFB9324393B04B015F97CFED5D08EEE4FFFBF52B0040000A0378410B947085E4FC5F0155BF8FAE5534E39E5DD82250000009D2A140AFF1A02D7A42C509605CBD1FDEDFF2A58020000F4A02449360E41EB9278D86BDB50596AA70B960000007414B006E6F3F9651D04CA6C8FE5E182250000001D4A92E4A010B41676142C1B1A1A76162C010000E8542E97FB58085B7776B0C7F28B82250000005D0D5CC3437BAB3C58C6D02958020000B046F1DE9521703DDDD0D0B06F78FC7529582EE9A7015AB0040000E885B015AF0C7B65D9D7FBC5C363054B000000D6A8A1A1E11B216CCD6F6969F960F9F7070E1CF81EC1120000804EEDB6DB6E1B84A03523B47DEAE5FF2C58020000F46CC83A33B49BEBECFF2C58020000F4847C3EFFE510B29E4B926453C1120000806EC9E572EB8580F560682DF5F67F172C0100007A4092243F0E01EB0FF5F87F172C010000D652A150F8E7788FCAD0B6102C010000E8AE772549726F08573FACD70E102C010000D62E547D3FB4FB4F39E594770B96000000744B5353D32742A85A9CCFE73F57E7E15AB0040000A830508D0EED64FD2058020000745B128440F5E7A14387AE2F580A96000000DD0D951B8730B530B46DF58660090000504990FA4D68E7E909C1120000A09210B57B68B372B9DC867A43B0040000E896A6A6A67F08216A6E6803F58660090000504980FA656897E909C1120000A0DB1A1A1ABE1502D4BC5C2EB791DE102C010000BAA5A5A5E57D213CCD0C6D4FBD215802000054129CCE09ED463D2158020000745B3E9FDF2604A745B95C6E13BD215802000074CBC08103DF1382E5C3499234EB0DC1120000A092C0342CB43BF48460090000D06DB95C6EEB10989684C74FE90DC1120000A0BBDE15C2D27DA11DA62B044B0000804A82D261A14D8A01536F0896000000DD120F7D2D1D02BBB5DE102C0100002A094977264972A29E102C0100002A094883E2ED45E26D46F48660090000D02D83060DFA6808488B42FB8ADE102C0100002A094737254972B69E102C0100580B699ABE67CE9C39374F9D3AF5ED71E3C6A563C68CD1FAB08D1D3B369D3871E2F3A1355B1AFB563E9FDF2B84A3BFB6B4B4BC4F6F08969817CC0B00B01662F13069D2A474F1E2C5E9EBAFBFAEAD83B664C992F4DE7BEF7D291413FB5922FB462E97DB2804A379A17D536F08969817CC0B00B096E21669C543551411AF8F1933668625B2CF42D1E5A1FD424F08969817CC0B00D003E2614E26F0EA68A18078D312D9FB1A1A1A760CA1E8993DF7DCF3037A43B0C4BC605E00801E10CFE73079574D01A150EF65B95C6EC310889E2C140ADFD11B8225E605F30200F47101F1CA8B0BD339D3AE4E1F1B7B5AB1C5E7F17B267E05442DC9E7F3E72749729D9E102C312F981700A08F0B88E5CB16A4D3FF7072FAE7DB8F5BA5C5EFC5D74CFE0A881A0995DB8530B43004CB8DF586608979C1BC00007D5C40CC7BECB6D58A87ACCD7F6CB4C95F0151F5860E1DBA7E08968F86D6A837044BCC0BE60500580705C48C7B7EDA6101115F33F92B206A20049D1CDA683D2158625E302F00C03A2A20A68F39A5C30222BE66F2574054B35C2EF7F910821687C77FD41B8225E605F302002820141074CB29A79CF2EE1080A624497288DE102C312F981700601D1610F16A7F1D1510F13593BF02A25AE5F3F92343009A109EBE4B6FAC55881C1D83E41ADA343D655E302F981700504074D8664DFE598705447CCDE4AF80A8D230B445684B72B9DC67F4C65AF7E5B6A1BDD959B00C217E0F3D655E302F981700504074D8962E78349D7EF7F0D50F770ADF8BAF99FC1510551A86EE0E61E7383DD163FD796727C172CAC08103DFA397CC0BE605F302000A884EDB530F8E5CAD8088DF33F12B20AA510894FB87B0F3602E975B4F6FF458B0DCB6A3609924C9DE7AC8BC605E302F00A080E8BCAD5C99CEBAFF97AB1FEE14BE175F33F92B20AA4908931F0B61E7B9102EBFAC377A3C5CB677AEE5347B2BCD0BE605F302000A884E27B5E5CB16A433275FD2E1B934F1B5F81E058002A25A8440F9FF922439434FF44AB05CED5C4BE7569A17CC0BE60500E8B88058B9325D386B7CFA97BB8675583C642DBE27BED7566A05441584CAEF85B03363B7DD76DB406FF45A1F8FB2B7D2BC605E302F00C01A0B88356D8DB6955A01518D0A85C28742D05910DAD7F546AF06CBAF959D5BB9AB1E312F9817CC0B00D06E01D195ADD19D6DA5560C2820D6C2072BFDC11072AE0AA167842EEC7D0D0D0D77C560696FA579C1BC605EA0BAE64280AA2A202A2D1EB2A61850405428EEFD4A4B8FDD0D3A3B87A0F3542E977BBFB5BAF73FA70F7FF8C3C53D96BAC2BC605E302F503D732140D515109A02621DD839B465A15D547AECF20561060D1AF4F721E4CC29140ABB58A3FBEE732A054B17EE312F68E605AA602E045040680A88BF4DA4D9041AB7D22EE9EA849ACFE72F4A92E45A6B73757F4E981734F302C6584001A12920FA6A225DD3F7DB86CA7821996773B9DC87ADCDD5FB39615ED0CC0B1863010584A680E82DBBAE61C2CC5E6FF73C931026DF9B24C963215CE6ACC9D5FB39615ED0CC0B1863A1263435357D221496870F1932E4B6E6E6E6A70B85C26BA54BE1AF0CCFE796EEB9766C7C9FDE52402820AA6E225DD344D9E1D6DA102A4F8DEBB7B5B8BA3F27CC0B9A7901632CD59BA1424EBA39B459A12D2F65A815F182887595A14251B9F7D0A143A71D72C8212F8E1831E285A953A7A60B162C4857AC589146F171F1E2C5E9942953E65D70C1057F09C1737EE89C7BC2CF355B9414100A88756AE76E6E7D5DEDFD6190FB97B03E2F6E6E6EDECC5A5CBD9F13E605CDBC803196EACB50A18D2905C8B48BAD7F66A8F01FDB2284C93F1E79E491AF3CF4D043E95B6FBD9576550899330E3CF0C099E1774CCAE5729FB16829201410EB6C22DDA3829F5B1E27D4B0EEAE17D6E107423BD01A5CBD9F932E342F68E6058CB15457860AEDCE6E84C9F65AFFC9502D2D2D830E38E080D76EBBEDB6B7BB1328DBFACD6F7EF34048DD8BECBD544028206A62225DE5E777DC71C72BC3C036CE1451DD9FD300876C991734F302C658AA423E9F0FA553E392F290D8D4D4949E7DF6D9E9F8F1E3D3B973E7A62FBFFC723127BDFAEAABC5A340274F9E9C5E74D145E9A04183DA86CBE5359FA1860D1BD6F2831FFCE0F5993367A63DE1C9279F7CAAB9B9797EE898831410266F0544AF5BD3C509BAE4EFFEEEEFF60ADEDE7CF3CD0F324D54EFE7D483BF07F382790163AC3196B50B957B8430F86679A0BCEEBAEB8AA70C76C5B265CB8AEF8F3F571E306B36431D73CC3187066F74B503BA6AD1A2450B4BE1B26EF75C2A2014107D3891F6C8A13B215CEE6E42ADFECF6980ADEAE605CDBC803196751D2A1BCB43E5D1471F5DDC3B5989F873C71D775CDB70595B196AE8D0A1FF74F0C107BFD1537B2ADBDB73593A2CF6B30A084D01D1E3DA5E6CE05DA10D293D7647DB9F7311039F13E605F302C658632C1D289D53D97AF8EBF0E1C35B0F77AD543C4CF6CC33CF6C7B586CED64A8638E3966CEE8D1A3D3DE74F5D5578F8D27A32A20340544AF4CA47B944D88578696961EBB3AA176F47326549F13E605F302C658632CED285DF9B5754FE5DA86CAF270D966CF656D64A8534F3DF507C71E7BEC3B6FBCF146DADB060F1E3CA31E0F8955402820FA68221D50DACA9A96B5AE4CA8E51369D60697BDEE3C139F13E605F302C658632CAB86CABDCBCFA9ACF4F0D7CE0E8B2D3FE7B22632D409279CF06CBCA5485FB8EFBEFBEEADC7BD960A0805442FE868826B6F62EC6C426DEFFD57B4F37EE799F89C302F981730C61A63F95BB06CDD5B192FBCD31B6EB8E186DAD96B79E38D376E77F8E187BFB336B715E9AEE6E6E6A7E3F1C80A084D01B1D613E9AEDD9820DB9B50BB3A91B69D501D0AE473C2BC605EC0184BDD6A6A6AFA4476C19EB85771E9D2A5BD929BE2D562DBDC8AA47A33D425975C72E315575C91F6A533CE38239E6B796C7FD95211DABF2B201410BDBD0C5530A1AD6942EDEE445AFEF797D4DBD65A9F13E605F302C65863AC653293CFE70FCFC2DEB9E79EDBABD929DEE7B22C58566F863AF5D453E74E9D3AB54F83E5F8F1E3EF0B9D32BA3F2C7465C73C8F090BD8D714100A88DE5A86DA4CA45D9DC83A9A50DF5DE144DA762B71DD4CA83E27CC0BE6058CB1C658CB64D9EB3767EF99306142AF66A7C993279707CBEACD50471C71C4EB0B172EECD36019FE5E3C14765E7F5AE8CADA9DED6DDD50402820D676191A50F9791DED4DA87F5D8B89746DFF3DFD7A5DF739615E302F608CA5FF2F93E1EB59D96B3D7DD19EB6162C5850FEEFA8DE0C3564C8907756AC58D1A7C1F2B5D75E7B3E74CA8A7EBAD0B56EDD285FF814100A88B55C86D676AB687B13EADA4CA46D27D45DEB7082F139615E302F608C35C6D6E93219EF2D997DAFA76E31D2D9AD47CAFE0D2BAABAD3D685F877FBF34257BE7523EE3E574028202A5D86F6DE7BEFB1A549EFA2B5FC53EF6E67EBEC5F4BDF5F1B17957ED707EB7182C95A2E971BFB918F7CC4E7444DCC0B715928140A5D7EFFADB7DE9A6EB5D556DDFAFDE79F7FFE1ADF73ECB1C7169FDF74D34D69DCC89D7D3F5E5D51B0B4DE980BA9F2B1BCB5F55576CA5AD5765A4B4B4BDAD77B2CC3DF7BB33B1F567F687D5D40DC7DF7DDC5C1326EE1B8FDF6DBE3FD438B85C1EEBBEF9EC6CFBCA70B945A2B206A6DF9F9F6B7BF9DBEF7BDEF4DD7626B68675B69BB73E3E80EB7D2D6DB3ADD59F339695D6DEB3258EEB4D34EEDBE16C7E7EDB7DFBED8B2B963B3CD362BB6F83CB6ABAEBAAAF83BE6CF9F5FFC997BEFBDB7F8FDF2F77FF39BDF6C7DFF2DB7DC926EB9E596ABFD1BE2C503B3E723478E6C7D1EE709F382662ED46AA5D9635972C41147BCD1D7E7582E5AB468613F3EC7326BD3F2F9FC1E03070E7C4F7C5F5F07CB38485E78E185C505310B71D9F74F3CF1C4D6AFC367512C2EE2C41F03DE0E3BEC50FCF797170871B2DF70C30D5B7FA63F1410B5B80C9526AEE5037AE7BC924A26D47A3FC7D2E7444DCD0B6DC7E44D36D9A4C3D7E3DC316BD6AC74975D76592D58DE7CF3CDE9673FFBD9D57E5FF9581EBF3EFDF4D35BBF5E7FFDF55BE79EA79E7AAAF87BE27BBEF5AD6F15E783F8FC89279E68FDD9471F7DB4F878F1C517DB6369BD31C65295CB64787CD239966D9C75D6594BFBFAAAB093274F9ED9DFAE0ADBC90038A0AF0B8851A346B5EE218D03E5F1C71FDFFA7C9F7DF669B78088AFC53D9BD9FBB2ADD1313CC6C0F9C94F7E5201B18E97A1B65B45D76222BD6240FB57C2EBCE845AB75785F539518BF342DB3D927159DA60830D3A7D5F0C901FF8C007560B961B6FBCF16A73C9F2E5CBD371E3C6B56E608CBFFF80030E283E8FEF8D73497BE1B67C83E3A69B6EDA7AB44DDC381937623A14D67A638CA55A974957856D4718D4EFE8EBFB589E77DE7953FBCB7D2CCB3EE4294992ECDDC100D867054416D2E25EC301657B27E3F33BEFBCB31808E3F37BEEB967B5093E1600D9F3E9D3A7171FAFBFFEFAF4D9679F2D3E9F376F9E02621D2E43156C1D5DD3BDB9BA7AE3E8B6B61D5087F7EEF23951ABF342DB3665CA94E272F4A10F7D6895235ADAB6B84131B6B6C1F24B5FFA52BB1B29E3EF8C61B4ED9C12E79E8D36DAA8DDF7C70D8E0F3EF860F179FC7765DFBFE4924B9C6369BD31C652D5CBA4FB58B6E38F7FFC63EE88238E48DF7AEBAD3E0B962D2D2D0B42A76CD14F16BACEB6A8F57901B16CD9B262B88C13F436DB6C530C887142CF26ECD89E79E699E2C019F76CBEF4D24BADE13006BF389967C5C1800EF6582A20D6CD32D4CDADA45DBDE1737727D4EC10A4BDEB7082F1395193F34247E757C60D8CF1796787C366CF63988C2DBB904FFCB9B6A1347EEF1BDFF8C66A1B1C6320DD6BAFBD56D9001ACFB98FEFB9FCF2CBDB9D53EAFD1409EB8D3196EA5F269B9A9A3E11DE53BC6E4C789E2E5DBAB4577253ACED070D1A541E2CAB3B439D7AEAA9AF3DF4D0437D122A1F7EF8E1A5A143EEABB785B32F0B881826E3641E43630C7271F779B67731B678F853B6F730DB031907D1B807319BD4B3BD94718F657C3D9E6BA380A83A1D6DADEDEA44DADD0935FB7B26529F1335362FB43D0C369EEE908DC1E79C73CE2AEF89A730ECB6DB6EC5D6DEC57B4E3EF9E4F4A8A38E6A3DBAA5BBF3423CB77FF6ECD9AB1D29533E2F6447DF641707322F608CA51AC55B8F64812FEE88E90D37DC704379A89C54F59D72F5D5579F7BDC71C7F5C95ECB430E39E4A9F021342B207A776B746C93264D2A1611D956E7CE425CF9041F03665618C495245EBCA1EDE1AD0A88AA11B7D6B63D1467C880EEDF9BABBD09757037B60AE373A20682E580D29128D9D78F3CF2C82A1754CBC2676CE557145FD33996D9112BEDCD29F19CFAC71F7F7C8DA748C4B9203BAA2586DB384F7476A8AE7901632C55102CF7CE425FDC6BD9D317F189BF2FFEDEB27B68D646863AE9A4935E1E3D7A74AF86CADFFFFEF7CFC6BD95DD3CCC4101B116E75B965F4EBEB36019CFB58987CEC6731DE39ECEECFD718F657BEF574054DD845A7E1183F289B13B377CEEE8E7DCF8D9E7443F981706747001B7B80131BE16E6E6550E7FCD0266769BA86C8360DC4BD9DE38DFD1C6CAB62D1E05931D2973CD35D7ACB24134DBA33A7CF8F0D5AE626E5EC0184B350AD9E69E2CF81D7DF4D13D76EB91381EC71D7FE57B2B6B26438D1A35EA3F0E39E4907766CE9CD92BA1F2E9A79F7EABB9B9F9F990B43FAB80E8BD969D3FF9F9CF7FBE18D8CAB738C7EFEFBBEFBEADCF6388CCF626C61B5FC7C35F6310CD6E3F926DD9CE9EC70B022920AA56DB4381DE55DACADADDCBA6B7FDB95D4DA43E276A7B5E88175E8B174C8BE7D577F49EB8B1308EC36DFF4D7143637635EF78718AEE84D88EE685D8B20BCC959F6F5F7E2D80BE6E82A531D618CB5A04CB2D425B9205C058D7AE6DB88CA1F2CC33CF2C0F95CB6B2E4385C2FF8A78219FC58B17F768A88CBFEF80030E585A8F87C0AEAB2DD3E55B9CD7F49E18FCBAF37E0544CD4CA83DB1F5D715EF7C4EF4B37941132C8DB1C6587A563E9F6FCC2EE493EDB9ACF4B0D8F8736DF654A6359BA1468E1C794B0C973DB5E7F2E9A79F4E0F3AE8A01743879FA08030792B206A664275C3679F13E605F302C658632C5D1402604B79B88CE746C6530DE2555DBB7AF5D778A19EF2732A63ABF90CF5AB5FFDEA67210CBE13CFB95C9B0BFADC71C71D2B870C19F262EC680584024201D167D6F6901D87FCF89C302F981730C61A63E9A6B8E732B465E5C13006C5782AC18409138A7B23B3C364E3E1AE0B162C28DEBD61C48811F1768CAB04CA78F86BBFC950975F7EF976279D74D2F371576CBC6A5C77C40BB3849F7B71F0E0C1D3EAF59C4A058402A24A26D4EE6E657571029F13E605F302C658632C158AE75C96DF86A4C236A95F66A80B2FBCF0BF8317E2E1B1F1AA9ED3A64D4B172E5C583C172F8A8FF11CCA183EE3EEDEC30E3B6CC5C1071F3C3D26EC7ABCFAAB0242015145BA7B088F437E7C4E9817CC0B18638DB1F44CC0DCAF1430DFEC4EA0AC8B0C75EDB5D77EE5BCF3CEBBF6E4934F9E3574E8D0E5CDCDCD6F9776EFBE75E081072E0FC1F3A1D0CE8C29DDA2A4805040D4DC84BA6D68CB07B8E1B3CF09F382790163AC31961E13B2D22742C03C2A64A49B437B2AB4156541725E68A3433B56864201A180A805BB9626CA5D3B797D8989D4E78479C1BC8031D6184BEF2B85C9D4D19D28201410B5A8A3ADB50EF9F139615E302F0896C658632C7D249FCF7F2D3B3C364912E7F1A2805040F48B09D544EA73C2BCA00996C658632C7D1B2C47951D0A3B4D8FA0805040D4FA847A9189D4E7847941332F18638DB1F49D1024B76D7B319F10342D7F28201410352B1E76910E7019759F13E605CDBC608C35C6D297C172743B57829DE65C4B14100A885AF6415D501B9F539C7474837941332F608CA5E643E5B61DDD7A244912178D4201A180805E9F882CAFE605CDBC803196DA5FD6EEECE4FE9553F4100A080504287A302F981730C64267CB59877B2B9D6B89024201018A1ECC0BE6058CB1D095E56C7467A1D215625140282040D18379C1BC803116BA65D0A0417F1F96BD57F4040A080504287A302F981730C6424572B9DCFBC3B2B75C4FA080504080A207F3827901632C5464CF3DF7FC4092242FEB0914100A0850F4605E302F608C858A343535FD4358F65ED21328201410A0E8C1BC605EC0180B15C9E5721B8565EF453D81024201018A1ECC0BE6058CB150919696960FE6F3F9657A0205840202143D9817CC0B1863A1228542E14361D97B414FA080504080A207F3827901632C542497CB7D382C7B4BF5040A080504287A302F981730C64245060F1EFC91B0EC3DAF275040282040D18379C1BC8031162A9224C9C661D95BA2275040282040D18379C1BC8031162A92CBE53609CBDE623D81024201018A1ED6DAB871E38CC9D5D1568479E14D4BA43116FA4A92249B86656F919E4001A18000450F6B6DE2C4890B172F5E6C5C5EC76DC18205378679618625D2180B7D2597CB7D2C2C7B0BF5040A080504287A586BE3C78FDF6BC284092F3EF7DC73AF199FD7CD86C638278C1D3BF699D0F6B3441A63A1AF3437376F1696BD67F5040A080504287AE811613CDA63CC9831D3E29114F1307DAD4F5BECF319E60463AC5E601D2C771F0F6D819E4001A18000450F8031162A92CBE5FE312C7BF3F50475ABA1A161670330287A008CB150B9A6A6A64F84656F9E9EA09E07DF49A1BDA32740D103608C858A97BB4F8636574F50AF2BC0C038F8C69624C9BFEB1150F4001863A1FB72B9DCA7C2B2F78C9EA05E07DE7BCA82E5183D028A1E00632C745FA150D83C2C7B4FEB09EA4E0892BB66A1D25E4B50F400186361AD96BB2D427B4A4F508F0BFFA4B6C132B4D17A06143D00C658E89E5C2EB76558F6E6E809EA6DC0DDAF9D50596C8542E15FF510287A008CB1D075A186FE7458F666EB09EA6DC0FD4B47C13249921BF410287A008CB1D075B95CEE3361D99BA527A81B2138EEDD51A8CC5A3E9FFFA29E02450F803116BAA65028FC7358F666EA09EA46088D0FAF29588676B39E02450F803116BA5C636F1596BDBFEA09EA5692241B879560899E00450F8031162A93CBE5B60E75F5137A82BA3568D0A08F8601F8393D018A1E00632C542684CACF86656F869EA06E3537376F16568267F504287A008CB150997C3EFFB9B0EC3DAE27A85BB95CEE1FC34A305F4F80A207C0180B15D7D49F4F92E4313D413D0FBE9F0C6DAE9E00450F8031162A1342E517C2B2375D4F50B70A85C2E66125785A4F80A207C0180B9589B7EB8BF78AD713D4AD5C2EB7655809E6E80950F4001863A1324D4D4DFF12C2E5A37A82BA1556807F0A03F0937A02143D00C658A84C92245F0ACBDE9FF50475AB5028FC73580966EA0950F4001863A132F97CFECB61D97B444F50B7DCCC15143D00C65858EBE5EE2BA1FD494F50B7DC7307143D00C65858EB9A7A9BB0EC3DA427A85B2E8D0C8A1E00632CAC9D42A1F0D5B0EC3DA827A85BAE60058A1E00632CACF572B76D68D3F40475CB89C6A0E80130C6C25AD7D4DB8565EF013D413D0FBE4E3406450F803116D642A150F8B7B0ECFD514F50CF2B81E3C141D103608C85B55BEEB60F6DAA9EA06ED96D0F8A1E00632CAC754DFDB5B0EC4DD113D4FB4A60EB0A287A008CB150A124497608CBDEFD7A827A1E7CBF1EDA643D018A1E00632CA8A9A1224992FC7B580926E90950F4001863A1320D0D0DDF08CBDE7D7A827A5E09BE15C2E5BD7A02143D00C658A878B9FB666813F504F5BC120C0CED1E3D018A1E00632C54C6CE1AEA5E5801760A03F0383D018A1E00632C545C537F3B2C7B13F40475ABA1A161E7B0228CD113A0E80130C642C5CB9DA300A96FF97CFEBFC24AF0073D018A1E00632C54A6A1A161C72449C6EB09EA565801760D03F09D7A02143D00C658A8B8A6767A19F5AD50287C279FCFDFAE2740D103608C858A97BBFF086DAC9EA06E8550B947580946EB0950F4001863A132AE5B82C1B7B171CFD06ED513A0E80130C6426542A8FCCFB0ECDDAD27A8E79560EF7C3E3F4A4F80A207C0180B9571414CAC04F9FCF7C24A708B9E00450F8031162A532814760975F55D7A827A1E7CF70BED663D018A1E00632C54C69D16B01224494358096ED213A0E80130C64265DC6901C1320803F0F57A02143D00C658A878B9DB3DB4FFD513D4AD7C3EDF14B2E5757A02143D00C658A8B8A6760B3FEA7EF01D14DA483D018A1E00632C54264992EF8670799B9EA09E5782216100BE464F80A207C0180B152F77EE0D4F7DCBE7F3FB877079959E00450F8031162AAEA9F70ACBDEEFF504F53CF81E18DA157A02143D00C658A84C92247B8770394A4F50CF83EFC1A15DAE2740D103608C858A97BB7D42FB9D9EA06E254972483E9FBF544F80A207C0180B9509F5F4F7C2B2778B9EA09E57821F8495E0177A02143D00C658A84C9224FB86BAFAFFE909EA79F03D2CB49FE90950F4001863A1E2E56EBFD06ED613D4AD24498EC8E7F323F404287A008CB15099504FE7425DFD5B3D413DAF04478695E07FF404287A008CB150F172970FED463D413DAF043F0AED423D018A1E00632C54269FCF37264972839EA06E8515E098B0229CAF2740D103608C858A6BEA242C7BD7EB09EA560895C785F5E05C3D018A1E00632C54BCDC1542FB8D9EA09E83E509612538474F80A207C0180B15D7D44D49925CA727A8E7C177586867EA0950F4001863A1322154368765EFD77A827A1E7CFF3BB4D3F504287A008CB150F1723728B4917A82BA95CFE77F9224C9A97A02143D00C658A8B8A61E1C6AEA6BF504F53CF89E12DA703D018A1E00632C542684CA2161D9BB464F50CF83EF69A19DAC2740D103608C858A97BB96D0AED613D4AD2449CEC8E7F327E90950F4001863A132A19EDE3FD4D557E909EA79F03D2BAC0427EA0950F4001863A1E2E5EE80D0AED413D4F34A704E68C7EB0950F4001863A13249921C94CFE77FA527A8E795E0DCB0121CA72740D103608C858A97BB8343BB5C4F50B742A83C3F84CB63F404287A008CB150F1723734B4CBF404F5BC125C18DA8FF404287A008CB1509924490EC9E7F397EA09EA7925F89FB0121CA92740D103608C858A97BBEF87F64B3D41DD0AA17244089747E80950F4001863A1E29AFA0761D9FB859EA09E07DF9F8576989E00450F8031162A9324C9A1215CFE5C4F50CF83EF2FE216163D018A1E00632C54BCDC1D1677D8E809EA7925B82C5EC54A4F80A207C0180B95C9E7F3878765EF123D413DAF04BF8A3774D513D06B05CEE858E4ACA14DD353008225B52B5EB3245EBB444F50CF83EF95A11DA027A0D7D6B16D437BB3B3601926A23DF4148060494D2F773F0CED623D413DAF045787D6A227A057D7B33B3B099653060E1CF81EBD04205852BBE2EDFBE26DFCF404752BAC00D7861561B09E805E2D72B6ED28588675706F3D04205852F3CBDD8F42BB504F50CF2BC1AF4361DBAC27A0D7D7B5F6CEB59C666F25806049EDCBE7F347879AFA023D413D0FBEBF09ADA027A0D7D7B5D5CEB5746E25806049FF1042E531615E3F5F4F50CF2BC10D612568D413D0FBC2BA36CADE4A00C1927EB9DC1D1BDA797A827A5E096E0AE1B2414F409F04CBAF959D5BB9AB1E01102CE93773FC71616E3F574F50CF83EFCDA1EDA727A0CFD6B9E2B996F656020896F41F2154FE3884CB9FEA09EA79F0BD25AC04DFD31354BB344DDF3367CE9C9BA74E9DFAF6B871E3D23163C6687DDCC68E1D9B4E9C38F1F9D05CF00B102C61D5E5EEF8D0CED113D4AD78CE97DB1D500B62A89C346952BA78F1E2F4F5D75FD7D6515BB264497AEFBDF7BE1442A6231D00C112FE56539F106AEAB3F504F53CF8DE1ADA9E7A826A17F7540A9555132E5F1F3366CC0C4B252058C2FF09A1F2C4B0EC9DA527A8E7C177B45B1E500BE2E1AF425DF5B4102CDFB454028225B42E77C3423B534F50B742A8BCBD50287C474F50EDE2397E025D55054B851B2058C2DF6AEA93922439434F50CF2BC15D6E7B407F0A96AFBCB8309D33EDEAF4B1B1A7155B7C1EBF270C0A96806009BDB8DC9D1CDA697A827A5E09EE0EC1F23FF504FD21582E5FB6209DFE8793D33FDF7EDC2A2D7E2FBE26100A96806009BD219FCFFF24D4D4A7EA09EA79F01D1BDA7FE809FA43B09CF7D86DAB85CAACCD7F6CB4402858028225F4D672373CB453F404752B4992F10D0D0D3BEA09FA43B09C71CF4F3B0C96F1358150B004044BE8A5E5EE94182EF504F5BC124C08E1F2DB7A82FE102CA78F39A5C360195F1308054B40B084DE100F838D87C3EA09EA79F09D18DA37F50482A5265802822554BCDC9D162FE0A327A8E795E0BE8686866FE809FA43B08C5781ED2858C6D70442C112102CA19796BBD343FB6F3D413DAF04F72749B2839EA03F04CB59937FD661B08CAF098482252058426F88F7B08CF7B2D413D4F3E03B35B4EDF504FD21582E5DF0683AFDEEE1AB1F061BBE175F1308054B40B0845E5AEECE0C6D989EA09E578207F2F9FC767A82FE102C637BEAC191AB05CBF83D6150B004044BE8C5E5EEAC24494ED413D4F34AF060A150F8AA9EA05F04CB952BD359F7FF72F5C360C3F7E26B02A160090896D01B42A83C3B9FCF9FA027A8E7C1F74FA17D454F50EBC172F9B205E9CCC99774788E657C2DBE4728142C01C1127A61B93B27B4E3F504F5BC123C92CFE7BFAC27A8D960B97265BA70D6F8F42F770DEB3054662DBE27BED7DE4BC112102CA1272549726EA8A98FD313D4ADB0023CDAD4D4F42F7A825A0C966BDA4B69EFA560090896D047CBDD79A11DAB27A8E795607A92245FD013D462B0ECCA5ECACEF65E0A8882252058424FC8E7F3E7879AFA183D413D0FBE8F8715E1737A825A0C969586CAAC098882252058424F08A1F28250531FAD27A8E7C1F7AF6125D84A4F508BC152132C01044BAA64B9BB30B41FE909EA79259895CBE53EA327102C35C112102CA132F97CFEA224498ED213D4F3E03BBB50287C5A4F20586A82252058426542A8FC9F102E8FD413D4F3E0FB54685BE809044B4DB004044BA878B9BB38B41FEA09EA7925782697CB7D4A4F20586A822520584265F2F9FC8824498ED013D4F3E03BAFA9A9E9137A02C152132C01C1122A5EEE2E09E1F2703D413DAF040B42FBB89E40B0D4044B40B0848A97BB9F8576989EA09E578285B95CEE637A02C152132C01C1122A93CFE77F9E24C9A17A827A1E7C9F1B3468D047F50482A5265802822554BCDCFD32B4EFEB09EA7925589224C9C67A02C152132C01C1122A93CFE72F0D35F5217A827A1E7C97E672B90FEB09044B4DB004044BA878B9BB2CB4A17A827ADEBAB2ACA5A5E5837A02C152132C01C1122A5EEE2E0FED603D413DAF042F353535FD839E40B0D4044B40B084CAE4F3F95F254972909EA09E07DFE5B95CEEFD7A826A3070E0C0F7089682258060490D2E77578476A09EA09E578257BFFBDDEFFE9D9E605D4B92A4391603A1ED27580A9600822535B6DC5D19DA017A827A5E0956B6B4B4BC4F4FB0AEE472B9CF1C7BECB1F73DF9E4938B9E7FFEF9B1871F7EF88361B9BCA4ED722958D65EB00C9FE3B6F97C7E94A51C102CE9EF9224B92ACC79FBEB09EA79F07D63E8D0A1EBEB09FA5A3CEC75D0A0413FB9E5965B9E7FEBADB756A47FB3ECF6DB6FBFBBB9B9796A0C9D8265ED05CB1828431B1DDA9B0A3C40B0A44E96BBAB436BD113D4F34AF05628DED7D313F4A52449FEFDA73FFDE99C175E78E1F9B4032FBFFCF213279C70C282ECD058C1B2FA8365DB4099354B3C20585207CBDD35A1BE19A227A8E795E09DF0F02E3D415F88B7B639EAA8A3AEFBD39FFED461A06CE3CDBBEFBE7BC1C1071F7CE95D77DD25D05569B0CCE7F35F8B87BCB60D9482252058522F42A8BC36CC8583F504753DF8C67019DADBA5A2F08D78DE65682BE2857D427B25AC282FC7DB92C47B5E86C717427B3EB425A13D17DAA2D09E0D2DEE599A17DADCD09E09EDA9D0E684F66468B342FB6BF83D4F84C7C7C3E363E1F12FE1F73D1A1E1F098F0F87C787428BE7D63D10DA1F439B12DAFDA1DD17DAA4F033F786C709E1717C781C171EC784C7BBC3CFDE151EEF0C8FB787C7FF0D8FB785C75B4B45EEEFC2E3FF0B8F37877653683786767D68BF09EDD7A18D8C83403C74211E171FAFE6152F151D6F701B1E2F0D8FBF088F3F8FE7FB85C711E13DFF131E2F0A8F1784C7F3C3E3B9E1F1A7E1F1ECF09EB3C2E319E1F1F4F0786A783C25BCF693F07872783C293C0E0B8F2784C7E3C3E371E1F1D8F0787478FC51783C323CFE303C1E1E1E0F0B8F3F088FDF8F37D98DF7438A57188B2783C7E3F6E396B03868C50BDD84C7A6F09884C7C6F0D0101E73E171DFF0F8BDF0B87778DC2B3C7E373CEE512814BE131E770B8FBB84C7FF6A6868D839FCCEFF088F3B86C781E1F15BE1F19BE1F11BE1F1EB312884C7EDC3E376A5F3E4B6098F5F098F5F0EBFF34BE1F18BE1F10BE1F173E1F1B3E171ABF0BBFF393CFE5378FC742E97DB323C6E1E1E3FD5D4D4F489F0F88FCDCDCD5B5F76D965E98A152BDE4ABBE9E5975F7EE997BFFC653A77EE5CA1AE8A8265477B28DBB678BE6C5806368C170A1B3468D0DFC72B51EFB9E79E1F88B73A0ACF378A2D6E7408CBCC87C2F30F0F1E3CF82361B9DA383CDF24B6F0331F0D5F6F1A9E7F2C2C479B85DFF9F1B84CC5652BB6F0F527E3B21697B9F07C8BD2F2F7E9D8E232190FA92E2D9F5B85E75B9796D9CFC516BEFE7C6959FE62F85DFF525ABEBF1C5BF8997F2D2DF7DB84E75F2DAD0BDB85E7FF165B691DF95AF8991DE27A13D79FB8373EAE4BA5F5E95BE1EB6F97D6B11DC3F39DE27A575AF7760E5FFF675C1FE37A199EEF5A5A47BF135B78CFEE71DD8DEB7078BE67697DDE3BB6F0F53EA5F57CDFB847BFB4EE3784E7F9D84A6342129E174AE344BC30D6A0D84AE3C79078B8561C53E2D812C7987889FCD84A63CED0F0FC90380EC5F1283C3F34B6D2F87478787E4469CC3A323C3F2A8E63A5B1ECE8F0F531A5F1EDB8F0FCC7A531EF84D8C2D72796C6C23826FE77697CFC4969AC1C1EC7CDD2F8795A692C8D63EA99A5765669AC3DA734EE9E1B9E9F175B693CBE203CBFB03446FF4F787E711CB7638B6378683F2B8DE7BF08ED97718C2F8DF3F186E69797C6FE7845C72B4BF3C1D5A5764D699E1819E78DF0FCBAD21C12E792EBC3D73794E6969BC2F3DFC6F926CE3BA5B9E796D23C14E7A3DF97E6A6DB4AEBCCE8D29C15E7AE3B4AF3589CCFFE506A7797E6B9B1A5392FCE7DF7C479B03417C63971629C1F4BF3E4E4D29C797F69FE9C5A9A4BE39C3AAD34BF3E546A7F2ACDBB8F84F6E7D25CFC97529B5E9AA31F0F6D4669DEFE6B68334B6D56695E9F5D9AE3E35CFF7469DE7FA65403C45A607EA92E88F5C1C2525B54AA1B16976A88584B2C2DD5152F946A8C1763BD51AA3B96C71AA4D4623DF25AA9368935CAEBA57AE5CD527BAB54C7BC638316EBB0A68EE3C4203D41BD7BD729A79CF2EE78CE5B3CDF72B7DD76DB201682591198158059E197157D59B197157A5981575EDC65455D56D065855C56C465C55B56B865455B56AC65855A56A065C55956946505595688654558567C658557567465C5565668B529B00E2C1556C5A22A2BA8B2422A2BA2B2E2292B9CB282292B96B222292B90B2E2282B8AB282282B84B222282B7EB2C2272B78B262A74D919315385961532C6AB262262B64B222262B5EB2C2252B58B262A5AC48C90A94AC30C98A926231921522590192151F658547567094171B5991F1ECF0E1C397CD9B37EF9DEE06CB65CB96A523468C28160BD51A2E972C59120B99F4E69B6F4E5F7DF5D574F3CD374F77DA69A734AC2FC576EBADB7165F6FFB73F17BE79C734E875F5779B0EC6A5B512A0A5F2D1589CBB30D56A542F2C5B20D574BCB365E2D2EB56C23D6C2B20D59F34BCB56F906ADA7CB366ACD2EB56CE3D6CCB20D5C334ACB6EB6A16B7AD9C6AE3F9796F36CA3D79FCA367C4D2BDBF8F5C7D23A926D049B9C6D082BAD4B13B30D62A575ACB851AC1414C6661BC7E2FA986D202BADA3B7671BCA4AEB6E716359697D1E956D342BADE7C50D67A540936D3CBBB134261437A295C6895F970A9E6C63DA35651BD4AECC36AA95C2D5E5651BD77E996D602B85B29F651BDAE298956D6C8BE358692C2B6E742B8D6FC50D6FA531EFEC6C035C692C2C6E842B8D8FA7661BE3E2B8996D902B8DA5C58D72B195C6D8E2C6B9D2B85BDC40175B693C2E6EA82B8DD1C58D7571DC2E8DDDC58D76A5F1BCB8E12E8EF1A5F05CDC80571AFB5B37E2C57921B66C635E69BE286ED02BCD2149B661AF34B71437EE95E69B7DB38D7CA579A8B8A1AF34371537F6C516E7AC6CA35F691E2B6EF88B2DCE6FD906C0D29C57DC0818E7C1D25C58DC18589A1F8B1B04E39C195BB661B0349716370E96E6D76DB28D84A579B7B8A1B034177F31DB60589AA38B1B0D4BF37671C3616CA5F9BC7503629CEBB38D88B1C51A20DB9818EB82581FC40D42B1C57A21D60D716351AC21622D113724C5BA22B65863C48D4CB1DE887547DC00156B90D8623D12374EC5DA24D628E1F97B63BD12EB96D8E2293DB18E19E0082CD6ED1ECBEBE218A12700FA48C889EF993C79F25D2B57AE7CBB2BA1F2FEFBEF5F70E08107BEF2939FFC247DFAE9A7AB3A6C3DF0C003E9669B6D16F7CA1603E2E38F3F5E7CBCE4924B5A4363F6DEEDB6DBAE356C5E75D555E9C61B6F9C3EF8E083C5AF77DF7DF7D6D7E2EFA8F643614B05F0948E82A5A51E80FEAE743443414F00F4B11B6EB861BFD9B367BFD651A07CF6D967579E7EFAE98BE35E8AB825BBD62EDE1343E1C891238B8F03070E4C274D9AB44AB09C356B563A6AD4A8D660B9C30E3BA4A3478F4EAFBBEEBAD69FBFE9A69B6AEAE23D71AF4B698F9D600940BD05CB781459A22700D68178A8530857F7AF58B1E2CD2C50BEF1C61BEFFCFEF7BF9FB7FFFEFB0F89873865EFADE660397FFEFCE21EC60D37DCB01820B36078E9A597B606C7B8D7B23C58C6F79F7CF2C9AD0174BDF5D64B43902E06B6C9932717BF1FC3672DDE6EA4B4077392600940BD88A721C4C3E3F504C03A74DA69A7B5C4301582D4E2CB2FBFBCDDF313AA7D8F6576F8EB2DB7DCD21A2CE31EC9B67B31B3E74F3DF55471EF64FCDE17BFF8C562D08CDF5FBA7469F17B219CD5EC7D2CCB26D9B807738A251C80FEAE749E7B5E4F00AC63E57B276B3158B60D93F1F9F5D75F5F0C8CF1BCCB458B16AD122CB7DF7EFBF4F6DB6F2F7E2FEEF1DC6AABAD8A87C25E73CD35AD17028A2DFE5CAD064B00A8A360192FA4D8A02700AA5CAD04CBE9D3A7A72FBDF452EB61B0D91EC8F8FD2C58CE9B37AF78E5D8183AE3A1A2F171CB2DB74C0F3DF4D0E2F3B8D733BE77DCB87135BDC71200EA45E9EAFC393D012058F648B08C81F2B39FFD6CEBC57AE20578E2633CF475409BDB8DC4C367A74C99527CCCAE021B1FE3F996D9457C044B00A87EA5FBA6EFA7270004CB1E0996F150D6F818F748C6C7679E7926BDFBEEBB573BC7B2FC671E79E49162A08CF7BEAC95ABDE0A9600F037F1DEC2F11EB67A0240B05CEBB67CF9F2F489279E281EF65AFEFDECFE94F1DE95EDDDC73286D1E1C38717EF6579D2492715BF9F05D478BEA5600900D5ADB1B1F196102EBFA7270004CB3EBF8A6C2DFFFB054B00582558FE2EB47DF4048060A909960050917C3E3F2A4992BDF5048060A90996005091C6C6C65B43DB534F0008969A60090015C9E7F3B72549F25D3D0120586A82250054A4B1B1717408977BE80900C152132C01A0D260F9BFA1EDAE2700044B4DB004808AE4F3F9DB0B85C277F4048060A90996005091C6C6C63B42B8DC4D4F0008969A6009009506CB3B9324D9554F0008969A60090015C9E7F377150A855DF4048060A90996005091C6C6C63F8470F95F7A0240B0D4044B00A83458DE9D24C97FEA0900C152132C01A02221548E696868D8594F0008969A60090015696C6C1C17C2E54E7A0240B0D4044B00A8480895E31B1A1A76D4130082A526580240451A1B1BEF096DA09E00102C35C112002A0D96139224F9B69E00102C35C112002A1242E5BD0D0D0DDFD2130082A526580240451A1B1B2786F64D3D0120586A822500541A2C272549F2EF7A0240B0D4044B00A83458DED7D0D0F00D3D0120586A822500541A2C2787F6753D0120586A822500541A2CEF4F9264073D0120586A822500541A2CA7E4F3F9AFE90900C152132C01A0D2603935B4EDF5048060A90996005069B07C209FCF6FA72700AADCB871E304BAEA692B42B07CD3520900ADC1725A68DBEA09802A3771E2C4858B172F16EAAAA02D58B0E0C6102C67582A01A035583E582814BEAA2700AADCF8F1E3F79A3061C28BCF3DF7DC6BC2DDBADB531943E5D8B1639F096D3F4B2500B406CB87F2F9FC367A02A0068430B3C7983163A6C5C330E3397EB5D8468D1A95D6EABFBDD4EF33844A00582D58FE29B4AFE809007ADD73CF3DB7EF881123D230F16CA13700A0FFC8E7F30F170A857FD51300F4AA344DDFF7C20B2F2C0BD2A14387FEAF1E0180FEA3B1B1F191102EBFAC2700E855F3E6CDFB755A72FFFDF72F4892646FBD0200FD2658FE39CCED5FD21300F49A575E79E5CB6FBFFDF63B699933CF3C735E4B4BCB07F50E00D4BE7C3EFF685353D3BFE809007ACDA2458BE6A46DBCF8E28B8BC20474B1DE0180DAD7D8D8F897102EBFA82700E81573E7CE3D39EDC0A851A316B9993200F48B60393D49922FE809007A5CC88E1F5BB972E51B1D05CB77DE79E7F51FFDE8478F0E1C38F03D7A0B006A5708958FE572B9CFEB09007ADCFCF9F3A7A46B3067CE9C7961323A4A6F0140ED6A6C6C9C11E6F3CFEA09007ADCE4C993D7942BD3152B564C089351DAD2D2F23E3D0600B52984CA2772B9DCD67A02801EF7939FFCE4B0CE0E858DB972D8B06137D9630900B5ADB1B1F1AFF97C7E2B3D0140AFB8F1C61BFFDA51AA7CF2C9272F0D13D114E7580240CD07CB998542E19FF50400BD2297CB7D2604C815ED5CB8677A5353D374578505807E112C67C5395F4F00D06BCE3BEFBC4B42907CBB3C585E71C51557E6F3F98BF40E00F48B60F96498D7FF494F00D06BE2A1AE77DD75D7E22C54BEF8E28BD7C72D9B2D2D2D1FD43B00D02F82E5EC42A1F0693D0140AF3AFCF0C3775AB66CD9CAD0D2A143878E4D92646FBD0200FD2658CEC9E5725BEA09007ADD65975D76E7881123D27C3E3F4A6F0040BF0A964F85B6859E00A0D7C5435FE33D2B9DDC0F00FD2E583E5D281436D71300F4D5C493EA0500E877F3FB33B95CEE537A0200C11200A8747E9F1BDA27F5040082250050E9FC3E3F97CBFDA39E0040B004002A9DDF1784F6713D0180600900543ABF3FDBDCDCBC999E0040B004002A9DDF17E672B98FE90900044B00A0D2F97D5192249BEA0900044B00A0D2F9FDB94183067D544F002058020095CEEF8B73B9DC267A0200C11200A8747E5F9224C9C67A0200C11200A8747E7F7EF0E0C11FD1130008960040A5F3FBD25C2EF7613D0180600900543ABFBF5028143EA42700102C01808AE4F3F9652D2D2D1FD4130008960040A5F3FB4B4D4D4DFFA02700102C01808A2449F2F29E7BEEF9013D0180600900543ABF2FCFE572EFD7130008960040A5F3FB2B83060DFA7B3D0180600900543ABFBFFADDEF7EF7EFF4040082250050E9FCFE5A2E97DB504F002058020095CEEF2B5A5A5ADEA72700102C01804AE7F795BBEDB6DB067A0200C11200A8747E7F3D97CBBD574F002058020095CEEF6F0C1D3A747D3D0180600900543ABFBF3970E0C0F7E80900044B00A0D2F9FDED534E39E5DD7A0200C11200A8747E7F273CBC4B4F0020580200E677006A63E2D1344DD334ADFF35550E00000000000000000000000000000000000000000000000000000000000000B04EFD7F52A9DA10FF9FDF790000000049454E44AE426082,
+ 1);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247539', 1, 'var-userLeave', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247541', 1, 'hist.var-userLeave', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247542', 1, 'hist.detail.var-userLeave', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF2E18C78737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000163FF066800787400203266643739336364643964333432663862303335333063383566326233303533737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247554', 1, 'var-userLeave', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247556', 1, 'hist.var-userLeave', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('247557', 1, 'hist.detail.var-userLeave', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665000000000000000102000F4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000675736572496471007E00024C0008757365724E616D6571007E000278707372000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000163F9E00C007874002061346137343362666665393731316537623437323230316130363863363438327371007E0006770800000163FEF7CF0278737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E0006770800000164042CC400787400203765393832666139393863303434386538306231353832346333303439633562737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787400043230313874000CE6B58BE8AF95E8AFB7E581877070707071007E00087400037A786D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302553', 1, '请假流程.bpmn20.xml', '302552',
+ 0x3C3F786D6C2076657273696F6E3D27312E302720656E636F64696E673D275554462D38273F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A61637469766974693D22687474703A2F2F61637469766974692E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E61637469766974692E6F72672F70726F63657373646566223E0A20203C70726F636573732069643D2270726F636573735F6C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C73746172744576656E742069643D22737461727422206E616D653D227374617274222F3E0A202020203C757365725461736B2069643D22757365723122206E616D653D22E7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D223062373632356665646161303565383566323832343836653163396339316239222061637469766974693A63616E64696461746547726F7570733D226533343665393633363834383463386661376632313763653535306130313836222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30443235384332342D314631392D343233332D413937362D4130443843423944414541432220736F757263655265663D22737461727422207461726765745265663D227573657231222F3E0A202020203C757365725461736B2069643D22757365723222206E616D653D22E4BABAE4BA8BE5AEA1E689B9222061637469766974693A61737369676E65653D223938623035316230333638316465363032383939336135643134616339336362222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C73657175656E6365466C6F772069643D227369642D33334642463234452D464537302D343730412D394442352D3942313838314531333834372220736F757263655265663D22757365723222207461726765745265663D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222F3E0A202020203C6578636C7573697665476174657761792069643D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C757365725461736B2069643D227573657222206E616D653D22E8B083E695B4222F3E0A202020203C656E644576656E742069643D22656E6422206E616D653D22656E64222F3E0A202020203C73657175656E6365466C6F772069643D227369642D34373638373538312D333535422D343335342D383433432D43333034323333323836414622206E616D653D22E5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D46423539344242452D383030352D344544432D423343382D39373831454432323643393522206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D35353636443037362D414234432D344134322D393938462D32353337373839463831383122207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D39394343413337462D413233352D343835332D383437322D44453233334144324544333222206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D227573657222207461726765745265663D227573657231223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C6578636C7573697665476174657761792069643D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D30344339463239412D304242352D343639312D383034432D37363445344530413237313622206E616D653D22E58F96E6B688E8AFB7E581872220736F757263655265663D227573657222207461726765745265663D22656E64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30413541464638362D414541342D343231322D423146342D3932373541343430364332442220736F757263655265663D22757365723122207461726765745265663D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222F3E0A202020203C73657175656E6365466C6F772069643D227369642D37463032463244352D413642412D343233342D413732342D3346383938443233354134422220736F757263655265663D226368696C6422207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222F3E0A202020203C73756250726F636573732069643D226368696C6422206E616D653D2273756250726F63657373223E0A2020202020203C73746172744576656E742069643D22737374617274222F3E0A2020202020203C757365725461736B2069643D22616C6C6D616E6167657222206E616D653D22E680BBE7BB8FE79086E5AEA1E689B9222061637469766974693A61737369676E65653D226438313861633661383663663161363464323138346266303639396436376138222F3E0A2020202020203C6578636C7573697665476174657761792069643D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A2020202020203C656E644576656E742069643D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222F3E0A2020202020203C656E644576656E742069643D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D33453941414432332D343444412D344138352D383242442D4436433833304134433439382220736F757263655265663D2273737461727422207461726765745265663D22616C6C6D616E61676572222F3E0A2020202020203C73657175656E6365466C6F772069643D227369642D41323335414337362D354242452D344133382D383243342D31304545383141463834363522206E616D653D22E5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D44413934353339452D463639342D343041312D424534412D42434343314439424431314422206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D31434331333342322D343442312D343833302D394335392D37443335363443393333464122207461726765745265663D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A2020202020203C2F73657175656E6365466C6F773E0A2020202020203C73657175656E6365466C6F772069643D227369642D34454238313431392D314141372D343937452D413545452D4535414546313743354530422220736F757263655265663D22616C6C6D616E6167657222207461726765745265663D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222F3E0A202020203C2F73756250726F636573733E0A202020203C73657175656E6365466C6F772069643D227369642D41453541454438342D303734362D343738372D393836462D36413739323743333443333422206E616D653D22E5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D227573657232223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D35313046453036322D433042432D343643382D394231372D38413338303732413242433622206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D42453337324431342D463530392D344544422D383745382D37423231303738333541453522207461726765745265663D2275736572223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D38344442433035362D303639312D343733452D383243462D44333235454637333641373222206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D227369642D30443039333043392D394241312D344636382D383545412D33383445313642343039413022206E616D653D22E5908CE6848F2220736F757263655265663D227369642D39353037343945412D344242362D343237362D423637412D44453033453334413035373322207461726765745265663D226368696C64223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B666C61673D3D747275657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F70726F636573735F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D2270726F636573735F6C65617665222069643D2242504D4E506C616E655F70726F636573735F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223232382E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657231222069643D2242504D4E53686170655F7573657231223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939342220783D223132302E302220793D223230332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227573657232222069643D2242504D4E53686170655F7573657232223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2237392E3939393939393939393939393937222077696474683D2239392E39393939393939393939393938392220783D223531302E30393038383236333634343631372220793D223230332E3730333730333130343131343233222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831222069643D2242504D4E53686170655F7369642D35353636443037362D414234432D344134322D393938462D323533373738394638313831223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731352E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535222069643D2242504D4E53686170655F7369642D42453337324431342D463530392D344544422D383745382D374232313037383335414535223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223337302E353435343431333138323233312220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2275736572222069643D2242504D4E53686170655F75736572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E30303030303030303030303032332220783D223334302E3534353434313331383232332220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223838302E353435343431333138323233322220793D223232392E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733222069643D2242504D4E53686170655F7369642D39353037343945412D344242362D343237362D423637412D444530334533344130353733223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223236342E39393939393939393939393939342220793D223232332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226368696C64222069643D2242504D4E53686170655F6368696C64223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D223137322E3130323038303930333236363038222077696474683D223431312E36303837323832303738373235362220783D223138342E37343130373732313432383638362220793D22312E34323130383534373135323032303034452D3134222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22737374617274222069643D2242504D4E53686170655F737374617274223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223230332E32353935393536373832393732352220793D2237312E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22616C6C6D616E61676572222069643D2242504D4E53686170655F616C6C6D616E61676572223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939372220783D223237342E37343130373732313432383638362220793D2234362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641222069643D2242504D4E53686170655F7369642D31434331333342322D343442312D343833302D394335392D374433353634433933334641223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431392E37343130373732313432383638362220793D2236362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341222069643D2242504D4E53686170655F7369642D46363844434341302D463741342D343444342D394534342D353641363832443837454341223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223530342E37343130373732313432383638362220793D2237322E3035313034303435313633333036222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244222069643D2242504D4E53686170655F7369642D36393442374132412D393841442D343530442D383146452D313135424335363237354244223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E303030303030303030303030303134222077696474683D2232382E302220783D223432352E37343130373732313432383638362220793D223133352E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136222069643D2242504D4E456467655F7369642D30344339463239412D304242352D343639312D383034432D373634453445304132373136223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223434382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223439342E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223839342E353435343431333138323233322220793D223235372E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732222069643D2242504D4E456467655F7369642D38344442433035362D303639312D343733452D383243462D443332354546373336413732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330342E353930383639353736373134332220793D223234342E3131323833343432313436393437222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337302E363430313837323338373936332220793D223234332E373938343439393138373537222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635222069643D2242504D4E456467655F7369642D41323335414337362D354242452D344133382D383243342D313045453831414638343635223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223435392E333632383732303836303831372220793D2238362E3432393234353537393833383138222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223530342E373431333631313932383236322220793D2238362E3134303231303631373337343835222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336222069643D2242504D4E456467655F7369642D35313046453036322D433042432D343643382D394231372D384133383037324132424336223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E393837353134343839383930352220793D223236332E32363136333038323635313634222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E36363730323138363333373736372220793D223336382E37303337303636343732373932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143222069643D2242504D4E456467655F7369642D30443235384332342D314631392D343233332D413937362D413044384342394441454143223E0A20202020202020203C6F6D6764693A776179706F696E7420783D2236302E302220793D223234332E37303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223132302E302220793D223234332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042222069643D2242504D4E456467655F7369642D34454238313431392D314141372D343937452D413545452D453541454631374335453042223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223337342E37343130373732313432383638362220793D2238362E3236373439303636383038333235222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223432302E31353431323036393235343737342220793D2238362E3436343038333932393839333932222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437222069643D2242504D4E456467655F7369642D33334642463234452D464537302D343730412D394442352D394231383831453133383437223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223631302E3039303838323633363434362220793D223234332E3834353738353439363831313337222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731352E393838343436343031363631392220793D223234342E3134363730393038313632323632222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146222069643D2242504D4E456467655F7369642D34373638373538312D333535422D343335342D383433432D433330343233333238364146223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735352E313035353637393030353031362220793D223234342E3134333537373431353930353333222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223838302E3534353531303937373036392220793D223234332E3734373836373831363239343733222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144222069643D2242504D4E456467655F7369642D44413934353339452D463639342D343041312D424534412D424343433144394244313144223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E303837373235313633333532342220793D223130352E3730343339323530323536373534222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433392E383533313635313630393039322220793D223133352E3030303434383731313033393938222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130222069643D2242504D4E456467655F7369642D30443039333043392D394241312D344636382D383545412D333834453136423430394130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223238342E32343236393939353539333433372220793D223232342E34363130303430343232343934222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223139332E34393435373938303736303230372220793D223137322E3130323038303930333236363038222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442222069643D2242504D4E456467655F7369642D37463032463244352D413642412D343233342D413732342D334638393844323335413442223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E35343534343133313832323331342220793D223137322E3130323038303930333236363038222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223339302E353435343431333138323233312220793D223232332E3730333730333939383138333738222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332222069643D2242504D4E456467655F7369642D39394343413337462D413233352D343835332D383437322D444532333341443245443332223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223334302E3534353434313331383232332220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223430382E37303337303636343732373933222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223136392E39393939393939393939393939372220793D223238332E37303337303339393831383338222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935222069643D2242504D4E456467655F7369642D46423539344242452D383030352D344544432D423343382D393738314544323236433935223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223236332E32303337303339393831383338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733362E303435343431333138323233312220793D223430382E37303337303636343732373932222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223434302E35343534343133313832323332352220793D223430382E3730333730363634373237393236222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334222069643D2242504D4E456467655F7369642D41453541454438342D303734362D343738372D393836462D364137393237433334433334223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431302E31303138303630343037373735352220793D223234342E3134373333393237353632393338222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223531302E30393038383236333634343631372220793D223234332E3835313539323539373636343134222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244222069643D2242504D4E456467655F7369642D30413541464638362D414541342D343231322D423146342D393237354134343036433244223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223231392E39393939393939393939393939342220793D223234332E393230313534323134363334222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223236352E343133303433343738323630382220793D223234342E31313637343734373634343437222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938222069643D2242504D4E456467655F7369642D33453941414432332D343444412D344138352D383242442D443643383330413443343938223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223233332E32353935393536373832393732352220793D2238362E3035313034303435313633333034222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223237342E37343130373732313432383638362220793D2238362E3035313034303435313633333034222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E,
+ 0);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302554', 1, '请假流程.process_leave.png', '302552',
+ 0x89504E470D0A1A0A0000000D4948445200000396000001F80806000000316A727D000062194944415478DAECDD097C54D5FDFF7F5CEBBFF5E752BF55DBAAB5D65A977EADD6B57611BFB5162B5AA424933B4920ECC862485804110822A8280209680111152C8A451414902433804650401417108CB2C85264515C5204BDFFF3B9B967B8339949662699C9CCDCD7D3C779CC649604CFDC39E7BCEF39F7DE162D80CC77FCB5D75E3BFBDC73CFFD5ADD3729140A8542698A72D65967FDF7861B6E582CFD0C5D2D0000191E2ACF38E38C8D37DD74D3772B57AE346B6A6A4C00001AEBE0C183E63BEFBC63B66BD7CE3CEDB4D33E215C020090C18E3BEEB87B6EBCF1C6830C81000089D2B66DDB43279D74D2787A5D00003237586E90994A00001265DDBA75E6F1C71FBF9D5E170080CCC5F257004042C9B2D816B5C75D0200804C0D960000241AC112000082250000044B0000D03CC1D21E48983939398CAA0080600900000896F10F26CE38E38C3A8FB76FDF3E103C8F39E618F3B2CB2E33DF7BEF3D465F0040B004000004CBE882A5F3B96FBFFDD6BCF3CE3BCD162CCD050082250000C8DC60F9AF7FFDCB3CFBECB3CDA38E3A2A30D328BA74E962DDBFFEFAEBCD03070E043DA70713BD7AF5322FB8E002EB7E595959D860D9AF5FBFC0FB9CBFE7D1471F0DFA9DBB76ED32FFF18F7F041EEBD3A78FF57AEDF3CF3F37F3F2F202CFCF9D3B37F09CBCF7C61B6F0C3C273F37F4FFD7D07300008225000004CBD806050DCE4ACE9E3DDBFAF98D37DE087A9F84C701030604FD8E9FFCE42781E72FBAE822F3EDB7DF0EFB3777EFDE5DE731B94C8A04C3D07F57B76EDDAC9FB76FDF6E85CAD090AB7F1E3D7A74C4E762F97F0700102C0100205846E9934F3E092C579599BB2D5BB6840D963ACC39836568E80CF7BE480391534F3DB5CE63575E7965E0E770BFF357BFFA55D8DF77CD35D70442626858ACEFFFAFBEE70000044B00000896718834DB27B392F7DC738F757FD5AA557566FB64D96AACC1F2C4134F0C3B7B2817DC9665AFA101512F83DDBB77AFF5FC934F3E19F6DF2925D2C98242FFFFA27D0E0040B004008060598F9B6EBA2910CC4E3FFD7473E6CC9981E72444EAE7E4184A67D8935B79AD7EACBABADA7ADC7956D82FBEF822E86FC9CFA1338BFA384A59FE7AEBADB7061E2F2C2CB496C53A67175BB66C59E7EF899D3B779A7FFDEB5F03CF2D5BB62CAAFFBFFA9E0300102C01002058020040B0040000044B0000C1120000102C0100044B000040B004008060090000C112000082250000205802000896000080600900205802000082250000044B000008960000102C010000C1120040B0040000044B0000C1120000102C0100044B000040B0040080600900000896000082250000205802000896000080600900205802000082250000044B000040B00400102C010000C1120040B0040000044B0000C1120000102C01002058020040B004008060090000089600008225000020580200089600008060090000C112000082250000044B000040B00400102C010000C1120040B0040000044B0000C19260090000C11200008225000020580200089600008060999E0EAAFFE67C38C79C5F35DF5C5CB1D82C2F2FA724B1489D2F5CBAD07C7FC3FB6C8C00C1120000102CD39384CA05CB169853374F35C7EF1D4F69863279EB64F365FFCBE6860D1BD82001822500002058A61F99A92454A646B8ACACAC648304089600008060997E642926C12E358A2C8D0540B004000004CBB42361865047B004089600008060898407CB29DBC79A152B869A2BCB075945EECB630442822540B0040000044B826514A1F24173F5A281E6DB2F0D082AF2983C4728245802044B000040B02458D65BE6BD35A24EA8D465FE5B77130A099600C1120000102C0996F5079EE5958323064B798E5048B00408960000806049B0ACB7AC5C7C47C46029CF110A099600C1120000102C0996044B822540B0040000044B243058960F8A1C2CD5738442822540B0040000044B8265BD65D9B2211183A53C4728245802044B000040B02458D65B6654DF67AE7AB9EE7258794C9E2314122C01822500002058122C1B0E3D2B86D50996F21881906009102C010000C19260D960E099B067BCB9E4D5BBEA044B794C9E2314122C01822500002058122C239629DB1F6CF0184B790DC1906009102C010000C1926059679672CE7BF7986B160E8C182A7591D7C86B99BD245802044B000040B0245846354BC9EC25C11220580200008225EA0D96D1CC52D6377B4948245836C6A64D9BA804102C010000C132DD8365BCA152174222C1325E23478EB406F9720B102C010000C1328D83258560D91CEEBFFF7EF388238E302FBDF452EB76D8B0617C4141B0040000044B82258560195BA8D46152662C8F3CF248C22508960000806049B0A4102C630F950D3D0E102C010000C1926049215806C8CC647DE1513FCF31972058020080B409969B376F3667CE9C698E1E3DDAECD3A78F59505060E6E4E498F9F9F966CF9E3DCDE1C3879B53A74E353FFEF86382258560D944A1B2A1D0C8CC6578D5D5D5E6B871E3ACB6292F2FCF340CC36AAFA4E4E6E69A3D7AF430C78C1963BD0E044B0000089649307FFE7CB3A4A4C4ECDBB7AF3979F26473C58A15E6B66DDBCC9A9A1AEB79B9DDB56B97B97AF56AF389279EB05E77C71D77984F3EF924C19242B06CC4F2D7686722637D7D269B356B96D9A54B9740888CA674EEDCD99C366D1A099260090000C13211366CD86005CA01030658A1F1D0A14351BFF7ADB7DE32EFBCF34E2B64AE5DBB9660492158C6182A639D81747BB85CBF7EBDD9B56BD798026568E9D8B1635AB757044B00009072C172EEDCB9D6523199AD8C2550865AB4689135D84BD7D94B8225C1321D42A5DB97C54E9F3E3D68A9AB5EEE7AEFBDF79A3E9FCFDCB2658BB97FFF7EEBB55F7DF595B5E2A2AAAACA5A2A2B4BF99DEF93DFC3EC25C11200008265138529398652662C9BC2A64D9BCC5EBD7A998F3EFA28C19242B08CA0A113F524FBF7A48BD9B367D70994722CB82CCF8FC6BE7DFBACD7CBFB9CBFE7E1871F2651122C01002058C66BCE9C3956A88C7650162DF97D72120D99592058520896E1C360532D6375CBCCA5B427CE30585C5C6CCD4EC643DE27CBFE9DBF8F994B8225000004CB387CF0C10766F7EEDD9B6CA632DCCC65A74E9DCC356BD6102C2904CB9010A843E5B7DF7E6B9D7C466E6311FABE4C3FE6528EA9742E7F95B352EBE5AEF19265B2A3468D0A5A169B4EED15C1120000A444B01C326488754C6522C9319772EC26C19242B0AC3BB328A1F0BCF3CEB306F2721B6DB88CF4BE4C0E97CE33BFCA4C656343A5335C3A672EE5843E044B8225000004CB283DFFFCF3D660EA9B6FBE49F820A5A8A8286D9698112C0996C90A953A2CD983F8A8C3A53354EAD2AD5BB73ACB6C336959AC5C52C4794C65BCCB5FEB5B16EB3CE6D2ED4B6209960000102CA376D75D775997144906399DFF6DB7DD46B0A4B83658460A7BE142627DE132DAD767DA3197CED94A39F14EA2C3ABDB672D09960000102CA3F2F1C71F5B27EC69CC65456225CB61E518A9E61E9C2E5EBC986049B04CE836142954465A9E1A6D588C3584A6CBB2D886EAB4BABA3A68B672CF9E3D09F977C8D9629D972269EEF68A60090000523E58CA6540927D2990C71E7BCC1C33664CB30E96F4805106B2959595044B826542B6A178C25D43A131D650E9FCFB471E79644ACF5C3654A772ED49FD9A44B721C9FC5B044B000090F6C1B2A4A4C45CB1624552072AB2EC562E3F920A03585DBA76ED5A67A6846049B06CEC3614EF72D448E1F1E0C1837185CA8696E1A64B9D4ABBA19F5BB2644942FF2D55555581BF2567CC265802000082653DE478C71D3B762475A022D7B5CCCBCB4BA901AC73A6440F64099604CBC66E43F184CAFAC2E5B1C71E1B77A86CECBF2715EA54DA0DFD58539FB427D4B66DDB027FCBEBF5122C010000C1B23EEDDBB7376B6A6A923A5091BF27D7884BC501AC73A6846049B06CEC3624A531212E5CB86C4CA88C75596EAAD5A9B334D5254622914B8F38FF1EC1120000102C1B18C8A5FA00B2B90AC132F582653A6C37BAB46DDBD61A94FFEA57BF6AD4774596BF86CE54CACFF278635C7AE9A5D6EF4AA73A4D76D02358122C010020584649CE7CC88CE5E1D2A1430773F6ECD9E6810307121A2C4BDE29317BCFEF1DF8593ED39B87DF1CF6B5BD5EE8653DFFD0AE87CC1E737A98577AAF34BB3DD3CDBCA8D545E655B95735E9BF4BFECEADA36E6DF0357F2EFCB375BFD3139DCC71BBC7051EEF30AD83EB672C9DDB5043678165C632B63A65C69260090000523458CA49299AE3184BB954402A0D609D61404BF48CA57C8EFD7CFDCC31DBC658F78B2B8B23BEAEEDBD6DAD60A9439C7EFC86FE37047E1EFDD168F3BC6BCFB342A704BC9F5FF973F3B27697593FEB30DA7E6A7BF398E38E09BCA7EFCB7D839E3FF1F413CD5F5CF30BEBBE942E4F75314F39FB943AFF1EEF246FE0BEFC4E7D5F82A65B8365B86D88632C6BF52DF599031F596A8E98FE5AC432FFB56AEB755D074D8858A71C6349B0040000291A2C070E1C98F4B3C22E5FBEBCD9CFB2A8078C050505D6C5D043C3402283E5909543ACC076FC8F8EB7C2DBD1DF3BDAFAF9F4F34FB702A4F3B55D67750DCC6CCAE7FE97E2BF04EEFFE6E6DFD4F9DD123EE53999D9D4AFCB7D24D7BA95F02881F3E4334E0E0A89CE30283FB71EDA3AF0F351C71C1508AF23DE1B61FD7BE535E7FEE15C2B50CAFDA16F0E0DBC77F0EB83ADDB760FB4734DB0AC6F1B8A778630D3CE0A2B81F1B197DE89EA753D4A1E0BAAD39D7BBF32074F5E6695821EFD382B2CC1120000A462B02C2B2B33A74E9D9AD481CAA449939AFDBA7091669792112C7BCEED6905B6D0C78F3BE138F3E2D617077ED6214D42A7737652EECBEF904028F70B1716D699519400A8EF4B9095DB82E905E6A80F4759F7477E30D27A7EECCEB1E6ED2FDD1E98A194E7AECEBFDABA2FC155C268B81954E78CE509A79E1058AE2BB39B320BEA8619CB68B6A178660A13751DCB279F7CB2D9AE632981F1AD8DFF3117BCFE719D59CA992FBF673DBF7EF3EEDA99CD092FD6A953FDFFD66D7019D7B12458020080540C96D5D5D5668F1E3DCC43870E256DA0D2B1634773FDFAF5293FA06AEE60294B64255CCA72D9332F39D30A88F21AF959BFE6EE75775B033F99D97C60C703817028C12F6B6C9675BFF38CCE11672C753894D7848652F977CADF0B172C65C672E02B0303CB79F5E3F237DDB214361E0DCD18461B1A630D973AD40E1A34A859FEBF75B03C70E06083AF1B3AEDD5C0CF4BDEDC6C963CF69A552484DEFEE03CD330BC56D893E5F47BF6EC49C8BF77DFBE7DD6F1E73A58A6437B45B0040000CD1A2C459F3E7DCCD5AB57276590F2C61B6F58C1321D243258CA67F8872E7FB0C29E3EBE511EBBAED7757596CDCA73121A25C8C971987A76512FA3D5B3877A06527E8FCC20EAB0A7672965C6529E1FF6F6B03A41F19CABCFA9336329C75B86CEA0CA497BE4354699113694BAE918CB78459AB98C352C46FBFAE60E953A30CEF6AD0FDC1FFCCF6541C7554E7B716DD860596307D1E232BF39C87E4FFBAE7D02816FE6CC9909F9F7CA325CFD37D2A5BD2258020080660F9632882A2C2C4CCAACA51CAB346DDA345707CBBB56DD65151DC66E1A7293755F02DF3D1BEEA913FAA41495175927EE9163281B0A71CE594709983A30CA6CE505D75F5067796BB4C1524E0E2467B36D11B2D4D6192CF5F2DDD0FF0F8265DD99CBD065A95DBA748979796BB870D9AD5BB7A867489B2B58FE7BC90741CFE9E32F438365B8F73B439FCC5A36F5497CE4F7C9EFD57F235DDA2B8225000068F660691DBBA406A32FBCF042420728322094BDFFD11E939689C1528E6D94B0274B5B5BDED6D29A89D4414C429B2C91BDA6C33575DE27814DCEF81AE9A43BCEF2FD93BE6FFD7E39D6517EBF7EBDCC58469A410D174AE5A43C3A00D7778CA5FCDBF4B25839C18F044DE7D96B0996F52F8BD527F47186C4584EC813E97DA97449918682E553E5EB1A0C96FD27F9AD194E6BD6B24BAF40F02B2E2E6EB24B8FC82546060C1810345B992EED15C1120000A444B0946388E44C8C1B366C48C8E0E4A38F3EB26601D6AC59933603AAA60E96F76FBD3F705911097F57E45C11F4BCF3B21DCEE327E56CB112D89CD7B094C72FF9FB2581FB1222F56CE2A9E79E6A2D7F9520AA2F3FD2C23EC652DF9713023534DB195A6419AD5E6A9B3F393F68465582A4DCDE38F8C63A9741215846BF2C5642A1ECE489F51222A1EF6BECF533131D2CFB4D5A12B414564EEA134BB01C5CF6A269E41E3E0672F8F0E18D0E97122A478D1A15F89D72ADDD746AAF08960000202582A5983E7DBAB51C4FAE33D99476EEDC699D0823DD969425F23A9672B21D1DCAE458CBDF77FA7D60F62FD27BA2990594E017CBEB63099652F4196A9D27EC719E4C285125538365B870998865B6A9162C9F5BB631E8B97FBEF076BDC1B272F516EBB223424268F1C425567BE5BC8EA8CC5CC6BB2C56DEE79CA964092CC11200008265234D9E3CD9ECD4A993F9C1071F34C9EFDBB871A3152A478F1E9D7603AA44064B0AC13211E1B2A9436A22826543AF0B0D96CF541C0EA4231F7F2D70FFAEA9AF5AED554E8E1174CCA59CD047CEEA1A0D799D2CD1771E5329251DDB2B8225000048A960A9672EF3F2F2CC7FFFFBDF8D3AA18F0CD8BC5EAF35F84B47044B8265323576F96AAA2D7F0D0D8C53E7BD1DF6B9CFBF3A600E7C64A9351329AF9BF8DCE1E5A79B77EEB71E7B7FD39EA06331777F5E1358F6DB7DD894A070A903A65C7B72C99225D66CA45E262BCB5DB76DDB6656555599A5A5A5D6F27FE7FB64F96BBAB657044B00009072C152C831975DBB76B5CEE2BA6AD5AA98DEBB62C50AEB782F39F1453A1FA344B024583657B88C75C631954ED41329583E5DB92EE2F3727D4B798D94D0F7C9352CAD1D5E0BDE09BC46CAE819CBCD11D3ABACFBABDF7EC75AC6EF0C89B196746FAF08960000202583A53663C60C6BC0267BF6EFBBEF3EF395575E313FF9E413B3A6A6C67AFEEBAFBF3677ECD861CD003CF8E08366FBF6EDAD019AECF54FF7B329122C0996E9B02C365597BF3607DD5EC51A2833A1BD2258020080940E965A7575B53976EC58B367CF9E758E4792E5AE32B3294BCF64A63353102C0996A91E2E9F7CF249EB7583060D2201B9BCBD2258020080B408966E44B02458A6C2B2D848CB5BF5D95F099520580200008225C19242B08C79E692E5AF20580200008225C19242B08C3B5C122A41B0040000044B822585601977B8BCF4D24B099520580200008225C19242B08C8F1C5329DF7D39010D40B0040000044B8225856019974D9B36112C41B0040000044B82258560D938044B102C010000C19260492158122C41B0040000044B8225856049B004C1120000102C41B02458122C0182250000044B102C0996044B80600900000896044B0AC1926009822500002058122C29044B8225089600008060098225C1926009102C01002058826049B0245802044B000040B02458520896044B102C010000C19260492158122C41B0040000044B102C0996044B8060090000C112044B8225C11220580200008225C19242B0245882600900000896044B0AC13211C1B262E52673C4F42ABBBC6695F9AF55078AF3B1BEA53EB3A8D41FF43BE4B1818F2C0DBC2E5CD1EF7D70D6CA7AFF3D2BDEDD6EBD6EE7DEAFF87008960000806089508B2B1613EA089629192C6B0E1C0CFB9C04BCFE939634F83BE4758FBDF44E54AF1B3AEDD5A0C724400E9EBCCC2ACE007AD7D4576BEF97F9AC9F41B0040000044B280B972D34A76E9E4AB06BE6327BD36CB3B2B2920DB281A5B095ABB758816EC99B9BA30A8C6F6DFC8FB9E0F58FEBCC52CE7CF93DEBF9F59B775BB7231F7FADCEFBBFFDF6DBC0EFF9E70B6F5BF73FDCBAD7FA79F11B9B825E03822500002058BADAC6EA8DE6CBFE970997CD1C2A2B2A2BCC0D1B36B8721BECDEBDBB1524EB2B1D3A74300F1C386885BA6897A4EA607920C2CC67A4194B09AD258FBD66153D3B59A45EA3672D6569AE5E8E2B3F1797F9694808960000806089EAEA6AD3E7F3594B3129C92F3253E9D65029962D5BD660B09C3D7B7660E650CF34F69FE437EF7BEAF57A03E36CDFFAC0FDC1FF0C5ED63AEDC5B56183A55E822B817190FD9ED019CF221536CBFEFD268D07C1120000102C01A48AAE5DBB460C95050505E6538BDFB102608D3D6B39755EEDD254098EF2F3FB9BF634182CFFBDE483A0E7F4F197E18EB10C7D7FB8E7E4F84B102C010000C112401ACC5A8E7A648E15E4F67D511308753A580A39DE511E7BE05F6FC4142C9F2A5FD760B0945951E719689D339EF7CE5CC10747B0040000044B00A924DCB19685E3CBCD810F2FA913F89CC152CC78F9DD3A3397A1C1B2DFA42541C1504EEA43B004C11200008225800C9DB5340CAF15DE463D32376CE00B0D96424ED453DF8CE573CB36063DA7CFF41A2958CA1968F549822484164F3C1C70E5ECB09FECFA920F8D60090000089600524D8F1E3D42CE047B206CB0D4A1B03EF51D2319FABAD060F94CC5E140AA2F45A2AF63293EFFEA8039EFD50FADC70898044B000040B0049042E40CB93A583EF7DC731183E023CFBF1555600C37B3A983E1C047965A3391F2BA89CFAD093CB779E7FEC0B25AE7B198BB3FAF09BAB6A5044A799FDC07C1120000102C01A4107DAC65B8D9CA5867229FAE5C17F179E7753143DF27D7B014D317BC13788D94D133965BD7B194FB124EE577481005C1120000102C013413B986EAB871E3CC9E3D7B9A797979A661188119CBDCDC5C6B69EC983163ACD701044B000040B00410306BD62CB34B972E112F3112AE74EEDCD99C366D1A9507822500002058026EB67EFD7AB36BD7AE3105CAD0D2B1634773EDDAB5542608960000806009B8CDF4E9D38396BAEAE5AEF7DE7BAFE9F3F9CC2D5BB698FBF7D71EAFF8D5575F99DBB66D33ABAAAAACA5B2F9F9F941EF93DFC3EC2508960000806009B8C8ECD9B3EB04CA9933679ABB76ED8AEAFDFBF6EDB35E2FEF73FE9E871F7E98CA05C1120000102C0137CC543AC3607171B1353B190F79DF800103827E1F33972058020000822590C1E4984AE7F2D7E1C3870796BBC64B96C98E1A352A6859EC9A356BA86C102C010000C112C844CE33BFCA4C656343A5335C3A672EE5843E00C1120000102C810C239714711E5319EFF2D748E4F7398FB964492C0896000080600964F06CA59C7827D1E195594B102C010000C112C820D5D5D541B3957BF6EC49C8DF91B3C53A2F4522C77402044B000040B00432805C7B5287BD3163C664CCDF02C1120000102C012449CF9E3D03616FC9922509FD5B55555581BFD5BD7B772A1F044B000040B00432415E5E5E20EC35F5497B426DDBB62DF0B7BC5E2F950F8225000020580299C079EDCAA6BAC4482472E911FDB7A400044B000040B0043240B2831EC112044B000040B00498B164C612044B000040B0047018C75882600900000896001A85B3C282600900000896001A85EB5882600900000896001AA5BABA3A10F6727373CD3D7BF624E4EFECDBB7CFCCCFCF0FFCADF5EBD753F9205802000082259029BA74E912087C3367CE4CC8DF98356B56E06F74ECD8914A07C1120000102C814CE20C7D326BD9D427F191DF27BF57FF8D69D3A651E92058020000822590693A77EE1C087EC5C5C54D76E911B9C4C880010382662B0F1C3840858360090000089640A691631E9DD7B41C3E7C78A3C3A584CA51A346057EA7FCFE356BD650D92058020000822590A9A64F9F1E08817AE632DE65B1F23EE74C254B6041B0040000044BC025264F9E1C1406E5D84839A18F9CD5351AF23A3966D3794CA594D1A34753B920580200008225E0D6994B1D30E5DA934B962CB16623F5325959EEBA6DDB36B3AAAACA2C2D2D350B0A0A82DE27CB5F25AC02044B000040B0045C468EB9745E86249E2227EAE1984A102C010000C11270B9193366C41C302550CA2C25677F05C1120000102C01045457579B63C78E357BF6EC59E7F849AFD76B76EFDEDD5A2A2B339D00C1120000102C0100044B000040B00400102C010000C1120000822500006E0A963535358C7800000973F0E0418225000099EC88238E78F7F5D75FFF8A610F002051DE7FFFFDFF1E75D4511FD1EB020090B94A2EBCF0C2F719F6000012E5D24B2F7D57F537F7D2E5020090B98E5765E5CF7EF6B355555555DB65B91200008D25FDC9DAB56B3FF9F5AF7FBD46F533EBECFE0600006478B82CB13B7E9342A1345CE41A90D40385527F39E288233E54B70F102A01000050AFACACACE355C87A4095831E8FE72B757BBB1BFEBFED6009000000008857CB962D8F360CA3AF0A585B2564D9658F7AEA08822500000000A0A150D54E95771C815297675C5407044B0000000088555656D6B92A50CD0F132875E94FB00400000000846518469E1C47594FA8945240B00400000000D417A66409ECC79182A5C7E3B99A600900000000A8574141C1499196C3CA1962099600000000806883D50C550E3882658DCBFEFF099600000000102FFB243E9FCAD257C330CAED60B99260090000000068504949C9912A542D53E576FD980A98EAC79CE9044B00000000408354882C9460A9EE1EE17CBC65CB9647132C0100000000F5722C81FD85DBEB82600900000000310AB70496600900000000885AA425B0044B00000000408358024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B00000000881B4B60099600000000D0282C8125580200000040DC58024BB00400000080B8B104966009000000008DC21258822500000000C48D25B0044B000000348112B3E4E899EB673E3BEFB579DF2EAE586C969797539258A4CE172E59B87BB17F711E5B6392B77D96C0122C41BF40BF000040D390C1C382650BCCA99BA79AE3F78EA7344399BC75B2B968C9A2CF2B2A2ADAB145264FE812D8BEA53EB3B0D4B7BC7082EFA948A56F99BF8DF5BA09BE87EAFBDD85E37D57C9EBFA942EFB11C112F40B14FA050040C6933DD20C1E9ABF4CD932E5407979F93AB6C8E408B704D60E960DCE5ECAEB5479DEF99804C8BE65BEA5529C01B46FA97F817DFF4B553E2358827E8142BF0000C848B2E4860E3C358A1A401C648B4CBC484B60AD6039BEE2E2C289FED6A1B39445137CDDE4F9E28915E7C96DD184CA19E17EEFE180EABF43EE178DAB38A7F6F5FE56CED7102C41BF40A15F00006414399E83CE3B6506100CD49320D2596075B02C29997D6C7DEF0F9DB12C9E50715D51A97FB6147B76727F51A96F6F60D96C59E52CEB7E6016D3B7956009FA050AFD0200C095038829DBC79A152B869A2BCB075945EECB6374FC0C20D2497D6781B542DF84CA7C4778F4072F6BADEC1B2E58964CF71F673FBE4D05CAAA70C7651696FA76A8E0393293EA926049BF40BF40BF0000404C038829DB1F34572F1A68BEFDD280A0228FC97374FE0C20D241436781AD1B2C2B0DE773FAF8CB70C75886BE3FCC739FC9F197044BD02F50E8170000AE1D40CC7B6B449DC1832EF3DFBA9BCE9F01445A88B40436EA6059E6EFDC60B02CAD5C6BCD50863993AC0A96930996A05FA0D02F00005C3B80585E3938E200429EA3F3670091EAEA5B021B3958FAD6075D6264A2BF35C1926049BF40BF40BF0000409C0388958BEF88388090E7E8FC1940A4B28696C0460A9685657E8FF3397DA6D748C1B2A8D47FBDBE6EA584501524AB03CFC9D961C72DFB31C112F40B14FA050000030806100C20D250434B60C305CB065F17122C8B26F83BE8E7F4A548F4752CE57ECF49FEE3D5CF6DADC7322460122CE917E817E8170000886D00513E28F200423D47E7CF00225545B304362458F60FF79C04C3A252DF2A6B26D25AD6EA1FAE9F2B9EB4F44C79AC5F99FF7CE7B198B73DFCCAC9CE6B5B4AA094F7C9FD340C91F32548365056B2C5D12FD02FD02F00001840442CCB960D89388090E7E8FC1940A4A26897C03A8365515965C7C8BF6FF6B1F66CA559E77DA5FED972BFB0B4B2B77E8D7526D8D2CAA9D6752CD5CF124EE57748104DC36079B92A07EB0B962ABCB766ABA35FA05FA05F0000308088586654DF67AE7AB9EEB227794C9EA3F36700918AA25D028BA8C3E5C27A82E5F2962D5B1E4D2DD12FD02FD02F00001840D4DFB9AD18566700218FD1F133804845B12C8145D4C1F2F248C1D2308C36D410FD02FD02FD0200800144BD65C29EF1E69257EFAA338090C7E4393A7F0610A924D625B088295C863BD67225B395F40BF40BF40B00000610F5766A53B63FD8E0B134F21A06000C2052054B60131A2CEB1C6BC9B195F40BF40BF40B0000441C40C81EE739EFDD63AE593830E2E04117798DBC96BDD40C209A1B4B609312DCE7325B49BF40BF40BF00004083038886F646B3979A01442A62096CD282E5D58E632B5B5123F40BF40BF40B0000841D4044B337BABEBDD40C06184034C2498D083C2C814D92ECECEC45122C99ADA45FA05FA05F406AF585009052038878070FBA30186000112799FD32EDDB98B00436B99FD30F7FF8436BC692AAA05FA05FA05F40EAF48500907203080A03886670BD2AFB541967DF467D421896C036CFE764074B4EDC43BF40A15F400AF48500C00082C200E27047AA3B50D94BFB69B41D2A4B60D3E37302FD02857E01B4B100184050184024AB236DE8F1202C814D8FCF09F40B14FA05D0C60260004161009128AD1AE830F5F3618F3361096C7A7C4EA05FA0D02F803616480BB9B9B967783C9EDE1D3A7498979797B7C9EBF57E6D9F0AFFBFEAFE16FB9A6BFDE575D4160308061029D79136D45146DC5BCB12D8F4F89C40BF40A15F006D2C523743A9B1D4B3AA6C54E50B3B43D5A8F2B1AB329461186DBA75EBB6B27BF7EE9F959696EE5DB16285B96DDB36B3A6A6C61472BB6BD72E73F9F2E55BC78E1DFB8E0A9E9FA8CAF1ABF7E5B12931806000D1ACAE8F71EF6B9DD7B304363D3E27D02F50E817401B8BD4CB50AA94DB01D28CB264668652FF6367AB30F97A6161E197AB57AF360F1D3A64464B85CC759D3B77DEA07EC72B323065D36200C100A2D93AD2D671BCEF0BE95059029B1E9F135548BF40A15F006D2C522B43A9B230863019AE644E862A2828C8EFD4A9D3D7F3E6CDFB36964019EAA9A79E7A43A5EE9DCC5E3280600091161D69D0FBAFBDF6DA292C814DFDCFA9054BB6E81728F40BA08D454AF0783C39B2D2CB1912737373CD7BEFBDD7F4F97CE6962D5BCCFDFBF75B39E9ABAFBEB2568156555599E3C68D33F3F3F343C3E517699FA1EEBCF3CE82DB6EBBEDC0860D1BCCA6F0E1871F7E9C9797F789AA982E0C20E8BC1940245C43272788CAF7BFFFFDBFDF72CB2DDF9E75D6595DE92652F7736AC2DF03FA05FA05D0C6D2C6A271A1B2B50A83079D8172E6CC99D62183D1D8B76F9FF57A799F3360A66D86EAD7AF5F4FE59B682B205A3B77EEDC61874BD7CE5C3280600091C48EB44996EEA87079131D6AEA7F4E2DD8AB4EBF40A15F006D2C9A3B54E63843657171B1353B190F79DF80010342C3657A65A86EDDBAFDA26BD7AEDF34D54C65B8994B7B59ECF90C20280C209A5CE8C90664F96A8716B12F630D7D1F2731E07302FD02FD026863696311817D4C6560F9EBF0E1C303CB5DE325CB64478D1A15BA2C367D3254BF7EFD3E9A3F7FBE9948D3A74FAF908351194050184024A4236DEDE810A7A962DAB7D176A891DE4787CAE704FA05FA05D0C6D2C6220CFBCCAF8199CAC6864A67B80C99B94C8F0C3562C488DBFAF7EFFFDD37DF7C63265AFBF6EDD7B971492C0308061049EA485BD87B594D4789A6437576A4BAB4773CCF71267C4EA05FA05F006D2C6D2C8243651BE73195F12E7FAD6F59ACF398CBB4C85083060DDA2E97144986575F7D75A91B672D194030804880481D5CB88EB1BE0E35DCEB1F0DF37A8E33E17302FD02FD026863696371385806662BE5C43B89306BD6ACF499B57CFAE9A7AFE8DDBBF7778DB9AC48ACF2F2F236C97A6406101406108DEE485BC5D04186EB50A3ED48433B549602F139817E817E01B4B170ADDCDCDC33F4097B645671CF9E3D09C94D72B6D8904B91A46E862A2B2B7BFAD1471F3593E99E7BEE91632DFB67CA9E0A55FEC000820144A2B7A1383AB4863AD4583B52E7DFFFD46D7B6BF99C40BF40BF00DA58DA58B649CDE3F1F4D6616FCC983109CD4E729D4B47B04CDD0C3562C4882D2B56AC486AB0F4F97CAFAA4A999F091B9D63CD73B9DAC0AE6600C1002251DB5048471A6D4716A9433D32CE8E34742FB16B3A543E27D02FD02F80369636966DD2F1FCB3FA354B962C496876AAAAAA7206CBD4CD507DFAF439B063C78EA4064BF5F76429ECD64CDAE81C6561B8BD1B0C20184034761B6A11FF711DE13AD40F1AD19136F6DF93D1DF753E27D02FD02F80361699BF4DAA9F37EAE79AFAA43DA1B66DDBE6FC77A46E86EAD0A1C377353535490D965F7FFDF56E55293519BAD105F66E38373E06100C201AB90D3576AF68B80EB5311D696887DACA851D0C9F13E817E817401B4B1BEBD26D52AE2DA91F6BAA4B8CD477E911C7BFA126A52BAD39C8DFCDE48DCEB97743A6CF1940308088771B6AD3A64D85DDE98D6BE49F3A32CCDED90FECC71B639CFDBB4E726307A34B565656C529A79CC2E784B4E817645BB83CFBF2A85FDFED996EE6A9E79E1AD3EFBF75D4AD0DBEE6CF857FB6EE777AA293396EF7B8C0E31DA6752058F2BDA12F44AAB7E58192ACECA44BCA565A41418199EC194BF5F70EC6F261654249F600A2D70BBDACC6F2A15D0F993DE6F430AFF45E690D0C2E6A75917955EE554D3E4049B70144BA6D3FD75E7BAD79ECB1C79A8DD81B5ADF5EDA582E1C1D712FADDBBED3F5153E274AB4A53983E579D79E17F639699FCFBEFC6CABE8BEE3C4D34FB48ADC9792FB48AEF53BEED9708FF59EBE2FF7B51E77BEFE17D7FC22F0FA2E4F75314F39FB943AFF06EF246FE07EFBA9ED03F7A59FA05FA0D01752D2A5306369EBD3A7CF37C93EC672E7CE9D3B32F8184B5D567A3C9ED62D5BB63C5A5E97EC60298D64DB7BDB5AC1528738FDF80DFD6F08FC3CFAA3D1D6E0423A7E09783FBFF2E7E665ED2E0B1A2048677FCC71C704DE9309038874DC86EC8EEB8B168939AE249E0ED5EDC758F23921ADFA85D036F9F81F1D1FF179E93B86BD3DCCBCE0FA0BEA04CBCE333A9BA79D775A9DDFE76CCBE5E7D6435B077E3EEA98A3027DCF88F74658BF475E73EE1FCEB5FA03B93FF4CDA181F70E7E7DB075DBEE8176CC58F2BDA18D454A6E93EAF6438EB10C317AF4E83DC93E2B6C5555D5864C3B2B6C3D0D608B640F20BACEEA6AF69EDF3BD041FFA5F82F81FBBFB9F937610710F29CCC6CEAD7E9BDD1121E25709E7CC6C90C209A791B0ADD2BDA888EF4D116E1CF84174B879AB267C22B2AADBCA1B0AC72965526F89E92D2B7CCDF4697A0C74A7DA62AFF71BE5F1E2B2CF52DD7AFD3A5FBD029A62E1D7A0E92F799A5CFAD7DBEBECFE9AABFB62F94D7F5295DF6233EA7C488F479398BFEACD5FD87EAFB5D85E37D5745F979A55DBF103A2329DBD2D1DF3BBADED74980FCDEF1DFAB132C7F70CA0FEAF42563778E356F7FE9F6C00E46F9FD57E75F6DDD97D74A5F122EDC3A77389E70EA0981D536B273527662B214D6D58378FA42DAE5266B9713B14D7256D8301E7DF4D105C9BE8EE5030F3CB02253AE63E9F890971B86D126420398B401840E69326BD8C2313B29F77BCEED690542B95FB8B0B04E072F03007D7FC8CA21D66DC1F40273D487A3ACFB233F18C900A219B7A138F68E36746DAE682F1C1DEAF216297CEDAE92E9FEE3227574AABC1B6587787B439F93FDFB9E77BE463ABEBE65BEA5523A0EFF57E52F2FB9F6CBDAD7F917D89DA8FCFC199F53930F606E8FE675F57D5EC13B1BEAFDBCD2AE5F082DFD7CFDACEDE8FB277D3F68454B68911D8A524283E54F7FFDD3B03B29E5774A180DED53A4EF39EE84E3C2BE5E76380E7C65A0755FFE5DFAF1ACB1591C63E9DE60495F48BBDCE4ED7222B649AE6319C6EBAFBF9ED5A74F1FF3D0A143490B96050505DB54A59C9D210D617D7BD4923E8018B36D8C152EA5833EF39233AD80281DBAEEB0A5DCBDEE6EABE19499CD07763C10088712FCA433D783831611662C194034CF3614E35ED2682FF81C6B87AA9720B549A7EF6951A9FF7AE9988A27545C17558738BEE2E2C289FED6417B58873CB87196AF7AA2F57B26569C27B745132A67D409B6252547EADFD3EEF6095297FBCEBBA46597DAD7FB5B395FC3E7D4440398309F970C408A26F8BAC5F2791596FAEFB0B6977115E744F8BCD2B25F88747CA5EC6094FBF52D87D5F7254C4AD127F291F785865279EC9CABCFA9B3C35102E9C5AD2F0EDA012AC7DCCB6B8C32236C9FE2F643245C1A2CE90B699713D62E27629BCCCDCD3D43BDC63A6F8CBA6FEED9B32721B969DFBE7D667E7EBE3358A676861A3162C4D7AB57AF4E4AA85CB366CD1E5521AFBAED4B96CC01848449E9CC25344A902BAE2C0ECC2E4A91E54F7AF650CF404A232A3388BA53D7B394326329CFCBB1360C20524EA4BDB5D176A4B176A8FAEFA555475A5232FB587BAF68544B69748728EF8B654FAB84561560674BB1F7AAEE2F2AF5EDBD216FD070796DC1F0994B034B726BDFBB95CFA9E906304DF5790596679555CE0AF379A56DBF10BA0C560E77D06DF02D77DF12F41A3984E1C21B2EB44AB893F7B4BAA395795DAFEB02AB5B62ED17E4D8FE92774AEAAC9471F60B7AF58D3E3910FD02E80B699793D12EC74A2E3DA203DFCC993313929D66CD9AE50C95AFA4FC06307DFAF43103060C48CAAC65F7EEDD3F561F421EC132B17BA3A5149517598308BDD7B9BE10E7ECE02560EA8181CC56CAC91B4297B732804819B2E72E74294E8716B15F9B2B5C87DA3E86BDC2A9DDC195FAEF08EC212DAB7C5FDD7FB8DE8E6E4265BEA3D3F3072FC7A9EC1BAE43D44B70D563DB544758E5DC4BDB71D853BE5F5E7AEDE7BDC72EDAAB3ACC917C4E4DFBF936F5E7A5DF5F58EADBE1F8BCD2BA5F70B6DDCEF67CD0F241412754D3E1538AF38CE20D1D63A957AC84EB53E498FABB56DDD5E02112D217E8552D126EA59FA86FA92EFD02E80B6997532058B6D1A14F662D9BFA243EF2FBE4F73AAEA1991E196AC89021FBE7CF9F9FD050F9FCF3CF6F97D9CA189739102C1B71BCA5F374F2F5054B39D64696CECAB18E32D3A95F2F3396E15ECF0022E53A54E7490C9C1D632C177C8EF4BEB4BDF07351596547E9B8A4B3B23B3AEBB804E9F0E4E77E65FEF31BEE102B8DE0905A7BDC48B8634342DF1FFA39DD36E6C5EFBA8F7EEE1D3EA7440E609AECF392E73E93E37C32A55F6811E1046EB203519EFBE59F7E19B4FC55074C7D9928BD43506629C3B5F391765686165905A357CAE44FCE0FDA21AA67546F1C7C639DB398D32F80BE907639D1ED723C54B6F1EBE0575C5CDC64971E914B8CC8C49F73B6326D32D4DCB973FFDCBD7BF7EF366CD8909050B969D3A643797979BB55D23EDF8D5FB2640D20F4F193A79F7FBA15D89C7B9CE5F14BFE7E49E0BE84483D9B2817BE96E5AF1244F5E547F49E6D7D5F4E08C4002265852E053AC2DECB1AEB69D343DFD72A5D3B52E9C86A97BF2E38C1D151050E7897E334ECC7C6C7D42196F93B37D8219656AE759E81D6B9A7F62FDE0107F89C92388069E4E7A5063093D3BD5F9013AFC909D3E4B8FA48AF919D85D20EEB338AEB223B1AF5D9BCDBDCD326A6101BA95F90A24F30E73CDEDE792E80641782257D216D2CED722382E5D9AA7CAA03E0F0E1C31B1D2E25548E1A35CA192ABF48BB0CF5F8E38F3F2A27F2D9B56B5793864AF97D9D3A75DAE3C625B0CDB567DAB9C7B9A1D748F08BE5F50C20D2A6436D8ABDBF6979C63B396B5C51A96F55988E2EE84C6A4565953D42672EC32CE1591F746AF489FED68DE9103B0C7DF2453EA7440E609AF6F3CA8460492158BA3C5CD2C6D22E279CC7E3C9D127F2D13397F12E8B95F785CC549A699BA19E7CF2C939122E9B6AE672D3A64D66972E5D3E53153EC8CD5F3206100C20D2AC434DCB0B3EEB13F5C812D8081D5D9D5374CB0906EAEB100BCBFC9EA03DADF619EA22758872065A7D9220E93C5507581D784ECE6A376ED98FDDFE3925720093A0CF8B7E817E01F4857041BBDC182A001638C3A51C1B2927F491B3BA467BF65739518FF3984A29699FA1A64E9D3A5185C1EFE498CBC69CD067C18205FFEDD0A1C36752D16EFF923180600091448D5DB293914B7E9C9D59B41D6283AF0BE9108B26F83BE8E7F429D4F5F5B7E47ECF49FEE3D5CF6DE5B19F9D7FA597CFA969073089FCBC123190A15FA05F007D21ED726AB5CB8D253397AAEC730643098A729DCB254B9658B3917A99AC2C77DDB66D9B59555565969696CAE5188302A52C7FCD980C3565CA942B860C19B25BA662DF7AEBAD9802E5DAB56B650AF7B3F6EDDBAF74EB31950C201840A448871AEB5ED68C3D39416D47E71B1C658718F6E2C3D2A1C9125B6B0FAAB51CC73F5C3F573C69E9997A59ADF31892DB1E7EE564E735B9A42394F7C97D3EA7261BC024EBF3A25FA05F007D2132B85D6E0A72CCA5F332247196573232433DF4D04377297B6579ECA38F3E6AAE5CB9D2DCB16387595353638548B9956328257CCA746FAF5EBD6ABA76EDFAAE246C379EFD95010403881412EB129E8C5EF213CB1ED4704B6935E77531EBBCAFD43F5BEE179656F6D6AFB1CE60575A39D5BAFE96FA593A55F91DD281F23935CDE79AE4CF8B7E817E01F485C8D076B98903663B3B601E8C2550BA22433DF1C413973EF0C0034F0C1D3A7463B76EDDBEC8CBCBFBD69EDE3DD4B973E72F54F05CADCA2849E97CA51840308048BB0EF57255BE68C1059FF99C40BF40BF00DA58DA5834199595CE5001B3AFCA48CFAAF2B12A358E20B95595F9AAF42743810104038874D0CAEE285BD5F3FCA774A47C4EA05FA05F006D2C6D2C12CF0E9326AB3BC1008201443A8AB4B796253F7C4EA05FA05F2058D2C6D2C622493C1ECFD57A79AC61181CC70B06100C2032A243A523E57302FD028560491B4B1B8BE406CBB98EA5B02BA9113080600091EE1DEA383A523E27D02F50E81768636963913C2A485E1E7A321F1534D9FEC000820144DA926517FA5217E07302FD02FD02FD026D2C909C60393FCC99605772AC25184030804867275105E9F13949A74335D02F50E817401B8BB40F959747BAF48861189C340A0C2018400009EF88D85EE91728F40BA08D45FA6F6B0BEBB97EE5726A080C201840000C7A40BF40BF00DA58A0BEED2CE26C25C75A820104030880410FE817E817401B0B44B39DCDAF2F54728658308060000130E801FD02FD0268638198E4E7E7FF406D7B5F52136000C1000260D003FA05FA05D0C60271C9CACA3A5E6D7B5F50136000C1000260D003FA05FA05D0C60271B9E5965BFE9F6118FBA909308060000130E801FD02FD02686381B8E4E6E69EA0B6BDCFA909308060000130E801FD02FD02686381B86465659DA8B6BDCFA809308060000130E801FD02FD02686381B81414149CE4F178F651136000C1000260D003FA05FA05D0C60271F17ABD27AB6D6F2F350106100C2000063DA05FA05F006D2C1097ACACAC1FAA6D6F0F350106100C2000063DA05FA05F006D2C1097F6EDDB9FA2B6BDDDD404184030800018F4807E817E01B4B1405C0CC3F81FB5ED7D4A4D800104030880410FE817E817401B0BC4252B2BEB476ADBDB454D800104030880410F1A6D71C562DAE4D42835AA5F38C816491B0B248B6118A7A96D6F27350106100C2000063D68B4054B17EC98BA792AED723397C73E7CEC69D52FAC638BA48D0592252B2BEB74B5EDEDA026C000820104C0A0078D56EE2BFFFBCBFE973F537DC3D7B4CFCDB3A3D1EA132ACA37575454B4638BA48D0592252F2FEFC76ADBDB4E4D800104030880410F9A846A8F5A979797AF949514B24C9F92D42275BE8E3E8136965A40336C773F51651B350106100C2000063D00401B0BC4252B2BEBA76ADBFB849A806B6567675F4F030C30E80100DA58207EB9B9B967A86D6F2B35013737BEAFA8F21D350130E80100DA5820EEEDEE4C55B6501370EB17A0A534BE520CC3F803350230E80100DA58207659595967A96D6F333501B736BC7E47B02CA74600063D00401B0BC4CEEBF5FE4C6D7B9BA809B88E0A92AD74A864D61260D00300B4B140A3B6BBB355F9989A801B37FE574283A52AF3A91980410F00D0C602B1C9CACAFAB9DAF63EA226E0B606B75D98506915AFD77B09350430E80100DA58207A6A0C7D8EDAF6AAA909B8ADC17D2752B0340C6316350430E80100DA58207A595959E7AA6D6F233501D750C1B14DA450A98BC7E3F935350530E80100DA58203A5EAFF7976ADBDB404DC03554685CD350B054E5596A0A60D00300B4B140D463ECF3D4B6F7013501D7320CE37FD497E0536A0260D00300B4B1407CB2B2B27EA5C6D5EBA909B8567E7EFEA9AA01FE0F350130E80100DA58203E2A549EAFB6BD75D4045C2B2F2FEFC7EA4BB09D9A0018F400006D2C101F8FC77381DAF6DEA726E05A5959593F555F824FA80980410F00D0C602718FA92F340CE33D6A026E6E7CCF54650B350130E80100DA58203E2A545EA4B6BD77A909B896D7EBFD99FA126CA22600063D00401B0BC4472ED727D78AA726E05A5959593F575F828FA80980410F00D0C602F1C9CDCDFD5F152ED75213702DF505F8856A803FA42600063D00401B0BC4C7308C8BD5B6F7363501D7F27ABDBF545F820DD404C0A00700686381F8783C9EDFA86DEF2D6A02AEC5C55C01063D00401B0B347ABBBB549537A909B816D7DC0118F400006D2CD0E831F56FD5B6B79A9A806B716A6480410F00D0C6028DE3F57A2F53DBDE2A6A02AEC519AC00063D00401B0B347ABBBB5C9595D4045C8B038D01063D00401B0B347A4C7D85DAF6DEA026E0E6C697038D01063D00401B0B3482D7EBBD526D7BAF531370F39780F5E000831E00A08D051AB7DD5DA5CA0A6A02AEC5B43DC0A00700686381468FA9AF56DBDE726A026EFF12B0770560D00300B4B1409C0CC3F89DDAF65EA326E0E6C6F71A55AAA80980410F00D0C6028CA981B81886F107F52578859A0018F400006D2C109FECECECDFAB6DEF556A026EFE12FC4985CBA5D404C0A00700686381B8B7BB3FAAB28C9A809BBF042D55F1531300831E00A08D05E2C3640D5C4F7D01FE4F35C095D404C0A00700686381B8C7D4D7AA6D6F093501D7CACECEBE5E7D11CAA90980410F00D0C602716F77AC0284BB793C9E1BD497E0656A0248EEA0A7A8B4F286C2B2CA595699E07B4A4ADF327F1B5D821E2BF599AAFCC7F93BE4B1C252DF72FDBA7045BF57DD7FA8BE7F4FE178DF55F2BA3EA5CB7EC4A703806009C42E3B3BFB3AC3307CD4045C4B7D015AA906782135012477D05332DD7F5CB8E7EC10F96E43BFC30E96B747F33A559E773E2601B26F996FA994E0F0EA5F60DFFF5295CFF8A400102C81A8C7D41C5E0677F37ABD7FF3783C2F511340F30F7A8A4AFDD74BC02B9E50715D54C1727CC5C58513FDAD4367298B26F8BA59BF6762C579725B34A17246E8FB4B4A4A8E3C1C50FD77587F7F5CC539B5AFF7B772BE060008964083DBDD9F55A9A026E05A2A54B6565F82F9D404D0BC839E9292D9C7DAB38B512D49D5C152DED7D0EB9C3396125A55809D2DC59E9DDC5F54EADB1B58365B56392BB024B7F6BD5BF9C400102C81FA71DE12D0F8E6E4DCA2CA0BD404D0BC831E3D731898692CAB7C5FDD7FB8DEC038A132DF111EFDC1CB5A2BFB860B967A09AE7A6C9B0A9455E18ECB2C2CF5ED50C173249F14008225101D152AFFA2B6BDC5D404DCFC2568E3F178E6521340F30D7A8ACA2A3B4A0094D06707C6FE56F853C1517EEE57E63FBFE16059690487D4DAE32FC31D6319FAFE30CF7D26C75FF24901205802D1E18498E04BE0F1B4555F8239D404D03C831E0984B5CB5F179CE0087CFD03A17382BF95FDD8F898826599BF7383C1B2B472ADF30CB441339E65BEC97C520008964074BC5EEF5FD5B87A1135013737BEED5479969A00923FE891B3AF1695FA5685098CFD9D8F159555F6089DB90CB314767DD0254626FA5B132C01102C81E4E04A0BE04B6018D9EA4BF00C350124F37BE7B54ED2234B60C306BE906029E4443D615E17089685657E8FF3397DA6D748C152CE40AB4F1224215405C9EAC0737276D871CB7ECC270580600944872B2D8001AEA21AE07F5113406A0C7A9CA1B03EF51D2359E77521C1B26882BF837E4E5F8A445FC752EEF79CE43F5EFDDCD67A8C800980600944B3DDDDA4CA8BD4045CCBE3F1E4AA6C39939A00522758F69DE01B1C65B0EC1FEE390986B2C4D69A89B496B5FA87EBE78A272D3D532FAB751E8B79DBC3AF9CECBCB6A5044A799FDCE7130340B0041A1C5373093FB8BEF1CD57E5496A0248A56019DD4C64B8A5B49AF3BA9875DE57EA9F2DF70B4B2B7BEBD75867822DAD9C6A5DC752FD2CE1547E8704513E3100044BA07E8661DCACC2E53C6A026EFE1274500DF0E3D404C0A00700686381B8B73BAE0D0F77F3783C1D55B87C8C9A0018F400006D2C10F798FAEF6ADB7B9E9A809B1BDFCEAA3C4A4D000C7A00803616888F61186D54B89C4B4DC0CD8D6F5755A6501300831E00A08D05E2DEEE6E55E5396A02AE651846778FC7F34F6A0260D00300B4B1407CD478BAADDAF6E6501370F397E036F52578989A0018F400006D2C101FC330FEA1C6D5FFA626E0E6C6B7972A13A90980410F00D0C602716F77ED5479969A806B1986D1C7E3F194521300831E00A08D05E2A3C6D3596A5C3D9B9A809BBF0485EA4B309E9A0018F400006D2C10F776E751E5696A026EFE1214A9F210350130E80100DA58203E1E8F27C7308C59D4045C4B7D01FAA92FC283D404C0A00700686381B8C7D486DAF6FE454DC0B554A81CA0BE0763A80980410F00D0C602716F775E559EA226E0E66039487D09EEA32600063D00401B0BC43DA6CE350C632635013737BE77AA328A9A0018F400006D2C101F152AF3D4B637839A809B1BDFBB5419494D000C7A00803616887BBBCB57E5496A02AEE5F17886198631829A0018F400006D2C10F798BABD1A533F414DC0CD8D6F892AC3A90980410F00D0C602F151A1B283DAF61EA726E0E6C6F76E5586521300831E00A08D05E2DEEE0A54994E4DC0B50CC3B8C7E3F10CA12600063D00401B0BC4478DA73BAA71F563D404DCDCF88E565F82C1D404C0A00700686381B8B7BB4EAA4CA326E0E62FC17DAADC414D000C7A00803616888F61185D3C1ECF546A026EFE128C515F8201D404C0A00700686381B8B7BBAEAA4CA126E05A2A543EA8C2653F6A0260D00300B4B140DCDB5D375526531370F397E021558AA80980410F00D0C602F1310CA3BBC7E3F9273501377F09C6AB2F4121350130E80100DA5820EEEDAE872A8F5013702D152A4B55B8EC434D000C7A00803616887B4C7D9BDAF61EA626E0E6C677A22ABDA80980410F00D0C602F1310CA3A70A9793A809B8B9F17D58F6B0501300831E00A08D05E2DEEE7AC9840D3501377F0926CB59ACA80980410F00D0C602F1F1783CBDD5B657464DC0CD5F82A97241576A0248D80067BE0C721A282BA929002058227DC9394BE4DC25D404DCDCF84E53A513350124EC3B76B92A07EB0B96AA236A4D4D0100C11269BDDDDDAECA046A026EFE124C57A5809A0012FA3D5B584FB05CDEB265CBA3A925002058227DC9E5FBE4327ED4045C4B7D019E505F84F6D40490D041CEE59182A5FA0EB6A18600806089B4DFEE8A5479889A809BBF0433D4C0368F9A0012FE5D0B77ACE54A662B01806089F4E7F1788AD5987A2C35013737BE4FA9E2A52680847FD7EA1C6BC9B1950040B0446650A1B29FEAD71FA426E0E62FC12CF525C8A12680C453DFB5B9CC560200C11219B9DDF557E5016A026EFE123CA3C2653635012425585EED38B6B215350200044B644C1F3F40F5ED63A809B8B9F17D569576D40490B4EF9C75AC25B3950040B044E650A172A00A97F753137073E33B477D09DA521348752566C9D133D7CF7C76DE6BF3BE5D5CB1D82C2F2FA724B948BD2F5CB270F762FF624EF805806009046F7777A8721F3501D79263BEB8DC01D28184CA05CB169853374F35C7EF1D4F69A63279EB6473D192459F575454B0D20100C112383CA61EA4C6D4F752137073E3FB822AB750134875325349A84C8D3265CB9403E5E5E5EBD82A01102C815A2A540E56DBDE686A026E6E7CE773C903A403598649A84B9DA282E541B64A00044B20B0DDDDA9CA286A02AEA542E54B5EAFF76FD404529D1CE347A04BA960C9C00D00C112383CA61E6218C63DD404DCFC2558C4650F9049C172CAF6B166C58AA1E6CAF2415691FBF218619060098060092470BB1BAACADDD404DCFC2558AC82E55FA8096442B09CB2FD4173F5A281E6DB2F0D082AF2983C472024580220580289E0F17886A931F5086A026E6E7C2B54F93335814C0896F3DE1A512754EA32FFADBB0984044B00044B2051DBDD70554AA809B8966118BEECECECEBA8096442B05C5E393862B094E70884044B00044B2041DB5D89844B6A026EFE122C51E1F25A6A0299102C572EBE2362B094E70884044B00044B20116419AC2C87A526E0E6C677992A7FA42640B0A4102C01102C81B8B7BBBBE5043ED404DCFC2578353B3BFBF7D404322258960F8A1C2CD5730442822500822590A0ED6EA42A77511370F397E035C3307E474D201382E5B2654322064B798E4048B00440B0041241AE6129D7B2A426E0E6C677852A575113C8846039A3FA3E73D5CB7597C3CA63F21C819060098060092468BB1BA5CA9DD404DCFC2578C3E3F15C414D201382A51578560CAB132CE531C220C11200C11248E07637DA308CC1D404DCFC2558E5F57A2FA3269009C172C29EF1E69257EFAA132CE531798E4048B00440B004124185CA7B3D1ECF206A026E6E7CDF54E5526A02E91E2CA76C7FB0C1632CE535844282250082259080EDEE3E55EEA026E0E62FC15B1E8FE737D404D23558CA4CE49CF7EE31D72C1C183154EA22AF91D7327B49B00440B0049A92611863D4987A003501D7525F80B5B9B9B9FF4B4D201D836543B394CC5E122C01102C81246D770FA8D29F9A809BBF04EF1A8671113581740C96D1CC52D6377B49402458022058024DC1E3F13CA8C6D4FDA809B8B9F17D5F7D112EA026908EC132DE50A90B019160098060093405152AC7AA31753135013737BE1FA82FC179D404D231585208960040B0448A6C770FA952444DC0CD5F828D595959E752132058520896000896407C3C1ECF38C330FA52137073E35BEDF57ACFA12640B0A4102C01102C81F8A850395E85CB426A026E6E7C3F56E56C6A02044B0AC11200C112887BBB9BA0CAEDD404DCFC25D89C9595751635018225856009806009C4C7E3F1941A86D1879A809B1BDFADB9B9B9675013205852089600089640DCDB5D990A97BDA909B8F94BB04D959F5013205852089600089640DCDBDD44557A511370F39760475656D6E9D4040896148225008225101F8FC733C9308C9ED404DCDCF8FE273F3FFF546A02044B0AC11200C112887BBB7B44951ED404DCFC25F8D4308CFFA12640B0A4102C01102C81F8783C9E7FAA3175776A026E6E7CF7646565FD909A00C19242B00440B004E2DEEE26ABD28D9A809BF7AEEC2B282838899A00C19242B00440B004E2DEEEA6A8D2959A809BBF049FE7E6E69E404D806049215802205802F1F1783C530DC3E8424DC0CD8DEF17595959C7531348052D5BB63C9A6049B004008225D270BB7B5495CED404DCFC25F8EAE69B6FFE3E3581E66618469E0C06546947B024580200C11269B6DD4D53A5133501377F09FE5B5050701C3581E6929595756EFFFEFD5FFDF0C30F77EEDEBDBBA277EFDEABD4765916BA5D122CD32F58AACFF1728FC73397AD1C00C11299CE308CC7549FD7919A809B1BDF6FBA75EB760C3581649365AFF9F9F9C3E6CC99B3FBD0A14335E661FB5E7AE9A5C57979792B2474122CD32F584AA05465BE2A0719E0012058C225DBDD74550AA809B8F94B70480DDE8FA226904C8661FCE1FEFBEFFF68EFDEBDBBCD08F6EFDFBF7ED0A041DBF4D2588265EA07CBD040A90B5B3C0082255CB0DD3DAEC6371DA809B8F94BF09DBA39829A4032C8A56DFAF6ED3BF3CD37DF8C1828431C5CBC78F1B6AE5DBBFE73D1A24504BA140D961E8FE76A59F21A1A280996000896700B152A9F507D617B6A02AE6E7C255CAAF2AD3D28FC468EBB54A5464EECA3CA97EA8BB25F2E4B22D7BC54B77B55D9ADCAA7AAFC47959DAA6C57456696B6AAB24595CDAA7CACCA47AA7CA8CA46553E50BF67BDBA7D5FDDBEA76EDF51BF6FADBA7D4BDDAE51B7AB559163EBDE50E5755596ABF29A2AAFAAF28A7ACF5275BB44DDFAD46DA5BA2D57B78BD57B17A9DB85EAF62575FBA2BA9DA76E5FB007B9CFA9DB7FABDB6755794695A755F9972A4FA932439527A51190A50BB22E5ECEE625A78A960BDCAADB7FAADB87D5ED2439DE4FDD96AAD78C57B7E3D4ED5875FBA0BA1DA36EEF57B7F7AAD78C56B7F7A8DB91EA7684BA2D51CF0D53B743D5ED10757BA7BA1DA46EEF50B703D46D7F755BAC6E8BD46DA1BABD5DDDF656B7BDD4ED6DEAB6875C6457AE872467189383C165DDBEEC0993464B4E74A36E73D5ADA16E73D44DB6BACD52B7FF50B76DD56D1B75FB77757BB3BA6DEDF57AFFA66E6F54B77F55B7376467675FAF7EE79FD5ED75EAB6A5BAFD93BAFDA3BAFDBDBABD468282BABD4ADD5E611F27F75B757BA9BAFD8DFA9D17ABDB5FABDB8BD4ED05EAF67C757B9EFADDBF54B7BF50B7E7646565FD5CDDFE4CDD9E959B9B7B86BAFD695E5EDEAF264F9E6CD6D4D41C3263B47FFFFECF1F79E411F3BEF5F711EA522858469AA10C2D72BCACDA06FE3F3951587E7EFE0FE44CD4B7DC72CBFF934B1DA9FB274A919D0E6A9B3959DDFF61FBF6ED4F51DBD5FFA8FB3F92A2DE73AAFAF93475FF74B51DFD58FDCE9FC83625DB9614F5F399B2ADC936A7EE9F6D6F7FE748916D529654DBDBE779EAFEAFEC6DF60229EAE70BED6DF9D7EA77FDAFBD7DFF468A7ACF25F676FF5B75FF32FBBB7085BA7FA514FB3B72B57ACFEFE47B23DF1F998D97EF92FD7DFA93FAF95AFB3B769DBAFF7FF2BDB3BF7BD7AB9FFF22DF47F95EAAFBADECEFE8DFA4A8D7DC24DF5DF90EABFBB7D8DFE73652D4CFB7DADFF37FC88CBEFDDDCF56F73D52EC36C150F7BD763B2127C6CA9762B71F1D64B996B429D2B6481B23A7C89762B739DDD4FDEED20E497BA4EEF79462B74FBDD5FD3E769B55A8EEF79576CC6ECB8AD5CFFDECF66D80BA3FD06EF30649513F0FB6DB426913EFB2DBC761765B395CDA4DBBFDBCDB6E4BA54D1D6597D1765B7B9FDDEE8E51F71F9062B7C763D5FD87EC367ABCBA3F41DA6D29D286AB32D16ECF1F56E51169E3ED765E2E683EC56EFBE58C8ED3ECFE60BA5D1EB7FB8927A5DF50F767DA7D88F425FF523FCFB2FB9667D4FDD9D2DF48BF63F73D73EC7E48FAA3E7EDBE699EFD9D996FF759D2772DB0FB31E9CF5EB6CB62BB9FABB0FB3CE9FBFCD20FDA7DA1F489CBA47FB4FBC92ABBCF7CCDEE3F57D87DA9F4A92BEDFE75B55DDEB4FBDDB75479DBEE8BDFB1CBBB761FFDBE2AEBEC7EFB035536D865A3DDAF57DB7DBCF4F59BEC7E7FB33D0690B1C027F6B840C6073BECB2D31E37ECB2C7103296D8638F2BF6DA638CCF64BC618F3BBE9031885D643CF2B53D369131CA017BBC72D02E87EC71CC77ECD042338EA9A59DC8A726E076479494941C29C7BCC9F19637DE78E3F76420A807817A00A8077E7AD0A7077B7AA0A70778CEC19D1ED4E9019D1EC8E9419C1EBCE9819B1EB4E9C19A1EA8E9019A1E9CE941991E90E981981E84E9C1971E78E941971E6CE98156C800ABB33DB0B206557A40A507527A10A5074F7AE0A4074C7AB0A407497A80A407477A50A407447A20A407417AF0A3073E7AC0A3073B21831C3DC0D1031B6B50A307337A20A307317AF0A2072E7AC0A2072B8E418A1EA0E881891E945883113D10D103103DF8700C3CF480C339D8D0838CEDC3870FDFB775EBD6EF620D96FBF6ED334B4B4BADC142AA86CBFB36DF270319B3F38CCEE643BB1E327F78D60FCDF3AE3DCFBCD27BA555BA3DD3CD7A3EF47DF2D82D77DF12F1E7140F96D1961A7B50F8953D48FC42EFB0B207929F39765CED71ECBCDA6517BD136B876347D627F6B6E5DCA1B5C9B153ABDA2E7AE7D606C70EAE75F6B6AB7774BDEBD8D9F5B6BD9DEB9D5E6F3A767CAD74ECFC7ADDFE8EE89D60557A4798FD5D5AA67788D9DF316BA7981D142AF4CE31F93EEA1D64F677F425BDA3CCFEEE5A3BCBECEFF35CBDD3CCFE9E5B3BCEEC40A3779E3D6DB709D64E34BB9D98610F78F4CEB4C71D3BD4A6E99D6A76B89AE2D8B9F688DEC16687B2897A479BB4597A679BB463765B66ED74B3DB376BC79BDDE6DDAB77C0D96DA1B513CE6E1F47E89D71D26EEA1D72765B6AED949362B7B1D6CE39BBDDB576D049B1DB636B479DDD465B3BEBA4DDB6DB6E6BA79DDD9E5B3BEEA48DB7C3B3B503CF6EFB033BF1A45F90A277E6D9FD85B543CFEE430CBD63CFEE5BAC9D7B767FF30FBD93CFEE87AC1D7D76DF64EDEC93227D96DEE967F763D68E3F29D2BFE91D80769F67ED04947ED0EE0BAD9D8176FF68ED10943E538ADE3168F7A5D6CE41BB7FFDADDE4968F7BBD68E42BB2FFEB5DE6168F7D1D64E43BBDFB6761C4AB1FBF3C00E44E9EBF54E44293206D03B13655C20E303D9212445C60B326E909D45328690B184EC48927185141963C84E26196FC8B8437640C918448A8C4764E7948C4D648CA2EE1F2BE31519B74891437A641CD382155868DE19CB99D246501340924907D0AFCC7F7EDF327F1B5586F72DF599AABC1BE9F545E32ACE91D7C87B02BF63BA3F70D6D0BE65BEDFDBBF635A437F5B5E5738C1F75043AF2B9CE86F1DEEF19E93FCC75BBFA3AC328B4F32762A271E5D5555B5E8BFFFFDEFB7D184CAD75E7B6D5BE7CE9DBF1C366C9879EFBA7B533A6C0D583AC03CF1F413CD71BBC75901F1AE557759B75963B302A151BFF6ACDF9E15089BB98FE49A3F38E507E6C057065A3F5FD4EAA2C073F23B527D29AC3D005E1E2958B2D5038D57545A7983EA7766596582EF2929761F6A95A0C76AFBC3FFD4E9FB4A7DCBF5EBC215FDDE86FAC8C2F1BEABE4757D4A97FD884F06A865AF66F052134082158EAF38AD4F69C585B74FF05DA63AA3B685657E8F744A45A5BE31CE8068EF710CB05FFFBCEEEC8A26F8BAA9DBAF5579BDA8D47FBDDD013E553CC1F7B7A2872A7F5A52E23F3A9A60D97782AFB8E1D7F9736B3BCE0527149556FC51FDED7FD7FE3B2A0DBBD37EDED181BFCEA71C9B59B366B5ABAEAEFE3A52A0DCBE7DFB7F478E1CB94B6629644F76BA9DBC474261FBA9EDADDB5FFEE9976651795150B01CF6F630B3EBACAE8160F9F32B7F6E767FB6BBD9615A87C0FB3B3DD129AD4EDE23B32EF68C1DC1126862CEBEB24E9F56CF8ED99060797B547DA4EADF9C8F4980EC5BE65B2A2538BCFA17D8F7BF54E5333E25B83C58CA2A32839A0012A86892FF5CD5E12C9212668FEA8B819F2754E6EBB0793868FA8F2E9AE06F253396D6EF52F7E535DD26CFFFBE7ADDB5A1B39875FE76ED6B16E93DBC81805AEAAB72FCDDFEEAB16FEA74E2EA6F174FAC38AFF6FEEC6325BC3A83A50AC79DD5FDBED67D159CF9A463274B9DE6CE9DFB5A4D4DCD411D28BFF9E69BEF9E7FFEF9AD1D3B76EC204B9CF46B533958DEB3E11E6B86F198E38EB102A40E8639A53981E028B396CE6029AF6F7547AB40003DF2A823CDD6435B9BBDE7F7368B2B8BADC7257CA6E3E546EC19CC5708964082FB577B076BF1848AEBA20A96E32B2E96D538A1B394F64E5B53FABCDA9DB89533EAF689B53B7E6B03AAFF0EEBEFDBAB89A46F76BE067023390C4196C75313400249400B3793581B2C2B1BDCB32321D27AED38FF2556075656D9431EB796D2AA9F655633D27B0B4B7D3B0A4B2BDFACF3771D339676D8FCBAC1FF0F7B6F7160296C84A5B288DDDD77DF5D505555656EDCB871D7942953C21E9F90EA33967AF96B97A7BA0482A5CC4886CE62EAFB23DE1B61CD4ECA633FBEF0C756D094C7EFDF7ABFF5D86FDBFE366DAF63E9E864650673395B389088BE75F6B1F60EDAA896A4EA6029EF6BE875CE194B09AD2AC0CE9662F797FB8B4A7D7B03CB66CB2A670596E4D6BE772B9F0EDCC83ECEDD434D0049A03A9B4F55792574C6D2DA5B5A56D9517E76767812E46489A9F5BCA31393A5B4B5B38EB57B6AADD95039BEA4B4B2B73D1B796DE06FD6CE821E52B7E323CE585A4B78FCF3F47B6449ADFD6FEAA16723F512A0704B618BCA7C3DAD9F2756FC8E4F397ECED9C9740C96A16152EE174C2FB002A31C7739FAA3D141C1F2ECCBCF367BCCE9613D26339EA79E7BAAB514367F727EE0444052E47DE91A2C0124B44FB5660E03338D6595EFABFB0FD71B18559FE8088FFEE0FEB8B26FB860A977AAAAC7B6E9BE3374C65376E2AA3E79249F0A5C1E2CE5448AD9D40490A44E5085B3EA903D9B2F068263A97F41E87B824ED0E3E8148515F8A4439DB4F44CDD4986F99B9B5579AB6EE75A67C632E8D8106B4FB0FD6F94632C6B7F56FF76158C9D274B501DF15AD98BCBA79B78E9122C87AC1C623EB0E381C032583D03298FEB6039F28391D6996325745ED6EE32EBF694B34F31FFD4ED4FD67D99F594D7DEFED2ED693D63092031023B636B77C04ADFD8DFEACFEC434AC21D225237581E5E31E43CFE32DC3196E1FAE090E73E939DAF7C327033FBECFC9CD811485AB074063A47C7661DBF58EAFB32F43DB26C47661303338DD62C62ED718D72863CB9ED35B1E294A60E968EC74D99C13CFCEF0D0EBFF66BFEC3A74BB0741E5779DA79A7054ED62327E0915B59FADA22E47223B27CB69FAF9F75ABCF022BB772BCA53E890FC11240701F56BB6A46767A3A025FFF40E8B4CF45202B75620A9665FECE0D06CBD2CAB5CE33D006CD7896F926F3E9C0CDECEBA6B7A326806405CB883396FE91FAA43CCEF7C88900FA8E5BF6E3D08ECF19FCACD7440896F65EDD6FEA5B0A2BB3A5A1C761460E96F2FF50DBA9EA633399B124583A83A52C65955B999194DBBBD7DD6DF67AA1579D632C9DEF19B47C901528E5DA97E972D65B8225D02CFDE897AACF5A152630F60FE9FB7A84CE5C86590ABB3EE81223F679030896407CE4DAC2720D5B6A02485EB0FC7D482765ED319599C94827E1B1CF38D7A1760F6DC585FA843DCE33C8D63363B9BFCE2C63C88CA55C4A24DCC97B74672927EBD167A0959312102C099691CAD89D63CDA16F0EB596BD3A1FD7D7A7946B5786BB8EA584D11B07DF685DCBF2AF03FF6A3DAE03AA1C6F49B004DC4D9FA847769686ED5B4382A5EE57C3BC2E102CE5B25FCEE7F4995E23054B39AF813E49908450D9511C784ECE0E6BEF0406DC2A2727678E0A976DA90920D1A17262C5EF5427F69C55225D6EA4F6E769211DE315FAA43EB581D2FFEBDAE5B1F67258FB3224F67B2BA30EB8D15CC7F2F0BF69BF3E13AC5CCB32CC6BB6F109132CE3398B6C3AFFFB0996408AF4AF8E50D870DF17FE18C93AAF0B0996B273573FA72F45E23C3CC4EE23DBD69EC19D8009D706CBE754B9959A0012ACF69223C1D7B78A74B911BD1CF6B6875F39F9F05959F512D6CA1B0E77A4872FF41C69C6B231C152CF92AABF3D3CB413951306D9C7787EC98C25C1D28D856009A44EB0547DDAE0288365FF70CFD92B73565933918E7E4FF7777A59ADF39014E9A39DD7B6944029EF93FB7C2A70238FC733D7308C36D4049020766755157A8AF2C3B381FE79218F3DA167269D41547ED6CB52EDF7E5D60DA9BE89D176C27AEF6B7D64C94F6199EF96A0F7D94B6F45E178DF55CEEB6A826049B004D03CC132BA99C8704B6935E77531EBBCCFDE81AA2FEB6597CFFA96564EB5AE6369F7CFF23B2488F2A9C08D7272725E50E5166A0248A0862EC60C102C09960000A4338FC733CF308C9BA9090020585208960000C425272767BE0A97ADA9090020585208960000C41B2C5F54E5266A02000896148225000071F1783C2F79BDDEBF51130040B0A4102C0100884B4E4ECE02152E6FA4260080604921580200106FB05C6818462B6A02000896148225000071F1783C8BBC5EEF5FA9090020585208960000C4252727E765152E6FA0260080604921580200106FB05C6C18C65FA8090020585208960000C44585CAF2ECECECEBA9090020585208960000C4252727A75285CBFFA32600806049215802001017152A7DD9D9D9D751130040B0A4102C0100884B4E4E8E5F9596D40400102C29044B0000E20D964B0CC3B8969A0000822585600900405C54A85C9A9D9DFD276A02000896148225000071C9C9C959A6CA1FA9090020585208960000C41B2C5F310CE30FD40400102C29044B0000E20D96AF666767FF9E9A000082258560090040BCC1B24A956BA8090020585208960000C41B2C5F330CE377D40400102C29044B0000E20D96CB3D1ECFD5D40400102C29044B0000E20D962B54B98A9A000082258560090040BCC1F20D8FC77305350100296E71C562025DEA941A152C0FB25502001008962B55B99C9A008014B760E9821D53374F25D4A54079ECC3C79E56C1721D5B2500008160B9CAEBF55E464D00408A2BF795FFFD65FFCB9FA970F935E1AEF9662AFFFFF6EE36468ABB8E03782488A8B5A156A4B5A9ADB5D6A6565A35A6698CF1348D29A610129DECC371B889C9455B28B7D437C5946C62782349E9EE1E8D2410638C8AC4E4FA82B424ECED5A1A20C6A78AD807A56839D0A3553815E15A03EBCCEECEB2777060266CCD6D3E9FE49F9DDDDB79E037243FBEFC67E61AA1B2B2FBD54AA5F2157F2B01A01D2C7F954AA53EA91200B34018661ED8BD7BF72FA2CB30A37BFC66E3181919A9CFD6636FD5FD45A112002E0896BF0EC727540280AE3B7EFCF8974BA5523D6C3C37AB0600F48E542AF59B6C367BB74A00D055F57A7DFE8913274E86EA8383833B5504007A473A9D7E3E0C9777A904005D353636F6837ACBBE7DFB8E653299E5AA02003D132C7F1BF6F6C52A0140D79C3A75EAAEB367CF9EAB77D8B061C3582E975BA03A0030FBA552A903FDFDFD1F570900BA667C7CFC707D9A898989F1B0011555070066BF743AFDBB305CDEA9120074C59123471EABCF60646464DC2F5306809E0896073399CCC75402802B2ECC8ED74D4E4EBE3953B03C77EEDC1BF97CFE405F5FDF5CD50280D92B0C95BF0F82E00E9500E08A3B7AF4E8FEFA651C3E7C782C6C4643AA0500B3573A9D7E31ECE7B7AB040057DCDEBD7B2F972BEB67CE9CF959D88CEAB95C6EBE8A01C0EC1486CA978220F8A84A0070C5AD5FBFFEA14B5D0A1BE5CA75EBD6FDC48C2500CC6EE974FAE5542A759B4A00D015DBB76F7F79A65479E8D0A1EF868D68BF7B2C0160D607CB3F64B3D98FA804005D1104C1AD61803C739107F71CECEFEF3FE8A9B000D013C1F28F51CF570900BA66E3C68DE530489EED0C965BB76EDD964AA536A90E00F444B03C14F6F50FAB04005D135DEABA6BD7AED7E250393131F1A3E87F3673B9DC02D501809E0896AF64B3D95B540280AE5AB56AD5174E9E3C39198EFAE0E0602593C92C571500E89960793808820FA904005DB765CB96674AA5523D954A8DA80600F454B0FC53386E560900BA2EBAF435FA9D956EEE07809E0B967FCE66B337A904006F55E3A9AB0200F45C7F7F3508820FAA040082250090B4BF1F09C78D2A018060090024EDEF478320B8412500102C0180A4FDFD58383EA0120008960040D2FEFE97152B565CAF120008960040D2FEFED72008AE530900044B0020697F1FCF64328B540200C1120048DADF8F0F0C0CBC5F2500102C0180A4FDFDB5200816AA040082250090B4BFBF9EC964DEA7120008960040D2FEFEB7952B575EAB120008960040D2FEFEF72008DEAB120008960040D2FE7E229BCD5EA312000896004022A954EA642E975BA0120008960040D2FEFE8FFEFEFEAB550200C11200482493C9FC73D9B265EF510900044B0020697FFF57100457A9040082250090B4BF9F1A181878B74A002058020049FBFBBF972E5DFA2E950040B0040092F6F7D34110BC532500102C0180A4FDFD4C2E979BAF120008960040D2FE3EB964C99277A8040082250090B4BFBF1104C13C950040B0040092F6F737070707DFAE120008960040D2FEFE9FBEBEBEB92A018060090024EDEF670B85C21C950040B0040092F6F773E1CBDB540200C11200D0DF01981D8DC7300CC3308CDE1BFE95030000000000C07985426DEE50B9B63C1E6B8AD51F36964BD5C9A1F2E80BFFCB36D63C51591C6DA7B9BDC29CCE87B384DBA9E74BB56F47CB8F946BB75FB0EE70ED818B6DF3C1CDB5ABA275D79447834BED3BFE4EF8FA7A389E6C1D7BFDE162F553E1EBCED6FBB1700C3BDB0000005D0B9785399D21AE15C67647A12F0A9AF18843DBDA62E5F3D382E5A2E8F3706C8BC35E1C4A1BCBC3957BD76E7EF6C6E6E7D5C7A606C35A7FF4F9EAD2D357E74B95CFE68BD59F36F7339A696DF3A978BFE1F8F9C58265B8CDCF34026CB13AD80E9B4F54EF89C269FB3BA56ACD99060000E8A256F87ABE15E24EE74BB51D71E0CC6FAADCD20C90D57B9A3390D5CF4D5F3FFCFE7D0F0D57AE5D5DDAB3B050D831AF19EE2A8B5B3396F735835FEDFE0B436D6DEEDAE1CA6DCDE51DF3D616AB5FEA0C966BCAB5AF85CB43ADED2DEA5C7775A972473394EE59D8F879A9FA703B58B6963BFE6C3B9D650000802E07CB30C4A51ACBCD7079AC1DCA36D5EE6E04CBD2E8AAE812D9F3A1B03027BFB976EBD48039FAC530D4ED0FBFF7FD8E99C697E2E5301C7EFA52C751F85E6D7EF4DABE1476864B653B02E3A98EE5B1F63E872BF70E95ABCF761CC33667190000E0FF142CF3C5DA57DBDF29561F9FB25E7174209E358C66365BF7365E1008E359CC6826B211401F1FBD21DA4FBE3CFAF57836B21904E33038F552D87CB9FA601C18A3F5DB97D6761C673C4BB9A65C5D1607DFC6BE8AB5FBA7CF76020000D0856039FD52D8E8F36F3CF9DC35EDE0D7113EA7AF1B5F8E3AB469CFF59DB394F1BD99AD07ECB4673FDB61B335A318DD63D97C5F7D257CFF5CE70385C29079203E9EA9C73B9A892E956DBF2F561FED7870CF531DF7674EE44BD5EF38CB0000005D0E96179BB1EC089D13D1ECE44CEBC7C1320EA2D14C64E7CFDBF75D4E7BCA6B1C2CA319CCF3FBAA3D7D91EF1C8FDF3F323C7A53637FADD0D83EFE69F755C6F76E364367ED5BCE320000C05B1B2C1B612C7A204FF4B4D5F8E9AB975A3F0C9EDF6C2F97475FB8DC8CE5CCC1325A7FCAAF3E393D7DC6B263DD89F3FBAF3E9A2F557F19EEEBC7D1BD9CD1A5B951B86CCE62D6EE74967BDF7F01C2B8EC92D1A67BA30000000049454E44AE426082,
+ 1);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302558', 1, 'var-baseTask', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302560', 1, 'hist.var-baseTask', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302561', 1, 'hist.detail.var-baseTask', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000331313170707070707400352F6C656176652F726561644F6E6C794C656176652F343332303730666331663532633063633137376164393031613561616338643174002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000037371007E000C77080000017FE5DADC00787400203433323037306663316635326330636331373761643930316135616163386431737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302573', 2, 'var-leaveOpinionList', NULL,
+ 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302575', 2, 'hist.var-leaveOpinionList', NULL,
+ 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302576', 1, 'hist.detail.var-leaveOpinionList', NULL,
+ 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B7874002030623736323566656461613035653835663238323438366531633963393162397074000331313174000633303235363678,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302588', 1, 'hist.detail.var-leaveOpinionList', NULL,
+ 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000027704000000027372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDEED97B787400203062373632356665646161303565383566323832343836653163396339316239707400033131317400063330323536367371007E0002017371007E000677080000017FDDEFA3BB7874002064383138616336613836636631613634643231383462663036393964363761387074000331313174000633303235383478,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302598', 2, 'source', NULL,
+ 0x7B227265736F757263654964223A22333032353937222C2270726F70657274696573223A7B2270726F636573735F6964223A2270726F63657373222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C2270726F636573735F617574686F72223A22222C2270726F636573735F76657273696F6E223A22222C2270726F636573735F6E616D657370616365223A22687474703A2F2F6C656E6F73702E636E222C22657865637574696F6E6C697374656E657273223A22222C226576656E746C697374656E657273223A22222C227369676E616C646566696E6974696F6E73223A22222C226D657373616765646566696E6974696F6E73223A22227D2C227374656E63696C223A7B226964223A2242504D4E4469616772616D227D2C226368696C64536861706573223A5B7B227265736F757263654964223A227369642D33304636324437352D353136352D344532322D383433412D394441393335424135303331222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22222C22696E69746961746F72223A22222C22666F726D6B6579646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22227D2C227374656E63696C223A7B226964223A2253746172744E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3137352E352C2279223A3134317D2C2275707065724C656674223A7B2278223A3134352E352C2279223A3131317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C226173796E6368726F6E6F7573646566696E6974696F6E223A2266616C7365222C226578636C7573697665646566696E6974696F6E223A2266616C7365222C22657865637574696F6E6C697374656E657273223A22222C226D756C7469696E7374616E63655F74797065223A224E6F6E65222C226D756C7469696E7374616E63655F63617264696E616C697479223A22222C226D756C7469696E7374616E63655F636F6C6C656374696F6E223A22222C226D756C7469696E7374616E63655F7661726961626C65223A22222C226D756C7469696E7374616E63655F636F6E646974696F6E223A22222C226973666F72636F6D70656E736174696F6E223A2266616C7365222C22757365727461736B61737369676E6D656E74223A22222C22666F726D6B6579646566696E6974696F6E223A22222C2264756564617465646566696E6974696F6E223A22222C227072696F72697479646566696E6974696F6E223A22222C22666F726D70726F70657274696573223A22222C227461736B6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22557365725461736B227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3338352C2279223A3135357D2C2275707065724C656674223A7B2278223A3238352C2279223A37357D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D32333931423338312D323736372D344134332D383237442D374333353037394145303745222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3238342E393233383535393435353934382C2279223A3132352E303334373433383734303737367D2C2275707065724C656674223A7B2278223A3137352E38313234373231373934303531382C2279223A3131382E313536363632333735393232347D7D2C22646F636B657273223A5B7B2278223A31352C2279223A31357D2C7B2278223A35302C2279223A34307D5D2C22746172676574223A7B227265736F757263654964223A227369642D39363143373036422D413744312D343941312D394332382D414135433233433430364243227D7D2C7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22657865637574696F6E6C697374656E657273223A22227D2C227374656E63696C223A7B226964223A22456E644E6F6E654576656E74227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3539382C2279223A3132397D2C2275707065724C656674223A7B2278223A3537302C2279223A3130317D7D2C22646F636B657273223A5B5D7D2C7B227265736F757263654964223A227369642D36463636323645392D383144342D343845392D394345332D433632464434433932454230222C2270726F70657274696573223A7B226F766572726964656964223A22222C226E616D65223A22222C22646F63756D656E746174696F6E223A22222C22636F6E646974696F6E73657175656E6365666C6F77223A22222C22657865637574696F6E6C697374656E657273223A22222C2264656661756C74666C6F77223A2266616C7365227D2C227374656E63696C223A7B226964223A2253657175656E6365466C6F77227D2C226368696C64536861706573223A5B5D2C226F7574676F696E67223A5B7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A3536392E333832383132352C2279223A3131357D2C2275707065724C656674223A7B2278223A3338352E36303534363837352C2279223A3131357D7D2C22646F636B657273223A5B7B2278223A35302C2279223A34307D2C7B2278223A31342C2279223A31347D5D2C22746172676574223A7B227265736F757263654964223A227369642D35383442353134362D373630372D343239362D393143342D383746384646323636333436227D7D5D2C22626F756E6473223A7B226C6F7765725269676874223A7B2278223A313230302C2279223A313035307D2C2275707065724C656674223A7B2278223A302C2279223A307D7D2C227374656E63696C736574223A7B2275726C223A227374656E63696C736574732F62706D6E322E302F62706D6E322E302E6A736F6E222C226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C227373657874656E73696F6E73223A5B5D7D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302601', 1, 'var-baseTask', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302603', 1, 'hist.var-baseTask', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302604', 1, 'hist.detail.var-baseTask', NULL,
+ 0xACED000573720018636F6D2E6C656E2E656E746974792E557365724C65617665B811E59153A6CD0702000C4C0009626567696E54696D657400104C6A6176612F7574696C2F446174653B4C000863726561746542797400124C6A6176612F6C616E672F537472696E673B4C000A6372656174654461746571007E00014C0004646179737400134C6A6176612F6C616E672F496E74656765723B4C0007656E6454696D6571007E00014C0002696471007E00024C000B6F70696E696F6E4C6973747400104C6A6176612F7574696C2F4C6973743B4C001170726F63657373496E7374616E6365496471007E00024C000673746174757371007E00024C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E000178720017636F6D2E6C656E2E656E746974792E426173655461736BA48CBC2F51BC802602000D4C0008637265617465427971007E00024C000A6372656174654461746571007E00014C0002696471007E00024C001170726F63657373496E7374616E6365496471007E00024C0006726561736F6E71007E00024C000673746174757371007E00024C000B7375626D697474696D657371007E00034C00087461736B4E616D6571007E00024C0008757064617465427971007E00024C000A7570646174654461746571007E00014C000775726C7061746871007E00024C000675736572496471007E00024C0008757365724E616D6571007E000278707070707400043230313874000332323270707070707400352F6C656176652F726561644F6E6C794C656176652F376538303465376562376162386633353461663133316362626336326336383374002035393436613938356637333363353766316162373136383966376236616565617400087A68616E6773616E7372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDB8E2400787070737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000057371007E000C77080000017FF0279400787400203765383034653765623761623866333534616631333163626263363263363833737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000000770400000000787070707070,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302616', 1, 'var-leaveOpinionList', NULL,
+ 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302618', 1, 'hist.var-leaveOpinionList', NULL,
+ 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302619', 1, 'hist.detail.var-leaveOpinionList', NULL,
+ 0xACED0005737200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A657870000000017704000000017372001B636F6D2E6C656E2E656E746974792E4C656176654F70696E696F6E1956BF801DDE60870200065A0004666C61674C000A63726561746554696D657400104C6A6176612F7574696C2F446174653B4C00046F7049647400124C6A6176612F6C616E672F537472696E673B4C00066F704E616D6571007E00044C00076F70696E696F6E71007E00044C00067461736B496471007E00047870017372000E6A6176612E7574696C2E44617465686A81014B597419030000787077080000017FDDFADF437874002030623736323566656461613035653835663238323438366531633963393162397074000333333374000633303236303978,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302630', 1, 'source', NULL,
+ 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302632', 1, 'source', NULL,
+ 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302633', 1, 'source-extra', NULL,
+ 0x89504E470D0A1A0A0000000D4948445200000288000000CD08060000003B43814C000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C0000000467414D410000B18E7CFB5193000000017352474200AECE1CE900000006624B474400FF00FF00FFA0BDA793000000097048597300000EC400000EC401952B0E1B000011F04944415478DAEDDD0B7454F59D07F09BC924194208E115E3A22B56A4BADAB55A1F548F055F80407B5C2B25984A715DDB7A56DAD5FA586B7DD5F6D45D75ABDBDD565B151FA841E8FAA8D64715A85B05179422281110C16208C86308904C1E33D97B69E8491110C883103E9F73AE776632B933FE90BFDFFBFFFFEFFF060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005D44961200FBC203CB1EF87A8F648F9F146C2EE81FAF8B6B8B3A486376637D2637F34AF6E6ECEF8C183162A98A000222D0293C52F1C87D7DAAFA5C92EC970C36166D0CEABAD5294A07C94DE50685C9C2A0EFAABED5F1A678D9D9679FFDACAA00DBCB5602A023453D87C51F15DFBAF2332B83649F6490CE492B4A074AC7D3414D414DB0B9E7E6BCA2B545C3CA2E2C7B72F2E4C9EB55066829A60440478A8695A39EC328A4B0EFA4F253C1BAE275D5B158EC56D500B6175702A02345730E971FB47CD70DD3E67850B8B430C85D9F1B64356505754575C1A6819B82869E0D0AD88636F4DDD0BFEFEABE435502D89E1E44A063CF4AEBE259BB9A731885C33E6FF609F23ECE0BB2D25941900982BCF5795B5FCBD998A3806DA83E519F17EE4A54021010814EAD60794110ABFF64D31485C5E867000888C0016657BD8451EF22000222708089E61CEECDCF001010010010100100101081034EBADBCE17CECEE46614084040040E345B0EDDB2C320988967822D03B628108080081C6852C5A920D537B5C3D76B8B6B15084040040EC886A9F1934D53769D5BC7030888C001275EF3E7BBA824D6243EF1B3BC7579419F397DB6BE070001113800E457E66F0D80D1FD97772637991BF49DDD37E8BEA2BB351101DAF3845D09807DDA08D5C483C28AC2AD3D84BB23BAE55EE1E2C220B13611540FAA0E1A7A342822401BD38308EC53518FE0EE86C396A29EC6BEFFD75701010444A0AB897A04F79A651101DA852166609F5A75CE2A4500E864F420020020200200202002002020020020200200D06AAE6206000E68AFBFFEFA3F2C5DBAF4E2952B579EB67AF5EA1E1B376ECC49A552415E5E5E537E7E7E436161E187E1FEC5850B17DE3575EAD4A50222004017D4D4D4149F356BD68DD3A74FBFE2BEFBEE2B38E18413822143860403060C088A8A8A823010066148CCDAB469536E6565E5C0F0BD030B0A0A2EBBE28A2B962493C96F4C9A34E90D011100A08BD8B061C37161287C69DEBC79C55FF9CA57826BAEB926C8C9C9F9C4FB1289C4D6AD5FBF7EC171C71D175C7AE9A5B11933667C76EAD4A97FB8FCF2CBA7AD5EBDFAD2F0F1E6AE58237310018003C61B6FBC31E68E3BEE989B9B9B5B7CFBEDB707C3870FDF6138DC91ECECECE0ECB3CF0EEEBEFBEEF8E0C183CFEBD1A3C7FCD2D2D201022200C07E1C0E1F79E491F230DCC5C78F1FBF7518796F44BD8A65656589281C868F5FEB8A2151400400BABC6858F999679E796CF8F0E1B1D1A347B7C931CF39E79CD8B871E37AE5E6E6BE3066CC9802011100603F115D90326DDAB497060D1A146FAB70B8CDB061C3BA9D79E6997DF3F2F2FE5D400400D84FCC9E3DFB96B7DF7EBBF8820B2E6897E38F1D3BB64F3C1EFFFA85175EF879011100A09D959696FE60DCB871E70D1D3A74AF575E79E59557BE336AD4A8BD9E73F869A239895FFBDAD7EAC3877708880000EDEFD6A6A6A6274B4A4A9263C78E9D1C86C5117B32DF2F5A047BD9B26505679E7966BB7EC961C386F5C9CACA3A31FC6E03BB42D1AD834887995CF5D2590B6A975D5E99FA78F087756BFAAC6FAC8ED766EAB2F2623941AF7861E380C4411B8A737ACF39A5E0EFFE73EC4167BEA86200B4D03D0C606561582CCBCECEAE2E2D2D7D3A7CFE585E5EDECC071F7C30B5B35F5ABC78F1A5D122D8BBBB94CDDE8A96C039EAA8A33E7CE79D77CE0BBA404FA28048BBFBD6E23BAF5ADB90BC7ED2EADF169D52787470E141E70483BA1D1A94E4F60EF26389A026930A36346C8A2FAEFD53BFD7AB178EFC65D53323CF7FE7FA4DBD730AEFBA6FD0B537AA2000DB290CB78BC2B078512A346EDCB827C2E74FAE5AB5EAD999336736B67C63F8DAE033CE38A343BED4B061C3BA870171888008BB7059C5ED7FBF2ABDFEF90FEB561D7CF521E3B2BED4F3B8203B2BFB13EF8B42627E5E22E89FD72F38A3E884E0FABF1D1FBCBA717E8FBB3E7AE286910BAEBA6C407EC9C89F1F71D51C15ED1CA2F940E1AE229D4EBFD055EF2000EC571261501C1FEEC7979494443D8B2F656565DDBFAD67B1B2B2B2E0B0C30EEB902F127E4E34C9F1D8AE5054019176F1CD25B7DFF4D6E6A537FE53C9E8D8C5079DBBC360B82B51988CB647D6BCD8F7BF2B9F9CFDED2577DC76CF91575DAFB29DC2AD5B1B8F783C3376ECD877C286F87FC2A7331389C4EC5D0DF3D0F9D4ADAB0BDE7AEBAD28F4DFAC1A741151CFE2056160BC20954A45FF6DBF5F5D5D9D535858D8211FDEB367CF9270D7254E9C0544DADC75CBEEF9C16B9B16DE74CFC0EF657DBEE0C8561DEBA2E2E1C1890547C5BEBDF48EEB2E5B7C678F5F0CFADE7754B873081BE058180E3F173E8CB69B9A8779DE085F7F36168BBD1C9EB52FDC7EA887CEE5E3D91F072BE7AD8C1EDEA41A745147D4D5D5B5DBD5CBDB8BAE660E758905B30544DAD49845375CF9874D0B6F79FCB337664543C66DE1E8FCC382C7C2E38D7BEF87FF3C76D1CD95538EBEF93695DE77CACBCBB3C2B3F2A61DB58D61388CE6DE0CC96432414949C986F07D33C2E7BFC9CECE7EF9D1471F5DA97A9D4BBFC1FD827E95FD8279F3E6DDA21A7462BB7302930EDB9FA6F0A4F5AF724DF87C593C1E1F50535313EB8890585B5BFB51B8EB2920420BA7CEFDE611CB6BAB6EFBE59157C7DA2A1C6E131DEFDE8157C5BEF1DE8F7F387CE195CFBF78EC7FCC57F14EAF57B89D1F6DE9743A1AEA49878F1755565606C11714A733C8EB93171C73C231C1B5D75E7BB36AD059856DC70E03629807A3118A4C180273C37D76B88F5E4B86FB97C3EDD1BCBCBC17A2692F975F7E79AABABA3AAF2302623299DC18EE1A044468A15B4EFEF317179F95D3DA61E59D897A1227F6FF6ACEA455CF3D1D3E1DA0E2ED63C2840989542A551236B42561239BD87E1FBEE5A0BD3C743411F5D879F3E60503BEEC8F0FD82BD162D4D1C966B716BD85D19CBF17C26D4AB76EDD5E0E4361B2E52F1416162E5BB162C5D1252525EDFEE5162C58B0283AF71210A1D997E64D2CCBC9CAFE4C3467B03D45C79FB2E6954386CC9F78D9EF8FFBD92F547EC7C68C1953929D9D9DD855C80BF745D1F3F071F4FC2FFB686277243A1BDFD17E0F4543D12D7FB1E2F8E38F3F6A43B0C11F12B037725B84C269E1F65C229178765717C885A1F1B773E7CE3DFA94534E69F72FF7FCF3CF47DD94D30544D8F637363BE7966B0EBD303B5AF4BABD7DFF6F2FCABE71F9FDD7850FBB7440DC55C88BC5623D5B3EDF3EE46D3BC6AE425EF87B3BFBE8A8A1AD6ADE52E1EF5485EFDDB6AF6B7EFDD36ADFD8DCBE441FB830FCBD7BC3467A7274667FC92597340988C01E9F6D3635453D8333C3F6EFA1E6256C92BBF37B15151577E5E4E4FC4B434343767B2E969D4EA7575455559D14EEBBC4C5940222AD367076D9213599DA43A365693AC2A9859F0B1A9B322547CD2A1D50F1C5F2E5FB63C06B3154BB7DB06BB9DF69C8DB16EE7611F2AA5A04BD1D86BCE6B93A7F793D6CD45253A74EADDA9D7FB7D2D2D21D05C4C6F038B1E8EAE6E6B6E5854C2673E79A356B66BA9A1968851BC2B66579229198B6374B694517C85D79E5958BA64F9F7EECF0E1ED37CA3569D2A437C3EF5918B6A34B0544081DDCAD68FC909E9F8FEFE95A87AD716EEF53729E5EFFDAC5413B2ECF3161C284A2542A55149EAD168541A7287CA96FB815B445C0DB4D3B0D79E1F7D9B85DE8DBE390D7866AC22D1A568987DF2B0A9DF785DFE3DEAED24802FB567979F98F5A7B8C6432F9F5279F7C72CEE9A79F9ED31E17ABD4D6D62E0E03E869615B3CBAABD45D40A4D57283F8974F2BFC5CAC233FF3E41E4707CF6F7863D4A705C49DF5E2853F3A24DCF29A876B0BB61BA68DD6B0EABB6D2E5EB4644B4B6D11F05A0CD56EFF7A2A3C4BAEDACF169C8E5ADBBF1A46F6B702E84C1E78E081F913274E7C74CA9429632FBEF8E26E6D7CF8E4F5D75FFF5AD8066E09C3EC5C01119AAD6FDCF499E80AE38E54940C63E9CCF5C7949696DE1E85B9F02F665174D145D0DCCBD762FF57A16EFB70D772B87607A249D06B9B8762A3D0B3367AAD0B06BCD6308C0CEC17162C5870694D4DCDC9C5C5C5478C1A35AAADAE346EBCF3CE3B1FAAACAC8CD67F3DBD2BD54B40A4D55299FAA27E39451DFA9915731606FD66A5A31EBFAB7614FC5A58BB2DE8B508777FE9C50BF7D1E2CDA9743A5D153EDEBC0F8769F7375787757ACA3032B0BF884E62FBF7EF3FFC89279E9813B6FF3D468F1EDDBD95874C46E170EEDCB96785FFEFF87257BB37BD8048AB353435E6E6C7121DFA99434EFB5270CFAAA783BF9915DC103E5DB92DF46D0B8389442269A8B3FD949797DFA10AC0FE26BA60A5ACACECA45FFFFAD7CF5556561E3C7EFCF87ECDB7C7DB23D19CC3685839EA398CC261D8262EEF6AB5121069FD7F4459F1BA9A4C2AAF2343625149EF60F5A9B18657BFFBD88FFC0900B0272171E8D0A15FA8AFAFFFB759B366FDE3F9E79FDF3072E4C87ED9D99F7EA165B494CDC30F3F3CE777BFFBDDE9D19CC36858B9ABF51C0A88B499BCAC9C0D1F37244B0ECB2BE9B0CFDCD0B029C8C98A57AB3E007BAA79CEF4F7C68E1D3BE9B1C71EBBBDBCBC7CC8A04183169F75D65985871F7E786EAF5EBD0ECACFCF8FD7D6D6AE4E2693EBDE7DF7DD779E7DF6D982AAAAAAE3A3F9EE61303C6FCA9429B3BB728D04445AAD29C8CC7DB766F9B96140ECB0756E16D7FE29FC67D65BAA0FC0DE0A43DEC270776E5959D921151515A3172D5A343C0C80C7067F5E8122BAD0319AA7581B6E3DC2ED956811EC0365EEB58048AB6D694ABDF84AF2CD53CFED35B877477DE6AB1BE7276B33752FA93E00AD150D3B87BB7B9A37423125A0B5B2D2F1A76624E7C5D24DE90EFBCCE7D6CFCAE4A4B7DE8713001010E96C960E7E74654DBAEE8FD3936F75C89CC0FFDD387FF39674ED92CE7C9B3D00101039E03564D277DFB0FCFE9A8EE845FCFEF25F6EAC6F4AFF97AA0380804827F6FE298F3FB5BEB1FABDBB2BA7AD68CFCFB967D5532B3FAEDFB0E2902DABCA551D0004443AB9EC74D3845FADFA4DF7B736BDD72E6B42BD53B3BCE6EE8FA6259A62C12533CF705B37001010E9F4A239810D41E3C46F2CFEC99695756BEADAF2D8D1F1C655DCBCB9B12973C5E2131FAF506D001010D94FBC7FD294F2BA4CDDBF8E5878F586B99B2AD6B5C531176EF9605D74BCDA74EAA74B4F7E7CB22A038080C87E66C9C9E50FA69AEAAEB8B0E287C18F3F7CF88FADB970E5A71F4D79FBABEFFE205D9FA9BF6EE9C9536E535D00687F16CAA65D443D8947CD2A9D3D69F50BBF9AF2F1F4F77F72F8B752A37A7FF198DDFDFD979373165FF3C1BD0D9B1BB6546765678D5D7262B96165001010D9DF35AF5378CEC039A5177CF7FD9F7DEBEA0F7EDEEBB8EE03579CDF6748E2841E47161F9CDBA7283F96E85E93496D595B9FDCF076CD07EB9F5AFB6AF5ECEA770FABCFD4AF09B282FBFBD7544D76410A00088874314B4F2A8FEE78326DE0ECB243E66E7EEF82B9D515A7356505BDB28260DBBD9BB7ED3F6C0A82DF47774859D2BC08F612E5030001912E1C14076FBDD7E55DCD1B00D049B94805000001110000011100000111000001110000011100000111000001118076905202404004F6B9744E3A95579BA7109D40A226313FDC55A904202002FB54434EC30B3D933D332AB1EF1DFCA7832B9A9A9A66AA04202002FB54417DC1C4DE55BD3775DBD24D31F6A1FCEAFC5F75DBD4EDAC4C2673836A00DBCB5602A0233DF4D043D513C64F985BB4AE6864BC31BEA63EB7BE5B3A27EDBEF01D2395A849BCD9FF83FE2F1557168F88C562970D1B366CB6B200DBCB5202605F983163C621E974FAD6F0E1D0A6A6A6012AD261AAA261E5A8E770C488114B9503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E854FE1F5EFD99B91416FC3A0000000049454E44AE426082,
+ NULL);
+INSERT INTO `act_ge_bytearray`
+VALUES ('302635', 1, 'source', NULL,
+ 0x7B227265736F757263654964223A2263616E766173222C227374656E63696C736574223A7B226E616D657370616365223A22687474703A2F2F6C656E6F73702E636E23227D2C226964223A2263616E766173227D,
+ NULL);
-- ----------------------------
-- Table structure for act_ge_property
-- ----------------------------
DROP TABLE IF EXISTS `act_ge_property`;
-CREATE TABLE `act_ge_property` (
- `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `VALUE_` varchar(300) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- PRIMARY KEY (`NAME_`) USING BTREE
+CREATE TABLE `act_ge_property`
+(
+ `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `VALUE_` varchar(300) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ PRIMARY KEY (`NAME_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_ge_property
-- ----------------------------
-INSERT INTO `act_ge_property` VALUES ('next.dbid', '305001', 123);
-INSERT INTO `act_ge_property` VALUES ('schema.history', 'create(5.22.0.0)', 1);
-INSERT INTO `act_ge_property` VALUES ('schema.version', '5.22.0.0', 1);
+INSERT INTO `act_ge_property`
+VALUES ('next.dbid', '305001', 123);
+INSERT INTO `act_ge_property`
+VALUES ('schema.history', 'create(5.22.0.0)', 1);
+INSERT INTO `act_ge_property`
+VALUES ('schema.version', '5.22.0.0', 1);
-- ----------------------------
-- Table structure for act_hi_actinst
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_actinst`;
-CREATE TABLE `act_hi_actinst` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `START_TIME_` datetime(3) NOT NULL,
- `END_TIME_` datetime(3) NULL DEFAULT NULL,
- `DURATION_` bigint(20) NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_ACT_INST_START`(`START_TIME_`) USING BTREE,
- INDEX `ACT_IDX_HI_ACT_INST_END`(`END_TIME_`) USING BTREE,
- INDEX `ACT_IDX_HI_ACT_INST_PROCINST`(`PROC_INST_ID_`, `ACT_ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_ACT_INST_EXEC`(`EXECUTION_ID_`, `ACT_ID_`) USING BTREE
+CREATE TABLE `act_hi_actinst`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `START_TIME_` datetime(3) NOT NULL,
+ `END_TIME_` datetime(3) NULL DEFAULT NULL,
+ `DURATION_` bigint(20) NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_ACT_INST_START`(`START_TIME_`) USING BTREE,
+ INDEX `ACT_IDX_HI_ACT_INST_END`(`END_TIME_`) USING BTREE,
+ INDEX `ACT_IDX_HI_ACT_INST_PROCINST`(`PROC_INST_ID_`, `ACT_ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_ACT_INST_EXEC`(`EXECUTION_ID_`, `ACT_ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_hi_actinst
-- ----------------------------
-INSERT INTO `act_hi_actinst` VALUES ('247553', 'process_leave:1:247536', '247552', '247552', 'start', NULL, NULL, 'start', 'startEvent', NULL, '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000', 1, '');
-INSERT INTO `act_hi_actinst` VALUES ('247559', 'process_leave:1:247536', '247552', '247552', 'user1', '247560', NULL, '经理审批', 'userTask', NULL, '2018-06-14 23:44:03.000', NULL, NULL, '');
-INSERT INTO `act_hi_actinst` VALUES ('302557', 'process_leave:1:302555', '302556', '302556', 'start', NULL, NULL, 'start', 'startEvent', NULL, '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000', 10, '');
-INSERT INTO `act_hi_actinst` VALUES ('302565', 'process_leave:1:302555', '302556', '302556', 'user1', '302566', NULL, '经理审批', 'userTask', '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', '2022-03-31 11:04:52.000', 335536, '');
-INSERT INTO `act_hi_actinst` VALUES ('302579', 'process_leave:1:302555', '302556', '302556', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 43, '');
-INSERT INTO `act_hi_actinst` VALUES ('302581', 'process_leave:1:302555', '302556', '302580', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52313, '');
-INSERT INTO `act_hi_actinst` VALUES ('302582', 'process_leave:1:302555', '302556', '302580', 'sstart', NULL, NULL, NULL, 'startEvent', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 31, '');
-INSERT INTO `act_hi_actinst` VALUES ('302583', 'process_leave:1:302555', '302556', '302580', 'allmanager', '302584', NULL, '总经理审批', 'userTask', 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52298, '');
-INSERT INTO `act_hi_actinst` VALUES ('302591', 'process_leave:1:302555', '302556', '302580', 'sid-1CC133B2-44B1-4830-9C59-7D3564C933FA', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, '');
-INSERT INTO `act_hi_actinst` VALUES ('302592', 'process_leave:1:302555', '302556', '302580', 'sid-F68DCCA0-F7A4-44D4-9E44-56A682D87ECA', NULL, NULL, NULL, 'endEvent', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, '');
-INSERT INTO `act_hi_actinst` VALUES ('302593', 'process_leave:1:302555', '302556', '302556', 'sid-BE372D14-F509-4EDB-87E8-7B2107835AE5', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, '');
-INSERT INTO `act_hi_actinst` VALUES ('302594', 'process_leave:1:302555', '302556', '302556', 'user2', '302595', NULL, '人事审批', 'userTask', '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, '');
-INSERT INTO `act_hi_actinst` VALUES ('302600', 'process_leave:1:302555', '302599', '302599', 'start', NULL, NULL, 'start', 'startEvent', NULL, '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000', 8, '');
-INSERT INTO `act_hi_actinst` VALUES ('302608', 'process_leave:1:302555', '302599', '302599', 'user1', '302609', NULL, '经理审批', 'userTask', '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', '2022-03-31 11:18:00.000', 120357, '');
-INSERT INTO `act_hi_actinst` VALUES ('302622', 'process_leave:1:302555', '302599', '302599', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 0, '');
-INSERT INTO `act_hi_actinst` VALUES ('302624', 'process_leave:1:302555', '302599', '302623', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL, '2022-03-31 11:18:00.000', NULL, NULL, '');
-INSERT INTO `act_hi_actinst` VALUES ('302625', 'process_leave:1:302555', '302599', '302623', 'sstart', NULL, NULL, NULL, 'startEvent', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 9, '');
-INSERT INTO `act_hi_actinst` VALUES ('302626', 'process_leave:1:302555', '302599', '302623', 'allmanager', '302627', NULL, '总经理审批', 'userTask', 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('247553', 'process_leave:1:247536', '247552', '247552', 'start', NULL, NULL, 'start', 'startEvent', NULL,
+ '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000', 1, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('247559', 'process_leave:1:247536', '247552', '247552', 'user1', '247560', NULL, '经理审批', 'userTask', NULL,
+ '2018-06-14 23:44:03.000', NULL, NULL, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302557', 'process_leave:1:302555', '302556', '302556', 'start', NULL, NULL, 'start', 'startEvent', NULL,
+ '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000', 10, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302565', 'process_leave:1:302555', '302556', '302556', 'user1', '302566', NULL, '经理审批', 'userTask',
+ '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', '2022-03-31 11:04:52.000', 335536, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302579', 'process_leave:1:302555', '302556', '302556', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL,
+ NULL, 'exclusiveGateway', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 43, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302581', 'process_leave:1:302555', '302556', '302580', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL,
+ '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52313, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302582', 'process_leave:1:302555', '302556', '302580', 'sstart', NULL, NULL, NULL, 'startEvent', NULL,
+ '2022-03-31 11:04:52.000', '2022-03-31 11:04:52.000', 31, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302583', 'process_leave:1:302555', '302556', '302580', 'allmanager', '302584', NULL, '总经理审批', 'userTask',
+ 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000', 52298, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302591', 'process_leave:1:302555', '302556', '302580', 'sid-1CC133B2-44B1-4830-9C59-7D3564C933FA', NULL, NULL,
+ NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302592', 'process_leave:1:302555', '302556', '302580', 'sid-F68DCCA0-F7A4-44D4-9E44-56A682D87ECA', NULL, NULL,
+ NULL, 'endEvent', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302593', 'process_leave:1:302555', '302556', '302556', 'sid-BE372D14-F509-4EDB-87E8-7B2107835AE5', NULL, NULL,
+ NULL, 'exclusiveGateway', NULL, '2022-03-31 11:05:44.000', '2022-03-31 11:05:44.000', 0, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302594', 'process_leave:1:302555', '302556', '302556', 'user2', '302595', NULL, '人事审批', 'userTask',
+ '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302600', 'process_leave:1:302555', '302599', '302599', 'start', NULL, NULL, 'start', 'startEvent', NULL,
+ '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000', 8, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302608', 'process_leave:1:302555', '302599', '302599', 'user1', '302609', NULL, '经理审批', 'userTask',
+ '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', '2022-03-31 11:18:00.000', 120357, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302622', 'process_leave:1:302555', '302599', '302599', 'sid-950749EA-4BB6-4276-B67A-DE03E34A0573', NULL, NULL,
+ NULL, 'exclusiveGateway', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 0, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302624', 'process_leave:1:302555', '302599', '302623', 'child', NULL, NULL, 'subProcess', 'subProcess', NULL,
+ '2022-03-31 11:18:00.000', NULL, NULL, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302625', 'process_leave:1:302555', '302599', '302623', 'sstart', NULL, NULL, NULL, 'startEvent', NULL,
+ '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000', 9, '');
+INSERT INTO `act_hi_actinst`
+VALUES ('302626', 'process_leave:1:302555', '302599', '302623', 'allmanager', '302627', NULL, '总经理审批', 'userTask',
+ 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, '');
-- ----------------------------
-- Table structure for act_hi_attachment
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_attachment`;
-CREATE TABLE `act_hi_attachment` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `URL_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CONTENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TIME_` datetime(3) NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE
+CREATE TABLE `act_hi_attachment`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `URL_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CONTENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TIME_` datetime(3) NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_hi_comment
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_comment`;
-CREATE TABLE `act_hi_comment` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TIME_` datetime(3) NOT NULL,
- `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ACTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `MESSAGE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `FULL_MSG_` longblob NULL,
- PRIMARY KEY (`ID_`) USING BTREE
+CREATE TABLE `act_hi_comment`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TIME_` datetime(3) NOT NULL,
+ `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ACTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `MESSAGE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `FULL_MSG_` longblob NULL,
+ PRIMARY KEY (`ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_hi_detail
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_detail`;
-CREATE TABLE `act_hi_detail` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `VAR_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `TIME_` datetime(3) NOT NULL,
- `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DOUBLE_` double NULL DEFAULT NULL,
- `LONG_` bigint(20) NULL DEFAULT NULL,
- `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_DETAIL_PROC_INST`(`PROC_INST_ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_DETAIL_ACT_INST`(`ACT_INST_ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_DETAIL_TIME`(`TIME_`) USING BTREE,
- INDEX `ACT_IDX_HI_DETAIL_NAME`(`NAME_`) USING BTREE,
- INDEX `ACT_IDX_HI_DETAIL_TASK_ID`(`TASK_ID_`) USING BTREE
+CREATE TABLE `act_hi_detail`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `VAR_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `TIME_` datetime(3) NOT NULL,
+ `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DOUBLE_` double NULL DEFAULT NULL,
+ `LONG_` bigint(20) NULL DEFAULT NULL,
+ `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_DETAIL_PROC_INST`(`PROC_INST_ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_DETAIL_ACT_INST`(`ACT_INST_ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_DETAIL_TIME`(`TIME_`) USING BTREE,
+ INDEX `ACT_IDX_HI_DETAIL_NAME`(`NAME_`) USING BTREE,
+ INDEX `ACT_IDX_HI_DETAIL_TASK_ID`(`TASK_ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_hi_detail
-- ----------------------------
-INSERT INTO `act_hi_detail` VALUES ('247558', 'VariableUpdate', '247552', '247552', NULL, '247553', 'userLeave', 'serializable', 0, '2018-06-14 23:44:03.000', '247557', NULL, NULL, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302562', 'VariableUpdate', '302556', '302556', NULL, '302557', 'baseTask', 'serializable', 0, '2022-03-31 10:59:17.000', '302561', NULL, NULL, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302564', 'VariableUpdate', '302556', '302556', NULL, '302557', 'day', 'integer', 0, '2022-03-31 10:59:17.000', NULL, NULL, 3, '3', NULL);
-INSERT INTO `act_hi_detail` VALUES ('302570', 'VariableUpdate', '302556', '302556', NULL, '302565', 'flag', 'boolean', 0, '2022-03-31 11:04:52.000', NULL, NULL, 1, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302572', 'VariableUpdate', '302556', '302556', NULL, '302565', 'needfinish', 'integer', 0, '2022-03-31 11:04:52.000', NULL, NULL, 1, '1', NULL);
-INSERT INTO `act_hi_detail` VALUES ('302577', 'VariableUpdate', '302556', '302556', NULL, '302565', 'leaveOpinionList', 'serializable', 0, '2022-03-31 11:04:52.000', '302576', NULL, NULL, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302578', 'VariableUpdate', '302556', '302556', NULL, '302565', 'day', 'integer', 1, '2022-03-31 11:04:52.000', NULL, NULL, 3, '3', NULL);
-INSERT INTO `act_hi_detail` VALUES ('302586', 'VariableUpdate', '302556', '302556', NULL, '302583', 'flag', 'boolean', 1, '2022-03-31 11:05:44.000', NULL, NULL, 1, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302587', 'VariableUpdate', '302556', '302556', NULL, '302583', 'needfinish', 'integer', 1, '2022-03-31 11:05:44.000', NULL, NULL, 1, '1', NULL);
-INSERT INTO `act_hi_detail` VALUES ('302589', 'VariableUpdate', '302556', '302556', NULL, '302583', 'leaveOpinionList', 'serializable', 1, '2022-03-31 11:05:44.000', '302588', NULL, NULL, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302590', 'VariableUpdate', '302556', '302556', NULL, '302583', 'day', 'integer', 1, '2022-03-31 11:05:44.000', NULL, NULL, 3, '3', NULL);
-INSERT INTO `act_hi_detail` VALUES ('302605', 'VariableUpdate', '302599', '302599', NULL, '302600', 'baseTask', 'serializable', 0, '2022-03-31 11:16:00.000', '302604', NULL, NULL, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302607', 'VariableUpdate', '302599', '302599', NULL, '302600', 'day', 'integer', 0, '2022-03-31 11:16:00.000', NULL, NULL, 5, '5', NULL);
-INSERT INTO `act_hi_detail` VALUES ('302613', 'VariableUpdate', '302599', '302599', NULL, '302608', 'flag', 'boolean', 0, '2022-03-31 11:18:00.000', NULL, NULL, 1, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302615', 'VariableUpdate', '302599', '302599', NULL, '302608', 'needfinish', 'integer', 0, '2022-03-31 11:18:00.000', NULL, NULL, 1, '1', NULL);
-INSERT INTO `act_hi_detail` VALUES ('302620', 'VariableUpdate', '302599', '302599', NULL, '302608', 'leaveOpinionList', 'serializable', 0, '2022-03-31 11:18:00.000', '302619', NULL, NULL, NULL, NULL);
-INSERT INTO `act_hi_detail` VALUES ('302621', 'VariableUpdate', '302599', '302599', NULL, '302608', 'day', 'integer', 1, '2022-03-31 11:18:00.000', NULL, NULL, 5, '5', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('247558', 'VariableUpdate', '247552', '247552', NULL, '247553', 'userLeave', 'serializable', 0,
+ '2018-06-14 23:44:03.000', '247557', NULL, NULL, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302562', 'VariableUpdate', '302556', '302556', NULL, '302557', 'baseTask', 'serializable', 0,
+ '2022-03-31 10:59:17.000', '302561', NULL, NULL, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302564', 'VariableUpdate', '302556', '302556', NULL, '302557', 'day', 'integer', 0, '2022-03-31 10:59:17.000',
+ NULL, NULL, 3, '3', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302570', 'VariableUpdate', '302556', '302556', NULL, '302565', 'flag', 'boolean', 0, '2022-03-31 11:04:52.000',
+ NULL, NULL, 1, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302572', 'VariableUpdate', '302556', '302556', NULL, '302565', 'needfinish', 'integer', 0,
+ '2022-03-31 11:04:52.000', NULL, NULL, 1, '1', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302577', 'VariableUpdate', '302556', '302556', NULL, '302565', 'leaveOpinionList', 'serializable', 0,
+ '2022-03-31 11:04:52.000', '302576', NULL, NULL, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302578', 'VariableUpdate', '302556', '302556', NULL, '302565', 'day', 'integer', 1, '2022-03-31 11:04:52.000',
+ NULL, NULL, 3, '3', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302586', 'VariableUpdate', '302556', '302556', NULL, '302583', 'flag', 'boolean', 1, '2022-03-31 11:05:44.000',
+ NULL, NULL, 1, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302587', 'VariableUpdate', '302556', '302556', NULL, '302583', 'needfinish', 'integer', 1,
+ '2022-03-31 11:05:44.000', NULL, NULL, 1, '1', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302589', 'VariableUpdate', '302556', '302556', NULL, '302583', 'leaveOpinionList', 'serializable', 1,
+ '2022-03-31 11:05:44.000', '302588', NULL, NULL, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302590', 'VariableUpdate', '302556', '302556', NULL, '302583', 'day', 'integer', 1, '2022-03-31 11:05:44.000',
+ NULL, NULL, 3, '3', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302605', 'VariableUpdate', '302599', '302599', NULL, '302600', 'baseTask', 'serializable', 0,
+ '2022-03-31 11:16:00.000', '302604', NULL, NULL, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302607', 'VariableUpdate', '302599', '302599', NULL, '302600', 'day', 'integer', 0, '2022-03-31 11:16:00.000',
+ NULL, NULL, 5, '5', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302613', 'VariableUpdate', '302599', '302599', NULL, '302608', 'flag', 'boolean', 0, '2022-03-31 11:18:00.000',
+ NULL, NULL, 1, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302615', 'VariableUpdate', '302599', '302599', NULL, '302608', 'needfinish', 'integer', 0,
+ '2022-03-31 11:18:00.000', NULL, NULL, 1, '1', NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302620', 'VariableUpdate', '302599', '302599', NULL, '302608', 'leaveOpinionList', 'serializable', 0,
+ '2022-03-31 11:18:00.000', '302619', NULL, NULL, NULL, NULL);
+INSERT INTO `act_hi_detail`
+VALUES ('302621', 'VariableUpdate', '302599', '302599', NULL, '302608', 'day', 'integer', 1, '2022-03-31 11:18:00.000',
+ NULL, NULL, 5, '5', NULL);
-- ----------------------------
-- Table structure for act_hi_identitylink
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_identitylink`;
-CREATE TABLE `act_hi_identitylink` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_IDENT_LNK_USER`(`USER_ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_IDENT_LNK_TASK`(`TASK_ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_IDENT_LNK_PROCINST`(`PROC_INST_ID_`) USING BTREE
+CREATE TABLE `act_hi_identitylink`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_IDENT_LNK_USER`(`USER_ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_IDENT_LNK_TASK`(`TASK_ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_IDENT_LNK_PROCINST`(`PROC_INST_ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_hi_identitylink
-- ----------------------------
-INSERT INTO `act_hi_identitylink` VALUES ('302567', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556');
-INSERT INTO `act_hi_identitylink` VALUES ('302568', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302566', NULL);
-INSERT INTO `act_hi_identitylink` VALUES ('302585', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556');
-INSERT INTO `act_hi_identitylink` VALUES ('302596', NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556');
-INSERT INTO `act_hi_identitylink` VALUES ('302610', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599');
-INSERT INTO `act_hi_identitylink` VALUES ('302611', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302609', NULL);
-INSERT INTO `act_hi_identitylink` VALUES ('302628', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599');
+INSERT INTO `act_hi_identitylink`
+VALUES ('302567', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556');
+INSERT INTO `act_hi_identitylink`
+VALUES ('302568', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302566', NULL);
+INSERT INTO `act_hi_identitylink`
+VALUES ('302585', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556');
+INSERT INTO `act_hi_identitylink`
+VALUES ('302596', NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556');
+INSERT INTO `act_hi_identitylink`
+VALUES ('302610', NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599');
+INSERT INTO `act_hi_identitylink`
+VALUES ('302611', 'e346e96368484c8fa7f217ce550a0186', 'candidate', NULL, '302609', NULL);
+INSERT INTO `act_hi_identitylink`
+VALUES ('302628', NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599');
-- ----------------------------
-- Table structure for act_hi_procinst
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_procinst`;
-CREATE TABLE `act_hi_procinst` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `START_TIME_` datetime(3) NOT NULL,
- `END_TIME_` datetime(3) NULL DEFAULT NULL,
- `DURATION_` bigint(20) NULL DEFAULT NULL,
- `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `START_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `END_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- UNIQUE INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_PRO_INST_END`(`END_TIME_`) USING BTREE,
- INDEX `ACT_IDX_HI_PRO_I_BUSKEY`(`BUSINESS_KEY_`) USING BTREE
+CREATE TABLE `act_hi_procinst`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `START_TIME_` datetime(3) NOT NULL,
+ `END_TIME_` datetime(3) NULL DEFAULT NULL,
+ `DURATION_` bigint(20) NULL DEFAULT NULL,
+ `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `START_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `END_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ UNIQUE INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_PRO_INST_END`(`END_TIME_`) USING BTREE,
+ INDEX `ACT_IDX_HI_PRO_I_BUSKEY`(`BUSINESS_KEY_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_hi_procinst
-- ----------------------------
-INSERT INTO `act_hi_procinst` VALUES ('247552', '247552', NULL, 'process_leave:1:247536', '2018-06-14 23:44:03.000', NULL, NULL, NULL, 'start', NULL, NULL, NULL, '', NULL);
-INSERT INTO `act_hi_procinst` VALUES ('302556', '302556', NULL, 'process_leave:1:302555', '2022-03-31 10:59:17.000', NULL, NULL, NULL, 'start', NULL, NULL, NULL, '', NULL);
-INSERT INTO `act_hi_procinst` VALUES ('302599', '302599', NULL, 'process_leave:1:302555', '2022-03-31 11:16:00.000', NULL, NULL, NULL, 'start', NULL, NULL, NULL, '', NULL);
+INSERT INTO `act_hi_procinst`
+VALUES ('247552', '247552', NULL, 'process_leave:1:247536', '2018-06-14 23:44:03.000', NULL, NULL, NULL, 'start', NULL,
+ NULL, NULL, '', NULL);
+INSERT INTO `act_hi_procinst`
+VALUES ('302556', '302556', NULL, 'process_leave:1:302555', '2022-03-31 10:59:17.000', NULL, NULL, NULL, 'start', NULL,
+ NULL, NULL, '', NULL);
+INSERT INTO `act_hi_procinst`
+VALUES ('302599', '302599', NULL, 'process_leave:1:302555', '2022-03-31 11:16:00.000', NULL, NULL, NULL, 'start', NULL,
+ NULL, NULL, '', NULL);
-- ----------------------------
-- Table structure for act_hi_taskinst
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_taskinst`;
-CREATE TABLE `act_hi_taskinst` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `START_TIME_` datetime(3) NOT NULL,
- `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL,
- `END_TIME_` datetime(3) NULL DEFAULT NULL,
- `DURATION_` bigint(20) NULL DEFAULT NULL,
- `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PRIORITY_` int(11) NULL DEFAULT NULL,
- `DUE_DATE_` datetime(3) NULL DEFAULT NULL,
- `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_TASK_INST_PROCINST`(`PROC_INST_ID_`) USING BTREE
+CREATE TABLE `act_hi_taskinst`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `START_TIME_` datetime(3) NOT NULL,
+ `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL,
+ `END_TIME_` datetime(3) NULL DEFAULT NULL,
+ `DURATION_` bigint(20) NULL DEFAULT NULL,
+ `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PRIORITY_` int(11) NULL DEFAULT NULL,
+ `DUE_DATE_` datetime(3) NULL DEFAULT NULL,
+ `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_TASK_INST_PROCINST`(`PROC_INST_ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_hi_taskinst
-- ----------------------------
-INSERT INTO `act_hi_taskinst` VALUES ('247560', 'process_leave:1:247536', 'user1', '247552', '247552', '经理审批', NULL, NULL, NULL, NULL, '2018-06-14 23:44:03.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '');
-INSERT INTO `act_hi_taskinst` VALUES ('302566', 'process_leave:1:302555', 'user1', '302556', '302556', '经理审批', NULL, NULL, NULL, '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', NULL, '2022-03-31 11:04:52.000', 335519, 'completed', 50, NULL, NULL, NULL, '');
-INSERT INTO `act_hi_taskinst` VALUES ('302584', 'process_leave:1:302555', 'allmanager', '302556', '302580', '总经理审批', NULL, NULL, NULL, 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', NULL, '2022-03-31 11:05:44.000', 52287, 'completed', 50, NULL, NULL, NULL, '');
-INSERT INTO `act_hi_taskinst` VALUES ('302595', 'process_leave:1:302555', 'user2', '302556', '302556', '人事审批', NULL, NULL, NULL, '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '');
-INSERT INTO `act_hi_taskinst` VALUES ('302609', 'process_leave:1:302555', 'user1', '302599', '302599', '经理审批', NULL, NULL, NULL, '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', NULL, '2022-03-31 11:18:00.000', 120347, 'completed', 50, NULL, NULL, NULL, '');
-INSERT INTO `act_hi_taskinst` VALUES ('302627', 'process_leave:1:302555', 'allmanager', '302599', '302623', '总经理审批', NULL, NULL, NULL, 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '');
+INSERT INTO `act_hi_taskinst`
+VALUES ('247560', 'process_leave:1:247536', 'user1', '247552', '247552', '经理审批', NULL, NULL, NULL, NULL,
+ '2018-06-14 23:44:03.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '');
+INSERT INTO `act_hi_taskinst`
+VALUES ('302566', 'process_leave:1:302555', 'user1', '302556', '302556', '经理审批', NULL, NULL, NULL,
+ '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 10:59:17.000', NULL, '2022-03-31 11:04:52.000', 335519,
+ 'completed', 50, NULL, NULL, NULL, '');
+INSERT INTO `act_hi_taskinst`
+VALUES ('302584', 'process_leave:1:302555', 'allmanager', '302556', '302580', '总经理审批', NULL, NULL, NULL,
+ 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:04:52.000', NULL, '2022-03-31 11:05:44.000', 52287,
+ 'completed', 50, NULL, NULL, NULL, '');
+INSERT INTO `act_hi_taskinst`
+VALUES ('302595', 'process_leave:1:302555', 'user2', '302556', '302556', '人事审批', NULL, NULL, NULL,
+ '98b051b03681de6028993a5d14ac93cb', '2022-03-31 11:05:44.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL,
+ '');
+INSERT INTO `act_hi_taskinst`
+VALUES ('302609', 'process_leave:1:302555', 'user1', '302599', '302599', '经理审批', NULL, NULL, NULL,
+ '0b7625fedaa05e85f282486e1c9c91b9', '2022-03-31 11:16:00.000', NULL, '2022-03-31 11:18:00.000', 120347,
+ 'completed', 50, NULL, NULL, NULL, '');
+INSERT INTO `act_hi_taskinst`
+VALUES ('302627', 'process_leave:1:302555', 'allmanager', '302599', '302623', '总经理审批', NULL, NULL, NULL,
+ 'd818ac6a86cf1a64d2184bf0699d67a8', '2022-03-31 11:18:00.000', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL,
+ '');
-- ----------------------------
-- Table structure for act_hi_varinst
-- ----------------------------
DROP TABLE IF EXISTS `act_hi_varinst`;
-CREATE TABLE `act_hi_varinst` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DOUBLE_` double NULL DEFAULT NULL,
- `LONG_` bigint(20) NULL DEFAULT NULL,
- `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CREATE_TIME_` datetime(3) NULL DEFAULT NULL,
- `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_PROCVAR_PROC_INST`(`PROC_INST_ID_`) USING BTREE,
- INDEX `ACT_IDX_HI_PROCVAR_NAME_TYPE`(`NAME_`, `VAR_TYPE_`) USING BTREE,
- INDEX `ACT_IDX_HI_PROCVAR_TASK_ID`(`TASK_ID_`) USING BTREE
+CREATE TABLE `act_hi_varinst`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DOUBLE_` double NULL DEFAULT NULL,
+ `LONG_` bigint(20) NULL DEFAULT NULL,
+ `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CREATE_TIME_` datetime(3) NULL DEFAULT NULL,
+ `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_PROCVAR_PROC_INST`(`PROC_INST_ID_`) USING BTREE,
+ INDEX `ACT_IDX_HI_PROCVAR_NAME_TYPE`(`NAME_`, `VAR_TYPE_`) USING BTREE,
+ INDEX `ACT_IDX_HI_PROCVAR_TASK_ID`(`TASK_ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_hi_varinst
-- ----------------------------
-INSERT INTO `act_hi_varinst` VALUES ('247555', '247552', '247552', NULL, 'userLeave', 'serializable', 0, '247556', NULL, NULL, NULL, NULL, '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000');
-INSERT INTO `act_hi_varinst` VALUES ('302559', '302556', '302556', NULL, 'baseTask', 'serializable', 0, '302560', NULL, NULL, NULL, NULL, '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000');
-INSERT INTO `act_hi_varinst` VALUES ('302563', '302556', '302556', NULL, 'day', 'integer', 2, NULL, NULL, 3, '3', NULL, '2022-03-31 10:59:17.000', '2022-03-31 11:05:44.000');
-INSERT INTO `act_hi_varinst` VALUES ('302569', '302556', '302556', NULL, 'flag', 'boolean', 1, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000');
-INSERT INTO `act_hi_varinst` VALUES ('302571', '302556', '302556', NULL, 'needfinish', 'integer', 1, NULL, NULL, 1, '1', NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000');
-INSERT INTO `act_hi_varinst` VALUES ('302574', '302556', '302556', NULL, 'leaveOpinionList', 'serializable', 1, '302575', NULL, NULL, NULL, NULL, '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000');
-INSERT INTO `act_hi_varinst` VALUES ('302602', '302599', '302599', NULL, 'baseTask', 'serializable', 0, '302603', NULL, NULL, NULL, NULL, '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000');
-INSERT INTO `act_hi_varinst` VALUES ('302606', '302599', '302599', NULL, 'day', 'integer', 1, NULL, NULL, 5, '5', NULL, '2022-03-31 11:16:00.000', '2022-03-31 11:18:00.000');
-INSERT INTO `act_hi_varinst` VALUES ('302612', '302599', '302599', NULL, 'flag', 'boolean', 0, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000');
-INSERT INTO `act_hi_varinst` VALUES ('302614', '302599', '302599', NULL, 'needfinish', 'integer', 0, NULL, NULL, 1, '1', NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000');
-INSERT INTO `act_hi_varinst` VALUES ('302617', '302599', '302599', NULL, 'leaveOpinionList', 'serializable', 0, '302618', NULL, NULL, NULL, NULL, '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('247555', '247552', '247552', NULL, 'userLeave', 'serializable', 0, '247556', NULL, NULL, NULL, NULL,
+ '2018-06-14 23:44:03.000', '2018-06-14 23:44:03.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302559', '302556', '302556', NULL, 'baseTask', 'serializable', 0, '302560', NULL, NULL, NULL, NULL,
+ '2022-03-31 10:59:17.000', '2022-03-31 10:59:17.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302563', '302556', '302556', NULL, 'day', 'integer', 2, NULL, NULL, 3, '3', NULL, '2022-03-31 10:59:17.000',
+ '2022-03-31 11:05:44.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302569', '302556', '302556', NULL, 'flag', 'boolean', 1, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:04:52.000',
+ '2022-03-31 11:05:44.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302571', '302556', '302556', NULL, 'needfinish', 'integer', 1, NULL, NULL, 1, '1', NULL,
+ '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302574', '302556', '302556', NULL, 'leaveOpinionList', 'serializable', 1, '302575', NULL, NULL, NULL, NULL,
+ '2022-03-31 11:04:52.000', '2022-03-31 11:05:44.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302602', '302599', '302599', NULL, 'baseTask', 'serializable', 0, '302603', NULL, NULL, NULL, NULL,
+ '2022-03-31 11:16:00.000', '2022-03-31 11:16:00.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302606', '302599', '302599', NULL, 'day', 'integer', 1, NULL, NULL, 5, '5', NULL, '2022-03-31 11:16:00.000',
+ '2022-03-31 11:18:00.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302612', '302599', '302599', NULL, 'flag', 'boolean', 0, NULL, NULL, 1, NULL, NULL, '2022-03-31 11:18:00.000',
+ '2022-03-31 11:18:00.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302614', '302599', '302599', NULL, 'needfinish', 'integer', 0, NULL, NULL, 1, '1', NULL,
+ '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000');
+INSERT INTO `act_hi_varinst`
+VALUES ('302617', '302599', '302599', NULL, 'leaveOpinionList', 'serializable', 0, '302618', NULL, NULL, NULL, NULL,
+ '2022-03-31 11:18:00.000', '2022-03-31 11:18:00.000');
-- ----------------------------
-- Table structure for act_id_group
-- ----------------------------
DROP TABLE IF EXISTS `act_id_group`;
-CREATE TABLE `act_id_group` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE
+CREATE TABLE `act_id_group`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_id_group
-- ----------------------------
-INSERT INTO `act_id_group` VALUES ('023366f3457511e8bcf1309c2315f9aa', 1, 'hr', NULL);
-INSERT INTO `act_id_group` VALUES ('0ea934e5e55411e7b983201a068c6482', 1, 'manage', NULL);
-INSERT INTO `act_id_group` VALUES ('2619a672e53811e7b983201a068c6482', 1, 'admin', NULL);
-INSERT INTO `act_id_group` VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 1, 'blogAdmin', NULL);
-INSERT INTO `act_id_group` VALUES ('dcb0f642fe9611e7b472201a068c6482', 1, 'dev', NULL);
-INSERT INTO `act_id_group` VALUES ('e346e96368484c8fa7f217ce550a0186', 1, 'DeputyManager', NULL);
+INSERT INTO `act_id_group`
+VALUES ('023366f3457511e8bcf1309c2315f9aa', 1, 'hr', NULL);
+INSERT INTO `act_id_group`
+VALUES ('0ea934e5e55411e7b983201a068c6482', 1, 'manage', NULL);
+INSERT INTO `act_id_group`
+VALUES ('2619a672e53811e7b983201a068c6482', 1, 'admin', NULL);
+INSERT INTO `act_id_group`
+VALUES ('4bb891d8caf84cc6ba27e515e80ac40d', 1, 'blogAdmin', NULL);
+INSERT INTO `act_id_group`
+VALUES ('dcb0f642fe9611e7b472201a068c6482', 1, 'dev', NULL);
+INSERT INTO `act_id_group`
+VALUES ('e346e96368484c8fa7f217ce550a0186', 1, 'DeputyManager', NULL);
-- ----------------------------
-- Table structure for act_id_info
-- ----------------------------
DROP TABLE IF EXISTS `act_id_info`;
-CREATE TABLE `act_id_info` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `VALUE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PASSWORD_` longblob NULL,
- `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE
+CREATE TABLE `act_id_info`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `VALUE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PASSWORD_` longblob NULL,
+ `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_id_membership
-- ----------------------------
DROP TABLE IF EXISTS `act_id_membership`;
-CREATE TABLE `act_id_membership` (
- `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `GROUP_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- PRIMARY KEY (`USER_ID_`, `GROUP_ID_`) USING BTREE,
- INDEX `ACT_FK_MEMB_GROUP`(`GROUP_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_MEMB_GROUP` FOREIGN KEY (`GROUP_ID_`) REFERENCES `act_id_group` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `act_id_user` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_id_membership`
+(
+ `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `GROUP_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ PRIMARY KEY (`USER_ID_`, `GROUP_ID_`) USING BTREE,
+ INDEX `ACT_FK_MEMB_GROUP`(`GROUP_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_MEMB_GROUP` FOREIGN KEY (`GROUP_ID_`) REFERENCES `act_id_group` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `act_id_user` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_id_membership
-- ----------------------------
-INSERT INTO `act_id_membership` VALUES ('98b051b03681de6028993a5d14ac93cb', '023366f3457511e8bcf1309c2315f9aa');
-INSERT INTO `act_id_membership` VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', '0ea934e5e55411e7b983201a068c6482');
-INSERT INTO `act_id_membership` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482');
-INSERT INTO `act_id_membership` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d');
-INSERT INTO `act_id_membership` VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'dcb0f642fe9611e7b472201a068c6482');
-INSERT INTO `act_id_membership` VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'e346e96368484c8fa7f217ce550a0186');
+INSERT INTO `act_id_membership`
+VALUES ('98b051b03681de6028993a5d14ac93cb', '023366f3457511e8bcf1309c2315f9aa');
+INSERT INTO `act_id_membership`
+VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', '0ea934e5e55411e7b983201a068c6482');
+INSERT INTO `act_id_membership`
+VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '2619a672e53811e7b983201a068c6482');
+INSERT INTO `act_id_membership`
+VALUES ('acfc0e9232f54732a5d9ffe9071bf572', '4bb891d8caf84cc6ba27e515e80ac40d');
+INSERT INTO `act_id_membership`
+VALUES ('5946a985f733c57f1ab71689f7b6aeea', 'dcb0f642fe9611e7b472201a068c6482');
+INSERT INTO `act_id_membership`
+VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 'e346e96368484c8fa7f217ce550a0186');
-- ----------------------------
-- Table structure for act_id_user
-- ----------------------------
DROP TABLE IF EXISTS `act_id_user`;
-CREATE TABLE `act_id_user` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `FIRST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `LAST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EMAIL_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PWD_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PICTURE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE
+CREATE TABLE `act_id_user`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `FIRST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `LAST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EMAIL_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PWD_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PICTURE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_id_user
-- ----------------------------
-INSERT INTO `act_id_user` VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 1, NULL, NULL, '11@qq.com', NULL, NULL);
-INSERT INTO `act_id_user` VALUES ('5946a985f733c57f1ab71689f7b6aeea', 1, NULL, NULL, '11@qq.com', NULL, NULL);
-INSERT INTO `act_id_user` VALUES ('98b051b03681de6028993a5d14ac93cb', 1, NULL, NULL, '11@qq.com', NULL, NULL);
-INSERT INTO `act_id_user` VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 1, NULL, NULL, '', NULL, NULL);
-INSERT INTO `act_id_user` VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', 1, NULL, NULL, '11@qq.com', NULL, NULL);
+INSERT INTO `act_id_user`
+VALUES ('0b7625fedaa05e85f282486e1c9c91b9', 1, NULL, NULL, '11@qq.com', NULL, NULL);
+INSERT INTO `act_id_user`
+VALUES ('5946a985f733c57f1ab71689f7b6aeea', 1, NULL, NULL, '11@qq.com', NULL, NULL);
+INSERT INTO `act_id_user`
+VALUES ('98b051b03681de6028993a5d14ac93cb', 1, NULL, NULL, '11@qq.com', NULL, NULL);
+INSERT INTO `act_id_user`
+VALUES ('acfc0e9232f54732a5d9ffe9071bf572', 1, NULL, NULL, '', NULL, NULL);
+INSERT INTO `act_id_user`
+VALUES ('d818ac6a86cf1a64d2184bf0699d67a8', 1, NULL, NULL, '11@qq.com', NULL, NULL);
-- ----------------------------
-- Table structure for act_procdef_info
-- ----------------------------
DROP TABLE IF EXISTS `act_procdef_info`;
-CREATE TABLE `act_procdef_info` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `INFO_JSON_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- UNIQUE INDEX `ACT_UNIQ_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
- INDEX `ACT_IDX_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
- INDEX `ACT_FK_INFO_JSON_BA`(`INFO_JSON_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_procdef_info`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `INFO_JSON_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ UNIQUE INDEX `ACT_UNIQ_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
+ INDEX `ACT_IDX_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
+ INDEX `ACT_FK_INFO_JSON_BA`(`INFO_JSON_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_re_deployment
-- ----------------------------
DROP TABLE IF EXISTS `act_re_deployment`;
-CREATE TABLE `act_re_deployment` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE
+CREATE TABLE `act_re_deployment`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_re_deployment
-- ----------------------------
-INSERT INTO `act_re_deployment` VALUES ('247533', '请假流程', NULL, '', '2018-06-14 23:37:51.000');
-INSERT INTO `act_re_deployment` VALUES ('302552', '请假流程', NULL, '', '2022-03-31 10:58:53.000');
+INSERT INTO `act_re_deployment`
+VALUES ('247533', '请假流程', NULL, '', '2018-06-14 23:37:51.000');
+INSERT INTO `act_re_deployment`
+VALUES ('302552', '请假流程', NULL, '', '2022-03-31 10:58:53.000');
-- ----------------------------
-- Table structure for act_re_model
-- ----------------------------
DROP TABLE IF EXISTS `act_re_model`;
-CREATE TABLE `act_re_model` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL,
- `LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL,
- `VERSION_` int(11) NULL DEFAULT NULL,
- `META_INFO_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EDITOR_SOURCE_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_FK_MODEL_SOURCE`(`EDITOR_SOURCE_VALUE_ID_`) USING BTREE,
- INDEX `ACT_FK_MODEL_SOURCE_EXTRA`(`EDITOR_SOURCE_EXTRA_VALUE_ID_`) USING BTREE,
- INDEX `ACT_FK_MODEL_DEPLOYMENT`(`DEPLOYMENT_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_re_model`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL,
+ `LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL,
+ `VERSION_` int(11) NULL DEFAULT NULL,
+ `META_INFO_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EDITOR_SOURCE_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_FK_MODEL_SOURCE`(`EDITOR_SOURCE_VALUE_ID_`) USING BTREE,
+ INDEX `ACT_FK_MODEL_SOURCE_EXTRA`(`EDITOR_SOURCE_EXTRA_VALUE_ID_`) USING BTREE,
+ INDEX `ACT_FK_MODEL_DEPLOYMENT`(`DEPLOYMENT_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_re_model
-- ----------------------------
-INSERT INTO `act_re_model` VALUES ('142517', 75, '请假流程', 'processKey', NULL, '2018-01-25 17:21:39.000', '2022-03-31 10:58:54.000', 1, '{\"name\":\"请假流程\",\"description\":\"\"}', '302552', '142518', '142519', '');
-INSERT INTO `act_re_model` VALUES ('212510', 11, '测试流程', 'processKey', NULL, '2018-04-27 19:57:22.000', '2018-12-11 23:10:00.000', 1, '{\"name\":\"测试流程\",\"description\":\"\"}', NULL, '212511', '212512', '');
-INSERT INTO `act_re_model` VALUES ('302597', 4, '新建流程', 'processKey', NULL, '2022-03-31 11:08:57.000', '2022-03-31 11:32:34.000', 1, '{\"name\":\"新建流程\",\"description\":\"\"}', NULL, '302598', '302633', '');
-INSERT INTO `act_re_model` VALUES ('302629', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:25:58.000', '2022-03-31 11:25:58.000', 1, '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302630', NULL, '');
-INSERT INTO `act_re_model` VALUES ('302631', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:31:43.000', '2022-03-31 11:31:43.000', 1, '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302632', NULL, '');
-INSERT INTO `act_re_model` VALUES ('302634', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:39:26.000', '2022-03-31 11:39:26.000', 1, '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302635', NULL, '');
+INSERT INTO `act_re_model`
+VALUES ('142517', 75, '请假流程', 'processKey', NULL, '2018-01-25 17:21:39.000', '2022-03-31 10:58:54.000', 1,
+ '{\"name\":\"请假流程\",\"description\":\"\"}', '302552', '142518', '142519', '');
+INSERT INTO `act_re_model`
+VALUES ('212510', 11, '测试流程', 'processKey', NULL, '2018-04-27 19:57:22.000', '2018-12-11 23:10:00.000', 1,
+ '{\"name\":\"测试流程\",\"description\":\"\"}', NULL, '212511', '212512', '');
+INSERT INTO `act_re_model`
+VALUES ('302597', 4, '新建流程', 'processKey', NULL, '2022-03-31 11:08:57.000', '2022-03-31 11:32:34.000', 1,
+ '{\"name\":\"新建流程\",\"description\":\"\"}', NULL, '302598', '302633', '');
+INSERT INTO `act_re_model`
+VALUES ('302629', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:25:58.000', '2022-03-31 11:25:58.000', 1,
+ '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302630', NULL, '');
+INSERT INTO `act_re_model`
+VALUES ('302631', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:31:43.000', '2022-03-31 11:31:43.000', 1,
+ '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302632', NULL, '');
+INSERT INTO `act_re_model`
+VALUES ('302634', 2, '新建流程', 'processKey', NULL, '2022-03-31 11:39:26.000', '2022-03-31 11:39:26.000', 1,
+ '{\"name\":\"新建流程\",\"description\":\"\",\"revision\":1}', NULL, '302635', NULL, '');
-- ----------------------------
-- Table structure for act_re_procdef
-- ----------------------------
DROP TABLE IF EXISTS `act_re_procdef`;
-CREATE TABLE `act_re_procdef` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `VERSION_` int(11) NOT NULL,
- `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `HAS_START_FORM_KEY_` tinyint(4) NULL DEFAULT NULL,
- `HAS_GRAPHICAL_NOTATION_` tinyint(4) NULL DEFAULT NULL,
- `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- PRIMARY KEY (`ID_`) USING BTREE,
- UNIQUE INDEX `ACT_UNIQ_PROCDEF`(`KEY_`, `VERSION_`, `TENANT_ID_`) USING BTREE
+CREATE TABLE `act_re_procdef`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `VERSION_` int(11) NOT NULL,
+ `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `HAS_START_FORM_KEY_` tinyint(4) NULL DEFAULT NULL,
+ `HAS_GRAPHICAL_NOTATION_` tinyint(4) NULL DEFAULT NULL,
+ `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ PRIMARY KEY (`ID_`) USING BTREE,
+ UNIQUE INDEX `ACT_UNIQ_PROCDEF`(`KEY_`, `VERSION_`, `TENANT_ID_`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_re_procdef
-- ----------------------------
-INSERT INTO `act_re_procdef` VALUES ('process_leave:1:302555', 1, 'http://www.activiti.org/processdef', '请假流程', 'process_leave', 1, '302552', '请假流程.bpmn20.xml', '请假流程.process_leave.png', NULL, 0, 1, 1, '');
+INSERT INTO `act_re_procdef`
+VALUES ('process_leave:1:302555', 1, 'http://www.activiti.org/processdef', '请假流程', 'process_leave', 1, '302552',
+ '请假流程.bpmn20.xml', '请假流程.process_leave.png', NULL, 0, 1, 1, '');
-- ----------------------------
-- Table structure for act_ru_event_subscr
-- ----------------------------
DROP TABLE IF EXISTS `act_ru_event_subscr`;
-CREATE TABLE `act_ru_event_subscr` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `EVENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `EVENT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ACTIVITY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_EVENT_SUBSCR_CONFIG_`(`CONFIGURATION_`) USING BTREE,
- INDEX `ACT_FK_EVENT_EXEC`(`EXECUTION_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_ru_event_subscr`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `EVENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `EVENT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ACTIVITY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_EVENT_SUBSCR_CONFIG_`(`CONFIGURATION_`) USING BTREE,
+ INDEX `ACT_FK_EVENT_EXEC`(`EXECUTION_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_ru_execution
-- ----------------------------
DROP TABLE IF EXISTS `act_ru_execution`;
-CREATE TABLE `act_ru_execution` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PARENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `SUPER_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `IS_ACTIVE_` tinyint(4) NULL DEFAULT NULL,
- `IS_CONCURRENT_` tinyint(4) NULL DEFAULT NULL,
- `IS_SCOPE_` tinyint(4) NULL DEFAULT NULL,
- `IS_EVENT_SCOPE_` tinyint(4) NULL DEFAULT NULL,
- `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL,
- `CACHED_ENT_STATE_` int(11) NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_EXEC_BUSKEY`(`BUSINESS_KEY_`) USING BTREE,
- INDEX `ACT_FK_EXE_PROCINST`(`PROC_INST_ID_`) USING BTREE,
- INDEX `ACT_FK_EXE_PARENT`(`PARENT_ID_`) USING BTREE,
- INDEX `ACT_FK_EXE_SUPER`(`SUPER_EXEC_`) USING BTREE,
- INDEX `ACT_FK_EXE_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_ru_execution`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PARENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `SUPER_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `IS_ACTIVE_` tinyint(4) NULL DEFAULT NULL,
+ `IS_CONCURRENT_` tinyint(4) NULL DEFAULT NULL,
+ `IS_SCOPE_` tinyint(4) NULL DEFAULT NULL,
+ `IS_EVENT_SCOPE_` tinyint(4) NULL DEFAULT NULL,
+ `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL,
+ `CACHED_ENT_STATE_` int(11) NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_EXEC_BUSKEY`(`BUSINESS_KEY_`) USING BTREE,
+ INDEX `ACT_FK_EXE_PROCINST`(`PROC_INST_ID_`) USING BTREE,
+ INDEX `ACT_FK_EXE_PARENT`(`PARENT_ID_`) USING BTREE,
+ INDEX `ACT_FK_EXE_SUPER`(`SUPER_EXEC_`) USING BTREE,
+ INDEX `ACT_FK_EXE_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_ru_execution
-- ----------------------------
-INSERT INTO `act_ru_execution` VALUES ('302556', 3, '302556', NULL, NULL, 'process_leave:1:302555', NULL, 'user2', 1, 0, 1, 0, 1, 2, '', NULL, NULL);
-INSERT INTO `act_ru_execution` VALUES ('302599', 2, '302599', NULL, NULL, 'process_leave:1:302555', NULL, NULL, 0, 0, 1, 0, 1, 0, '', NULL, NULL);
-INSERT INTO `act_ru_execution` VALUES ('302623', 1, '302599', NULL, '302599', 'process_leave:1:302555', NULL, 'allmanager', 1, 0, 1, 0, 1, 2, '', NULL, NULL);
+INSERT INTO `act_ru_execution`
+VALUES ('302556', 3, '302556', NULL, NULL, 'process_leave:1:302555', NULL, 'user2', 1, 0, 1, 0, 1, 2, '', NULL, NULL);
+INSERT INTO `act_ru_execution`
+VALUES ('302599', 2, '302599', NULL, NULL, 'process_leave:1:302555', NULL, NULL, 0, 0, 1, 0, 1, 0, '', NULL, NULL);
+INSERT INTO `act_ru_execution`
+VALUES ('302623', 1, '302599', NULL, '302599', 'process_leave:1:302555', NULL, 'allmanager', 1, 0, 1, 0, 1, 2, '', NULL,
+ NULL);
-- ----------------------------
-- Table structure for act_ru_identitylink
-- ----------------------------
DROP TABLE IF EXISTS `act_ru_identitylink`;
-CREATE TABLE `act_ru_identitylink` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_IDENT_LNK_USER`(`USER_ID_`) USING BTREE,
- INDEX `ACT_IDX_IDENT_LNK_GROUP`(`GROUP_ID_`) USING BTREE,
- INDEX `ACT_IDX_ATHRZ_PROCEDEF`(`PROC_DEF_ID_`) USING BTREE,
- INDEX `ACT_FK_TSKASS_TASK`(`TASK_ID_`) USING BTREE,
- INDEX `ACT_FK_IDL_PROCINST`(`PROC_INST_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `act_ru_task` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_ru_identitylink`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_IDENT_LNK_USER`(`USER_ID_`) USING BTREE,
+ INDEX `ACT_IDX_IDENT_LNK_GROUP`(`GROUP_ID_`) USING BTREE,
+ INDEX `ACT_IDX_ATHRZ_PROCEDEF`(`PROC_DEF_ID_`) USING BTREE,
+ INDEX `ACT_FK_TSKASS_TASK`(`TASK_ID_`) USING BTREE,
+ INDEX `ACT_FK_IDL_PROCINST`(`PROC_INST_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `act_ru_task` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_ru_identitylink
-- ----------------------------
-INSERT INTO `act_ru_identitylink` VALUES ('302567', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556', NULL);
-INSERT INTO `act_ru_identitylink` VALUES ('302585', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556', NULL);
-INSERT INTO `act_ru_identitylink` VALUES ('302596', 1, NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556', NULL);
-INSERT INTO `act_ru_identitylink` VALUES ('302610', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599', NULL);
-INSERT INTO `act_ru_identitylink` VALUES ('302628', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599', NULL);
+INSERT INTO `act_ru_identitylink`
+VALUES ('302567', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302556', NULL);
+INSERT INTO `act_ru_identitylink`
+VALUES ('302585', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302556', NULL);
+INSERT INTO `act_ru_identitylink`
+VALUES ('302596', 1, NULL, 'participant', '98b051b03681de6028993a5d14ac93cb', NULL, '302556', NULL);
+INSERT INTO `act_ru_identitylink`
+VALUES ('302610', 1, NULL, 'participant', '0b7625fedaa05e85f282486e1c9c91b9', NULL, '302599', NULL);
+INSERT INTO `act_ru_identitylink`
+VALUES ('302628', 1, NULL, 'participant', 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, '302599', NULL);
-- ----------------------------
-- Table structure for act_ru_job
-- ----------------------------
DROP TABLE IF EXISTS `act_ru_job`;
-CREATE TABLE `act_ru_job` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL,
- `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `RETRIES_` int(11) NULL DEFAULT NULL,
- `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DUEDATE_` timestamp(3) NULL DEFAULT NULL,
- `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_FK_JOB_EXCEPTION`(`EXCEPTION_STACK_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_ru_job`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL,
+ `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `RETRIES_` int(11) NULL DEFAULT NULL,
+ `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DUEDATE_` timestamp(3) NULL DEFAULT NULL,
+ `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_FK_JOB_EXCEPTION`(`EXCEPTION_STACK_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for act_ru_task
-- ----------------------------
DROP TABLE IF EXISTS `act_ru_task`;
-CREATE TABLE `act_ru_task` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DELEGATION_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PRIORITY_` int(11) NULL DEFAULT NULL,
- `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL,
- `DUE_DATE_` datetime(3) NULL DEFAULT NULL,
- `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL,
- `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
- `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_TASK_CREATE`(`CREATE_TIME_`) USING BTREE,
- INDEX `ACT_FK_TASK_EXE`(`EXECUTION_ID_`) USING BTREE,
- INDEX `ACT_FK_TASK_PROCINST`(`PROC_INST_ID_`) USING BTREE,
- INDEX `ACT_FK_TASK_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_ru_task`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DELEGATION_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PRIORITY_` int(11) NULL DEFAULT NULL,
+ `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL,
+ `DUE_DATE_` datetime(3) NULL DEFAULT NULL,
+ `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL,
+ `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '',
+ `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_TASK_CREATE`(`CREATE_TIME_`) USING BTREE,
+ INDEX `ACT_FK_TASK_EXE`(`EXECUTION_ID_`) USING BTREE,
+ INDEX `ACT_FK_TASK_PROCINST`(`PROC_INST_ID_`) USING BTREE,
+ INDEX `ACT_FK_TASK_PROCDEF`(`PROC_DEF_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_ru_task
-- ----------------------------
-INSERT INTO `act_ru_task` VALUES ('302595', 1, '302556', '302556', 'process_leave:1:302555', '人事审批', NULL, NULL, 'user2', NULL, '98b051b03681de6028993a5d14ac93cb', NULL, 50, '2022-03-31 11:05:44.000', NULL, NULL, 1, '', NULL);
-INSERT INTO `act_ru_task` VALUES ('302627', 1, '302623', '302599', 'process_leave:1:302555', '总经理审批', NULL, NULL, 'allmanager', NULL, 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, 50, '2022-03-31 11:18:00.000', NULL, NULL, 1, '', NULL);
+INSERT INTO `act_ru_task`
+VALUES ('302595', 1, '302556', '302556', 'process_leave:1:302555', '人事审批', NULL, NULL, 'user2', NULL,
+ '98b051b03681de6028993a5d14ac93cb', NULL, 50, '2022-03-31 11:05:44.000', NULL, NULL, 1, '', NULL);
+INSERT INTO `act_ru_task`
+VALUES ('302627', 1, '302623', '302599', 'process_leave:1:302555', '总经理审批', NULL, NULL, 'allmanager', NULL,
+ 'd818ac6a86cf1a64d2184bf0699d67a8', NULL, 50, '2022-03-31 11:18:00.000', NULL, NULL, 1, '', NULL);
-- ----------------------------
-- Table structure for act_ru_variable
-- ----------------------------
DROP TABLE IF EXISTS `act_ru_variable`;
-CREATE TABLE `act_ru_variable` (
- `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `REV_` int(11) NULL DEFAULT NULL,
- `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
- `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `DOUBLE_` double NULL DEFAULT NULL,
- `LONG_` bigint(20) NULL DEFAULT NULL,
- `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
- PRIMARY KEY (`ID_`) USING BTREE,
- INDEX `ACT_IDX_VARIABLE_TASK_ID`(`TASK_ID_`) USING BTREE,
- INDEX `ACT_FK_VAR_EXE`(`EXECUTION_ID_`) USING BTREE,
- INDEX `ACT_FK_VAR_PROCINST`(`PROC_INST_ID_`) USING BTREE,
- INDEX `ACT_FK_VAR_BYTEARRAY`(`BYTEARRAY_ID_`) USING BTREE,
- CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
- CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
+CREATE TABLE `act_ru_variable`
+(
+ `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `REV_` int(11) NULL DEFAULT NULL,
+ `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `DOUBLE_` double NULL DEFAULT NULL,
+ `LONG_` bigint(20) NULL DEFAULT NULL,
+ `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
+ PRIMARY KEY (`ID_`) USING BTREE,
+ INDEX `ACT_IDX_VARIABLE_TASK_ID`(`TASK_ID_`) USING BTREE,
+ INDEX `ACT_FK_VAR_EXE`(`EXECUTION_ID_`) USING BTREE,
+ INDEX `ACT_FK_VAR_PROCINST`(`PROC_INST_ID_`) USING BTREE,
+ INDEX `ACT_FK_VAR_BYTEARRAY`(`BYTEARRAY_ID_`) USING BTREE,
+ CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act_ru_variable
-- ----------------------------
-INSERT INTO `act_ru_variable` VALUES ('302559', 1, 'serializable', 'baseTask', '302556', '302556', NULL, '302558', NULL, NULL, NULL, NULL);
-INSERT INTO `act_ru_variable` VALUES ('302563', 1, 'integer', 'day', '302556', '302556', NULL, NULL, NULL, 3, '3', NULL);
-INSERT INTO `act_ru_variable` VALUES ('302569', 1, 'boolean', 'flag', '302556', '302556', NULL, NULL, NULL, 1, NULL, NULL);
-INSERT INTO `act_ru_variable` VALUES ('302571', 1, 'integer', 'needfinish', '302556', '302556', NULL, NULL, NULL, 1, '1', NULL);
-INSERT INTO `act_ru_variable` VALUES ('302574', 1, 'serializable', 'leaveOpinionList', '302556', '302556', NULL, '302573', NULL, NULL, NULL, NULL);
-INSERT INTO `act_ru_variable` VALUES ('302602', 1, 'serializable', 'baseTask', '302599', '302599', NULL, '302601', NULL, NULL, NULL, NULL);
-INSERT INTO `act_ru_variable` VALUES ('302606', 1, 'integer', 'day', '302599', '302599', NULL, NULL, NULL, 5, '5', NULL);
-INSERT INTO `act_ru_variable` VALUES ('302612', 1, 'boolean', 'flag', '302599', '302599', NULL, NULL, NULL, 1, NULL, NULL);
-INSERT INTO `act_ru_variable` VALUES ('302614', 1, 'integer', 'needfinish', '302599', '302599', NULL, NULL, NULL, 1, '1', NULL);
-INSERT INTO `act_ru_variable` VALUES ('302617', 1, 'serializable', 'leaveOpinionList', '302599', '302599', NULL, '302616', NULL, NULL, NULL, NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302559', 1, 'serializable', 'baseTask', '302556', '302556', NULL, '302558', NULL, NULL, NULL, NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302563', 1, 'integer', 'day', '302556', '302556', NULL, NULL, NULL, 3, '3', NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302569', 1, 'boolean', 'flag', '302556', '302556', NULL, NULL, NULL, 1, NULL, NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302571', 1, 'integer', 'needfinish', '302556', '302556', NULL, NULL, NULL, 1, '1', NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302574', 1, 'serializable', 'leaveOpinionList', '302556', '302556', NULL, '302573', NULL, NULL, NULL, NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302602', 1, 'serializable', 'baseTask', '302599', '302599', NULL, '302601', NULL, NULL, NULL, NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302606', 1, 'integer', 'day', '302599', '302599', NULL, NULL, NULL, 5, '5', NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302612', 1, 'boolean', 'flag', '302599', '302599', NULL, NULL, NULL, 1, NULL, NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302614', 1, 'integer', 'needfinish', '302599', '302599', NULL, NULL, NULL, 1, '1', NULL);
+INSERT INTO `act_ru_variable`
+VALUES ('302617', 1, 'serializable', 'leaveOpinionList', '302599', '302599', NULL, '302616', NULL, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for base
-- ----------------------------
DROP TABLE IF EXISTS `base`;
-CREATE TABLE `base` (
- `id` int(11) NOT NULL,
- `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
- PRIMARY KEY (`id`) USING BTREE
+CREATE TABLE `base`
+(
+ `id` int(11) NOT NULL,
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of base
-- ----------------------------
-INSERT INTO `base` VALUES (1, '22');
+INSERT INTO `base`
+VALUES (1, '22');
-- ----------------------------
-- Table structure for blog_article
-- ----------------------------
DROP TABLE IF EXISTS `blog_article`;
-CREATE TABLE `blog_article` (
- `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
- `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'code',
- `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标题',
- `first_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '列表缩略图',
- `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章内容',
- `read_number` int(11) NOT NULL DEFAULT 0 COMMENT '阅读次数',
- `top_num` int(11) NULL DEFAULT 0 COMMENT '次序(置顶功能)',
- `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
- `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
- `create_date` datetime(0) NULL DEFAULT NULL,
- `update_date` datetime(0) NULL DEFAULT NULL,
- `del_flag` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0正常1删除',
- PRIMARY KEY (`id`) USING BTREE
+CREATE TABLE `blog_article`
+(
+ `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+ `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'code',
+ `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标题',
+ `first_img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '列表缩略图',
+ `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章内容',
+ `read_number` int(11) NOT NULL DEFAULT 0 COMMENT '阅读次数',
+ `top_num` int(11) NULL DEFAULT 0 COMMENT '次序(置顶功能)',
+ `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+ `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
+ `create_date` datetime(0) NULL DEFAULT NULL,
+ `update_date` datetime(0) NULL DEFAULT NULL,
+ `del_flag` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0正常1删除',
+ PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of blog_article
-- ----------------------------
-INSERT INTO `blog_article` VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world', 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '今天开发个人开源框架,完善了系统模块后,集成工作流功能模块,在新的resources下面新建freemarker前端页面(ftl页面),然后正常开发到展示流程表的时候,后台报错情景重新:Could not resolve view with name \'/actList\' in servlet with name \'dispatcherServlet\'
当时我就想是不是映射地址出错了,检查多次后发现也没错,怎么spring mvc就映射不到呢,而且是相同的的地址路径(模块不一样),和其他模块resources一致的路径,然后我系统模块是完全没问题的,我感觉应该是freemarker配置的问题,然后各种尝试,各种检查,各种查阅资料,发现,的确是freemarker的问题,我少配置了一项freemarker配置:FreeMarkerConfigurationFactory类下的属性:preferFileSystemAccess,<---对就是它,我们来看源码发现默认是true
Set whether to prefer file system access for template loading. File system access enables hot detection of template changes.
If this is enabled, FreeMarkerConfigurationFactory will try to resolve the specified \"templateLoaderPath\" as file system resource (which will work for expanded class path resources and ServletContext resources too).
Default is \"true\". Turn this off to always load via SpringTemplateLoader (i.e. as stream, without hot detection of template changes), which might be necessary if some of your templates reside in an expanded classes directory while others reside in jar files.
如果启用就以templateLoaderPath设置的路径来加载,默认为true,设置为false的话就以SpringTemplateLoader方式访问,那么就是流的方式访问,这可能是必要的,如果你的一些模板驻留在一个扩展的类而其他人驻留在jar文件的目录。
意思就是 如果你的文件在jar包文件目录下,就有必要设置为false,我们是多模块的,最终只运行一个模块,其他模块都是以jar包来加载的,我们要加载jar包里面的文件目录,必须要把这个属性设置为false才行,debug源码看看,先上配置文件:
,用继承:WebMvcConfigurationSupport 来替代即可,这里有一点要特别注意的,就是 有且只能继承一次WebMvcConfigurationSupport 多次会出现部分失效问题。
今天开发个人开源框架,完善了系统模块后,集成工作流功能模块,在新的resources下面新建freemarker前端页面(ftl页面),然后正常开发到展示流程表的时候,后台报错情景重新:Could not resolve view with name \' /
+ actList\' in servlet with name \'dispatcherServlet\'
当时我就想是不是映射地址出错了,检查多次后发现也没错,怎么spring mvc就映射不到呢,而且是相同的的地址路径(模块不一样),和其他模块resources一致的路径,然后我系统模块是完全没问题的,我感觉应该是freemarker配置的问题,然后各种尝试,各种检查,各种查阅资料,发现,的确是freemarker的问题,我少配置了一项freemarker配置:FreeMarkerConfigurationFactory类下的属性:preferFileSystemAccess,<---对就是它,我们来看源码发现默认是true
Set whether to prefer file system access for template loading. File system access enables hot detection of template changes.
If this is enabled, FreeMarkerConfigurationFactory will try to resolve the specified \"templateLoaderPath\" as file system resource (which will work for expanded class path resources and ServletContext resources too).
Default is \"true\". Turn this off to always load via SpringTemplateLoader (i.e. as stream, without hot detection of template changes), which might be necessary if some of your templates reside in an expanded classes directory while others reside in jar files.
如果启用就以templateLoaderPath设置的路径来加载,默认为true,设置为false的话就以SpringTemplateLoader方式访问,那么就是流的方式访问,这可能是必要的,如果你的一些模板驻留在一个扩展的类而其他人驻留在jar文件的目录。
意思就是 如果你的文件在jar包文件目录下,就有必要设置为false,我们是多模块的,最终只运行一个模块,其他模块都是以jar包来加载的,我们要加载jar包里面的文件目录,必须要把这个属性设置为false才行,debug源码看看,先上配置文件:
,用继承:WebMvcConfigurationSupport 来替代即可,这里有一点要特别注意的,就是 有且只能继承一次WebMvcConfigurationSupport 多次会出现部分失效问题。
+INSERT INTO "LEN"."BLOG_ARTICLE"
+VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world',
+ 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '
+', '16', '0', 'acfc0e9232f54732a5d9ffe9071bf572', 'a4a743bffe9711e7b472201a068c6482',
+ TO_DATE('2018-10-14 17:47:41', 'YYYY-MM-DD HH24:MI:SS'),
+ TO_DATE('2018-11-25 17:35:00', 'YYYY-MM-DD HH24:MI:SS'), '0');
+INSERT INTO "LEN"."BLOG_ARTICLE"
+VALUES ('3887934708c54f49bc5a566f77e2a759', '76249265', 'hello,world',
+ 'http://localhost:8081/img/77e5338a-217c-4b07-a3fd-63f20411dfcb.png', '
-
- lenosp
- com.len
- lenosp-2.0-SNAPSHOT
-
- 4.0.0
+
+
+ lenosp
+ com.len
+ lenosp-2.0-SNAPSHOT
+
+ 4.0.0
- len-activiti
+ len-activiti
- len-activiti
- http://maven.apache.org
-
+ len-activiti
+ http://maven.apache.org
+
-
- UTF-8
- 5.22.0
-
-
+
+ UTF-8
+ 5.22.0
+
+
-
-
- org.activiti
- activiti-engine
- ${activiti.version}
-
+
+
+ org.activiti
+ activiti-engine
+ ${activiti.version}
+
-
- org.activiti
- activiti-spring
- ${activiti.version}
-
+
+ org.activiti
+ activiti-spring
+ ${activiti.version}
+
-
- org.activiti
- activiti-modeler
- ${activiti.version}
-
+
+ org.activiti
+ activiti-modeler
+ ${activiti.version}
+
-
- org.activiti
- activiti-diagram-rest
- ${activiti.version}
-
-
+
+ org.activiti
+ activiti-diagram-rest
+ ${activiti.version}
+
+
-
-
- com.len
- len-sys
-
-
- junit
- junit
- 4.12
-
-
-
-
-
- com.len
- len-sys
- lenosp-2.0-SNAPSHOT
-
+
+
+ com.len
+ len-sys
+
+
+ junit
+ junit
+ 4.12
+
-
+
+
+
+ com.len
+ len-sys
+ lenosp-2.0-SNAPSHOT
+
+
+
-
-
-
- src/main/java
-
- **/*.xml
-
-
-
- src/main/resources
-
- **.*
- **/*.*
- **/*/*.*
-
-
-
-
+
+
+
+ src/main/java
+
+ **/*.xml
+
+
+
+ src/main/resources
+
+ **.*
+ **/*.*
+ **/*/*.*
+
+
+
+
diff --git a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java
index 155ca87..dcd7efa 100644
--- a/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java
+++ b/len-activiti/src/main/java/com/len/actlistener/ActNodeListener.java
@@ -1,20 +1,22 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.actlistener;
+import java.util.List;
+
+import org.activiti.engine.delegate.DelegateTask;
+import org.activiti.engine.delegate.TaskListener;
+
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.len.entity.ActAssignee;
import com.len.service.ActAssigneeService;
@@ -22,23 +24,18 @@ import com.len.service.impl.ActAssigneeServiceImpl;
import com.len.util.AssigneeType;
import com.len.util.SpringUtil;
-import java.util.List;
-
-import org.activiti.engine.delegate.DelegateTask;
-import org.activiti.engine.delegate.TaskListener;
-
/**
* @author zhuxiaomeng
* @date 2018/1/20.
* @email lenospmiller@gmail.com
- *
- * 流程监听器 动态注入节点办理人
+ *
+ * 流程监听器 动态注入节点办理人
*/
public class ActNodeListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
- //KEY
+ // KEY
String nodeId = delegateTask.getTaskDefinitionKey();
ActAssigneeService actAssigneeService = SpringUtil.getBean(ActAssigneeServiceImpl.class);
List assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId)));
diff --git a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java
index ab993a0..4ba5c5b 100644
--- a/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java
+++ b/len-activiti/src/main/java/com/len/actlistener/ActStartNodeListener.java
@@ -1,42 +1,40 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.actlistener;
-import com.len.entity.BaseTask;
+import java.util.Map;
+
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
-import java.util.Map;
+import com.len.entity.BaseTask;
/**
* @author zhuxiaomeng
* @date 2018/1/20.
* @email lenospmiller@gmail.com
- *
- * 流程监听器 动态注入节点办理人
+ *
+ * 流程监听器 动态注入节点办理人
*/
public class ActStartNodeListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
- //KEY
+ // KEY
String nodeId = delegateTask.getTaskDefinitionKey();
Map variables = delegateTask.getVariables();
- BaseTask baseTask = (BaseTask) variables.get("baseTask");
+ BaseTask baseTask = (BaseTask)variables.get("baseTask");
delegateTask.setAssignee(baseTask.getUserId());
diff --git a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java
index ebac5f5..65c1904 100644
--- a/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java
+++ b/len-activiti/src/main/java/com/len/actlistener/LeaveListenerImpl.java
@@ -1,31 +1,29 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.actlistener;
-import com.len.entity.UserLeave;
+import java.util.Map;
+
import org.activiti.engine.delegate.DelegateTask;
-import java.util.Map;
+import com.len.entity.UserLeave;
/**
* @author zhuxiaomeng
* @date 2018/1/25.
* @email lenospmiller@gmail.com
- *
- * 自定义请假流程 监听器
+ *
+ * 自定义请假流程 监听器
*/
public class LeaveListenerImpl extends ActNodeListener {
@@ -34,7 +32,7 @@ public class LeaveListenerImpl extends ActNodeListener {
super.notify(delegateTask);
String taskId = delegateTask.getId();
Map map = delegateTask.getVariables();
- UserLeave userLeave = (UserLeave) map.get("userLeave");
+ UserLeave userLeave = (UserLeave)map.get("userLeave");
delegateTask.addCandidateUser(userLeave.getUserId());
}
}
diff --git a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java
index 8d9145f..ccf0170 100644
--- a/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java
+++ b/len-activiti/src/main/java/com/len/actlistener/ListenUserRole.java
@@ -1,25 +1,21 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.actlistener;
-import com.len.entity.SysRole;
-import com.len.entity.SysRoleUser;
-import com.len.entity.SysUser;
-import com.len.service.SysUserService;
-import com.len.util.LenResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import org.activiti.engine.IdentityService;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
@@ -31,16 +27,18 @@ import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import com.len.entity.SysRole;
+import com.len.entity.SysRoleUser;
+import com.len.entity.SysUser;
+import com.len.service.SysUserService;
+import com.len.util.LenResponse;
/**
* @author zhuxiaomeng
* @date 2018/1/25.
* @email lenospmiller@gmail.com
- *
- * 切入实现系统用户 角色 用户-角色 同步到 activiti 用户 组 用户组 同步到工作流,模块化 无侵入
+ *
+ * 切入实现系统用户 角色 用户-角色 同步到 activiti 用户 组 用户组 同步到工作流,模块化 无侵入
*/
@Aspect
@Component
@@ -52,7 +50,7 @@ public class ListenUserRole {
@Autowired
SysUserService userService;
- /**********************用户处理begin***************************/
+ /********************** 用户处理begin ***************************/
/**
* 明确切入方法的参数
*
@@ -61,15 +59,15 @@ public class ListenUserRole {
@Around("execution(com.len.util.LenResponse com.len.controller.UserController.updateUser(*,String[]))")
public Object listenerUserUpdate(ProceedingJoinPoint joinPoint) throws Throwable {
Object o = new Object();
- //更新前拿到用户-角色数据
+ // 更新前拿到用户-角色数据
SysRoleUser sysRoleUser = new SysRoleUser();
Object[] args = joinPoint.getArgs();
- sysRoleUser.setUserId(((SysUser) args[0]).getId());
+ sysRoleUser.setUserId(((SysUser)args[0]).getId());
List keyList = userService.selectByCondition(sysRoleUser);
List strings = new ArrayList<>();
keyList.forEach(sysRoleUser1 -> strings.add(sysRoleUser1.getRoleId()));
o = joinPoint.proceed(joinPoint.getArgs());
- LenResponse jsonUtil = (LenResponse) o;
+ LenResponse jsonUtil = (LenResponse)o;
if (jsonUtil.isFlag()) {
changeUser(args, strings);
}
@@ -86,9 +84,9 @@ public class ListenUserRole {
Object o = joinPoint.proceed(joinPoint.getArgs());
Object[] args = joinPoint.getArgs();
if (args.length == 2) {
- LenResponse jsonUtil = (LenResponse) o;
+ LenResponse jsonUtil = (LenResponse)o;
if (jsonUtil.isFlag()) {
- changeUser(args, Arrays.asList((String[]) args[1]));
+ changeUser(args, Arrays.asList((String[])args[1]));
}
}
return o;
@@ -97,34 +95,33 @@ public class ListenUserRole {
@Around("execution(com.len.util.LenResponse com.len.controller.UserController.del(..))")
public Object listenDelUser(ProceedingJoinPoint point) throws Throwable {
Object o = point.proceed(point.getArgs());
- LenResponse util = (LenResponse) o;
+ LenResponse util = (LenResponse)o;
if (util.isFlag()) {
Object[] args = point.getArgs();
- identityService.deleteUser((String) args[0]);
+ identityService.deleteUser((String)args[0]);
}
return o;
}
-
/**
* 保存进 activiti 用户 角色 用户角色中间表
*
* @param obj
*/
private void changeUser(Object[] obj, List strings) {
- SysUser user = (SysUser) obj[0];
+ SysUser user = (SysUser)obj[0];
identityService.deleteUser(user.getId());
User au = new UserEntity();
au.setId(user.getId());
-// au.setFirstName(user.getRealName());
+ // au.setFirstName(user.getRealName());
au.setEmail(user.getEmail());
identityService.saveUser(au);
- //删除用户-组关联
+ // 删除用户-组关联
for (String roleId : strings) {
identityService.deleteMembership(user.getId(), roleId);
}
- //再次关联
+ // 再次关联
if (!strings.isEmpty()) {
for (String roleId : strings) {
identityService.createMembership(user.getId(), roleId);
@@ -132,14 +129,13 @@ public class ListenUserRole {
}
}
- /**********************用户处理end***************************/
-
+ /********************** 用户处理end ***************************/
- /**********************角色处理begin***************************/
+ /********************** 角色处理begin ***************************/
@Around("execution(com.len.util.LenResponse com.len.controller.RoleController.addRole(*,String[]))")
public Object listenRoleInsert(ProceedingJoinPoint joinPoint) throws Throwable {
Object o = joinPoint.proceed(joinPoint.getArgs());
- LenResponse j = (LenResponse) o;
+ LenResponse j = (LenResponse)o;
if (j.isFlag()) {
Object[] args = joinPoint.getArgs();
if (args.length == 2) {
@@ -154,7 +150,7 @@ public class ListenUserRole {
Object o = joinPoint.proceed(joinPoint.getArgs());
Object[] args = joinPoint.getArgs();
if (args.length == 2) {
- if (((LenResponse) o).isFlag()) {
+ if (((LenResponse)o).isFlag()) {
changeRole(args);
}
}
@@ -165,10 +161,10 @@ public class ListenUserRole {
@Around("execution(com.len.util.LenResponse com.len.controller.RoleController.del(..))")
public Object listenDelRole(ProceedingJoinPoint point) throws Throwable {
Object o = point.proceed(point.getArgs());
- LenResponse util = (LenResponse) o;
+ LenResponse util = (LenResponse)o;
if (util.isFlag()) {
Object[] args = point.getArgs();
- identityService.deleteGroup((String) args[0]);
+ identityService.deleteGroup((String)args[0]);
}
return o;
}
@@ -179,7 +175,7 @@ public class ListenUserRole {
* @param obj
*/
public void changeRole(Object[] obj) {
- SysRole role = (SysRole) obj[0];
+ SysRole role = (SysRole)obj[0];
identityService.deleteGroup(role.getId());
Group group = new GroupEntity();
group.setId(role.getId());
@@ -187,5 +183,5 @@ public class ListenUserRole {
identityService.saveGroup(group);
}
- /**********************角色处理end***************************/
+ /********************** 角色处理end ***************************/
}
diff --git a/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java b/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java
index cdd1ed6..539f53e 100644
--- a/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java
+++ b/len-activiti/src/main/java/com/len/config/ActPropertiesConfig.java
@@ -1,17 +1,14 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.config;
@@ -28,19 +25,19 @@ import org.springframework.context.annotation.PropertySource;
@PropertySource("classpath:properties\\activiti.properties")
public class ActPropertiesConfig {
- @Value("${modelId}")
- private String modelId;
+ @Value("${modelId}")
+ private String modelId;
- public String getModelId() {
- return modelId;
- }
+ public String getModelId() {
+ return modelId;
+ }
- public void setModelId(String modelId) {
- this.modelId = modelId;
- }
+ public void setModelId(String modelId) {
+ this.modelId = modelId;
+ }
- @Bean
- public ActPropertiesConfig getActPropertiesConfig(){
- return new ActPropertiesConfig();
- }
+ @Bean
+ public ActPropertiesConfig getActPropertiesConfig() {
+ return new ActPropertiesConfig();
+ }
}
diff --git a/len-activiti/src/main/java/com/len/config/ActivitiConfig.java b/len-activiti/src/main/java/com/len/config/ActivitiConfig.java
index bc37a6d..f4bb63f 100644
--- a/len-activiti/src/main/java/com/len/config/ActivitiConfig.java
+++ b/len-activiti/src/main/java/com/len/config/ActivitiConfig.java
@@ -1,21 +1,9 @@
package com.len.config;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
import javax.sql.DataSource;
-import org.activiti.engine.DynamicBpmnService;
-import org.activiti.engine.FormService;
-import org.activiti.engine.HistoryService;
-import org.activiti.engine.IdentityService;
-import org.activiti.engine.ManagementService;
-import org.activiti.engine.ProcessEngine;
-import org.activiti.engine.ProcessEngineConfiguration;
-import org.activiti.engine.RepositoryService;
-import org.activiti.engine.RuntimeService;
-import org.activiti.engine.TaskService;
+import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
-import org.activiti.image.HMProcessDiagramGenerator;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.activiti.spring.SpringProcessEngineConfiguration;
@@ -23,12 +11,11 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
/**
- * Created by liuruijie on 2017/2/20.
- * activiti工作流配置
+ * Created by liuruijie on 2017/2/20. activiti工作流配置
*/
@Configuration
public class ActivitiConfig {
@@ -40,17 +27,18 @@ public class ActivitiConfig {
* spring 集成 activiti
*/
@Bean
- public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager) {
+ public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource,
+ PlatformTransactionManager transactionManager) {
SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
processEngineConfiguration.setDataSource(dataSource);
- //表不存在创建表
+ // 表不存在创建表
processEngineConfiguration.setDatabaseSchemaUpdate("true");
- //指定数据库
+ // 指定数据库
processEngineConfiguration.setDatabaseType(dataType);
processEngineConfiguration.setTransactionManager(transactionManager);
- //历史变量
+ // 历史变量
processEngineConfiguration.setHistory("full");
- //指定字体
+ // 指定字体
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setAnnotationFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
@@ -60,11 +48,12 @@ public class ActivitiConfig {
return processEngineConfiguration;
}
- //流程引擎,与spring整合使用factoryBean
+ // 流程引擎,与spring整合使用factoryBean
@Bean
public ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration) {
ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
- processEngineFactoryBean.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
+ processEngineFactoryBean
+ .setProcessEngineConfiguration((ProcessEngineConfigurationImpl)processEngineConfiguration);
return processEngineFactoryBean;
}
diff --git a/len-activiti/src/main/java/com/len/controller/ActivitiController.java b/len-activiti/src/main/java/com/len/controller/ActivitiController.java
index 70b477e..372a500 100644
--- a/len-activiti/src/main/java/com/len/controller/ActivitiController.java
+++ b/len-activiti/src/main/java/com/len/controller/ActivitiController.java
@@ -1,38 +1,26 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.controller;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.len.base.BaseController;
-import com.len.config.ActPropertiesConfig;
-import com.len.entity.*;
-import com.len.exception.LenException;
-import com.len.service.ActAssigneeService;
-import com.len.service.RoleService;
-import com.len.service.RoleUserService;
-import com.len.service.SysUserService;
-import com.len.util.Base64Utils;
-import com.len.util.Checkbox;
-import com.len.util.LenResponse;
-import com.len.util.ReType;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
@@ -55,50 +43,55 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.len.base.BaseController;
+import com.len.config.ActPropertiesConfig;
+import com.len.entity.*;
+import com.len.exception.LenException;
+import com.len.service.ActAssigneeService;
+import com.len.service.RoleService;
+import com.len.service.RoleUserService;
+import com.len.service.SysUserService;
+import com.len.util.Base64Utils;
+import com.len.util.Checkbox;
+import com.len.util.LenResponse;
+import com.len.util.ReType;
/**
* @author zhuxiaomeng
* @date 2018/1/13.
* @email lenospmiller@gmail.com
- *
- * 流程管理 流程创建、发布 流程节点绑定角色/用户(绑定用户 开始ing)
+ *
+ * 流程管理 流程创建、发布 流程节点绑定角色/用户(绑定用户 开始ing)
*/
@Controller
@RequestMapping(value = "/act")
public class ActivitiController extends BaseController {
+ @Autowired
+ ActivitiService activitiService;
+ @Autowired
+ ActPropertiesConfig actPropertiesConfig;
@Autowired
private RepositoryService repositoryService;
-
@Autowired
private ObjectMapper objectMapper;
-
@Autowired
private IdentityService identityService;
-
@Autowired
private SysUserService userService;
-
@Autowired
private RoleService roleService;
-
@Autowired
private RoleUserService roleUserService;
-
@Autowired
private ActAssigneeService actAssigneeService;
- @Autowired
- ActivitiService activitiService;
-
-
/**
* 同步用户 角色 用户角色到activiti表中
*/
@@ -112,7 +105,7 @@ public class ActivitiController extends BaseController {
for (SysUser user : userList) {
au = new UserEntity();
au.setId(user.getId());
-// au.setFirstName(user.getRealName());
+ // au.setFirstName(user.getRealName());
au.setEmail(user.getEmail());
identityService.deleteUser(au.getId());
identityService.saveUser(au);
@@ -141,7 +134,6 @@ public class ActivitiController extends BaseController {
return j;
}
-
@GetMapping(value = "goActiviti")
public String goActiviti() throws UnsupportedEncodingException {
Model model = repositoryService.newModel();
@@ -163,7 +155,7 @@ public class ActivitiController extends BaseController {
repositoryService.saveModel(model);
String id = model.getId();
- //完善ModelEditorSource
+ // 完善ModelEditorSource
JSONObject editor = new JSONObject();
editor.put("id", "canvas");
editor.put("resourceId", "canvas");
@@ -189,10 +181,8 @@ public class ActivitiController extends BaseController {
*/
@GetMapping(value = "showAct")
@ResponseBody
- public ReType showAct(org.springframework.ui.Model model, ProcessDefinition definition,
- String page, String limit) {
- ProcessDefinitionQuery processDefinitionQuery = repositoryService
- .createProcessDefinitionQuery();
+ public ReType showAct(org.springframework.ui.Model model, ProcessDefinition definition, String page, String limit) {
+ ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List processDefinitionList = null;
if (definition != null) {
if (!StringUtils.isEmpty(definition.getDeploymentId())) {
@@ -203,16 +193,15 @@ public class ActivitiController extends BaseController {
}
}
- processDefinitionList = processDefinitionQuery.listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1), Integer.valueOf(limit));
+ processDefinitionList = processDefinitionQuery.listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1),
+ Integer.valueOf(limit));
long count = repositoryService.createProcessDefinitionQuery().count();
-// long count = repositoryService.createDeploymentQuery().count();
+ // long count = repositoryService.createDeploymentQuery().count();
List list = new ArrayList<>();
- processDefinitionList
- .forEach(processDefinition -> list.add(new ProcessDefinition(processDefinition)));
+ processDefinitionList.forEach(processDefinition -> list.add(new ProcessDefinition(processDefinition)));
return new ReType(count, list);
}
-
@GetMapping(value = "goActModel")
public String goActModel(org.springframework.ui.Model model) {
return "/actModelList";
@@ -223,8 +212,7 @@ public class ActivitiController extends BaseController {
*/
@GetMapping(value = "showAm")
@ResponseBody
- public ReType showModel(org.springframework.ui.Model model, ActModel actModel, String page,
- String limit) {
+ public ReType showModel(org.springframework.ui.Model model, ActModel actModel, String page, String limit) {
ModelQuery modelQuery = repositoryService.createModelQuery();
if (actModel != null) {
if (!StringUtils.isEmpty(actModel.getKey())) {
@@ -234,8 +222,8 @@ public class ActivitiController extends BaseController {
modelQuery.modelNameLike("%" + actModel.getName() + "%");
}
}
- List models = modelQuery
- .listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1), Integer.valueOf(limit));
+ List models =
+ modelQuery.listPage(Integer.valueOf(limit) * (Integer.valueOf(page) - 1), Integer.valueOf(limit));
long count = repositoryService.createModelQuery().count();
List list = new ArrayList<>();
models.forEach(mo -> list.add(new ActModel(mo)));
@@ -264,15 +252,13 @@ public class ActivitiController extends BaseController {
return LenResponse.error("数据不符合要求");
}
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
- //发布流程
+ // 发布流程
String processName = modelData.getName() + ".bpmn20.xml";
String convertToXML = new String(bpmnBytes);
System.out.println(convertToXML);
- Deployment deployment = repositoryService.createDeployment()
- .name(modelData.getName())
- .addString(processName, new String(bpmnBytes, "UTF-8"))
- .deploy();
+ Deployment deployment = repositoryService.createDeployment().name(modelData.getName())
+ .addString(processName, new String(bpmnBytes, "UTF-8")).deploy();
modelData.setDeploymentId(deployment.getId());
repositoryService.saveModel(modelData);
} catch (LenException e) {
@@ -285,7 +271,6 @@ public class ActivitiController extends BaseController {
return j;
}
-
/**
* 根据流程部署id获取节点并且传到前端
*
@@ -294,11 +279,10 @@ public class ActivitiController extends BaseController {
* @return
*/
@GetMapping("goAssignee/{deploymentId}")
- public String goAssignee(@PathVariable("deploymentId") String deploymentId,
- org.springframework.ui.Model model) {
- /**根据流程实例id查询出所有流程节点*/
+ public String goAssignee(@PathVariable("deploymentId") String deploymentId, org.springframework.ui.Model model) {
+ /** 根据流程实例id查询出所有流程节点 */
List activityList = actAssigneeService.getActivityList(deploymentId);
- /**角色和节点关系封装成list*/
+ /** 角色和节点关系封装成list */
List roleList = roleService.list();
Checkbox checkbox = null;
Map map = null;
@@ -307,11 +291,11 @@ public class ActivitiController extends BaseController {
List checkboxList = null;
for (ActivityImpl activiti : activityList) {
map = new HashMap<>();
- String name = (String) activiti.getProperty("name");
+ String name = (String)activiti.getProperty("name");
if (StringUtils.isEmpty(name) || "start".equals(name) || "end".equals(name)) {
continue;
}
- //节点id 、name、节点目前关联的角色 封装成进map
+ // 节点id 、name、节点目前关联的角色 封装成进map
String nodeId = activiti.getId();
assigneeList = actAssigneeService.list(new QueryWrapper<>(new ActAssignee(nodeId)));
List strings = new ArrayList<>();
@@ -356,16 +340,16 @@ public class ActivitiController extends BaseController {
String nodeId = entry.getKey().substring(0, sub);
nodeId = nodeId.substring(nodeId.lastIndexOf("_") + 1, nodeId.length());
String nodeName = entry.getKey().substring(entry.getKey().lastIndexOf("_") + 1, entry.getKey().length());
- //更新进list
+ // 更新进list
assignee.setAssigneeType(3);
assignee.setRoleId(entry.getValue()[0]);
assignee.setSid(nodeId);
assignee.setActivtiName(nodeName);
- //先清除
+ // 先清除
actAssigneeService.deleteByNodeId(nodeId);
assigneeList.add(assignee);
}
- //后添加 在map循环里添加 多角色会导致添加了的再次被删除 so 要拿出来
+ // 后添加 在map循环里添加 多角色会导致添加了的再次被删除 so 要拿出来
for (ActAssignee actAssignee : assigneeList) {
actAssigneeService.save(actAssignee);
}
@@ -391,7 +375,7 @@ public class ActivitiController extends BaseController {
if (StringUtils.isEmpty(nodeId) || "start".equals(nodeId) || "end".equals(nodeId)) {
continue;
}
- /**接触节点和代办关联*/
+ /** 接触节点和代办关联 */
actAssigneeService.deleteByNodeId(nodeId);
}
repositoryService.deleteDeployment(id, true);
@@ -404,9 +388,6 @@ public class ActivitiController extends BaseController {
return j;
}
- @Autowired
- ActPropertiesConfig actPropertiesConfig;
-
@GetMapping("shinePics/{processInstanceId}")
public String shinePics(org.springframework.ui.Model model, @PathVariable String processInstanceId) {
model.addAttribute("processInstanceId", processInstanceId);
@@ -416,7 +397,7 @@ public class ActivitiController extends BaseController {
@GetMapping("getShineProcImage")
@ResponseBody
public JSONObject getShineProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId)
- throws IOException {
+ throws IOException {
JSONObject result = new JSONObject();
JSONArray shineProImages = new JSONArray();
InputStream imageStream = activitiService.generateStream(processInstanceId, true);
@@ -436,7 +417,6 @@ public class ActivitiController extends BaseController {
List taskSqu = activitiService.getTaskSqu(processInstanceId);
-
result.put("id", UUID.randomUUID().toString());
result.put("errorNo", 0);
result.put("images", shineProImages);
@@ -463,5 +443,4 @@ public class ActivitiController extends BaseController {
return j;
}
-
}
diff --git a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java
index 25a92cd..cde019d 100644
--- a/len-activiti/src/main/java/com/len/controller/UserLeaveController.java
+++ b/len-activiti/src/main/java/com/len/controller/UserLeaveController.java
@@ -1,37 +1,28 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.controller;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.github.pagehelper.Page;
-import com.github.pagehelper.PageHelper;
-import com.len.base.BaseController;
-import com.len.base.CurrentUser;
-import com.len.core.shiro.Principal;
-import com.len.entity.BaseTask;
-import com.len.entity.LeaveOpinion;
-import com.len.entity.SysRoleUser;
-import com.len.entity.UserLeave;
-import com.len.exception.LenException;
-import com.len.service.RoleUserService;
-import com.len.service.UserLeaveService;
-import com.len.util.*;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
@@ -52,24 +43,33 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
-import sun.misc.BASE64Encoder;
-import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-import java.util.List;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import com.len.base.BaseController;
+import com.len.base.CurrentUser;
+import com.len.core.shiro.Principal;
+import com.len.entity.BaseTask;
+import com.len.entity.LeaveOpinion;
+import com.len.entity.SysRoleUser;
+import com.len.entity.UserLeave;
+import com.len.exception.LenException;
+import com.len.service.RoleUserService;
+import com.len.service.UserLeaveService;
+import com.len.util.*;
+
+import sun.misc.BASE64Encoder;
/**
* @author zhuxiaomeng
* @date 2018/1/21.
* @email lenospmiller@gmail.com
- *
- * 请假流程示例
+ *
+ * 请假流程示例
*/
@Controller
@RequestMapping("/leave")
@@ -98,16 +98,15 @@ public class UserLeaveController extends BaseController {
@Autowired
RoleUserService roleUserService;
-
+ @Autowired
+ HistoryService historyService;
private String leaveOpinionList = "leaveOpinionList";
-
@GetMapping(value = "showMain")
public String showMain(Model model) {
return "/dashboard/dashboard";
}
-
@GetMapping(value = "showMain2")
public String showMain2(Model model) {
return "/dashboard/dashboard2";
@@ -129,10 +128,11 @@ public class UserLeaveController extends BaseController {
tList = leaveService.selectListByPage(userLeave);
for (UserLeave leave : tList) {
ProcessInstance instance = runtimeService.createProcessInstanceQuery()
- .processInstanceId(leave.getProcessInstanceId()).singleResult();
- //保证运行ing
+ .processInstanceId(leave.getProcessInstanceId()).singleResult();
+ // 保证运行ing
if (instance != null) {
- Task task = this.taskService.createTaskQuery().processInstanceId(leave.getProcessInstanceId()).singleResult();
+ Task task = this.taskService.createTaskQuery().processInstanceId(leave.getProcessInstanceId())
+ .singleResult();
leave.setTaskName(task.getName());
}
}
@@ -151,9 +151,9 @@ public class UserLeaveController extends BaseController {
*/
@GetMapping("leaveDetail")
public String leaveDetail(Model model, String processId) {
- ProcessInstance instance = runtimeService.createProcessInstanceQuery()
- .processInstanceId(processId).singleResult();
- //保证运行ing
+ ProcessInstance instance =
+ runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
+ // 保证运行ing
List leaveList = null;
if (instance != null) {
Task task = this.taskService.createTaskQuery().processInstanceId(processId).singleResult();
@@ -161,18 +161,17 @@ public class UserLeaveController extends BaseController {
Object o = variables.get(leaveOpinionList);
if (o != null) {
/*获取历史审核信息*/
- leaveList = (List) o;
+ leaveList = (List)o;
}
} else {
leaveList = new ArrayList<>();
- List list = historyService.createHistoricDetailQuery().
- processInstanceId(processId).list();
+ List list = historyService.createHistoricDetailQuery().processInstanceId(processId).list();
HistoricVariableUpdate variable = null;
for (HistoricDetail historicDetail : list) {
- variable = (HistoricVariableUpdate) historicDetail;
+ variable = (HistoricVariableUpdate)historicDetail;
if (leaveOpinionList.equals(variable.getVariableName())) {
leaveList.clear();
- leaveList.addAll((List) variable.getValue());
+ leaveList.addAll((List)variable.getValue());
}
}
}
@@ -188,7 +187,7 @@ public class UserLeaveController extends BaseController {
@GetMapping("updateLeave/{taskId}")
public String updateLeave(Model model, @PathVariable String taskId) {
Map variables = taskService.getVariables(taskId);
- BaseTask baseTask = (BaseTask) variables.get("baseTask");
+ BaseTask baseTask = (BaseTask)variables.get("baseTask");
UserLeave leave = leaveService.getById(baseTask.getId());
model.addAttribute("leave", leave);
model.addAttribute("taskId", taskId);
@@ -197,7 +196,8 @@ public class UserLeaveController extends BaseController {
@PostMapping("updateLeave/updateLeave/{taskId}/{id}/{flag}")
@ResponseBody
- public LenResponse updateLeave(UserLeave leave, @PathVariable String taskId, @PathVariable String id, @PathVariable boolean flag) {
+ public LenResponse updateLeave(UserLeave leave, @PathVariable String taskId, @PathVariable String id,
+ @PathVariable boolean flag) {
LenResponse j = new LenResponse();
try {
UserLeave oldLeave = leaveService.getById(leave.getId());
@@ -222,7 +222,6 @@ public class UserLeaveController extends BaseController {
return j;
}
-
@PostMapping("addLeave")
@ResponseBody
public LenResponse addLeave(UserLeave userLeave) {
@@ -234,7 +233,7 @@ public class UserLeaveController extends BaseController {
long endTime = userLeave.getEndTime().getTime();
int days = 1;
if (endTime != beginTime) {
- days += (int) ((endTime - beginTime) / (1000 * 60 * 60 * 24));
+ days += (int)((endTime - beginTime) / (1000 * 60 * 60 * 24));
}
if (days <= 0) {
return LenResponse.error("时间输入有误");
@@ -309,7 +308,7 @@ public class UserLeaveController extends BaseController {
}
map = taskService.getVariables(taskId);
- BaseTask userLeave = (BaseTask) map.get("baseTask");
+ BaseTask userLeave = (BaseTask)map.get("baseTask");
taskEntity = new com.len.entity.Task(task1);
taskEntity.setUserName(userLeave.getUserName());
@@ -318,7 +317,7 @@ public class UserLeaveController extends BaseController {
/*如果是自己*/
if (user.getId().equals(userLeave.getUserId())) {
if (map.get("flag") != null) {
- if (!(boolean) map.get("flag")) {
+ if (!(boolean)map.get("flag")) {
objectMap.put("flag", true);
} else {
objectMap.put("flag", false);
@@ -339,8 +338,8 @@ public class UserLeaveController extends BaseController {
@GetMapping("agent/{id}")
public String agent(Model model, @PathVariable("id") String taskId) {
Map variables = taskService.getVariables(taskId);
- BaseTask baseTask = (BaseTask) variables.get("baseTask");
-// UserLeave userLeave = leaveService.selectByPrimaryKey(baseTask.getId());
+ BaseTask baseTask = (BaseTask)variables.get("baseTask");
+ // UserLeave userLeave = leaveService.selectByPrimaryKey(baseTask.getId());
model.addAttribute("leaveUrl", baseTask.getUrlpath());
model.addAttribute("taskId", taskId);
return "/act/task/task-agent-iframe";
@@ -359,38 +358,35 @@ public class UserLeaveController extends BaseController {
Map map = new HashMap<>();
map.put("flag", op.isFlag());
- //判断节点是否已经拒绝过一次了
+ // 判断节点是否已经拒绝过一次了
Object needend = variables.get("needend");
- if (needend != null && (boolean) needend && (!op.isFlag())) {
- map.put("needfinish", -1); //结束
+ if (needend != null && (boolean)needend && (!op.isFlag())) {
+ map.put("needfinish", -1); // 结束
} else {
if (op.isFlag()) {
- map.put("needfinish", 1);//通过下一个节点
+ map.put("needfinish", 1);// 通过下一个节点
} else {
- map.put("needfinish", 0);//不通过
+ map.put("needfinish", 0);// 不通过
}
}
- //审批信息叠加
+ // 审批信息叠加
List leaveList = new ArrayList<>();
Object o = variables.get(leaveOpinionList);
if (o != null) {
- leaveList = (List) o;
+ leaveList = (List)o;
}
leaveList.add(op);
- UserLeave userLeave=(UserLeave)variables.get("baseTask");
- map.put("day",userLeave.getDays());
+ UserLeave userLeave = (UserLeave)variables.get("baseTask");
+ map.put("day", userLeave.getDays());
map.put(leaveOpinionList, leaveList);
- j.setMsg("审核成功" + (op.isFlag() ? "[通过]" : "[未通过]"));
+ j.setMsg(
+ "审核成功" + (op.isFlag() ? "[通过]" : "[未通过]"));
taskService.complete(op.getTaskId(), map);
return j;
}
- @Autowired
- HistoryService historyService;
-
/**
- * 追踪图片成图
- * 增加历史流程
+ * 追踪图片成图 增加历史流程
*
* @param request
* @param resp
@@ -399,7 +395,7 @@ public class UserLeaveController extends BaseController {
*/
@GetMapping("getProcImage")
public void getProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId)
- throws IOException {
+ throws IOException {
InputStream imageStream = generateStream(request, resp, processInstanceId, true);
if (imageStream == null) {
return;
@@ -416,22 +412,22 @@ public class UserLeaveController extends BaseController {
e.start(resp.getOutputStream());
BufferedImage current = ImageIO.read(imageStream); // 读入需要播放的jpg文件
- e.addFrame(current); //添加到帧中
+ e.addFrame(current); // 添加到帧中
- e.setDelay(200); //设置播放的延迟时间
+ e.setDelay(200); // 设置播放的延迟时间
BufferedImage nocurrent = ImageIO.read(imageNoCurrentStream); // 读入需要播放的jpg文件
- e.addFrame(nocurrent); //添加到帧中
+ e.addFrame(nocurrent); // 添加到帧中
e.finish();
-// byte[] b = new byte[1024];
-// int len;
-// while ((len = imageStream.read(b, 0, 1024)) != -1) {
-// resp.getOutputStream().write(b, 0, len);
-// }
+ // byte[] b = new byte[1024];
+ // int len;
+ // while ((len = imageStream.read(b, 0, 1024)) != -1) {
+ // resp.getOutputStream().write(b, 0, len);
+ // }
}
- //只读图片页面
+ // 只读图片页面
@GetMapping("shinePics/{processInstanceId}")
public String shinePics(Model model, @PathVariable String processInstanceId) {
model.addAttribute("processInstanceId", processInstanceId);
@@ -441,7 +437,7 @@ public class UserLeaveController extends BaseController {
@GetMapping("getShineProcImage")
@ResponseBody
public String getShineProcImage(HttpServletRequest request, HttpServletResponse resp, String processInstanceId)
- throws IOException {
+ throws IOException {
JSONObject result = new JSONObject();
JSONArray shineProImages = new JSONArray();
BASE64Encoder encoder = new BASE64Encoder();
@@ -465,11 +461,12 @@ public class UserLeaveController extends BaseController {
return result.toJSONString();
}
-
- public InputStream generateStream(HttpServletRequest request, HttpServletResponse resp, String processInstanceId, boolean needCurrent) {
- ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+ public InputStream generateStream(HttpServletRequest request, HttpServletResponse resp, String processInstanceId,
+ boolean needCurrent) {
+ ProcessInstance processInstance =
+ runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
HistoricProcessInstance historicProcessInstance =
- historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+ historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
String processDefinitionId = null;
List executedActivityIdList = new ArrayList();
List currentActivityIdList = new ArrayList<>();
@@ -482,8 +479,8 @@ public class UserLeaveController extends BaseController {
}
if (historicProcessInstance != null) {
processDefinitionId = historicProcessInstance.getProcessDefinitionId();
- historicActivityInstanceList =
- historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list();
+ historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery()
+ .processInstanceId(processInstanceId).orderByHistoricActivityInstanceId().asc().list();
for (HistoricActivityInstance activityInstance : historicActivityInstanceList) {
executedActivityIdList.add(activityInstance.getActivityId());
}
@@ -493,24 +490,22 @@ public class UserLeaveController extends BaseController {
return null;
}
- //高亮线路id集合
- ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
+ // 高亮线路id集合
+ ProcessDefinitionEntity definitionEntity =
+ (ProcessDefinitionEntity)repositoryService.getProcessDefinition(processDefinitionId);
List highLightedFlows = getHighLightedFlows(definitionEntity, historicActivityInstanceList);
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
- //List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId);
+ // List activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId);
processEngineConfiguration = processEngine.getProcessEngineConfiguration();
- Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
- HMProcessDiagramGenerator diagramGenerator = (HMProcessDiagramGenerator) processEngineConfiguration.getProcessDiagramGenerator();
- //List activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId());
-
- InputStream imageStream = diagramGenerator.generateDiagram(
- bpmnModel, "png",
- executedActivityIdList, highLightedFlows,
- processEngine.getProcessEngineConfiguration().getActivityFontName(),
- processEngine.getProcessEngineConfiguration().getLabelFontName(),
- "宋体",
- null, 1.0, currentActivityIdList);
+ Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl)processEngineConfiguration);
+ HMProcessDiagramGenerator diagramGenerator =
+ (HMProcessDiagramGenerator)processEngineConfiguration.getProcessDiagramGenerator();
+ // List activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId());
+
+ InputStream imageStream = diagramGenerator.generateDiagram(bpmnModel, "png", executedActivityIdList,
+ highLightedFlows, processEngine.getProcessEngineConfiguration().getActivityFontName(),
+ processEngine.getProcessEngineConfiguration().getLabelFontName(), "宋体", null, 1.0, currentActivityIdList);
return imageStream;
}
@@ -522,43 +517,35 @@ public class UserLeaveController extends BaseController {
* @param historicActivityInstances
* @return
*/
- private List getHighLightedFlows(
- ProcessDefinitionEntity processDefinitionEntity,
- List historicActivityInstances) {
+ private List getHighLightedFlows(ProcessDefinitionEntity processDefinitionEntity,
+ List historicActivityInstances) {
List highFlows = new ArrayList();// 用以保存高亮的线flowId
for (int i = 0; i < historicActivityInstances.size() - 1; i++) {// 对历史流程节点进行遍历
- ActivityImpl activityImpl = processDefinitionEntity
- .findActivity(historicActivityInstances.get(i)
- .getActivityId());// 得到节点定义的详细信息
+ ActivityImpl activityImpl =
+ processDefinitionEntity.findActivity(historicActivityInstances.get(i).getActivityId());// 得到节点定义的详细信息
List sameStartTimeNodes = new ArrayList();// 用以保存后需开始时间相同的节点
- ActivityImpl sameActivityImpl1 = processDefinitionEntity
- .findActivity(historicActivityInstances.get(i + 1)
- .getActivityId());
+ ActivityImpl sameActivityImpl1 =
+ processDefinitionEntity.findActivity(historicActivityInstances.get(i + 1).getActivityId());
// 将后面第一个节点放在时间相同节点的集合里
sameStartTimeNodes.add(sameActivityImpl1);
for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {
- HistoricActivityInstance activityImpl1 = historicActivityInstances
- .get(j);// 后续第一个节点
- HistoricActivityInstance activityImpl2 = historicActivityInstances
- .get(j + 1);// 后续第二个节点
- if (activityImpl1.getStartTime().equals(
- activityImpl2.getStartTime())) {
+ HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);// 后续第一个节点
+ HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + 1);// 后续第二个节点
+ if (activityImpl1.getStartTime().equals(activityImpl2.getStartTime())) {
// 如果第一个节点和第二个节点开始时间相同保存
- ActivityImpl sameActivityImpl2 = processDefinitionEntity
- .findActivity(activityImpl2.getActivityId());
+ ActivityImpl sameActivityImpl2 =
+ processDefinitionEntity.findActivity(activityImpl2.getActivityId());
sameStartTimeNodes.add(sameActivityImpl2);
} else {
// 有不相同跳出循环
break;
}
}
- List pvmTransitions = activityImpl
- .getOutgoingTransitions();// 取出节点的所有出去的线
+ List pvmTransitions = activityImpl.getOutgoingTransitions();// 取出节点的所有出去的线
for (PvmTransition pvmTransition : pvmTransitions) {
// 对所有的线进行遍历
- ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition
- .getDestination();
+ ActivityImpl pvmActivityImpl = (ActivityImpl)pvmTransition.getDestination();
// 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示
if (sameStartTimeNodes.contains(pvmActivityImpl)) {
highFlows.add(pvmTransition.getId());
@@ -568,5 +555,4 @@ public class UserLeaveController extends BaseController {
return highFlows;
}
-
}
diff --git a/len-activiti/src/main/java/com/len/entity/ActAssignee.java b/len-activiti/src/main/java/com/len/entity/ActAssignee.java
index b841f36..03a1926 100644
--- a/len-activiti/src/main/java/com/len/entity/ActAssignee.java
+++ b/len-activiti/src/main/java/com/len/entity/ActAssignee.java
@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
-
@TableName(value = "act_assignee")
public class ActAssignee {
@TableId(value = "id", type = IdType.UUID)
@@ -41,6 +40,12 @@ public class ActAssignee {
@TableField(value = "activti_name")
private String activtiName;
+ public ActAssignee() {}
+
+ public ActAssignee(String sid) {
+ this.sid = sid;
+ }
+
/**
* @return id
*/
@@ -144,11 +149,4 @@ public class ActAssignee {
public void setActivtiName(String activtiName) {
this.activtiName = activtiName == null ? null : activtiName.trim();
}
-
- public ActAssignee() {
- }
-
- public ActAssignee(String sid) {
- this.sid = sid;
- }
}
\ No newline at end of file
diff --git a/len-activiti/src/main/java/com/len/entity/ActDeployment.java b/len-activiti/src/main/java/com/len/entity/ActDeployment.java
index 39df8d3..d4e719f 100644
--- a/len-activiti/src/main/java/com/len/entity/ActDeployment.java
+++ b/len-activiti/src/main/java/com/len/entity/ActDeployment.java
@@ -1,49 +1,46 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.entity;
import java.io.Serializable;
import java.util.Date;
+
+import org.activiti.engine.repository.Deployment;
+
import lombok.Getter;
import lombok.Setter;
-import org.activiti.engine.repository.Deployment;
/**
* @author zhuxiaomeng
* @date 2018/1/15.
- * @email lenospmiller@gmail.com
- * 流程部署表
+ * @email lenospmiller@gmail.com 流程部署表
*/
@Getter
@Setter
public class ActDeployment implements Serializable {
- private String id;
- private String name;
- private Date deploymentTime;
- private String category;
- private String tenantId;
+ private String id;
+ private String name;
+ private Date deploymentTime;
+ private String category;
+ private String tenantId;
- public ActDeployment() {
- }
+ public ActDeployment() {}
- public ActDeployment(Deployment deployment) {
- this.id = deployment.getId();
- this.name = deployment.getName();
- this.deploymentTime = deployment.getDeploymentTime();
- this.category = deployment.getCategory();
- this.tenantId = deployment.getTenantId();
- }
+ public ActDeployment(Deployment deployment) {
+ this.id = deployment.getId();
+ this.name = deployment.getName();
+ this.deploymentTime = deployment.getDeploymentTime();
+ this.category = deployment.getCategory();
+ this.tenantId = deployment.getTenantId();
+ }
}
diff --git a/len-activiti/src/main/java/com/len/entity/ActModel.java b/len-activiti/src/main/java/com/len/entity/ActModel.java
index 479b4c5..9229a5b 100644
--- a/len-activiti/src/main/java/com/len/entity/ActModel.java
+++ b/len-activiti/src/main/java/com/len/entity/ActModel.java
@@ -1,64 +1,56 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.entity;
import java.util.Date;
-import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
import org.activiti.engine.repository.Model;
+import lombok.Data;
+
/**
* @author zhuxiaomeng
* @date 2018/1/18.
- * @email lenospmiller@gmail.com
- * 模型列表
+ * @email lenospmiller@gmail.com 模型列表
*/
@Data
public class ActModel {
- private String id;
- private String name;
- private String key;
- private String category;
- private Date createTime;
- private Date lastUpdateTime;
- private Integer version;
- private String metaInfo;
- private String deploymentId;
- private String tenantId;
- private boolean hasEditorSource;
-
+ private String id;
+ private String name;
+ private String key;
+ private String category;
+ private Date createTime;
+ private Date lastUpdateTime;
+ private Integer version;
+ private String metaInfo;
+ private String deploymentId;
+ private String tenantId;
+ private boolean hasEditorSource;
- public ActModel() {
- }
+ public ActModel() {}
- public ActModel(Model model) {
- this.id = model.getId();
- this.name = model.getName();
- this.key = model.getKey();
- this.category = model.getCategory();
- this.createTime = model.getCreateTime();
- this.lastUpdateTime = model.getLastUpdateTime();
- this.version = model.getVersion();
- this.metaInfo = model.getMetaInfo();
- this.deploymentId = model.getDeploymentId();
- this.tenantId = model.getTenantId();
- this.hasEditorSource = model.hasEditorSource();
- }
+ public ActModel(Model model) {
+ this.id = model.getId();
+ this.name = model.getName();
+ this.key = model.getKey();
+ this.category = model.getCategory();
+ this.createTime = model.getCreateTime();
+ this.lastUpdateTime = model.getLastUpdateTime();
+ this.version = model.getVersion();
+ this.metaInfo = model.getMetaInfo();
+ this.deploymentId = model.getDeploymentId();
+ this.tenantId = model.getTenantId();
+ this.hasEditorSource = model.hasEditorSource();
+ }
}
diff --git a/len-activiti/src/main/java/com/len/entity/BaseTask.java b/len-activiti/src/main/java/com/len/entity/BaseTask.java
index 76769ff..9ecc044 100644
--- a/len-activiti/src/main/java/com/len/entity/BaseTask.java
+++ b/len-activiti/src/main/java/com/len/entity/BaseTask.java
@@ -9,6 +9,19 @@ import java.util.Date;
public abstract class BaseTask implements Serializable {
protected String id;
+ protected String userId;
+ protected String userName;
+ protected String processInstanceId;
+ protected String status;
+ protected Date createDate;
+ protected String createBy;
+ protected Date updateDate;
+ protected String updateBy;
+ protected String reason;
+ // ***实时节点信息
+ protected String taskName;
+ private String urlpath;
+ private Integer submittimes;
/**
* @return id
@@ -24,38 +37,6 @@ public abstract class BaseTask implements Serializable {
this.id = id == null ? null : id.trim();
}
-
- protected String userId;
-
- protected String userName;
-
-
- protected String processInstanceId;
-
- protected String status;
-
- protected Date createDate;
-
- protected String createBy;
-
- protected Date updateDate;
-
- protected String updateBy;
-
-
- protected String reason;
-
-
- //***实时节点信息
- protected String taskName;
-
-
- private String urlpath;
-
-
- private Integer submittimes;
-
-
/**
* @return user_id
*/
@@ -84,7 +65,6 @@ public abstract class BaseTask implements Serializable {
this.userName = userName == null ? null : userName.trim();
}
-
/**
* @return reason
*/
diff --git a/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java b/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java
index 454af09..4386b4c 100644
--- a/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java
+++ b/len-activiti/src/main/java/com/len/entity/LeaveOpinion.java
@@ -1,22 +1,20 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.entity;
import java.io.Serializable;
import java.util.Date;
+
import lombok.Getter;
import lombok.Setter;
@@ -26,19 +24,19 @@ import lombok.Setter;
*/
@Getter
@Setter
-public class LeaveOpinion implements Serializable{
+public class LeaveOpinion implements Serializable {
- //审批人id
- private String opId;
- //审批人姓名
- private String opName;
- //审批意见
- private String opinion;
- //审批时间
- private Date createTime;
- //是否通过
- private boolean flag;
- //流程id
- private String taskId;
+ // 审批人id
+ private String opId;
+ // 审批人姓名
+ private String opName;
+ // 审批意见
+ private String opinion;
+ // 审批时间
+ private Date createTime;
+ // 是否通过
+ private boolean flag;
+ // 流程id
+ private String taskId;
}
diff --git a/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java b/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java
index 00cdec5..a9d86ad 100644
--- a/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java
+++ b/len-activiti/src/main/java/com/len/entity/ProcessDefinition.java
@@ -1,17 +1,14 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.entity;
@@ -22,43 +19,42 @@ import lombok.ToString;
/**
* @author zhuxiaomeng
* @date 2018/1/21.
- * @email lenospmiller@gmail.com
- * 流程定义实体
+ * @email lenospmiller@gmail.com 流程定义实体
*/
@Getter
@Setter
@ToString
public class ProcessDefinition {
- private String id;
- private String category;
- private String name;
- private String key;
- private String description;
- private int version;
- private String resourceName;
- private String deploymentId;
- private String diagramResourceName;
- private boolean hasStartFormKey;
- private boolean hasGraphicalNotation;
- private boolean isSuspended;
- private String tenantId;
+ private String id;
+ private String category;
+ private String name;
+ private String key;
+ private String description;
+ private int version;
+ private String resourceName;
+ private String deploymentId;
+ private String diagramResourceName;
+ private boolean hasStartFormKey;
+ private boolean hasGraphicalNotation;
+ private boolean isSuspended;
+ private String tenantId;
- public ProcessDefinition() {
- }
- public ProcessDefinition(org.activiti.engine.repository.ProcessDefinition p) {
- this.id=p.getId();
- this.category=p.getCategory();
- this.name=p.getName();
- this.key=p.getKey();
- this.description=p.getDescription();
- this.version=p.getVersion();
- this.resourceName=p.getResourceName();
- this.deploymentId=p.getDeploymentId();
- this.diagramResourceName=p.getDiagramResourceName();
- this.hasStartFormKey=p.hasStartFormKey();
- this.hasGraphicalNotation=p.hasGraphicalNotation();
- this.isSuspended=p.isSuspended();
- this.tenantId=p.getTenantId();
+ public ProcessDefinition() {}
- }
+ public ProcessDefinition(org.activiti.engine.repository.ProcessDefinition p) {
+ this.id = p.getId();
+ this.category = p.getCategory();
+ this.name = p.getName();
+ this.key = p.getKey();
+ this.description = p.getDescription();
+ this.version = p.getVersion();
+ this.resourceName = p.getResourceName();
+ this.deploymentId = p.getDeploymentId();
+ this.diagramResourceName = p.getDiagramResourceName();
+ this.hasStartFormKey = p.hasStartFormKey();
+ this.hasGraphicalNotation = p.hasGraphicalNotation();
+ this.isSuspended = p.isSuspended();
+ this.tenantId = p.getTenantId();
+
+ }
}
diff --git a/len-activiti/src/main/java/com/len/entity/Task.java b/len-activiti/src/main/java/com/len/entity/Task.java
index 4bea8f9..ed9b5af 100644
--- a/len-activiti/src/main/java/com/len/entity/Task.java
+++ b/len-activiti/src/main/java/com/len/entity/Task.java
@@ -1,21 +1,19 @@
/**
* Copyright 2018 lenos
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package com.len.entity;
import java.util.Date;
+
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@@ -25,35 +23,36 @@ import lombok.ToString;
* @date 2018/1/21.
* @email lenospmiller@gmail.com
*
- * 流程任务
+ * 流程任务
*/
@Getter
@Setter
@ToString
public class Task {
- private String id;
- private String name;
- private Date createTime;
- private String assignee;
- private String processInstanceId;//流程实例id
- private String processDefinitionId;//流程定义id
- private String description;
- private String category;
+ private String id;
+ private String name;
+ private Date createTime;
+ private String assignee;
+ private String processInstanceId;// 流程实例id
+ private String processDefinitionId;// 流程定义id
+ private String description;
+ private String category;
+
+ private String userName;
+ private String reason;
+ private String urlpath;
+
+ public Task() {}
- private String userName;
- private String reason;
- private String urlpath;
- public Task() {
- }
- public Task(org.activiti.engine.task.Task t) {
- this.id=t.getId();
- this.name=t.getName();
- this.createTime=t.getCreateTime();
- this.assignee=t.getAssignee();
- this.processInstanceId=t.getProcessInstanceId();
- this.processDefinitionId=t.getProcessDefinitionId();
- this.description=t.getDescription();
- this.category=t.getCategory();
- }
+ public Task(org.activiti.engine.task.Task t) {
+ this.id = t.getId();
+ this.name = t.getName();
+ this.createTime = t.getCreateTime();
+ this.assignee = t.getAssignee();
+ this.processInstanceId = t.getProcessInstanceId();
+ this.processDefinitionId = t.getProcessDefinitionId();
+ this.description = t.getDescription();
+ this.category = t.getCategory();
+ }
}
diff --git a/len-activiti/src/main/java/com/len/entity/UserLeave.java b/len-activiti/src/main/java/com/len/entity/UserLeave.java
index 276e40e..d58bf95 100644
--- a/len-activiti/src/main/java/com/len/entity/UserLeave.java
+++ b/len-activiti/src/main/java/com/len/entity/UserLeave.java
@@ -1,75 +1,63 @@
package com.len.entity;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
@TableName(value = "user_leave")
public class UserLeave extends BaseTask {
@TableId(value = "id", type = IdType.UUID)
protected String id;
-
- /**
- * @return id
- */
- @Override
- public String getId() {
- return id;
- }
-
- /**
- * @param id
- */
- @Override
- public void setId(String id) {
- this.id = id == null ? null : id.trim();
- }
-
private Integer days;
-
@TableField(value = "begin_time")
private Date beginTime;
-
@TableField(value = "end_time")
private Date endTime;
-
@TableField(value = "process_instance_Id")
private String processInstanceId;
-
private String status;
-
@TableField(value = "create_date")
private Date createDate;
-
@TableField(value = "create_by")
private String createBy;
-
@TableField(value = "update_date")
private Date updateDate;
-
@TableField(value = "update_by")
private String updateBy;
-
- //***实时节点信息
+ // ***实时节点信息
@TableField(exist = false)
private String taskName;
+ // 请假单审核信息
+ @TableField(exist = false)
+ private List opinionList = new ArrayList<>();
+ /**
+ * @return id
+ */
+ @Override
+ public String getId() {
+ return id;
+ }
+ /**
+ * @param id
+ */
+ @Override
+ public void setId(String id) {
+ this.id = id == null ? null : id.trim();
+ }
- //请假单审核信息
- @TableField(exist = false)
- private List opinionList=new ArrayList<>();
-
- public void leaveOpAdd(LeaveOpinion leaveOpinion){
+ public void leaveOpAdd(LeaveOpinion leaveOpinion) {
this.opinionList.add(leaveOpinion);
}
- public void leaveOpAddAll(List leaveOpinionList){
+
+ public void leaveOpAddAll(List leaveOpinionList) {
this.opinionList.addAll(leaveOpinionList);
}
@@ -81,8 +69,6 @@ public class UserLeave extends BaseTask {
this.opinionList = opinionList;
}
-
-
/**
* @return days
*/
@@ -97,23 +83,18 @@ public class UserLeave extends BaseTask {
this.days = days;
}
-
-
public Date getBeginTime() {
return beginTime;
}
-
public void setBeginTime(Date beginTime) {
this.beginTime = beginTime;
}
-
public Date getEndTime() {
return endTime;
}
-
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
diff --git a/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java b/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java
index a15dc9d..1c4674e 100644
--- a/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java
+++ b/len-activiti/src/main/java/com/len/mapper/UserLeaveMapper.java
@@ -3,5 +3,4 @@ package com.len.mapper;
import com.len.base.BaseMapper;
import com.len.entity.UserLeave;
-public interface UserLeaveMapper extends BaseMapper {
-}
\ No newline at end of file
+public interface UserLeaveMapper extends BaseMapper {}
\ No newline at end of file
diff --git a/len-activiti/src/main/java/com/len/service/ActAssigneeService.java b/len-activiti/src/main/java/com/len/service/ActAssigneeService.java
index 6ec20ce..fd25032 100644
--- a/len-activiti/src/main/java/com/len/service/ActAssigneeService.java
+++ b/len-activiti/src/main/java/com/len/service/ActAssigneeService.java
@@ -1,10 +1,11 @@
package com.len.service;
-import com.len.base.BaseService;
-import com.len.entity.ActAssignee;
+import java.util.List;
+
import org.activiti.engine.impl.pvm.process.ActivityImpl;
-import java.util.List;
+import com.len.base.BaseService;
+import com.len.entity.ActAssignee;
/**
* @author zhuxiaomeng
@@ -12,10 +13,10 @@ import java.util.List;
* @email lenospmiller@gmail.com
*/
public interface ActAssigneeService extends BaseService {
- int deleteByNodeId(String nodeId);
+ int deleteByNodeId(String nodeId);
- public List getActivityList(String deploymentId);
+ public List getActivityList(String deploymentId);
- public List selectAllActivity(List activities);
+ public List selectAllActivity(List activities);
}
diff --git a/len-activiti/src/main/java/com/len/service/UserLeaveService.java b/len-activiti/src/main/java/com/len/service/UserLeaveService.java
index cc174b4..551b7e8 100644
--- a/len-activiti/src/main/java/com/len/service/UserLeaveService.java
+++ b/len-activiti/src/main/java/com/len/service/UserLeaveService.java
@@ -1,10 +1,10 @@
package com.len.service;
+import java.util.List;
+
import com.len.base.BaseService;
import com.len.entity.UserLeave;
-import java.util.List;
-
/**
* @author zhuxiaomeng
* @date 2018/1/21.
diff --git a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java
index 6ba629a..a22d005 100644
--- a/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java
+++ b/len-activiti/src/main/java/com/len/service/impl/ActAssigneeServiceImpl.java
@@ -1,9 +1,9 @@
package com.len.service.impl;
-import com.len.base.impl.BaseServiceImpl;
-import com.len.entity.ActAssignee;
-import com.len.mapper.ActAssigneeMapper;
-import com.len.service.ActAssigneeService;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.RepositoryService;
@@ -14,9 +14,10 @@ import org.activiti.engine.impl.util.io.InputStreamSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
+import com.len.base.impl.BaseServiceImpl;
+import com.len.entity.ActAssignee;
+import com.len.mapper.ActAssigneeMapper;
+import com.len.service.ActAssigneeService;
/**
* @author zhuxiaomeng
@@ -24,8 +25,8 @@ import java.util.List;
* @email lenospmiller@gmail.com
*/
@Service
-public class ActAssigneeServiceImpl extends BaseServiceImpl implements
- ActAssigneeService {
+public class ActAssigneeServiceImpl extends BaseServiceImpl
+ implements ActAssigneeService {
@Autowired
ActAssigneeMapper actAssigneeMapper;
@@ -40,11 +41,13 @@ public class ActAssigneeServiceImpl extends BaseServiceImpl getActivityList(String deploymentId) {
- org.activiti.engine.repository.ProcessDefinition processDefinition = repositoryService
- .createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
- ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
+ org.activiti.engine.repository.ProcessDefinition processDefinition =
+ repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
+ ProcessDefinitionEntity processDefinitionEntity =
+ (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService)
.getDeployedProcessDefinition(processDefinition.getId());
- InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName());
+ InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),
+ processDefinition.getResourceName());
BpmnModel bm = new BpmnXMLConverter().convertToBpmnModel(new InputStreamSource(inputStream), false, true);
return selectAllActivity(processDefinitionEntity.getActivities());
diff --git a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java
index fdf6eda..6fcb087 100644
--- a/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java
+++ b/len-activiti/src/main/java/com/len/service/impl/UserLeaveServiceImpl.java
@@ -1,13 +1,14 @@
package com.len.service.impl;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
import com.len.base.impl.BaseServiceImpl;
import com.len.entity.UserLeave;
import com.len.mapper.UserLeaveMapper;
import com.len.service.UserLeaveService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
/**
* @author zhuxiaomeng
@@ -15,8 +16,7 @@ import java.util.List;
* @email lenospmiller@gmail.com
*/
@Service
-public class UserLeaveServiceImpl extends BaseServiceImpl implements
- UserLeaveService {
+public class UserLeaveServiceImpl extends BaseServiceImpl implements UserLeaveService {
@Autowired
UserLeaveMapper userLeaveMapper;
diff --git a/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java b/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java
index 62fef8a..0ad7a5f 100644
--- a/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java
+++ b/len-activiti/src/main/java/com/len/util/AnimatedGifEncoder.java
@@ -1,17 +1,15 @@
package com.len.util;
-import java.awt.Color;
-import java.awt.Graphics2D;
+import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
-
+
/**
- * Class AnimatedGifEncoder - Encodes a GIF file consisting of one or more
- * frames.
+ * Class AnimatedGifEncoder - Encodes a GIF file consisting of one or more frames.
*
*
* Example:
@@ -23,774 +21,727 @@ import java.io.OutputStream;
* e.finish();
*
*
- * No copyright asserted on the source code of this class. May be used for any
- * purpose, however, refer to the Unisys LZW patent for restrictions on use of
- * the associated LZWEncoder class. Please forward any corrections to
+ * No copyright asserted on the source code of this class. May be used for any purpose, however, refer to the Unisys LZW
+ * patent for restrictions on use of the associated LZWEncoder class. Please forward any corrections to
* kweiner@fmsware.com.
*
* @author Kevin Weiner, FM Software
* @version 1.03 November 2003
*
*/
-
+
public class AnimatedGifEncoder {
-
- protected int width; // image size
-
- protected int height;
-
- protected Color transparent = null; // transparent color if given
-
- protected int transIndex; // transparent index in color table
-
- protected int repeat = -1; // no repeat
-
- protected int delay = 0; // frame delay (hundredths)
-
- protected boolean started = false; // ready to output frames
-
- protected OutputStream out;
-
- protected BufferedImage image; // current frame
-
- protected byte[] pixels; // BGR byte array from frame
-
- protected byte[] indexedPixels; // converted frame indexed to palette
-
- protected int colorDepth; // number of bit planes
-
- protected byte[] colorTab; // RGB palette
-
- protected boolean[] usedEntry = new boolean[256]; // active palette entries
-
- protected int palSize = 7; // color table size (bits-1)
-
- protected int dispose = -1; // disposal code (-1 = use default)
-
- protected boolean closeStream = false; // close stream when finished
-
- protected boolean firstFrame = true;
-
- protected boolean sizeSet = false; // if false, get size from first frame
-
- protected int sample = 10; // default sample interval for quantizer
-
- /**
- * Sets the delay time between each frame, or changes it for subsequent frames
- * (applies to last frame added).
- *
- * @param ms
- * int delay time in milliseconds
- */
- public void setDelay(int ms) {
- delay = Math.round(ms / 10.0f);
- }
-
- /**
- * Sets the GIF frame disposal code for the last added frame and any
- * subsequent frames. Default is 0 if no transparent color has been set,
- * otherwise 2.
- *
- * @param code
- * int disposal code.
- */
- public void setDispose(int code) {
- if (code >= 0) {
- dispose = code;
+
+ protected int width; // image size
+
+ protected int height;
+
+ protected Color transparent = null; // transparent color if given
+
+ protected int transIndex; // transparent index in color table
+
+ protected int repeat = -1; // no repeat
+
+ protected int delay = 0; // frame delay (hundredths)
+
+ protected boolean started = false; // ready to output frames
+
+ protected OutputStream out;
+
+ protected BufferedImage image; // current frame
+
+ protected byte[] pixels; // BGR byte array from frame
+
+ protected byte[] indexedPixels; // converted frame indexed to palette
+
+ protected int colorDepth; // number of bit planes
+
+ protected byte[] colorTab; // RGB palette
+
+ protected boolean[] usedEntry = new boolean[256]; // active palette entries
+
+ protected int palSize = 7; // color table size (bits-1)
+
+ protected int dispose = -1; // disposal code (-1 = use default)
+
+ protected boolean closeStream = false; // close stream when finished
+
+ protected boolean firstFrame = true;
+
+ protected boolean sizeSet = false; // if false, get size from first frame
+
+ protected int sample = 10; // default sample interval for quantizer
+
+ /**
+ * Sets the delay time between each frame, or changes it for subsequent frames (applies to last frame added).
+ *
+ * @param ms int delay time in milliseconds
+ */
+ public void setDelay(int ms) {
+ delay = Math.round(ms / 10.0f);
+ }
+
+ /**
+ * Sets the GIF frame disposal code for the last added frame and any subsequent frames. Default is 0 if no
+ * transparent color has been set, otherwise 2.
+ *
+ * @param code int disposal code.
+ */
+ public void setDispose(int code) {
+ if (code >= 0) {
+ dispose = code;
+ }
+ }
+
+ /**
+ * Sets the number of times the set of GIF frames should be played. Default is 1; 0 means play indefinitely. Must be
+ * invoked before the first image is added.
+ *
+ * @param iter int number of iterations.
+ * @return
+ */
+ public void setRepeat(int iter) {
+ if (iter >= 0) {
+ repeat = iter;
+ }
+ }
+
+ /**
+ * Sets the transparent color for the last added frame and any subsequent frames. Since all colors are subject to
+ * modification in the quantization process, the color in the final palette for each frame closest to the given
+ * color becomes the transparent color for that frame. May be set to null to indicate no transparent color.
+ *
+ * @param c Color to be treated as transparent on display.
+ */
+ public void setTransparent(Color c) {
+ transparent = c;
}
- }
-
- /**
- * Sets the number of times the set of GIF frames should be played. Default is
- * 1; 0 means play indefinitely. Must be invoked before the first image is
- * added.
- *
- * @param iter
- * int number of iterations.
- * @return
- */
- public void setRepeat(int iter) {
- if (iter >= 0) {
- repeat = iter;
+
+ /**
+ * Adds next GIF frame. The frame is not written immediately, but is actually deferred until the next frame is
+ * received so that timing data can be inserted. Invoking finish()
flushes all frames. If
+ * setSize
was not invoked, the size of the first image is used for all subsequent frames.
+ *
+ * @param im BufferedImage containing frame to write.
+ * @return true if successful.
+ */
+ public boolean addFrame(BufferedImage im) {
+ if ((im == null) || !started) {
+ return false;
+ }
+ boolean ok = true;
+ try {
+ if (!sizeSet) {
+ // use first frame's size
+ setSize(im.getWidth(), im.getHeight());
+ }
+ image = im;
+ getImagePixels(); // convert to correct format if necessary
+ analyzePixels(); // build color table & map pixels
+ if (firstFrame) {
+ writeLSD(); // logical screen descriptior
+ writePalette(); // global color table
+ if (repeat >= 0) {
+ // use NS app extension to indicate reps
+ writeNetscapeExt();
+ }
+ }
+ writeGraphicCtrlExt(); // write graphic control extension
+ writeImageDesc(); // image descriptor
+ if (!firstFrame) {
+ writePalette(); // local color table
+ }
+ writePixels(); // encode and write pixel data
+ firstFrame = false;
+ } catch (IOException e) {
+ ok = false;
+ }
+
+ return ok;
}
- }
-
- /**
- * Sets the transparent color for the last added frame and any subsequent
- * frames. Since all colors are subject to modification in the quantization
- * process, the color in the final palette for each frame closest to the given
- * color becomes the transparent color for that frame. May be set to null to
- * indicate no transparent color.
- *
- * @param c
- * Color to be treated as transparent on display.
- */
- public void setTransparent(Color c) {
- transparent = c;
- }
-
- /**
- * Adds next GIF frame. The frame is not written immediately, but is actually
- * deferred until the next frame is received so that timing data can be
- * inserted. Invoking finish()
flushes all frames. If
- * setSize
was not invoked, the size of the first image is used
- * for all subsequent frames.
- *
- * @param im
- * BufferedImage containing frame to write.
- * @return true if successful.
- */
- public boolean addFrame(BufferedImage im) {
- if ((im == null) || !started) {
- return false;
+
+ /**
+ * Flushes any pending data and closes output file. If writing to an OutputStream, the stream is not closed.
+ */
+ public boolean finish() {
+ if (!started)
+ return false;
+ boolean ok = true;
+ started = false;
+ try {
+ out.write(0x3b); // gif trailer
+ out.flush();
+ if (closeStream) {
+ out.close();
+ }
+ } catch (IOException e) {
+ ok = false;
+ }
+
+ // reset for subsequent use
+ transIndex = 0;
+ out = null;
+ image = null;
+ pixels = null;
+ indexedPixels = null;
+ colorTab = null;
+ closeStream = false;
+ firstFrame = true;
+
+ return ok;
}
- boolean ok = true;
- try {
- if (!sizeSet) {
- // use first frame's size
- setSize(im.getWidth(), im.getHeight());
- }
- image = im;
- getImagePixels(); // convert to correct format if necessary
- analyzePixels(); // build color table & map pixels
- if (firstFrame) {
- writeLSD(); // logical screen descriptior
- writePalette(); // global color table
- if (repeat >= 0) {
- // use NS app extension to indicate reps
- writeNetscapeExt();
+
+ /**
+ * Sets frame rate in frames per second. Equivalent to setDelay(1000/fps)
.
+ *
+ * @param fps float frame rate (frames per second)
+ */
+ public void setFrameRate(float fps) {
+ if (fps != 0f) {
+ delay = Math.round(100f / fps);
}
- }
- writeGraphicCtrlExt(); // write graphic control extension
- writeImageDesc(); // image descriptor
- if (!firstFrame) {
- writePalette(); // local color table
- }
- writePixels(); // encode and write pixel data
- firstFrame = false;
- } catch (IOException e) {
- ok = false;
}
-
- return ok;
- }
-
- /**
- * Flushes any pending data and closes output file. If writing to an
- * OutputStream, the stream is not closed.
- */
- public boolean finish() {
- if (!started)
- return false;
- boolean ok = true;
- started = false;
- try {
- out.write(0x3b); // gif trailer
- out.flush();
- if (closeStream) {
- out.close();
- }
- } catch (IOException e) {
- ok = false;
+
+ /**
+ * Sets quality of color quantization (conversion of images to the maximum 256 colors allowed by the GIF
+ * specification). Lower values (minimum = 1) produce better colors, but slow processing significantly. 10 is the
+ * default, and produces good color mapping at reasonable speeds. Values greater than 20 do not yield significant
+ * improvements in speed.
+ *
+ * @param quality int greater than 0.
+ * @return
+ */
+ public void setQuality(int quality) {
+ if (quality < 1)
+ quality = 1;
+ sample = quality;
}
-
- // reset for subsequent use
- transIndex = 0;
- out = null;
- image = null;
- pixels = null;
- indexedPixels = null;
- colorTab = null;
- closeStream = false;
- firstFrame = true;
-
- return ok;
- }
-
- /**
- * Sets frame rate in frames per second. Equivalent to
- * setDelay(1000/fps)
.
- *
- * @param fps
- * float frame rate (frames per second)
- */
- public void setFrameRate(float fps) {
- if (fps != 0f) {
- delay = Math.round(100f / fps);
+
+ /**
+ * Sets the GIF frame size. The default size is the size of the first frame added if this method is not invoked.
+ *
+ * @param w int frame width.
+ * @param h int frame width.
+ */
+ public void setSize(int w, int h) {
+ if (started && !firstFrame)
+ return;
+ width = w;
+ height = h;
+ if (width < 1)
+ width = 320;
+ if (height < 1)
+ height = 240;
+ sizeSet = true;
}
- }
-
- /**
- * Sets quality of color quantization (conversion of images to the maximum 256
- * colors allowed by the GIF specification). Lower values (minimum = 1)
- * produce better colors, but slow processing significantly. 10 is the
- * default, and produces good color mapping at reasonable speeds. Values
- * greater than 20 do not yield significant improvements in speed.
- *
- * @param quality
- * int greater than 0.
- * @return
- */
- public void setQuality(int quality) {
- if (quality < 1)
- quality = 1;
- sample = quality;
- }
-
- /**
- * Sets the GIF frame size. The default size is the size of the first frame
- * added if this method is not invoked.
- *
- * @param w
- * int frame width.
- * @param h
- * int frame width.
- */
- public void setSize(int w, int h) {
- if (started && !firstFrame)
- return;
- width = w;
- height = h;
- if (width < 1)
- width = 320;
- if (height < 1)
- height = 240;
- sizeSet = true;
- }
-
- /**
- * Initiates GIF file creation on the given stream. The stream is not closed
- * automatically.
- *
- * @param os
- * OutputStream on which GIF images are written.
- * @return false if initial write failed.
- */
- public boolean start(OutputStream os) {
- if (os == null)
- return false;
- boolean ok = true;
- closeStream = false;
- out = os;
- try {
- writeString("GIF89a"); // header
- } catch (IOException e) {
- ok = false;
+
+ /**
+ * Initiates GIF file creation on the given stream. The stream is not closed automatically.
+ *
+ * @param os OutputStream on which GIF images are written.
+ * @return false if initial write failed.
+ */
+ public boolean start(OutputStream os) {
+ if (os == null)
+ return false;
+ boolean ok = true;
+ closeStream = false;
+ out = os;
+ try {
+ writeString("GIF89a"); // header
+ } catch (IOException e) {
+ ok = false;
+ }
+ return started = ok;
}
- return started = ok;
- }
-
- /**
- * Initiates writing of a GIF file with the specified name.
- *
- * @param file
- * String containing output file name.
- * @return false if open or initial write failed.
- */
- public boolean start(String file) {
- boolean ok = true;
- try {
- out = new BufferedOutputStream(new FileOutputStream(file));
- ok = start(out);
- closeStream = true;
- } catch (IOException e) {
- ok = false;
+
+ /**
+ * Initiates writing of a GIF file with the specified name.
+ *
+ * @param file String containing output file name.
+ * @return false if open or initial write failed.
+ */
+ public boolean start(String file) {
+ boolean ok = true;
+ try {
+ out = new BufferedOutputStream(new FileOutputStream(file));
+ ok = start(out);
+ closeStream = true;
+ } catch (IOException e) {
+ ok = false;
+ }
+ return started = ok;
}
- return started = ok;
- }
-
- /**
- * Analyzes image colors and creates color map.
- */
- protected void analyzePixels() {
- int len = pixels.length;
- int nPix = len / 3;
- indexedPixels = new byte[nPix];
- NeuQuant nq = new NeuQuant(pixels, len, sample);
- // initialize quantizer
- colorTab = nq.process(); // create reduced palette
- // convert map from BGR to RGB
- for (int i = 0; i < colorTab.length; i += 3) {
- byte temp = colorTab[i];
- colorTab[i] = colorTab[i + 2];
- colorTab[i + 2] = temp;
- usedEntry[i / 3] = false;
+
+ /**
+ * Analyzes image colors and creates color map.
+ */
+ protected void analyzePixels() {
+ int len = pixels.length;
+ int nPix = len / 3;
+ indexedPixels = new byte[nPix];
+ NeuQuant nq = new NeuQuant(pixels, len, sample);
+ // initialize quantizer
+ colorTab = nq.process(); // create reduced palette
+ // convert map from BGR to RGB
+ for (int i = 0; i < colorTab.length; i += 3) {
+ byte temp = colorTab[i];
+ colorTab[i] = colorTab[i + 2];
+ colorTab[i + 2] = temp;
+ usedEntry[i / 3] = false;
+ }
+ // map image pixels to new palette
+ int k = 0;
+ for (int i = 0; i < nPix; i++) {
+ int index = nq.map(pixels[k++] & 0xff, pixels[k++] & 0xff, pixels[k++] & 0xff);
+ usedEntry[index] = true;
+ indexedPixels[i] = (byte)index;
+ }
+ pixels = null;
+ colorDepth = 8;
+ palSize = 7;
+ // get closest match to transparent color if specified
+ if (transparent != null) {
+ transIndex = findClosest(transparent);
+ }
+ }
+
+ /**
+ * Returns index of palette color closest to c
+ *
+ */
+ protected int findClosest(Color c) {
+ if (colorTab == null)
+ return -1;
+ int r = c.getRed();
+ int g = c.getGreen();
+ int b = c.getBlue();
+ int minpos = 0;
+ int dmin = 256 * 256 * 256;
+ int len = colorTab.length;
+ for (int i = 0; i < len;) {
+ int dr = r - (colorTab[i++] & 0xff);
+ int dg = g - (colorTab[i++] & 0xff);
+ int db = b - (colorTab[i] & 0xff);
+ int d = dr * dr + dg * dg + db * db;
+ int index = i / 3;
+ if (usedEntry[index] && (d < dmin)) {
+ dmin = d;
+ minpos = index;
+ }
+ i++;
+ }
+ return minpos;
}
- // map image pixels to new palette
- int k = 0;
- for (int i = 0; i < nPix; i++) {
- int index = nq.map(pixels[k++] & 0xff, pixels[k++] & 0xff, pixels[k++] & 0xff);
- usedEntry[index] = true;
- indexedPixels[i] = (byte) index;
+
+ /**
+ * Extracts image pixels into byte array "pixels"
+ */
+ protected void getImagePixels() {
+ int w = image.getWidth();
+ int h = image.getHeight();
+ int type = image.getType();
+ if ((w != width) || (h != height) || (type != BufferedImage.TYPE_3BYTE_BGR)) {
+ // create new image with right size/format
+ BufferedImage temp = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
+ Graphics2D g = temp.createGraphics();
+ g.drawImage(image, 0, 0, null);
+ image = temp;
+ }
+ pixels = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
}
- pixels = null;
- colorDepth = 8;
- palSize = 7;
- // get closest match to transparent color if specified
- if (transparent != null) {
- transIndex = findClosest(transparent);
+
+ /**
+ * Writes Graphic Control Extension
+ */
+ protected void writeGraphicCtrlExt() throws IOException {
+ out.write(0x21); // extension introducer
+ out.write(0xf9); // GCE label
+ out.write(4); // data block size
+ int transp, disp;
+ if (transparent == null) {
+ transp = 0;
+ disp = 0; // dispose = no action
+ } else {
+ transp = 1;
+ disp = 2; // force clear if using transparent color
+ }
+ if (dispose >= 0) {
+ disp = dispose & 7; // user override
+ }
+ disp <<= 2;
+
+ // packed fields
+ out.write(0 | // 1:3 reserved
+ disp | // 4:6 disposal
+ 0 | // 7 user input - 0 = none
+ transp); // 8 transparency flag
+
+ writeShort(delay); // delay x 1/100 sec
+ out.write(transIndex); // transparent color index
+ out.write(0); // block terminator
}
- }
-
- /**
- * Returns index of palette color closest to c
- *
- */
- protected int findClosest(Color c) {
- if (colorTab == null)
- return -1;
- int r = c.getRed();
- int g = c.getGreen();
- int b = c.getBlue();
- int minpos = 0;
- int dmin = 256 * 256 * 256;
- int len = colorTab.length;
- for (int i = 0; i < len;) {
- int dr = r - (colorTab[i++] & 0xff);
- int dg = g - (colorTab[i++] & 0xff);
- int db = b - (colorTab[i] & 0xff);
- int d = dr * dr + dg * dg + db * db;
- int index = i / 3;
- if (usedEntry[index] && (d < dmin)) {
- dmin = d;
- minpos = index;
- }
- i++;
+
+ /**
+ * Writes Image Descriptor
+ */
+ protected void writeImageDesc() throws IOException {
+ out.write(0x2c); // image separator
+ writeShort(0); // image position x,y = 0,0
+ writeShort(0);
+ writeShort(width); // image size
+ writeShort(height);
+ // packed fields
+ if (firstFrame) {
+ // no LCT - GCT is used for first (or only) frame
+ out.write(0);
+ } else {
+ // specify normal LCT
+ out.write(0x80 | // 1 local color table 1=yes
+ 0 | // 2 interlace - 0=no
+ 0 | // 3 sorted - 0=no
+ 0 | // 4-5 reserved
+ palSize); // 6-8 size of color table
+ }
}
- return minpos;
- }
-
- /**
- * Extracts image pixels into byte array "pixels"
- */
- protected void getImagePixels() {
- int w = image.getWidth();
- int h = image.getHeight();
- int type = image.getType();
- if ((w != width) || (h != height) || (type != BufferedImage.TYPE_3BYTE_BGR)) {
- // create new image with right size/format
- BufferedImage temp = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
- Graphics2D g = temp.createGraphics();
- g.drawImage(image, 0, 0, null);
- image = temp;
+
+ /**
+ * Writes Logical Screen Descriptor
+ */
+ protected void writeLSD() throws IOException {
+ // logical screen size
+ writeShort(width);
+ writeShort(height);
+ // packed fields
+ out.write((0x80 | // 1 : global color table flag = 1 (gct used)
+ 0x70 | // 2-4 : color resolution = 7
+ 0x00 | // 5 : gct sort flag = 0
+ palSize)); // 6-8 : gct size
+
+ out.write(0); // background color index
+ out.write(0); // pixel aspect ratio - assume 1:1
}
- pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
- }
-
- /**
- * Writes Graphic Control Extension
- */
- protected void writeGraphicCtrlExt() throws IOException {
- out.write(0x21); // extension introducer
- out.write(0xf9); // GCE label
- out.write(4); // data block size
- int transp, disp;
- if (transparent == null) {
- transp = 0;
- disp = 0; // dispose = no action
- } else {
- transp = 1;
- disp = 2; // force clear if using transparent color
+
+ /**
+ * Writes Netscape application extension to define repeat count.
+ */
+ protected void writeNetscapeExt() throws IOException {
+ out.write(0x21); // extension introducer
+ out.write(0xff); // app extension label
+ out.write(11); // block size
+ writeString("NETSCAPE" + "2.0"); // app id + auth code
+ out.write(3); // sub-block size
+ out.write(1); // loop sub-block id
+ writeShort(repeat); // loop count (extra iterations, 0=repeat forever)
+ out.write(0); // block terminator
}
- if (dispose >= 0) {
- disp = dispose & 7; // user override
+
+ /**
+ * Writes color table
+ */
+ protected void writePalette() throws IOException {
+ out.write(colorTab, 0, colorTab.length);
+ int n = (3 * 256) - colorTab.length;
+ for (int i = 0; i < n; i++) {
+ out.write(0);
+ }
}
- disp <<= 2;
-
- // packed fields
- out.write(0 | // 1:3 reserved
- disp | // 4:6 disposal
- 0 | // 7 user input - 0 = none
- transp); // 8 transparency flag
-
- writeShort(delay); // delay x 1/100 sec
- out.write(transIndex); // transparent color index
- out.write(0); // block terminator
- }
-
- /**
- * Writes Image Descriptor
- */
- protected void writeImageDesc() throws IOException {
- out.write(0x2c); // image separator
- writeShort(0); // image position x,y = 0,0
- writeShort(0);
- writeShort(width); // image size
- writeShort(height);
- // packed fields
- if (firstFrame) {
- // no LCT - GCT is used for first (or only) frame
- out.write(0);
- } else {
- // specify normal LCT
- out.write(0x80 | // 1 local color table 1=yes
- 0 | // 2 interlace - 0=no
- 0 | // 3 sorted - 0=no
- 0 | // 4-5 reserved
- palSize); // 6-8 size of color table
+
+ /**
+ * Encodes and writes pixel data
+ */
+ protected void writePixels() throws IOException {
+ LZWEncoder encoder = new LZWEncoder(width, height, indexedPixels, colorDepth);
+ encoder.encode(out);
}
- }
-
- /**
- * Writes Logical Screen Descriptor
- */
- protected void writeLSD() throws IOException {
- // logical screen size
- writeShort(width);
- writeShort(height);
- // packed fields
- out.write((0x80 | // 1 : global color table flag = 1 (gct used)
- 0x70 | // 2-4 : color resolution = 7
- 0x00 | // 5 : gct sort flag = 0
- palSize)); // 6-8 : gct size
-
- out.write(0); // background color index
- out.write(0); // pixel aspect ratio - assume 1:1
- }
-
- /**
- * Writes Netscape application extension to define repeat count.
- */
- protected void writeNetscapeExt() throws IOException {
- out.write(0x21); // extension introducer
- out.write(0xff); // app extension label
- out.write(11); // block size
- writeString("NETSCAPE" + "2.0"); // app id + auth code
- out.write(3); // sub-block size
- out.write(1); // loop sub-block id
- writeShort(repeat); // loop count (extra iterations, 0=repeat forever)
- out.write(0); // block terminator
- }
-
- /**
- * Writes color table
- */
- protected void writePalette() throws IOException {
- out.write(colorTab, 0, colorTab.length);
- int n = (3 * 256) - colorTab.length;
- for (int i = 0; i < n; i++) {
- out.write(0);
+
+ /**
+ * Write 16-bit value to output stream, LSB first
+ */
+ protected void writeShort(int value) throws IOException {
+ out.write(value & 0xff);
+ out.write((value >> 8) & 0xff);
}
- }
-
- /**
- * Encodes and writes pixel data
- */
- protected void writePixels() throws IOException {
- LZWEncoder encoder = new LZWEncoder(width, height, indexedPixels, colorDepth);
- encoder.encode(out);
- }
-
- /**
- * Write 16-bit value to output stream, LSB first
- */
- protected void writeShort(int value) throws IOException {
- out.write(value & 0xff);
- out.write((value >> 8) & 0xff);
- }
-
- /**
- * Writes string to output stream
- */
- protected void writeString(String s) throws IOException {
- for (int i = 0; i < s.length(); i++) {
- out.write((byte) s.charAt(i));
+
+ /**
+ * Writes string to output stream
+ */
+ protected void writeString(String s) throws IOException {
+ for (int i = 0; i < s.length(); i++) {
+ out.write((byte)s.charAt(i));
+ }
}
- }
}
-
-//
+
+//
// Adapted from Jef Poskanzer's Java port by way of J. M. G. Elliott.
// K Weiner 12/00
-
+
class LZWEncoder {
-
- private static final int EOF = -1;
-
- private int imgW, imgH;
-
- private byte[] pixAry;
-
- private int initCodeSize;
-
- private int remaining;
-
- private int curPixel;
-
- // GIFCOMPR.C - GIF Image compression routines
- //
- // Lempel-Ziv compression based on 'compress'. GIF modifications by
- // David Rowley (mgardi@watdcsu.waterloo.edu)
-
- // General DEFINEs
-
- static final int BITS = 12;
-
- static final int HSIZE = 5003; // 80% occupancy
-
- // GIF Image compression - modified 'compress'
- //
- // Based on: compress.c - File compression ala IEEE Computer, June 1984.
- //
- // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas)
- // Jim McKie (decvax!mcvax!jim)
- // Steve Davies (decvax!vax135!petsd!peora!srd)
- // Ken Turkowski (decvax!decwrl!turtlevax!ken)
- // James A. Woods (decvax!ihnp4!ames!jaw)
- // Joe Orost (decvax!vax135!petsd!joe)
-
- int n_bits; // number of bits/code
-
- int maxbits = BITS; // user settable max # bits/code
-
- int maxcode; // maximum code, given n_bits
-
- int maxmaxcode = 1 << BITS; // should NEVER generate this code
-
- int[] htab = new int[HSIZE];
-
- int[] codetab = new int[HSIZE];
-
- int hsize = HSIZE; // for dynamic table sizing
-
- int free_ent = 0; // first unused entry
-
- // block compression parameters -- after all codes are used up,
- // and compression rate changes, start over.
- boolean clear_flg = false;
-
- // Algorithm: use open addressing double hashing (no chaining) on the
- // prefix code / next character combination. We do a variant of Knuth's
- // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
- // secondary probe. Here, the modular division first probe is gives way
- // to a faster exclusive-or manipulation. Also do block compression with
- // an adaptive reset, whereby the code table is cleared when the compression
- // ratio decreases, but after the table fills. The variable-length output
- // codes are re-sized at this point, and a special CLEAR code is generated
- // for the decompressor. Late addition: construct the table according to
- // file size for noticeable speed improvement on small files. Please direct
- // questions about this implementation to ames!jaw.
-
- int g_init_bits;
-
- int ClearCode;
-
- int EOFCode;
-
- // output
- //
- // Output the given code.
- // Inputs:
- // code: A n_bits-bit integer. If == -1, then EOF. This assumes
- // that n_bits =< wordsize - 1.
- // Outputs:
- // Outputs code to the file.
- // Assumptions:
- // Chars are 8 bits long.
- // Algorithm:
- // Maintain a BITS character long buffer (so that 8 codes will
- // fit in it exactly). Use the VAX insv instruction to insert each
- // code in turn. When the buffer fills up empty it and start over.
-
- int cur_accum = 0;
-
- int cur_bits = 0;
-
- int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF,
- 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
-
- // Number of characters so far in this 'packet'
- int a_count;
-
- // Define the storage for the packet accumulator
- byte[] accum = new byte[256];
-
- // ----------------------------------------------------------------------------
- LZWEncoder(int width, int height, byte[] pixels, int color_depth) {
- imgW = width;
- imgH = height;
- pixAry = pixels;
- initCodeSize = Math.max(2, color_depth);
- }
-
- // Add a character to the end of the current packet, and if it is 254
- // characters, flush the packet to disk.
- void char_out(byte c, OutputStream outs) throws IOException {
- accum[a_count++] = c;
- if (a_count >= 254)
- flush_char(outs);
- }
-
- // Clear out the hash table
-
- // table clear for block compress
- void cl_block(OutputStream outs) throws IOException {
- cl_hash(hsize);
- free_ent = ClearCode + 2;
- clear_flg = true;
-
- output(ClearCode, outs);
- }
-
- // reset code table
- void cl_hash(int hsize) {
- for (int i = 0; i < hsize; ++i)
- htab[i] = -1;
- }
-
- void compress(int init_bits, OutputStream outs) throws IOException {
- int fcode;
- int i /* = 0 */;
- int c;
- int ent;
- int disp;
- int hsize_reg;
- int hshift;
-
- // Set up the globals: g_init_bits - initial number of bits
- g_init_bits = init_bits;
-
- // Set up the necessary values
- clear_flg = false;
- n_bits = g_init_bits;
- maxcode = MAXCODE(n_bits);
-
- ClearCode = 1 << (init_bits - 1);
- EOFCode = ClearCode + 1;
- free_ent = ClearCode + 2;
-
- a_count = 0; // clear packet
-
- ent = nextPixel();
-
- hshift = 0;
- for (fcode = hsize; fcode < 65536; fcode *= 2)
- ++hshift;
- hshift = 8 - hshift; // set hash code range bound
-
- hsize_reg = hsize;
- cl_hash(hsize_reg); // clear hash table
-
- output(ClearCode, outs);
-
- outer_loop: while ((c = nextPixel()) != EOF) {
- fcode = (c << maxbits) + ent;
- i = (c << hshift) ^ ent; // xor hashing
-
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue;
- } else if (htab[i] >= 0) // non-empty slot
- {
- disp = hsize_reg - i; // secondary hash (after G. Knott)
- if (i == 0)
- disp = 1;
- do {
- if ((i -= disp) < 0)
- i += hsize_reg;
-
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue outer_loop;
- }
- } while (htab[i] >= 0);
- }
- output(ent, outs);
- ent = c;
- if (free_ent < maxmaxcode) {
- codetab[i] = free_ent++; // code -> hashtable
- htab[i] = fcode;
- } else
- cl_block(outs);
+
+ static final int BITS = 12;
+ static final int HSIZE = 5003; // 80% occupancy
+ private static final int EOF = -1;
+ int n_bits; // number of bits/code
+ int maxbits = BITS; // user settable max # bits/code
+ int maxcode; // maximum code, given n_bits
+
+ // GIFCOMPR.C - GIF Image compression routines
+ //
+ // Lempel-Ziv compression based on 'compress'. GIF modifications by
+ // David Rowley (mgardi@watdcsu.waterloo.edu)
+
+ // General DEFINEs
+ int maxmaxcode = 1 << BITS; // should NEVER generate this code
+ int[] htab = new int[HSIZE];
+
+ // GIF Image compression - modified 'compress'
+ //
+ // Based on: compress.c - File compression ala IEEE Computer, June 1984.
+ //
+ // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas)
+ // Jim McKie (decvax!mcvax!jim)
+ // Steve Davies (decvax!vax135!petsd!peora!srd)
+ // Ken Turkowski (decvax!decwrl!turtlevax!ken)
+ // James A. Woods (decvax!ihnp4!ames!jaw)
+ // Joe Orost (decvax!vax135!petsd!joe)
+ int[] codetab = new int[HSIZE];
+ int hsize = HSIZE; // for dynamic table sizing
+ int free_ent = 0; // first unused entry
+ // block compression parameters -- after all codes are used up,
+ // and compression rate changes, start over.
+ boolean clear_flg = false;
+ int g_init_bits;
+ int ClearCode;
+ int EOFCode;
+ int cur_accum = 0;
+ int cur_bits = 0;
+
+ // Algorithm: use open addressing double hashing (no chaining) on the
+ // prefix code / next character combination. We do a variant of Knuth's
+ // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
+ // secondary probe. Here, the modular division first probe is gives way
+ // to a faster exclusive-or manipulation. Also do block compression with
+ // an adaptive reset, whereby the code table is cleared when the compression
+ // ratio decreases, but after the table fills. The variable-length output
+ // codes are re-sized at this point, and a special CLEAR code is generated
+ // for the decompressor. Late addition: construct the table according to
+ // file size for noticeable speed improvement on small files. Please direct
+ // questions about this implementation to ames!jaw.
+ int masks[] = {0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF,
+ 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF};
+ // Number of characters so far in this 'packet'
+ int a_count;
+ // Define the storage for the packet accumulator
+ byte[] accum = new byte[256];
+
+ // output
+ //
+ // Output the given code.
+ // Inputs:
+ // code: A n_bits-bit integer. If == -1, then EOF. This assumes
+ // that n_bits =< wordsize - 1.
+ // Outputs:
+ // Outputs code to the file.
+ // Assumptions:
+ // Chars are 8 bits long.
+ // Algorithm:
+ // Maintain a BITS character long buffer (so that 8 codes will
+ // fit in it exactly). Use the VAX insv instruction to insert each
+ // code in turn. When the buffer fills up empty it and start over.
+ private int imgW, imgH;
+ private byte[] pixAry;
+ private int initCodeSize;
+ private int remaining;
+ private int curPixel;
+
+ // ----------------------------------------------------------------------------
+ LZWEncoder(int width, int height, byte[] pixels, int color_depth) {
+ imgW = width;
+ imgH = height;
+ pixAry = pixels;
+ initCodeSize = Math.max(2, color_depth);
+ }
+
+ // Add a character to the end of the current packet, and if it is 254
+ // characters, flush the packet to disk.
+ void char_out(byte c, OutputStream outs) throws IOException {
+ accum[a_count++] = c;
+ if (a_count >= 254)
+ flush_char(outs);
}
- // Put out the final code.
- output(ent, outs);
- output(EOFCode, outs);
- }
-
- // ----------------------------------------------------------------------------
- void encode(OutputStream os) throws IOException {
- os.write(initCodeSize); // write "initial code size" byte
-
- remaining = imgW * imgH; // reset navigation variables
- curPixel = 0;
-
- compress(initCodeSize + 1, os); // compress and write the pixel data
-
- os.write(0); // write block terminator
- }
-
- // Flush the packet to disk, and reset the accumulator
- void flush_char(OutputStream outs) throws IOException {
- if (a_count > 0) {
- outs.write(a_count);
- outs.write(accum, 0, a_count);
- a_count = 0;
+
+ // Clear out the hash table
+
+ // table clear for block compress
+ void cl_block(OutputStream outs) throws IOException {
+ cl_hash(hsize);
+ free_ent = ClearCode + 2;
+ clear_flg = true;
+
+ output(ClearCode, outs);
}
- }
-
- final int MAXCODE(int n_bits) {
- return (1 << n_bits) - 1;
- }
-
- // ----------------------------------------------------------------------------
- // Return the next pixel from the image
- // ----------------------------------------------------------------------------
- private int nextPixel() {
- if (remaining == 0)
- return EOF;
-
- --remaining;
-
- byte pix = pixAry[curPixel++];
-
- return pix & 0xff;
- }
-
- void output(int code, OutputStream outs) throws IOException {
- cur_accum &= masks[cur_bits];
-
- if (cur_bits > 0)
- cur_accum |= (code << cur_bits);
- else
- cur_accum = code;
-
- cur_bits += n_bits;
-
- while (cur_bits >= 8) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
+
+ // reset code table
+ void cl_hash(int hsize) {
+ for (int i = 0; i < hsize; ++i)
+ htab[i] = -1;
}
-
- // If the next entry is going to be too big for the code size,
- // then increase it, if possible.
- if (free_ent > maxcode || clear_flg) {
- if (clear_flg) {
- maxcode = MAXCODE(n_bits = g_init_bits);
+
+ void compress(int init_bits, OutputStream outs) throws IOException {
+ int fcode;
+ int i /* = 0 */;
+ int c;
+ int ent;
+ int disp;
+ int hsize_reg;
+ int hshift;
+
+ // Set up the globals: g_init_bits - initial number of bits
+ g_init_bits = init_bits;
+
+ // Set up the necessary values
clear_flg = false;
- } else {
- ++n_bits;
- if (n_bits == maxbits)
- maxcode = maxmaxcode;
- else
- maxcode = MAXCODE(n_bits);
- }
+ n_bits = g_init_bits;
+ maxcode = MAXCODE(n_bits);
+
+ ClearCode = 1 << (init_bits - 1);
+ EOFCode = ClearCode + 1;
+ free_ent = ClearCode + 2;
+
+ a_count = 0; // clear packet
+
+ ent = nextPixel();
+
+ hshift = 0;
+ for (fcode = hsize; fcode < 65536; fcode *= 2)
+ ++hshift;
+ hshift = 8 - hshift; // set hash code range bound
+
+ hsize_reg = hsize;
+ cl_hash(hsize_reg); // clear hash table
+
+ output(ClearCode, outs);
+
+ outer_loop:
+ while ((c = nextPixel()) != EOF) {
+ fcode = (c << maxbits) + ent;
+ i = (c << hshift) ^ ent; // xor hashing
+
+ if (htab[i] == fcode) {
+ ent = codetab[i];
+ continue;
+ } else if (htab[i] >= 0) // non-empty slot
+ {
+ disp = hsize_reg - i; // secondary hash (after G. Knott)
+ if (i == 0)
+ disp = 1;
+ do {
+ if ((i -= disp) < 0)
+ i += hsize_reg;
+
+ if (htab[i] == fcode) {
+ ent = codetab[i];
+ continue outer_loop;
+ }
+ } while (htab[i] >= 0);
+ }
+ output(ent, outs);
+ ent = c;
+ if (free_ent < maxmaxcode) {
+ codetab[i] = free_ent++; // code -> hashtable
+ htab[i] = fcode;
+ } else
+ cl_block(outs);
+ }
+ // Put out the final code.
+ output(ent, outs);
+ output(EOFCode, outs);
}
-
- if (code == EOFCode) {
- // At EOF, write the rest of the buffer.
- while (cur_bits > 0) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
- }
-
- flush_char(outs);
+
+ // ----------------------------------------------------------------------------
+ void encode(OutputStream os) throws IOException {
+ os.write(initCodeSize); // write "initial code size" byte
+
+ remaining = imgW * imgH; // reset navigation variables
+ curPixel = 0;
+
+ compress(initCodeSize + 1, os); // compress and write the pixel data
+
+ os.write(0); // write block terminator
+ }
+
+ // Flush the packet to disk, and reset the accumulator
+ void flush_char(OutputStream outs) throws IOException {
+ if (a_count > 0) {
+ outs.write(a_count);
+ outs.write(accum, 0, a_count);
+ a_count = 0;
+ }
+ }
+
+ final int MAXCODE(int n_bits) {
+ return (1 << n_bits) - 1;
+ }
+
+ // ----------------------------------------------------------------------------
+ // Return the next pixel from the image
+ // ----------------------------------------------------------------------------
+ private int nextPixel() {
+ if (remaining == 0)
+ return EOF;
+
+ --remaining;
+
+ byte pix = pixAry[curPixel++];
+
+ return pix & 0xff;
+ }
+
+ void output(int code, OutputStream outs) throws IOException {
+ cur_accum &= masks[cur_bits];
+
+ if (cur_bits > 0)
+ cur_accum |= (code << cur_bits);
+ else
+ cur_accum = code;
+
+ cur_bits += n_bits;
+
+ while (cur_bits >= 8) {
+ char_out((byte)(cur_accum & 0xff), outs);
+ cur_accum >>= 8;
+ cur_bits -= 8;
+ }
+
+ // If the next entry is going to be too big for the code size,
+ // then increase it, if possible.
+ if (free_ent > maxcode || clear_flg) {
+ if (clear_flg) {
+ maxcode = MAXCODE(n_bits = g_init_bits);
+ clear_flg = false;
+ } else {
+ ++n_bits;
+ if (n_bits == maxbits)
+ maxcode = maxmaxcode;
+ else
+ maxcode = MAXCODE(n_bits);
+ }
+ }
+
+ if (code == EOFCode) {
+ // At EOF, write the rest of the buffer.
+ while (cur_bits > 0) {
+ char_out((byte)(cur_accum & 0xff), outs);
+ cur_accum >>= 8;
+ cur_bits -= 8;
+ }
+
+ flush_char(outs);
+ }
}
- }
}
-
+
/*
* NeuQuant Neural-Net Quantization Algorithm
* ------------------------------------------
@@ -811,484 +762,472 @@ class LZWEncoder {
* receive copies from any such party to do so, with the only requirement being
* that this copyright notice remain intact.
*/
-
+
// Ported to Java 12/00 K Weiner
class NeuQuant {
-
- protected static final int netsize = 256; /* number of colours used */
-
- /* four primes near 500 - assume no image has a length so large */
- /* that it is divisible by all four primes */
- protected static final int prime1 = 499;
-
- protected static final int prime2 = 491;
-
- protected static final int prime3 = 487;
-
- protected static final int prime4 = 503;
-
- protected static final int minpicturebytes = (3 * prime4);
-
- /* minimum size for input image */
-
- /*
- * Program Skeleton ---------------- [select samplefac in range 1..30] [read
- * image from input file] pic = (unsigned char*) malloc(3*width*height);
- * initnet(pic,3*width*height,samplefac); learn(); unbiasnet(); [write output
- * image header, using writecolourmap(f)] inxbuild(); write output image using
- * inxsearch(b,g,r)
- */
-
- /*
- * Network Definitions -------------------
- */
-
- protected static final int maxnetpos = (netsize - 1);
-
- protected static final int netbiasshift = 4; /* bias for colour values */
-
- protected static final int ncycles = 100; /* no. of learning cycles */
-
- /* defs for freq and bias */
- protected static final int intbiasshift = 16; /* bias for fractions */
-
- protected static final int intbias = (((int) 1) << intbiasshift);
-
- protected static final int gammashift = 10; /* gamma = 1024 */
-
- protected static final int gamma = (((int) 1) << gammashift);
-
- protected static final int betashift = 10;
-
- protected static final int beta = (intbias >> betashift); /* beta = 1/1024 */
-
- protected static final int betagamma = (intbias << (gammashift - betashift));
-
- /* defs for decreasing radius factor */
- protected static final int initrad = (netsize >> 3); /*
- * for 256 cols, radius
- * starts
- */
-
- protected static final int radiusbiasshift = 6; /* at 32.0 biased by 6 bits */
-
- protected static final int radiusbias = (((int) 1) << radiusbiasshift);
-
- protected static final int initradius = (initrad * radiusbias); /*
- * and
- * decreases
- * by a
- */
-
- protected static final int radiusdec = 30; /* factor of 1/30 each cycle */
-
- /* defs for decreasing alpha factor */
- protected static final int alphabiasshift = 10; /* alpha starts at 1.0 */
-
- protected static final int initalpha = (((int) 1) << alphabiasshift);
-
- protected int alphadec; /* biased by 10 bits */
-
- /* radbias and alpharadbias used for radpower calculation */
- protected static final int radbiasshift = 8;
-
- protected static final int radbias = (((int) 1) << radbiasshift);
-
- protected static final int alpharadbshift = (alphabiasshift + radbiasshift);
-
- protected static final int alpharadbias = (((int) 1) << alpharadbshift);
-
- /*
- * Types and Global Variables --------------------------
- */
-
- protected byte[] thepicture; /* the input image itself */
-
- protected int lengthcount; /* lengthcount = H*W*3 */
-
- protected int samplefac; /* sampling factor 1..30 */
-
- // typedef int pixel[4]; /* BGRc */
- protected int[][] network; /* the network itself - [netsize][4] */
-
- protected int[] netindex = new int[256];
-
- /* for network lookup - really 256 */
-
- protected int[] bias = new int[netsize];
-
- /* bias and freq arrays for learning */
- protected int[] freq = new int[netsize];
-
- protected int[] radpower = new int[initrad];
-
- /* radpower for precomputation */
-
- /*
- * Initialise network in range (0,0,0) to (255,255,255) and set parameters
- * -----------------------------------------------------------------------
- */
- public NeuQuant(byte[] thepic, int len, int sample) {
-
- int i;
- int[] p;
-
- thepicture = thepic;
- lengthcount = len;
- samplefac = sample;
-
- network = new int[netsize][];
- for (i = 0; i < netsize; i++) {
- network[i] = new int[4];
- p = network[i];
- p[0] = p[1] = p[2] = (i << (netbiasshift + 8)) / netsize;
- freq[i] = intbias / netsize; /* 1/netsize */
- bias[i] = 0;
- }
- }
-
- public byte[] colorMap() {
- byte[] map = new byte[3 * netsize];
- int[] index = new int[netsize];
- for (int i = 0; i < netsize; i++)
- index[network[i][3]] = i;
- int k = 0;
- for (int i = 0; i < netsize; i++) {
- int j = index[i];
- map[k++] = (byte) (network[j][0]);
- map[k++] = (byte) (network[j][1]);
- map[k++] = (byte) (network[j][2]);
+
+ protected static final int netsize = 256; /* number of colours used */
+
+ /* four primes near 500 - assume no image has a length so large */
+ /* that it is divisible by all four primes */
+ protected static final int prime1 = 499;
+
+ protected static final int prime2 = 491;
+
+ protected static final int prime3 = 487;
+
+ protected static final int prime4 = 503;
+
+ protected static final int minpicturebytes = (3 * prime4);
+
+ /* minimum size for input image */
+
+ /*
+ * Program Skeleton ---------------- [select samplefac in range 1..30] [read
+ * image from input file] pic = (unsigned char*) malloc(3*width*height);
+ * initnet(pic,3*width*height,samplefac); learn(); unbiasnet(); [write output
+ * image header, using writecolourmap(f)] inxbuild(); write output image using
+ * inxsearch(b,g,r)
+ */
+
+ /*
+ * Network Definitions -------------------
+ */
+
+ protected static final int maxnetpos = (netsize - 1);
+
+ protected static final int netbiasshift = 4; /* bias for colour values */
+
+ protected static final int ncycles = 100; /* no. of learning cycles */
+
+ /* defs for freq and bias */
+ protected static final int intbiasshift = 16; /* bias for fractions */
+
+ protected static final int intbias = (((int)1) << intbiasshift);
+ protected static final int beta = (intbias >> betashift); /* beta = 1/1024 */
+ protected static final int betagamma = (intbias << (gammashift - betashift));
+ protected static final int gammashift = 10; /* gamma = 1024 */
+ protected static final int gamma = (((int)1) << gammashift);
+ protected static final int betashift = 10;
+ /* defs for decreasing radius factor */
+ protected static final int initrad = (netsize >> 3); /*
+ * for 256 cols, radius
+ * starts
+ */
+
+ protected static final int radiusbiasshift = 6; /* at 32.0 biased by 6 bits */
+
+ protected static final int radiusbias = (((int)1) << radiusbiasshift);
+
+ protected static final int initradius = (initrad * radiusbias); /*
+ * and
+ * decreases
+ * by a
+ */
+
+ protected static final int radiusdec = 30; /* factor of 1/30 each cycle */
+
+ /* defs for decreasing alpha factor */
+ protected static final int alphabiasshift = 10; /* alpha starts at 1.0 */
+
+ protected static final int initalpha = (((int)1) << alphabiasshift);
+ /* radbias and alpharadbias used for radpower calculation */
+ protected static final int radbiasshift = 8;
+ protected static final int radbias = (((int)1) << radbiasshift);
+ protected static final int alpharadbshift = (alphabiasshift + radbiasshift);
+ protected static final int alpharadbias = (((int)1) << alpharadbshift);
+ protected int alphadec; /* biased by 10 bits */
+
+ /*
+ * Types and Global Variables --------------------------
+ */
+ protected byte[] thepicture; /* the input image itself */
+
+ protected int lengthcount; /* lengthcount = H*W*3 */
+
+ protected int samplefac; /* sampling factor 1..30 */
+
+ // typedef int pixel[4]; /* BGRc */
+ protected int[][] network; /* the network itself - [netsize][4] */
+
+ protected int[] netindex = new int[256];
+
+ /* for network lookup - really 256 */
+
+ protected int[] bias = new int[netsize];
+
+ /* bias and freq arrays for learning */
+ protected int[] freq = new int[netsize];
+
+ protected int[] radpower = new int[initrad];
+
+ /* radpower for precomputation */
+
+ /*
+ * Initialise network in range (0,0,0) to (255,255,255) and set parameters
+ * -----------------------------------------------------------------------
+ */
+ public NeuQuant(byte[] thepic, int len, int sample) {
+
+ int i;
+ int[] p;
+
+ thepicture = thepic;
+ lengthcount = len;
+ samplefac = sample;
+
+ network = new int[netsize][];
+ for (i = 0; i < netsize; i++) {
+ network[i] = new int[4];
+ p = network[i];
+ p[0] = p[1] = p[2] = (i << (netbiasshift + 8)) / netsize;
+ freq[i] = intbias / netsize; /* 1/netsize */
+ bias[i] = 0;
+ }
}
- return map;
- }
-
- /*
- * Insertion sort of network and building of netindex[0..255] (to do after
- * unbias)
- * -------------------------------------------------------------------------------
- */
- public void inxbuild() {
-
- int i, j, smallpos, smallval;
- int[] p;
- int[] q;
- int previouscol, startpos;
-
- previouscol = 0;
- startpos = 0;
- for (i = 0; i < netsize; i++) {
- p = network[i];
- smallpos = i;
- smallval = p[1]; /* index on g */
- /* find smallest in i..netsize-1 */
- for (j = i + 1; j < netsize; j++) {
- q = network[j];
- if (q[1] < smallval) { /* index on g */
- smallpos = j;
- smallval = q[1]; /* index on g */
+
+ public byte[] colorMap() {
+ byte[] map = new byte[3 * netsize];
+ int[] index = new int[netsize];
+ for (int i = 0; i < netsize; i++)
+ index[network[i][3]] = i;
+ int k = 0;
+ for (int i = 0; i < netsize; i++) {
+ int j = index[i];
+ map[k++] = (byte)(network[j][0]);
+ map[k++] = (byte)(network[j][1]);
+ map[k++] = (byte)(network[j][2]);
}
- }
- q = network[smallpos];
- /* swap p (i) and q (smallpos) entries */
- if (i != smallpos) {
- j = q[0];
- q[0] = p[0];
- p[0] = j;
- j = q[1];
- q[1] = p[1];
- p[1] = j;
- j = q[2];
- q[2] = p[2];
- p[2] = j;
- j = q[3];
- q[3] = p[3];
- p[3] = j;
- }
- /* smallval entry is now in position i */
- if (smallval != previouscol) {
- netindex[previouscol] = (startpos + i) >> 1;
- for (j = previouscol + 1; j < smallval; j++)
- netindex[j] = i;
- previouscol = smallval;
- startpos = i;
- }
+ return map;
}
- netindex[previouscol] = (startpos + maxnetpos) >> 1;
- for (j = previouscol + 1; j < 256; j++)
- netindex[j] = maxnetpos; /* really 256 */
- }
-
- /*
- * Main Learning Loop ------------------
- */
- public void learn() {
-
- int i, j, b, g, r;
- int radius, rad, alpha, step, delta, samplepixels;
- byte[] p;
- int pix, lim;
-
- if (lengthcount < minpicturebytes)
- samplefac = 1;
- alphadec = 30 + ((samplefac - 1) / 3);
- p = thepicture;
- pix = 0;
- lim = lengthcount;
- samplepixels = lengthcount / (3 * samplefac);
- delta = samplepixels / ncycles;
- alpha = initalpha;
- radius = initradius;
-
- rad = radius >> radiusbiasshift;
- if (rad <= 1)
- rad = 0;
- for (i = 0; i < rad; i++)
- radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad));
-
- // fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad);
-
- if (lengthcount < minpicturebytes)
- step = 3;
- else if ((lengthcount % prime1) != 0)
- step = 3 * prime1;
- else {
- if ((lengthcount % prime2) != 0)
- step = 3 * prime2;
- else {
- if ((lengthcount % prime3) != 0)
- step = 3 * prime3;
- else
- step = 3 * prime4;
- }
+
+ /*
+ * Insertion sort of network and building of netindex[0..255] (to do after
+ * unbias)
+ * -------------------------------------------------------------------------------
+ */
+ public void inxbuild() {
+
+ int i, j, smallpos, smallval;
+ int[] p;
+ int[] q;
+ int previouscol, startpos;
+
+ previouscol = 0;
+ startpos = 0;
+ for (i = 0; i < netsize; i++) {
+ p = network[i];
+ smallpos = i;
+ smallval = p[1]; /* index on g */
+ /* find smallest in i..netsize-1 */
+ for (j = i + 1; j < netsize; j++) {
+ q = network[j];
+ if (q[1] < smallval) { /* index on g */
+ smallpos = j;
+ smallval = q[1]; /* index on g */
+ }
+ }
+ q = network[smallpos];
+ /* swap p (i) and q (smallpos) entries */
+ if (i != smallpos) {
+ j = q[0];
+ q[0] = p[0];
+ p[0] = j;
+ j = q[1];
+ q[1] = p[1];
+ p[1] = j;
+ j = q[2];
+ q[2] = p[2];
+ p[2] = j;
+ j = q[3];
+ q[3] = p[3];
+ p[3] = j;
+ }
+ /* smallval entry is now in position i */
+ if (smallval != previouscol) {
+ netindex[previouscol] = (startpos + i) >> 1;
+ for (j = previouscol + 1; j < smallval; j++)
+ netindex[j] = i;
+ previouscol = smallval;
+ startpos = i;
+ }
+ }
+ netindex[previouscol] = (startpos + maxnetpos) >> 1;
+ for (j = previouscol + 1; j < 256; j++)
+ netindex[j] = maxnetpos; /* really 256 */
}
-
- i = 0;
- while (i < samplepixels) {
- b = (p[pix + 0] & 0xff) << netbiasshift;
- g = (p[pix + 1] & 0xff) << netbiasshift;
- r = (p[pix + 2] & 0xff) << netbiasshift;
- j = contest(b, g, r);
-
- altersingle(alpha, j, b, g, r);
- if (rad != 0)
- alterneigh(rad, j, b, g, r); /* alter neighbours */
-
- pix += step;
- if (pix >= lim)
- pix -= lengthcount;
-
- i++;
- if (delta == 0)
- delta = 1;
- if (i % delta == 0) {
- alpha -= alpha / alphadec;
- radius -= radius / radiusdec;
+
+ /*
+ * Main Learning Loop ------------------
+ */
+ public void learn() {
+
+ int i, j, b, g, r;
+ int radius, rad, alpha, step, delta, samplepixels;
+ byte[] p;
+ int pix, lim;
+
+ if (lengthcount < minpicturebytes)
+ samplefac = 1;
+ alphadec = 30 + ((samplefac - 1) / 3);
+ p = thepicture;
+ pix = 0;
+ lim = lengthcount;
+ samplepixels = lengthcount / (3 * samplefac);
+ delta = samplepixels / ncycles;
+ alpha = initalpha;
+ radius = initradius;
+
rad = radius >> radiusbiasshift;
if (rad <= 1)
- rad = 0;
- for (j = 0; j < rad; j++)
- radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad));
- }
- }
- // fprintf(stderr,"finished 1D learning: final alpha=%f
- // !\n",((float)alpha)/initalpha);
- }
-
- /*
- * Search for BGR values 0..255 (after net is unbiased) and return colour
- * index
- * ----------------------------------------------------------------------------
- */
- public int map(int b, int g, int r) {
-
- int i, j, dist, a, bestd;
- int[] p;
- int best;
-
- bestd = 1000; /* biggest possible dist is 256*3 */
- best = -1;
- i = netindex[g]; /* index on g */
- j = i - 1; /* start at netindex[g] and work outwards */
-
- while ((i < netsize) || (j >= 0)) {
- if (i < netsize) {
- p = network[i];
- dist = p[1] - g; /* inx key */
- if (dist >= bestd)
- i = netsize; /* stop iter */
+ rad = 0;
+ for (i = 0; i < rad; i++)
+ radpower[i] = alpha * (((rad * rad - i * i) * radbias) / (rad * rad));
+
+ // fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad);
+
+ if (lengthcount < minpicturebytes)
+ step = 3;
+ else if ((lengthcount % prime1) != 0)
+ step = 3 * prime1;
else {
- i++;
- if (dist < 0)
- dist = -dist;
- a = p[0] - b;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- a = p[2] - r;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- bestd = dist;
- best = p[3];
+ if ((lengthcount % prime2) != 0)
+ step = 3 * prime2;
+ else {
+ if ((lengthcount % prime3) != 0)
+ step = 3 * prime3;
+ else
+ step = 3 * prime4;
}
- }
}
- }
- if (j >= 0) {
- p = network[j];
- dist = g - p[1]; /* inx key - reverse dif */
- if (dist >= bestd)
- j = -1; /* stop iter */
- else {
- j--;
- if (dist < 0)
- dist = -dist;
- a = p[0] - b;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- a = p[2] - r;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- bestd = dist;
- best = p[3];
+
+ i = 0;
+ while (i < samplepixels) {
+ b = (p[pix + 0] & 0xff) << netbiasshift;
+ g = (p[pix + 1] & 0xff) << netbiasshift;
+ r = (p[pix + 2] & 0xff) << netbiasshift;
+ j = contest(b, g, r);
+
+ altersingle(alpha, j, b, g, r);
+ if (rad != 0)
+ alterneigh(rad, j, b, g, r); /* alter neighbours */
+
+ pix += step;
+ if (pix >= lim)
+ pix -= lengthcount;
+
+ i++;
+ if (delta == 0)
+ delta = 1;
+ if (i % delta == 0) {
+ alpha -= alpha / alphadec;
+ radius -= radius / radiusdec;
+ rad = radius >> radiusbiasshift;
+ if (rad <= 1)
+ rad = 0;
+ for (j = 0; j < rad; j++)
+ radpower[j] = alpha * (((rad * rad - j * j) * radbias) / (rad * rad));
}
- }
}
- }
+ // fprintf(stderr,"finished 1D learning: final alpha=%f
+ // !\n",((float)alpha)/initalpha);
}
- return (best);
- }
-
- public byte[] process() {
- learn();
- unbiasnet();
- inxbuild();
- return colorMap();
- }
-
- /*
- * Unbias network to give byte values 0..255 and record position i to prepare
- * for sort
- * -----------------------------------------------------------------------------------
- */
- public void unbiasnet() {
- for (int i = 0; i < netsize; i++) {
- network[i][0] >>= netbiasshift;
- network[i][1] >>= netbiasshift;
- network[i][2] >>= netbiasshift;
- network[i][3] = i; /* record colour no */
+
+ /*
+ * Search for BGR values 0..255 (after net is unbiased) and return colour
+ * index
+ * ----------------------------------------------------------------------------
+ */
+ public int map(int b, int g, int r) {
+
+ int i, j, dist, a, bestd;
+ int[] p;
+ int best;
+
+ bestd = 1000; /* biggest possible dist is 256*3 */
+ best = -1;
+ i = netindex[g]; /* index on g */
+ j = i - 1; /* start at netindex[g] and work outwards */
+
+ while ((i < netsize) || (j >= 0)) {
+ if (i < netsize) {
+ p = network[i];
+ dist = p[1] - g; /* inx key */
+ if (dist >= bestd)
+ i = netsize; /* stop iter */
+ else {
+ i++;
+ if (dist < 0)
+ dist = -dist;
+ a = p[0] - b;
+ if (a < 0)
+ a = -a;
+ dist += a;
+ if (dist < bestd) {
+ a = p[2] - r;
+ if (a < 0)
+ a = -a;
+ dist += a;
+ if (dist < bestd) {
+ bestd = dist;
+ best = p[3];
+ }
+ }
+ }
+ }
+ if (j >= 0) {
+ p = network[j];
+ dist = g - p[1]; /* inx key - reverse dif */
+ if (dist >= bestd)
+ j = -1; /* stop iter */
+ else {
+ j--;
+ if (dist < 0)
+ dist = -dist;
+ a = p[0] - b;
+ if (a < 0)
+ a = -a;
+ dist += a;
+ if (dist < bestd) {
+ a = p[2] - r;
+ if (a < 0)
+ a = -a;
+ dist += a;
+ if (dist < bestd) {
+ bestd = dist;
+ best = p[3];
+ }
+ }
+ }
+ }
+ }
+ return (best);
}
- }
-
- /*
- * Move adjacent neurons by precomputed alpha*(1-((i-j)^2/[r]^2)) in
- * radpower[|i-j|]
- * ---------------------------------------------------------------------------------
- */
- protected void alterneigh(int rad, int i, int b, int g, int r) {
-
- int j, k, lo, hi, a, m;
- int[] p;
-
- lo = i - rad;
- if (lo < -1)
- lo = -1;
- hi = i + rad;
- if (hi > netsize)
- hi = netsize;
-
- j = i + 1;
- k = i - 1;
- m = 1;
- while ((j < hi) || (k > lo)) {
- a = radpower[m++];
- if (j < hi) {
- p = network[j++];
- try {
- p[0] -= (a * (p[0] - b)) / alpharadbias;
- p[1] -= (a * (p[1] - g)) / alpharadbias;
- p[2] -= (a * (p[2] - r)) / alpharadbias;
- } catch (Exception e) {
- } // prevents 1.3 miscompilation
- }
- if (k > lo) {
- p = network[k--];
- try {
- p[0] -= (a * (p[0] - b)) / alpharadbias;
- p[1] -= (a * (p[1] - g)) / alpharadbias;
- p[2] -= (a * (p[2] - r)) / alpharadbias;
- } catch (Exception e) {
+
+ public byte[] process() {
+ learn();
+ unbiasnet();
+ inxbuild();
+ return colorMap();
+ }
+
+ /*
+ * Unbias network to give byte values 0..255 and record position i to prepare
+ * for sort
+ * -----------------------------------------------------------------------------------
+ */
+ public void unbiasnet() {
+ for (int i = 0; i < netsize; i++) {
+ network[i][0] >>= netbiasshift;
+ network[i][1] >>= netbiasshift;
+ network[i][2] >>= netbiasshift;
+ network[i][3] = i; /* record colour no */
}
- }
}
- }
-
- /*
- * Move neuron i towards biased (b,g,r) by factor alpha
- * ----------------------------------------------------
- */
- protected void altersingle(int alpha, int i, int b, int g, int r) {
-
- /* alter hit neuron */
- int[] n = network[i];
- n[0] -= (alpha * (n[0] - b)) / initalpha;
- n[1] -= (alpha * (n[1] - g)) / initalpha;
- n[2] -= (alpha * (n[2] - r)) / initalpha;
- }
-
- /*
- * Search for biased BGR values ----------------------------
- */
- protected int contest(int b, int g, int r) {
-
- /* finds closest neuron (min dist) and updates freq */
- /* finds best neuron (min dist-bias) and returns position */
- /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */
- /* bias[i] = gamma*((1/netsize)-freq[i]) */
-
- int i, dist, a, biasdist, betafreq;
- int bestpos, bestbiaspos, bestd, bestbiasd;
- int[] n;
-
- bestd = ~(((int) 1) << 31);
- bestbiasd = bestd;
- bestpos = -1;
- bestbiaspos = bestpos;
-
- for (i = 0; i < netsize; i++) {
- n = network[i];
- dist = n[0] - b;
- if (dist < 0)
- dist = -dist;
- a = n[1] - g;
- if (a < 0)
- a = -a;
- dist += a;
- a = n[2] - r;
- if (a < 0)
- a = -a;
- dist += a;
- if (dist < bestd) {
- bestd = dist;
- bestpos = i;
- }
- biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift));
- if (biasdist < bestbiasd) {
- bestbiasd = biasdist;
- bestbiaspos = i;
- }
- betafreq = (freq[i] >> betashift);
- freq[i] -= betafreq;
- bias[i] += (betafreq << gammashift);
+
+ /*
+ * Move adjacent neurons by precomputed alpha*(1-((i-j)^2/[r]^2)) in
+ * radpower[|i-j|]
+ * ---------------------------------------------------------------------------------
+ */
+ protected void alterneigh(int rad, int i, int b, int g, int r) {
+
+ int j, k, lo, hi, a, m;
+ int[] p;
+
+ lo = i - rad;
+ if (lo < -1)
+ lo = -1;
+ hi = i + rad;
+ if (hi > netsize)
+ hi = netsize;
+
+ j = i + 1;
+ k = i - 1;
+ m = 1;
+ while ((j < hi) || (k > lo)) {
+ a = radpower[m++];
+ if (j < hi) {
+ p = network[j++];
+ try {
+ p[0] -= (a * (p[0] - b)) / alpharadbias;
+ p[1] -= (a * (p[1] - g)) / alpharadbias;
+ p[2] -= (a * (p[2] - r)) / alpharadbias;
+ } catch (Exception e) {
+ } // prevents 1.3 miscompilation
+ }
+ if (k > lo) {
+ p = network[k--];
+ try {
+ p[0] -= (a * (p[0] - b)) / alpharadbias;
+ p[1] -= (a * (p[1] - g)) / alpharadbias;
+ p[2] -= (a * (p[2] - r)) / alpharadbias;
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+
+ /*
+ * Move neuron i towards biased (b,g,r) by factor alpha
+ * ----------------------------------------------------
+ */
+ protected void altersingle(int alpha, int i, int b, int g, int r) {
+
+ /* alter hit neuron */
+ int[] n = network[i];
+ n[0] -= (alpha * (n[0] - b)) / initalpha;
+ n[1] -= (alpha * (n[1] - g)) / initalpha;
+ n[2] -= (alpha * (n[2] - r)) / initalpha;
+ }
+
+ /*
+ * Search for biased BGR values ----------------------------
+ */
+ protected int contest(int b, int g, int r) {
+
+ /* finds closest neuron (min dist) and updates freq */
+ /* finds best neuron (min dist-bias) and returns position */
+ /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */
+ /* bias[i] = gamma*((1/netsize)-freq[i]) */
+
+ int i, dist, a, biasdist, betafreq;
+ int bestpos, bestbiaspos, bestd, bestbiasd;
+ int[] n;
+
+ bestd = ~(((int)1) << 31);
+ bestbiasd = bestd;
+ bestpos = -1;
+ bestbiaspos = bestpos;
+
+ for (i = 0; i < netsize; i++) {
+ n = network[i];
+ dist = n[0] - b;
+ if (dist < 0)
+ dist = -dist;
+ a = n[1] - g;
+ if (a < 0)
+ a = -a;
+ dist += a;
+ a = n[2] - r;
+ if (a < 0)
+ a = -a;
+ dist += a;
+ if (dist < bestd) {
+ bestd = dist;
+ bestpos = i;
+ }
+ biasdist = dist - ((bias[i]) >> (intbiasshift - netbiasshift));
+ if (biasdist < bestbiasd) {
+ bestbiasd = biasdist;
+ bestbiaspos = i;
+ }
+ betafreq = (freq[i] >> betashift);
+ freq[i] -= betafreq;
+ bias[i] += (betafreq << gammashift);
+ }
+ freq[bestpos] += beta;
+ bias[bestpos] -= betagamma;
+ return (bestbiaspos);
}
- freq[bestpos] += beta;
- bias[bestpos] -= betagamma;
- return (bestbiaspos);
- }
}
\ No newline at end of file
diff --git a/len-activiti/src/main/java/com/len/util/AssigneeType.java b/len-activiti/src/main/java/com/len/util/AssigneeType.java
index 4c25070..55431d9 100644
--- a/len-activiti/src/main/java/com/len/util/AssigneeType.java
+++ b/len-activiti/src/main/java/com/len/util/AssigneeType.java
@@ -5,10 +5,10 @@ package com.len.util;
* @date 2018/1/24.
* @email lenospmiller@gmail.com
*
- * 工作流节点绑定类型
+ * 工作流节点绑定类型
*/
public class AssigneeType {
- public static final int USER_TYPE=1;
- public static final int USER_S_TYPE=2;
- public static final int GROUP_TYPE=3;
+ public static final int USER_TYPE = 1;
+ public static final int USER_S_TYPE = 2;
+ public static final int GROUP_TYPE = 3;
}
diff --git a/len-activiti/src/main/java/com/len/util/Base64Utils.java b/len-activiti/src/main/java/com/len/util/Base64Utils.java
index 0787b47..b273227 100644
--- a/len-activiti/src/main/java/com/len/util/Base64Utils.java
+++ b/len-activiti/src/main/java/com/len/util/Base64Utils.java
@@ -1,14 +1,12 @@
package com.len.util;
-import org.apache.log4j.Logger;
-import sun.misc.BASE64Decoder;
-import sun.misc.BASE64Encoder;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
+import org.apache.log4j.Logger;
+
+import sun.misc.BASE64Encoder;
+
/**
* Created by user on 2018/7/12.
*/
@@ -22,10 +20,10 @@ public class Base64Utils {
byte[] bytes = new byte[in.available()];
// 将文件中的内容读入到数组中
in.read(bytes);
- strBase64 = encoder.encode(bytes); //将字节流数组转换为字符串
+ strBase64 = encoder.encode(bytes); // 将字节流数组转换为字符串
in.close();
} catch (IOException ioe) {
- logger.error("图片转64编码异常",ioe);
+ logger.error("图片转64编码异常", ioe);
}
return strBase64;
}
diff --git a/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java b/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java
index a9227a5..c351445 100644
--- a/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java
+++ b/len-activiti/src/main/java/org/activiti/FilterServletOutputStream.java
@@ -3,6 +3,7 @@ package org.activiti;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
diff --git a/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java b/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java
index 99133b8..2856f39 100644
--- a/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java
+++ b/len-activiti/src/main/java/org/activiti/GenericResponseWrapper.java
@@ -2,6 +2,7 @@ package org.activiti;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
+
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
@@ -28,21 +29,21 @@ public class GenericResponseWrapper extends HttpServletResponseWrapper {
return new PrintWriter(getOutputStream(), true);
}
+ public int getContentLength() {
+ return contentLength;
+ }
+
public void setContentLength(int length) {
this.contentLength = length;
super.setContentLength(length);
}
- public int getContentLength() {
- return contentLength;
+ public String getContentType() {
+ return contentType;
}
public void setContentType(String type) {
this.contentType = type;
super.setContentType(type);
}
-
- public String getContentType() {
- return contentType;
- }
-}
+}
diff --git a/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java b/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java
index cff0c49..e787a2c 100644
--- a/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java
+++ b/len-activiti/src/main/java/org/activiti/JsonpCallbackFilter.java
@@ -4,30 +4,24 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+
+import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
@WebFilter("/service/*")
@Slf4j
public class JsonpCallbackFilter implements Filter {
- public void init(FilterConfig fConfig) throws ServletException {
- }
+ public void init(FilterConfig fConfig) throws ServletException {}
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
- HttpServletRequest httpRequest = (HttpServletRequest) request;
- HttpServletResponse httpResponse = (HttpServletResponse) response;
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ HttpServletRequest httpRequest = (HttpServletRequest)request;
+ HttpServletResponse httpResponse = (HttpServletResponse)response;
Map parms = httpRequest.getParameterMap();
@@ -41,7 +35,7 @@ public class JsonpCallbackFilter implements Filter {
chain.doFilter(request, wrapper);
- //handles the content-size truncation
+ // handles the content-size truncation
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(new String(parms.get("callback")[0] + "(").getBytes());
outputStream.write(wrapper.getData());
@@ -60,6 +54,5 @@ public class JsonpCallbackFilter implements Filter {
}
}
- public void destroy() {
- }
+ public void destroy() {}
}
diff --git a/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java b/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java
index 72121b3..f896c0a 100644
--- a/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java
+++ b/len-activiti/src/main/java/org/activiti/image/HMProcessDiagramGenerator.java
@@ -1,14 +1,12 @@
-/* Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package org.activiti.image;
@@ -24,57 +22,61 @@ import org.activiti.bpmn.model.BpmnModel;
* @author martin.grofcik
* @author Tijs Rademakers
*/
-public interface HMProcessDiagramGenerator extends ProcessDiagramGenerator{
-
- /**
- * Generates a diagram of the given process definition, using the
- * diagram interchange information of the process.
- * @param bpmnModel bpmn model to get diagram for
- * @param imageType type of the image to generate.
- * @param highLightedActivities activities to highlight
- * @param highLightedFlows flows to highlight
- * @param activityFontName override the default activity font
- * @param labelFontName override the default label font
- * @param annotationFontName override the default annotation font
- * @param customClassLoader provide a custom classloader for retrieving icon images
- */
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor);
-
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor,List currentHighlightdActivities);
-
- /**
- * Generates a diagram of the given process definition, using the
- * diagram interchange information of the process.
- * @param bpmnModel bpmn model to get diagram for
- * @param imageType type of the image to generate.
- * @param highLightedActivities activities to highlight
- * @param highLightedFlows flows to highlight
- */
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows);
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
- List highLightedFlows, double scaleFactor);
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities);
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor);
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader);
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName,
- String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor);
-
- public InputStream generatePngDiagram(BpmnModel bpmnModel);
-
- public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor);
-
- public InputStream generateJpgDiagram(BpmnModel bpmnModel);
-
- public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor);
-
- public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor);
+public interface HMProcessDiagramGenerator extends ProcessDiagramGenerator {
+
+ /**
+ * Generates a diagram of the given process definition, using the diagram interchange information of the process.
+ *
+ * @param bpmnModel bpmn model to get diagram for
+ * @param imageType type of the image to generate.
+ * @param highLightedActivities activities to highlight
+ * @param highLightedFlows flows to highlight
+ * @param activityFontName override the default activity font
+ * @param labelFontName override the default label font
+ * @param annotationFontName override the default annotation font
+ * @param customClassLoader provide a custom classloader for retrieving icon images
+ */
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName,
+ ClassLoader customClassLoader, double scaleFactor);
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName,
+ ClassLoader customClassLoader, double scaleFactor, List currentHighlightdActivities);
+
+ /**
+ * Generates a diagram of the given process definition, using the diagram interchange information of the process.
+ *
+ * @param bpmnModel bpmn model to get diagram for
+ * @param imageType type of the image to generate.
+ * @param highLightedActivities activities to highlight
+ * @param highLightedFlows flows to highlight
+ */
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows);
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, double scaleFactor);
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities);
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ double scaleFactor);
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName,
+ String labelFontName, String annotationFontName, ClassLoader customClassLoader);
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName,
+ String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor);
+
+ public InputStream generatePngDiagram(BpmnModel bpmnModel);
+
+ public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor);
+
+ public InputStream generateJpgDiagram(BpmnModel bpmnModel);
+
+ public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor);
+
+ public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor);
}
diff --git a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java
index a97f60e..2d318bb 100644
--- a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java
+++ b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramCanvas.java
@@ -1,41 +1,22 @@
-/* Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package org.activiti.image.impl;
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics2D;
-import java.awt.Paint;
-import java.awt.Point;
-import java.awt.Polygon;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Shape;
-import java.awt.Stroke;
+import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Line2D;
-import java.awt.geom.Path2D;
-import java.awt.geom.PathIterator;
-import java.awt.geom.Rectangle2D;
-import java.awt.geom.RoundRectangle2D;
+import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -58,1294 +39,1343 @@ import org.slf4j.LoggerFactory;
/**
* Represents a canvas on which BPMN 2.0 constructs can be drawn.
*
- * Some of the icons used are licensed under a Creative Commons Attribution 2.5
- * License, see http://www.famfamfam.com/lab/icons/silk/
+ * Some of the icons used are licensed under a Creative Commons Attribution 2.5 License, see
+ * http://www.famfamfam.com/lab/icons/silk/
*
* @see org.activiti.engine.impl.bpmn.diagram.DefaultProcessDiagramGenerator
* @author Joram Barrez
*/
public class DefaultProcessDiagramCanvas {
- protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultProcessDiagramCanvas.class);
- public enum SHAPE_TYPE {Rectangle, Rhombus, Ellipse}
-
- // Predefined sized
- protected static final int ARROW_WIDTH = 5;
- protected static final int CONDITIONAL_INDICATOR_WIDTH = 16;
- protected static final int DEFAULT_INDICATOR_WIDTH = 10;
- protected static final int MARKER_WIDTH = 12;
- protected static final int FONT_SIZE = 11;
- protected static final int FONT_SPACING = 2;
- protected static final int TEXT_PADDING = 3;
- protected static final int ANNOTATION_TEXT_PADDING = 7;
- protected static final int LINE_HEIGHT = FONT_SIZE + FONT_SPACING;
-
-
- // Colors
- protected static Color TASK_BOX_COLOR = new Color(249, 249, 249);
- protected static Color SUBPROCESS_BOX_COLOR = new Color(255, 255, 255);
- protected static Color EVENT_COLOR = new Color(255, 255, 255);
- protected static Color CONNECTION_COLOR = new Color(88, 88, 88);
- protected static Color CONDITIONAL_INDICATOR_COLOR = new Color(255, 255, 255);
- protected static Color HIGHLIGHT_COLOR = Color.GREEN;
- protected static Color LABEL_COLOR = new Color(112, 146, 190);
- protected static Color TASK_BORDER_COLOR = new Color(187, 187, 187);
- protected static Color EVENT_BORDER_COLOR = new Color(88, 88, 88);
- protected static Color SUBPROCESS_BORDER_COLOR = new Color(0, 0, 0);
-
- // Fonts
- protected static Font LABEL_FONT = null;
- protected static Font ANNOTATION_FONT = null;
-
- // Strokes
- protected static Stroke THICK_TASK_BORDER_STROKE = new BasicStroke(3.0f);
- protected static Stroke GATEWAY_TYPE_STROKE = new BasicStroke(3.0f);
- protected static Stroke END_EVENT_STROKE = new BasicStroke(3.0f);
- protected static Stroke MULTI_INSTANCE_STROKE = new BasicStroke(1.3f);
- protected static Stroke EVENT_SUBPROCESS_STROKE = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] { 1.0f }, 0.0f);
- protected static Stroke NON_INTERRUPTING_EVENT_STROKE = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] { 4.0f, 3.0f }, 0.0f);
- protected static Stroke HIGHLIGHT_FLOW_STROKE = new BasicStroke(1.3f);
- protected static Stroke ANNOTATION_STROKE = new BasicStroke(2.0f);
- protected static Stroke ASSOCIATION_STROKE = new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] { 2.0f, 2.0f }, 0.0f);
-
- // icons
- protected static int ICON_PADDING = 5;
- protected static BufferedImage USERTASK_IMAGE;
- protected static BufferedImage SCRIPTTASK_IMAGE;
- protected static BufferedImage SERVICETASK_IMAGE;
- protected static BufferedImage RECEIVETASK_IMAGE;
- protected static BufferedImage SENDTASK_IMAGE;
- protected static BufferedImage MANUALTASK_IMAGE;
- protected static BufferedImage BUSINESS_RULE_TASK_IMAGE;
- protected static BufferedImage SHELL_TASK_IMAGE;
- protected static BufferedImage MULE_TASK_IMAGE;
- protected static BufferedImage CAMEL_TASK_IMAGE;
-
- protected static BufferedImage TIMER_IMAGE;
- protected static BufferedImage COMPENSATE_THROW_IMAGE;
- protected static BufferedImage COMPENSATE_CATCH_IMAGE;
- protected static BufferedImage ERROR_THROW_IMAGE;
- protected static BufferedImage ERROR_CATCH_IMAGE;
- protected static BufferedImage MESSAGE_THROW_IMAGE;
- protected static BufferedImage MESSAGE_CATCH_IMAGE;
- protected static BufferedImage SIGNAL_CATCH_IMAGE;
- protected static BufferedImage SIGNAL_THROW_IMAGE;
-
- protected int canvasWidth = -1;
- protected int canvasHeight = -1;
- protected int minX = -1;
- protected int minY = -1;
- protected BufferedImage processDiagram;
- protected Graphics2D g;
- protected FontMetrics fontMetrics;
- protected boolean closed;
- protected ClassLoader customClassLoader;
- protected String activityFontName = "Arial";
- protected String labelFontName = "Arial";
- protected String annotationFontName = "Arial";
-
- /**
- * Creates an empty canvas with given width and height.
- *
- * Allows to specify minimal boundaries on the left and upper side of the
- * canvas. This is useful for diagrams that have white space there.
- * Everything beneath these minimum values will be cropped.
- * It's also possible to pass a specific font name and a class loader for the icon images.
- *
- */
- public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
-
- this.canvasWidth = width;
- this.canvasHeight = height;
- this.minX = minX;
- this.minY = minY;
- if (activityFontName != null) {
- this.activityFontName = activityFontName;
- }
- if (labelFontName != null) {
- this.labelFontName = labelFontName;
- }
- if (annotationFontName != null) {
- this.annotationFontName = annotationFontName;
- }
- this.customClassLoader = customClassLoader;
-
- initialize(imageType);
- }
-
- /**
- * Creates an empty canvas with given width and height.
- *
- * Allows to specify minimal boundaries on the left and upper side of the
- * canvas. This is useful for diagrams that have white space there (eg
- * Signavio). Everything beneath these minimum values will be cropped.
- *
- * @param minX
- * Hint that will be used when generating the image. Parts that fall
- * below minX on the horizontal scale will be cropped.
- * @param minY
- * Hint that will be used when generating the image. Parts that fall
- * below minX on the horizontal scale will be cropped.
- */
- public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) {
- this.canvasWidth = width;
- this.canvasHeight = height;
- this.minX = minX;
- this.minY = minY;
-
- initialize(imageType);
- }
-
- public void initialize(String imageType) {
- if ("png".equalsIgnoreCase(imageType)) {
- this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
- } else {
- this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB);
- }
-
- this.g = processDiagram.createGraphics();
- if ("png".equalsIgnoreCase(imageType) == false) {
- this.g.setBackground(new Color(255, 255, 255, 0));
- this.g.clearRect(0, 0, canvasWidth, canvasHeight);
- }
-
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.setPaint(Color.black);
-
- Font font = new Font(activityFontName, Font.BOLD, FONT_SIZE);
- g.setFont(font);
- this.fontMetrics = g.getFontMetrics();
-
- LABEL_FONT = new Font(labelFontName, Font.BOLD, 14);
- ANNOTATION_FONT = new Font(annotationFontName, Font.PLAIN, FONT_SIZE);
-
- try {
- USERTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/userTask.png", customClassLoader));
- SCRIPTTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/scriptTask.png", customClassLoader));
- SERVICETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/serviceTask.png", customClassLoader));
- RECEIVETASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/receiveTask.png", customClassLoader));
- SENDTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/sendTask.png", customClassLoader));
- MANUALTASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/manualTask.png", customClassLoader));
- BUSINESS_RULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/businessRuleTask.png", customClassLoader));
- SHELL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/shellTask.png", customClassLoader));
- CAMEL_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/camelTask.png", customClassLoader));
- MULE_TASK_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/muleTask.png", customClassLoader));
-
- TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/timer.png", customClassLoader));
- COMPENSATE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate-throw.png", customClassLoader));
- COMPENSATE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate.png", customClassLoader));
- ERROR_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error-throw.png", customClassLoader));
- ERROR_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error.png", customClassLoader));
- MESSAGE_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message-throw.png", customClassLoader));
- MESSAGE_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message.png", customClassLoader));
- SIGNAL_THROW_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal-throw.png", customClassLoader));
- SIGNAL_CATCH_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal.png", customClassLoader));
- } catch (IOException e) {
- LOGGER.warn("Could not load image for process diagram creation: {}", e.getMessage());
- }
- }
-
- /**
- * Generates an image of what currently is drawn on the canvas.
- *
- * Throws an {@link ActivitiException} when {@link #close()} is already
- * called.
- */
- public InputStream generateImage(String imageType) {
- if (closed) {
- throw new ActivitiImageException("ProcessDiagramGenerator already closed");
- }
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- try {
- ImageIO.write(processDiagram, imageType, out);
-
- } catch (IOException e) {
- throw new ActivitiImageException("Error while generating process image", e);
- } finally {
- try {
- if (out != null) {
- out.close();
+ protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultProcessDiagramCanvas.class);
+ // Predefined sized
+ protected static final int ARROW_WIDTH = 5;
+ protected static final int CONDITIONAL_INDICATOR_WIDTH = 16;
+ protected static final int DEFAULT_INDICATOR_WIDTH = 10;
+ protected static final int MARKER_WIDTH = 12;
+ protected static final int FONT_SIZE = 11;
+ protected static final int FONT_SPACING = 2;
+ protected static final int TEXT_PADDING = 3;
+ protected static final int ANNOTATION_TEXT_PADDING = 7;
+ protected static final int LINE_HEIGHT = FONT_SIZE + FONT_SPACING;
+ // Colors
+ protected static Color TASK_BOX_COLOR = new Color(249, 249, 249);
+ protected static Color SUBPROCESS_BOX_COLOR = new Color(255, 255, 255);
+ protected static Color EVENT_COLOR = new Color(255, 255, 255);
+ protected static Color CONNECTION_COLOR = new Color(88, 88, 88);
+ protected static Color CONDITIONAL_INDICATOR_COLOR = new Color(255, 255, 255);
+ protected static Color HIGHLIGHT_COLOR = Color.GREEN;
+ protected static Color LABEL_COLOR = new Color(112, 146, 190);
+ protected static Color TASK_BORDER_COLOR = new Color(187, 187, 187);
+ protected static Color EVENT_BORDER_COLOR = new Color(88, 88, 88);
+ protected static Color SUBPROCESS_BORDER_COLOR = new Color(0, 0, 0);
+ // Fonts
+ protected static Font LABEL_FONT = null;
+ protected static Font ANNOTATION_FONT = null;
+ // Strokes
+ protected static Stroke THICK_TASK_BORDER_STROKE = new BasicStroke(3.0f);
+ protected static Stroke GATEWAY_TYPE_STROKE = new BasicStroke(3.0f);
+ protected static Stroke END_EVENT_STROKE = new BasicStroke(3.0f);
+ protected static Stroke MULTI_INSTANCE_STROKE = new BasicStroke(1.3f);
+ protected static Stroke EVENT_SUBPROCESS_STROKE =
+ new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] {1.0f}, 0.0f);
+ protected static Stroke NON_INTERRUPTING_EVENT_STROKE =
+ new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] {4.0f, 3.0f}, 0.0f);
+ protected static Stroke HIGHLIGHT_FLOW_STROKE = new BasicStroke(1.3f);
+ protected static Stroke ANNOTATION_STROKE = new BasicStroke(2.0f);
+ protected static Stroke ASSOCIATION_STROKE =
+ new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f, new float[] {2.0f, 2.0f}, 0.0f);
+ // icons
+ protected static int ICON_PADDING = 5;
+ protected static BufferedImage USERTASK_IMAGE;
+ protected static BufferedImage SCRIPTTASK_IMAGE;
+ protected static BufferedImage SERVICETASK_IMAGE;
+ protected static BufferedImage RECEIVETASK_IMAGE;
+ protected static BufferedImage SENDTASK_IMAGE;
+ protected static BufferedImage MANUALTASK_IMAGE;
+ protected static BufferedImage BUSINESS_RULE_TASK_IMAGE;
+ protected static BufferedImage SHELL_TASK_IMAGE;
+ protected static BufferedImage MULE_TASK_IMAGE;
+ protected static BufferedImage CAMEL_TASK_IMAGE;
+ protected static BufferedImage TIMER_IMAGE;
+ protected static BufferedImage COMPENSATE_THROW_IMAGE;
+ protected static BufferedImage COMPENSATE_CATCH_IMAGE;
+ protected static BufferedImage ERROR_THROW_IMAGE;
+ protected static BufferedImage ERROR_CATCH_IMAGE;
+ protected static BufferedImage MESSAGE_THROW_IMAGE;
+ protected static BufferedImage MESSAGE_CATCH_IMAGE;
+ protected static BufferedImage SIGNAL_CATCH_IMAGE;
+ protected static BufferedImage SIGNAL_THROW_IMAGE;
+ protected int canvasWidth = -1;
+ protected int canvasHeight = -1;
+ protected int minX = -1;
+ protected int minY = -1;
+ protected BufferedImage processDiagram;
+ protected Graphics2D g;
+ protected FontMetrics fontMetrics;
+ protected boolean closed;
+ protected ClassLoader customClassLoader;
+ protected String activityFontName = "Arial";
+ protected String labelFontName = "Arial";
+ protected String annotationFontName = "Arial";
+ /**
+ * Creates an empty canvas with given width and height.
+ *
+ * Allows to specify minimal boundaries on the left and upper side of the canvas. This is useful for diagrams that
+ * have white space there. Everything beneath these minimum values will be cropped. It's also possible to pass a
+ * specific font name and a class loader for the icon images.
+ *
+ */
+ public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType,
+ String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
+
+ this.canvasWidth = width;
+ this.canvasHeight = height;
+ this.minX = minX;
+ this.minY = minY;
+ if (activityFontName != null) {
+ this.activityFontName = activityFontName;
+ }
+ if (labelFontName != null) {
+ this.labelFontName = labelFontName;
+ }
+ if (annotationFontName != null) {
+ this.annotationFontName = annotationFontName;
+ }
+ this.customClassLoader = customClassLoader;
+
+ initialize(imageType);
+ }
+
+ /**
+ * Creates an empty canvas with given width and height.
+ *
+ * Allows to specify minimal boundaries on the left and upper side of the canvas. This is useful for diagrams that
+ * have white space there (eg Signavio). Everything beneath these minimum values will be cropped.
+ *
+ * @param minX Hint that will be used when generating the image. Parts that fall below minX on the horizontal scale
+ * will be cropped.
+ * @param minY Hint that will be used when generating the image. Parts that fall below minX on the horizontal scale
+ * will be cropped.
+ */
+ public DefaultProcessDiagramCanvas(int width, int height, int minX, int minY, String imageType) {
+ this.canvasWidth = width;
+ this.canvasHeight = height;
+ this.minX = minX;
+ this.minY = minY;
+
+ initialize(imageType);
+ }
+
+ /**
+ * This method creates shape by type and coordinates.
+ *
+ * @param shapeType
+ * @param graphicInfo
+ * @return Shape
+ */
+ private static Shape createShape(SHAPE_TYPE shapeType, GraphicInfo graphicInfo) {
+ if (SHAPE_TYPE.Rectangle.equals(shapeType)) {
+ // source is rectangle
+ return new Rectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(),
+ graphicInfo.getHeight());
+ } else if (SHAPE_TYPE.Rhombus.equals(shapeType)) {
+ // source is rhombus
+ Path2D.Double rhombus = new Path2D.Double();
+ rhombus.moveTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2);
+ rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2,
+ graphicInfo.getY() + graphicInfo.getHeight());
+ rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth(),
+ graphicInfo.getY() + graphicInfo.getHeight() / 2);
+ rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2, graphicInfo.getY());
+ rhombus.lineTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2);
+ rhombus.closePath();
+ return rhombus;
+ } else if (SHAPE_TYPE.Ellipse.equals(shapeType)) {
+ // source is ellipse
+ return new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(),
+ graphicInfo.getHeight());
+ } else {
+ // unknown source element, just do not correct coordinates
+ }
+ return null;
+ }
+
+ /**
+ * This method returns intersection point of shape border and line.
+ *
+ * @param shape
+ * @param line
+ * @return Point
+ */
+ private static Point getIntersection(Shape shape, Line2D.Double line) {
+ if (shape instanceof Ellipse2D) {
+ return getEllipseIntersection(shape, line);
+ } else if (shape instanceof Rectangle2D || shape instanceof Path2D) {
+ return getShapeIntersection(shape, line);
+ } else {
+ // something strange
+ return null;
+ }
+ }
+
+ /**
+ * This method calculates ellipse intersection with line
+ *
+ * @param shape Bounds of this shape used to calculate parameters of inscribed into this bounds ellipse.
+ * @param line
+ * @return Intersection point
+ */
+ private static Point getEllipseIntersection(Shape shape, Line2D.Double line) {
+ double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
+ double x = shape.getBounds2D().getWidth() / 2 * Math.cos(angle) + shape.getBounds2D().getCenterX();
+ double y = shape.getBounds2D().getHeight() / 2 * Math.sin(angle) + shape.getBounds2D().getCenterY();
+ Point p = new Point();
+ p.setLocation(x, y);
+ return p;
+ }
+
+ /**
+ * This method calculates shape intersection with line.
+ *
+ * @param shape
+ * @param line
+ * @return Intersection point
+ */
+ private static Point getShapeIntersection(Shape shape, Line2D.Double line) {
+ PathIterator it = shape.getPathIterator(null);
+ double[] coords = new double[6];
+ double[] pos = new double[2];
+ Line2D.Double l = new Line2D.Double();
+ while (!it.isDone()) {
+ int type = it.currentSegment(coords);
+ switch (type) {
+ case PathIterator.SEG_MOVETO:
+ pos[0] = coords[0];
+ pos[1] = coords[1];
+ break;
+ case PathIterator.SEG_LINETO:
+ l = new Line2D.Double(pos[0], pos[1], coords[0], coords[1]);
+ if (line.intersectsLine(l)) {
+ return getLinesIntersection(line, l);
+ }
+ pos[0] = coords[0];
+ pos[1] = coords[1];
+ break;
+ case PathIterator.SEG_CLOSE:
+ break;
+ default:
+ // whatever
+ }
+ it.next();
+ }
+ return null;
+ }
+
+ /**
+ * This method calculates intersections of two lines.
+ *
+ * @param a Line 1
+ * @param b Line 2
+ * @return Intersection point
+ */
+ private static Point getLinesIntersection(Line2D a, Line2D b) {
+ double d =
+ (a.getX1() - a.getX2()) * (b.getY2() - b.getY1()) - (a.getY1() - a.getY2()) * (b.getX2() - b.getX1());
+ double da =
+ (a.getX1() - b.getX1()) * (b.getY2() - b.getY1()) - (a.getY1() - b.getY1()) * (b.getX2() - b.getX1());
+ // double db = (a.getX1()-a.getX2())*(a.getY1()-b.getY1()) - (a.getY1()-a.getY2())*(a.getX1()-b.getX1());
+ double ta = da / d;
+ // double tb = db/d;
+ Point p = new Point();
+ p.setLocation(a.getX1() + ta * (a.getX2() - a.getX1()), a.getY1() + ta * (a.getY2() - a.getY1()));
+ return p;
+ }
+
+ public void initialize(String imageType) {
+ if ("png".equalsIgnoreCase(imageType)) {
+ this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
+ } else {
+ this.processDiagram = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB);
+ }
+
+ this.g = processDiagram.createGraphics();
+ if ("png".equalsIgnoreCase(imageType) == false) {
+ this.g.setBackground(new Color(255, 255, 255, 0));
+ this.g.clearRect(0, 0, canvasWidth, canvasHeight);
+ }
+
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g.setPaint(Color.black);
+
+ Font font = new Font(activityFontName, Font.BOLD, FONT_SIZE);
+ g.setFont(font);
+ this.fontMetrics = g.getFontMetrics();
+
+ LABEL_FONT = new Font(labelFontName, Font.BOLD, 14);
+ ANNOTATION_FONT = new Font(annotationFontName, Font.PLAIN, FONT_SIZE);
+
+ try {
+ USERTASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/userTask.png", customClassLoader));
+ SCRIPTTASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/scriptTask.png", customClassLoader));
+ SERVICETASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/serviceTask.png", customClassLoader));
+ RECEIVETASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/receiveTask.png", customClassLoader));
+ SENDTASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/sendTask.png", customClassLoader));
+ MANUALTASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/manualTask.png", customClassLoader));
+ BUSINESS_RULE_TASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/businessRuleTask.png", customClassLoader));
+ SHELL_TASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/shellTask.png", customClassLoader));
+ CAMEL_TASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/camelTask.png", customClassLoader));
+ MULE_TASK_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/muleTask.png", customClassLoader));
+
+ TIMER_IMAGE = ImageIO.read(ReflectUtil.getResource("org/activiti/icons/timer.png", customClassLoader));
+ COMPENSATE_THROW_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate-throw.png", customClassLoader));
+ COMPENSATE_CATCH_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/compensate.png", customClassLoader));
+ ERROR_THROW_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error-throw.png", customClassLoader));
+ ERROR_CATCH_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/error.png", customClassLoader));
+ MESSAGE_THROW_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message-throw.png", customClassLoader));
+ MESSAGE_CATCH_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/message.png", customClassLoader));
+ SIGNAL_THROW_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal-throw.png", customClassLoader));
+ SIGNAL_CATCH_IMAGE =
+ ImageIO.read(ReflectUtil.getResource("org/activiti/icons/signal.png", customClassLoader));
+ } catch (IOException e) {
+ LOGGER.warn("Could not load image for process diagram creation: {}", e.getMessage());
+ }
+ }
+
+ /**
+ * Generates an image of what currently is drawn on the canvas.
+ *
+ * Throws an {@link ActivitiException} when {@link #close()} is already called.
+ */
+ public InputStream generateImage(String imageType) {
+ if (closed) {
+ throw new ActivitiImageException("ProcessDiagramGenerator already closed");
+ }
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ ImageIO.write(processDiagram, imageType, out);
+
+ } catch (IOException e) {
+ throw new ActivitiImageException("Error while generating process image", e);
+ } finally {
+ try {
+ if (out != null) {
+ out.close();
+ }
+ } catch (IOException ignore) {
+ // Exception is silently ignored
+ }
+ }
+ return new ByteArrayInputStream(out.toByteArray());
+ }
+
+ /**
+ * Generates an image of what currently is drawn on the canvas.
+ *
+ * Throws an {@link ActivitiException} when {@link #close()} is already called.
+ */
+ public BufferedImage generateBufferedImage(String imageType) {
+ if (closed) {
+ throw new ActivitiImageException("ProcessDiagramGenerator already closed");
+ }
+
+ // Try to remove white space
+ minX = (minX <= 5) ? 5 : minX;
+ minY = (minY <= 5) ? 5 : minY;
+ BufferedImage imageToSerialize = processDiagram;
+ if (minX >= 0 && minY >= 0) {
+ imageToSerialize =
+ processDiagram.getSubimage(minX - 5, minY - 5, canvasWidth - minX + 5, canvasHeight - minY + 5);
+ }
+ return imageToSerialize;
+ }
+
+ /**
+ * Closes the canvas which dissallows further drawing and releases graphical resources.
+ */
+ public void close() {
+ g.dispose();
+ closed = true;
+ }
+
+ public void drawNoneStartEvent(GraphicInfo graphicInfo) {
+ drawStartEvent(graphicInfo, null, 1.0);
+ }
+
+ public void drawTimerStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawStartEvent(graphicInfo, TIMER_IMAGE, scaleFactor);
+ }
+
+ public void drawSignalStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawStartEvent(graphicInfo, SIGNAL_CATCH_IMAGE, scaleFactor);
+ }
+
+ public void drawMessageStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawStartEvent(graphicInfo, MESSAGE_CATCH_IMAGE, scaleFactor);
+ }
+
+ public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) {
+ Paint originalPaint = g.getPaint();
+ g.setPaint(EVENT_COLOR);
+ // g.setPaint(new Color(36,202,88));
+ Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(),
+ graphicInfo.getHeight());
+ g.fill(circle);
+ g.setPaint(EVENT_BORDER_COLOR);
+ g.draw(circle);
+ g.setPaint(originalPaint);
+ if (image != null) {
+ // calculate coordinates to center image
+ int imageX = (int)Math
+ .round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor));
+ int imageY = (int)Math
+ .round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor));
+ g.drawImage(image, imageX, imageY, (int)(image.getWidth() / scaleFactor),
+ (int)(image.getHeight() / scaleFactor), null);
+ }
+
+ }
+
+ public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ Paint originalPaint = g.getPaint();
+ Stroke originalStroke = g.getStroke();
+ g.setPaint(new Color(255, 255, 255));
+ Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(),
+ graphicInfo.getHeight());
+ g.fill(circle);
+ g.setPaint(EVENT_BORDER_COLOR);
+ if (scaleFactor == 1.0) {
+ g.setStroke(END_EVENT_STROKE);
+ } else {
+ g.setStroke(new BasicStroke(2.0f));
+ }
+ g.draw(circle);
+ g.setStroke(originalStroke);
+ g.setPaint(originalPaint);
+ }
+
+ public void drawErrorEndEvent(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawErrorEndEvent(graphicInfo, scaleFactor);
+ if (scaleFactor == 1.0) {
+ drawLabel(name, graphicInfo);
+ }
+ }
+
+ public void drawErrorEndEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawNoneEndEvent(graphicInfo, scaleFactor);
+ g.drawImage(ERROR_THROW_IMAGE, (int)(graphicInfo.getX() + (graphicInfo.getWidth() / 4)),
+ (int)(graphicInfo.getY() + (graphicInfo.getHeight() / 4)),
+ (int)(ERROR_THROW_IMAGE.getWidth() / scaleFactor), (int)(ERROR_THROW_IMAGE.getHeight() / scaleFactor),
+ null);
+ }
+
+ public void drawErrorStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawNoneStartEvent(graphicInfo);
+ g.drawImage(ERROR_CATCH_IMAGE, (int)(graphicInfo.getX() + (graphicInfo.getWidth() / 4)),
+ (int)(graphicInfo.getY() + (graphicInfo.getHeight() / 4)),
+ (int)(ERROR_CATCH_IMAGE.getWidth() / scaleFactor), (int)(ERROR_CATCH_IMAGE.getHeight() / scaleFactor),
+ null);
+ }
+
+ public void drawCatchingEvent(GraphicInfo graphicInfo, boolean isInterrupting, BufferedImage image,
+ String eventType, double scaleFactor) {
+
+ // event circles
+ Ellipse2D outerCircle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(),
+ graphicInfo.getHeight());
+ int innerCircleSize = (int)(4 / scaleFactor);
+ if (innerCircleSize == 0) {
+ innerCircleSize = 1;
+ }
+ int innerCircleX = (int)graphicInfo.getX() + innerCircleSize;
+ int innerCircleY = (int)graphicInfo.getY() + innerCircleSize;
+ int innerCircleWidth = (int)graphicInfo.getWidth() - (2 * innerCircleSize);
+ int innerCircleHeight = (int)graphicInfo.getHeight() - (2 * innerCircleSize);
+ Ellipse2D innerCircle = new Ellipse2D.Double(innerCircleX, innerCircleY, innerCircleWidth, innerCircleHeight);
+
+ Paint originalPaint = g.getPaint();
+ Stroke originalStroke = g.getStroke();
+ g.setPaint(EVENT_COLOR);
+ g.fill(outerCircle);
+
+ g.setPaint(EVENT_BORDER_COLOR);
+ if (isInterrupting == false)
+ g.setStroke(NON_INTERRUPTING_EVENT_STROKE);
+ g.draw(outerCircle);
+ g.setStroke(originalStroke);
+ g.setPaint(originalPaint);
+ g.draw(innerCircle);
+
+ if (image != null) {
+ // calculate coordinates to center image
+ int imageX =
+ (int)(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor));
+ int imageY =
+ (int)(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor));
+ if (scaleFactor == 1.0 && "timer".equals(eventType)) {
+ // move image one pixel to center timer image
+ imageX++;
+ imageY++;
+ }
+ g.drawImage(image, imageX, imageY, (int)(image.getWidth() / scaleFactor),
+ (int)(image.getHeight() / scaleFactor), null);
+ }
+ }
+
+ public void drawCatchingCompensateEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting,
+ double scaleFactor) {
+ drawCatchingCompensateEvent(graphicInfo, isInterrupting, scaleFactor);
+ drawLabel(name, graphicInfo);
+ }
+
+ public void drawCatchingCompensateEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, isInterrupting, COMPENSATE_CATCH_IMAGE, "compensate", scaleFactor);
+ }
+
+ public void drawCatchingTimerEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting,
+ double scaleFactor) {
+ drawCatchingTimerEvent(graphicInfo, isInterrupting, scaleFactor);
+ drawLabel(name, graphicInfo);
+ }
+
+ public void drawCatchingTimerEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, isInterrupting, TIMER_IMAGE, "timer", scaleFactor);
+ }
+
+ public void drawCatchingErrorEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting,
+ double scaleFactor) {
+ drawCatchingErrorEvent(graphicInfo, isInterrupting, scaleFactor);
+ drawLabel(name, graphicInfo);
+ }
+
+ public void drawCatchingErrorEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, isInterrupting, ERROR_CATCH_IMAGE, "error", scaleFactor);
+ }
+
+ public void drawCatchingSignalEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting,
+ double scaleFactor) {
+ drawCatchingSignalEvent(graphicInfo, isInterrupting, scaleFactor);
+ drawLabel(name, graphicInfo);
+ }
+
+ public void drawCatchingSignalEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, isInterrupting, SIGNAL_CATCH_IMAGE, "signal", scaleFactor);
+ }
+
+ public void drawCatchingMessageEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor);
+ }
+
+ public void drawCatchingMessageEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting,
+ double scaleFactor) {
+ drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor);
+ drawLabel(name, graphicInfo);
+ }
+
+ public void drawThrowingCompensateEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, true, COMPENSATE_THROW_IMAGE, "compensate", scaleFactor);
+ }
+
+ public void drawThrowingSignalEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, true, SIGNAL_THROW_IMAGE, "signal", scaleFactor);
+ }
+
+ public void drawThrowingNoneEvent(GraphicInfo graphicInfo, double scaleFactor) {
+ drawCatchingEvent(graphicInfo, true, null, "none", scaleFactor);
+ }
+
+ public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional,
+ double scaleFactor) {
+ drawSequenceflow(srcX, srcY, targetX, targetY, conditional, false, scaleFactor);
+ }
+
+ public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, boolean highLighted,
+ double scaleFactor) {
+ Paint originalPaint = g.getPaint();
+ if (highLighted)
+ g.setPaint(HIGHLIGHT_COLOR);
+
+ Line2D.Double line = new Line2D.Double(srcX, srcY, targetX, targetY);
+ g.draw(line);
+ drawArrowHead(line, scaleFactor);
+
+ if (conditional) {
+ drawConditionalSequenceFlowIndicator(line, scaleFactor);
}
- } catch(IOException ignore) {
- // Exception is silently ignored
- }
- }
- return new ByteArrayInputStream(out.toByteArray());
- }
-
- /**
- * Generates an image of what currently is drawn on the canvas.
- *
- * Throws an {@link ActivitiException} when {@link #close()} is already
- * called.
- */
- public BufferedImage generateBufferedImage(String imageType) {
- if (closed) {
- throw new ActivitiImageException("ProcessDiagramGenerator already closed");
- }
-
- // Try to remove white space
- minX = (minX <= 5) ? 5 : minX;
- minY = (minY <= 5) ? 5 : minY;
- BufferedImage imageToSerialize = processDiagram;
- if (minX >= 0 && minY >= 0) {
- imageToSerialize = processDiagram.getSubimage(minX - 5, minY - 5, canvasWidth - minX + 5, canvasHeight - minY + 5);
- }
- return imageToSerialize;
- }
-
- /**
- * Closes the canvas which dissallows further drawing and releases graphical
- * resources.
- */
- public void close() {
- g.dispose();
- closed = true;
- }
-
- public void drawNoneStartEvent(GraphicInfo graphicInfo) {
- drawStartEvent(graphicInfo, null, 1.0);
- }
-
- public void drawTimerStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawStartEvent(graphicInfo, TIMER_IMAGE, scaleFactor);
- }
-
- public void drawSignalStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawStartEvent(graphicInfo, SIGNAL_CATCH_IMAGE, scaleFactor);
- }
-
- public void drawMessageStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawStartEvent(graphicInfo, MESSAGE_CATCH_IMAGE, scaleFactor);
- }
-
- public void drawStartEvent(GraphicInfo graphicInfo, BufferedImage image, double scaleFactor) {
- Paint originalPaint = g.getPaint();
- g.setPaint(EVENT_COLOR);
-// g.setPaint(new Color(36,202,88));
- Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(),
- graphicInfo.getWidth(), graphicInfo.getHeight());
- g.fill(circle);
- g.setPaint(EVENT_BORDER_COLOR);
- g.draw(circle);
- g.setPaint(originalPaint);
- if (image != null) {
- // calculate coordinates to center image
- int imageX = (int) Math.round(graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor));
- int imageY = (int) Math.round(graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor));
- g.drawImage(image, imageX, imageY,
- (int) (image.getWidth() / scaleFactor), (int) (image.getHeight() / scaleFactor), null);
- }
-
- }
-
- public void drawNoneEndEvent(GraphicInfo graphicInfo, double scaleFactor) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
- g.setPaint(new Color(255,255,255));
- Ellipse2D circle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(),
- graphicInfo.getWidth(), graphicInfo.getHeight());
- g.fill(circle);
- g.setPaint(EVENT_BORDER_COLOR);
- if (scaleFactor == 1.0) {
- g.setStroke(END_EVENT_STROKE);
- } else {
- g.setStroke(new BasicStroke(2.0f));
- }
- g.draw(circle);
- g.setStroke(originalStroke);
- g.setPaint(originalPaint);
- }
-
- public void drawErrorEndEvent(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawErrorEndEvent(graphicInfo, scaleFactor);
- if (scaleFactor == 1.0) {
- drawLabel(name, graphicInfo);
- }
- }
-
- public void drawErrorEndEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawNoneEndEvent(graphicInfo, scaleFactor);
- g.drawImage(ERROR_THROW_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)),
- (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)),
- (int) (ERROR_THROW_IMAGE.getWidth() / scaleFactor),
- (int) (ERROR_THROW_IMAGE.getHeight() / scaleFactor), null);
- }
-
- public void drawErrorStartEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawNoneStartEvent(graphicInfo);
- g.drawImage(ERROR_CATCH_IMAGE, (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 4)),
- (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 4)),
- (int) (ERROR_CATCH_IMAGE.getWidth() / scaleFactor),
- (int) (ERROR_CATCH_IMAGE.getHeight() / scaleFactor), null);
- }
-
- public void drawCatchingEvent(GraphicInfo graphicInfo, boolean isInterrupting,
- BufferedImage image, String eventType, double scaleFactor) {
-
- // event circles
- Ellipse2D outerCircle = new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(),
- graphicInfo.getWidth(), graphicInfo.getHeight());
- int innerCircleSize = (int) (4 / scaleFactor);
- if (innerCircleSize == 0) {
- innerCircleSize = 1;
- }
- int innerCircleX = (int) graphicInfo.getX() + innerCircleSize;
- int innerCircleY = (int) graphicInfo.getY() + innerCircleSize;
- int innerCircleWidth = (int) graphicInfo.getWidth() - (2 * innerCircleSize);
- int innerCircleHeight = (int) graphicInfo.getHeight() - (2 * innerCircleSize);
- Ellipse2D innerCircle = new Ellipse2D.Double(innerCircleX, innerCircleY, innerCircleWidth, innerCircleHeight);
-
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
- g.setPaint(EVENT_COLOR);
- g.fill(outerCircle);
-
- g.setPaint(EVENT_BORDER_COLOR);
- if (isInterrupting == false)
- g.setStroke(NON_INTERRUPTING_EVENT_STROKE);
- g.draw(outerCircle);
- g.setStroke(originalStroke);
- g.setPaint(originalPaint);
- g.draw(innerCircle);
-
- if (image != null) {
- // calculate coordinates to center image
- int imageX = (int) (graphicInfo.getX() + (graphicInfo.getWidth() / 2) - (image.getWidth() / 2 * scaleFactor));
- int imageY = (int) (graphicInfo.getY() + (graphicInfo.getHeight() / 2) - (image.getHeight() / 2 * scaleFactor));
- if (scaleFactor == 1.0 && "timer".equals(eventType)) {
- // move image one pixel to center timer image
- imageX++;
- imageY++;
- }
- g.drawImage(image, imageX, imageY, (int) (image.getWidth() / scaleFactor),
- (int) (image.getHeight() / scaleFactor), null);
- }
- }
-
- public void drawCatchingCompensateEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingCompensateEvent(graphicInfo, isInterrupting, scaleFactor);
- drawLabel(name, graphicInfo);
- }
-
- public void drawCatchingCompensateEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingEvent(graphicInfo, isInterrupting, COMPENSATE_CATCH_IMAGE, "compensate", scaleFactor);
- }
-
- public void drawCatchingTimerEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingTimerEvent(graphicInfo, isInterrupting, scaleFactor);
- drawLabel(name, graphicInfo);
- }
-
- public void drawCatchingTimerEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingEvent(graphicInfo, isInterrupting, TIMER_IMAGE, "timer", scaleFactor);
- }
-
- public void drawCatchingErrorEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingErrorEvent(graphicInfo, isInterrupting, scaleFactor);
- drawLabel(name, graphicInfo);
- }
-
- public void drawCatchingErrorEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingEvent(graphicInfo, isInterrupting, ERROR_CATCH_IMAGE, "error", scaleFactor);
- }
-
- public void drawCatchingSignalEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingSignalEvent(graphicInfo, isInterrupting, scaleFactor);
- drawLabel(name, graphicInfo);
- }
-
- public void drawCatchingSignalEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingEvent(graphicInfo, isInterrupting, SIGNAL_CATCH_IMAGE, "signal", scaleFactor);
- }
-
- public void drawCatchingMessageEvent(GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor);
- }
-
- public void drawCatchingMessageEvent(String name, GraphicInfo graphicInfo, boolean isInterrupting, double scaleFactor) {
- drawCatchingEvent(graphicInfo, isInterrupting, MESSAGE_CATCH_IMAGE, "message", scaleFactor);
- drawLabel(name, graphicInfo);
- }
-
- public void drawThrowingCompensateEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawCatchingEvent(graphicInfo, true, COMPENSATE_THROW_IMAGE, "compensate", scaleFactor);
- }
-
- public void drawThrowingSignalEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawCatchingEvent(graphicInfo, true, SIGNAL_THROW_IMAGE, "signal", scaleFactor);
- }
-
- public void drawThrowingNoneEvent(GraphicInfo graphicInfo, double scaleFactor) {
- drawCatchingEvent(graphicInfo, true, null, "none", scaleFactor);
- }
-
- public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, double scaleFactor) {
- drawSequenceflow(srcX, srcY, targetX, targetY, conditional, false, scaleFactor);
- }
-
- public void drawSequenceflow(int srcX, int srcY, int targetX, int targetY, boolean conditional, boolean highLighted, double scaleFactor) {
- Paint originalPaint = g.getPaint();
- if (highLighted)
- g.setPaint(HIGHLIGHT_COLOR);
-
- Line2D.Double line = new Line2D.Double(srcX, srcY, targetX, targetY);
- g.draw(line);
- drawArrowHead(line, scaleFactor);
-
- if (conditional) {
- drawConditionalSequenceFlowIndicator(line, scaleFactor);
- }
-
- if (highLighted)
- g.setPaint(originalPaint);
- }
-
- public void drawAssociation(int[] xPoints, int[] yPoints, AssociationDirection associationDirection, boolean highLighted, double scaleFactor) {
- boolean conditional = false, isDefault = false;
- drawConnection(xPoints, yPoints, conditional, isDefault, "association", associationDirection, highLighted, scaleFactor);
- }
-
- public void drawSequenceflow(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, boolean highLighted, double scaleFactor) {
- drawConnection(xPoints, yPoints, conditional, isDefault, "sequenceFlow", AssociationDirection.ONE, highLighted, scaleFactor);
- }
-
- public void drawConnection(int[] xPoints, int[] yPoints, boolean conditional, boolean isDefault, String connectionType,
- AssociationDirection associationDirection, boolean highLighted, double scaleFactor) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
+ if (highLighted)
+ g.setPaint(originalPaint);
+ }
- g.setPaint(CONNECTION_COLOR);
- if (connectionType.equals("association")) {
- g.setStroke(ASSOCIATION_STROKE);
- } else if (highLighted) {
- g.setPaint(HIGHLIGHT_COLOR);
- g.setStroke(HIGHLIGHT_FLOW_STROKE);
+ public void drawAssociation(int[] xPoints, int[] yPoints, AssociationDirection associationDirection,
+ boolean highLighted, double scaleFactor) {
+ boolean conditional = false, isDefault = false;
+ drawConnection(xPoints, yPoints, conditional, isDefault, "association", associationDirection, highLighted,
+ scaleFactor);
}
- for (int i=1; i 1.0)
+ return;
+ int horizontal = (int)(CONDITIONAL_INDICATOR_WIDTH * 0.7);
+ int halfOfHorizontal = horizontal / 2;
+ int halfOfVertical = CONDITIONAL_INDICATOR_WIDTH / 2;
+
+ Polygon conditionalIndicator = new Polygon();
+ conditionalIndicator.addPoint(0, 0);
+ conditionalIndicator.addPoint(-halfOfHorizontal, halfOfVertical);
+ conditionalIndicator.addPoint(0, CONDITIONAL_INDICATOR_WIDTH);
+ conditionalIndicator.addPoint(halfOfHorizontal, halfOfVertical);
+
+ AffineTransform transformation = new AffineTransform();
+ transformation.setToIdentity();
+ double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
+ transformation.translate(line.x1, line.y1);
+ transformation.rotate((angle - Math.PI / 2d));
+
+ AffineTransform originalTransformation = g.getTransform();
+ g.setTransform(transformation);
+ g.draw(conditionalIndicator);
+
+ Paint originalPaint = g.getPaint();
+ g.setPaint(CONDITIONAL_INDICATOR_COLOR);
+ g.fill(conditionalIndicator);
+
+ g.setPaint(originalPaint);
+ g.setTransform(originalTransformation);
+ }
- public void drawSequenceflowWithoutArrow(int srcX, int srcY, int targetX, int targetY, boolean conditional, boolean highLighted, double scaleFactor) {
- Paint originalPaint = g.getPaint();
- if (highLighted)
- g.setPaint(HIGHLIGHT_COLOR);
-
- Line2D.Double line = new Line2D.Double(srcX, srcY, targetX, targetY);
- g.draw(line);
+ public void drawTask(BufferedImage icon, String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(name, graphicInfo);
+ g.drawImage(icon, (int)(graphicInfo.getX() + ICON_PADDING / scaleFactor),
+ (int)(graphicInfo.getY() + ICON_PADDING / scaleFactor), (int)(icon.getWidth() / scaleFactor),
+ (int)(icon.getHeight() / scaleFactor), null);
+ }
- if (conditional) {
- drawConditionalSequenceFlowIndicator(line, scaleFactor);
- }
-
- if (highLighted)
- g.setPaint(originalPaint);
- }
-
- public void drawArrowHead(Line2D.Double line, double scaleFactor) {
- int doubleArrowWidth = (int) (2 * ARROW_WIDTH / scaleFactor);
- if (doubleArrowWidth == 0) {
- doubleArrowWidth = 2;
- }
- Polygon arrowHead = new Polygon();
- arrowHead.addPoint(0, 0);
- int arrowHeadPoint = (int) (-ARROW_WIDTH / scaleFactor);
- if (arrowHeadPoint == 0) {
- arrowHeadPoint = -1;
- }
- arrowHead.addPoint(arrowHeadPoint, -doubleArrowWidth);
- arrowHeadPoint = (int) (ARROW_WIDTH / scaleFactor);
- if (arrowHeadPoint == 0) {
- arrowHeadPoint = 1;
- }
- arrowHead.addPoint(arrowHeadPoint, -doubleArrowWidth);
+ public void drawTask(String name, GraphicInfo graphicInfo) {
+ drawTask(name, graphicInfo, false);
+ }
- AffineTransform transformation = new AffineTransform();
- transformation.setToIdentity();
- double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
- transformation.translate(line.x2, line.y2);
- transformation.rotate((angle - Math.PI / 2d));
-
- AffineTransform originalTransformation = g.getTransform();
- g.setTransform(transformation);
- g.fill(arrowHead);
- g.setTransform(originalTransformation);
- }
-
- public void drawDefaultSequenceFlowIndicator(Line2D.Double line, double scaleFactor) {
- double length = DEFAULT_INDICATOR_WIDTH / scaleFactor, halfOfLength = length/2, f = 8;
- Line2D.Double defaultIndicator = new Line2D.Double(-halfOfLength, 0, halfOfLength, 0);
-
- double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
- double dx = f * Math.cos(angle), dy = f * Math.sin(angle),
- x1 = line.x1 + dx, y1 = line.y1 + dy;
-
- AffineTransform transformation = new AffineTransform();
- transformation.setToIdentity();
- transformation.translate(x1, y1);
- transformation.rotate((angle - 3 * Math.PI / 4));
-
- AffineTransform originalTransformation = g.getTransform();
- g.setTransform(transformation);
- g.draw(defaultIndicator);
-
- g.setTransform(originalTransformation);
- }
-
- public void drawConditionalSequenceFlowIndicator(Line2D.Double line, double scaleFactor) {
- if (scaleFactor > 1.0) return;
- int horizontal = (int) (CONDITIONAL_INDICATOR_WIDTH * 0.7);
- int halfOfHorizontal = horizontal / 2;
- int halfOfVertical = CONDITIONAL_INDICATOR_WIDTH / 2;
-
- Polygon conditionalIndicator = new Polygon();
- conditionalIndicator.addPoint(0, 0);
- conditionalIndicator.addPoint(-halfOfHorizontal, halfOfVertical);
- conditionalIndicator.addPoint(0, CONDITIONAL_INDICATOR_WIDTH);
- conditionalIndicator.addPoint(halfOfHorizontal, halfOfVertical);
-
- AffineTransform transformation = new AffineTransform();
- transformation.setToIdentity();
- double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
- transformation.translate(line.x1, line.y1);
- transformation.rotate((angle - Math.PI / 2d));
-
- AffineTransform originalTransformation = g.getTransform();
- g.setTransform(transformation);
- g.draw(conditionalIndicator);
-
- Paint originalPaint = g.getPaint();
- g.setPaint(CONDITIONAL_INDICATOR_COLOR);
- g.fill(conditionalIndicator);
-
- g.setPaint(originalPaint);
- g.setTransform(originalTransformation);
- }
-
- public void drawTask(BufferedImage icon, String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(name, graphicInfo);
- g.drawImage(icon, (int) (graphicInfo.getX() + ICON_PADDING / scaleFactor),
- (int) (graphicInfo.getY() + ICON_PADDING / scaleFactor),
- (int) (icon.getWidth() / scaleFactor), (int) (icon.getHeight() / scaleFactor), null);
- }
-
- public void drawTask(String name, GraphicInfo graphicInfo) {
- drawTask(name, graphicInfo, false);
- }
-
- public void drawPoolOrLane(String name, GraphicInfo graphicInfo) {
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
- g.drawRect(x, y, width, height);
-
- // Add the name as text, vertical
- if(name != null && name.length() > 0) {
- // Include some padding
- int availableTextSpace = height - 6;
-
- // Create rotation for derived font
- AffineTransform transformation = new AffineTransform();
- transformation.setToIdentity();
- transformation.rotate(270 * Math.PI/180);
-
- Font currentFont = g.getFont();
- Font theDerivedFont = currentFont.deriveFont(transformation);
- g.setFont(theDerivedFont);
-
- String truncated = fitTextToWidth(name, availableTextSpace);
- int realWidth = fontMetrics.stringWidth(truncated);
-
- g.drawString(truncated, x + 2 + fontMetrics.getHeight(), 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2);
- g.setFont(currentFont);
- }
- }
-
- protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder) {
- Paint originalPaint = g.getPaint();
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- // Create a new gradient paint for every task box, gradient depends on x and y and is not relative
-// g.setPaint(TASK_BOX_COLOR);
- g.setPaint(new Color(144,238,144));
- int arcR = 6;
- if (thickBorder)
- arcR = 3;
-
- // shape
- RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR);
- g.fill(rect);
- g.setPaint(TASK_BORDER_COLOR);
-
- if (thickBorder) {
- Stroke originalStroke = g.getStroke();
- g.setStroke(THICK_TASK_BORDER_STROKE);
- g.draw(rect);
- g.setStroke(originalStroke);
- } else {
- g.draw(rect);
- }
-
- g.setPaint(originalPaint);
- // text
- if (name != null && name.length() > 0) {
- int boxWidth = width - (2 * TEXT_PADDING);
- int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2;
- int boxX = x + width/2 - boxWidth/2;
- int boxY = y + height/2 - boxHeight/2 + ICON_PADDING + ICON_PADDING - 2 - 2;
-
- drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight);
- }
- }
-
- protected void drawMultilineCentredText(String text, int x, int y, int boxWidth, int boxHeight) {
- drawMultilineText(text, x, y, boxWidth, boxHeight, true);
- }
-
- protected void drawMultilineAnnotationText(String text, int x, int y, int boxWidth, int boxHeight) {
- drawMultilineText(text, x, y, boxWidth, boxHeight, false);
- }
-
- protected void drawMultilineText(String text, int x, int y, int boxWidth, int boxHeight, boolean centered) {
- // Create an attributed string based in input text
- AttributedString attributedString = new AttributedString(text);
- attributedString.addAttribute(TextAttribute.FONT, g.getFont());
- attributedString.addAttribute(TextAttribute.FOREGROUND, Color.black);
-
- AttributedCharacterIterator characterIterator = attributedString.getIterator();
-
- int currentHeight = 0;
- // Prepare a list of lines of text we'll be drawing
- List layouts = new ArrayList();
- String lastLine = null;
-
- LineBreakMeasurer measurer = new LineBreakMeasurer(characterIterator, g.getFontRenderContext());
-
- TextLayout layout = null;
- while (measurer.getPosition() < characterIterator.getEndIndex() && currentHeight <= boxHeight) {
-
- int previousPosition = measurer.getPosition();
-
- // Request next layout
- layout = measurer.nextLayout(boxWidth);
-
- int height = ((Float)(layout.getDescent() + layout.getAscent() + layout.getLeading())).intValue();
-
- if(currentHeight + height > boxHeight) {
- // The line we're about to add should NOT be added anymore, append three dots to previous one instead
- // to indicate more text is truncated
- if (!layouts.isEmpty()) {
- layouts.remove(layouts.size() - 1);
-
- if(lastLine.length() >= 4) {
- lastLine = lastLine.substring(0, lastLine.length() - 4) + "...";
- }
- layouts.add(new TextLayout(lastLine, g.getFont(), g.getFontRenderContext()));
+ public void drawPoolOrLane(String name, GraphicInfo graphicInfo) {
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+ g.drawRect(x, y, width, height);
+
+ // Add the name as text, vertical
+ if (name != null && name.length() > 0) {
+ // Include some padding
+ int availableTextSpace = height - 6;
+
+ // Create rotation for derived font
+ AffineTransform transformation = new AffineTransform();
+ transformation.setToIdentity();
+ transformation.rotate(270 * Math.PI / 180);
+
+ Font currentFont = g.getFont();
+ Font theDerivedFont = currentFont.deriveFont(transformation);
+ g.setFont(theDerivedFont);
+
+ String truncated = fitTextToWidth(name, availableTextSpace);
+ int realWidth = fontMetrics.stringWidth(truncated);
+
+ g.drawString(truncated, x + 2 + fontMetrics.getHeight(),
+ 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2);
+ g.setFont(currentFont);
}
- break;
- } else {
- layouts.add(layout);
- lastLine = text.substring(previousPosition, measurer.getPosition());
- currentHeight += height;
- }
}
+ protected void drawTask(String name, GraphicInfo graphicInfo, boolean thickBorder) {
+ Paint originalPaint = g.getPaint();
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+
+ // Create a new gradient paint for every task box, gradient depends on x and y and is not relative
+ // g.setPaint(TASK_BOX_COLOR);
+ g.setPaint(new Color(144, 238, 144));
+ int arcR = 6;
+ if (thickBorder)
+ arcR = 3;
+
+ // shape
+ RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, arcR, arcR);
+ g.fill(rect);
+ g.setPaint(TASK_BORDER_COLOR);
+
+ if (thickBorder) {
+ Stroke originalStroke = g.getStroke();
+ g.setStroke(THICK_TASK_BORDER_STROKE);
+ g.draw(rect);
+ g.setStroke(originalStroke);
+ } else {
+ g.draw(rect);
+ }
+
+ g.setPaint(originalPaint);
+ // text
+ if (name != null && name.length() > 0) {
+ int boxWidth = width - (2 * TEXT_PADDING);
+ int boxHeight = height - 16 - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2;
+ int boxX = x + width / 2 - boxWidth / 2;
+ int boxY = y + height / 2 - boxHeight / 2 + ICON_PADDING + ICON_PADDING - 2 - 2;
+
+ drawMultilineCentredText(name, boxX, boxY, boxWidth, boxHeight);
+ }
+ }
+
+ protected void drawMultilineCentredText(String text, int x, int y, int boxWidth, int boxHeight) {
+ drawMultilineText(text, x, y, boxWidth, boxHeight, true);
+ }
+
+ protected void drawMultilineAnnotationText(String text, int x, int y, int boxWidth, int boxHeight) {
+ drawMultilineText(text, x, y, boxWidth, boxHeight, false);
+ }
+
+ protected void drawMultilineText(String text, int x, int y, int boxWidth, int boxHeight, boolean centered) {
+ // Create an attributed string based in input text
+ AttributedString attributedString = new AttributedString(text);
+ attributedString.addAttribute(TextAttribute.FONT, g.getFont());
+ attributedString.addAttribute(TextAttribute.FOREGROUND, Color.black);
+
+ AttributedCharacterIterator characterIterator = attributedString.getIterator();
+
+ int currentHeight = 0;
+ // Prepare a list of lines of text we'll be drawing
+ List layouts = new ArrayList();
+ String lastLine = null;
+
+ LineBreakMeasurer measurer = new LineBreakMeasurer(characterIterator, g.getFontRenderContext());
+
+ TextLayout layout = null;
+ while (measurer.getPosition() < characterIterator.getEndIndex() && currentHeight <= boxHeight) {
+
+ int previousPosition = measurer.getPosition();
+
+ // Request next layout
+ layout = measurer.nextLayout(boxWidth);
- int currentY = y + (centered ? ((boxHeight - currentHeight) /2) : 0);
- int currentX = 0;
+ int height = ((Float)(layout.getDescent() + layout.getAscent() + layout.getLeading())).intValue();
- // Actually draw the lines
- for(TextLayout textLayout : layouts) {
+ if (currentHeight + height > boxHeight) {
+ // The line we're about to add should NOT be added anymore, append three dots to previous one instead
+ // to indicate more text is truncated
+ if (!layouts.isEmpty()) {
+ layouts.remove(layouts.size() - 1);
- currentY += textLayout.getAscent();
- currentX = x + (centered ? ((boxWidth - ((Double)textLayout.getBounds().getWidth()).intValue()) /2) : 0);
+ if (lastLine.length() >= 4) {
+ lastLine = lastLine.substring(0, lastLine.length() - 4) + "...";
+ }
+ layouts.add(new TextLayout(lastLine, g.getFont(), g.getFontRenderContext()));
+ }
+ break;
+ } else {
+ layouts.add(layout);
+ lastLine = text.substring(previousPosition, measurer.getPosition());
+ currentHeight += height;
+ }
+ }
+
+ int currentY = y + (centered ? ((boxHeight - currentHeight) / 2) : 0);
+ int currentX = 0;
+
+ // Actually draw the lines
+ for (TextLayout textLayout : layouts) {
+
+ currentY += textLayout.getAscent();
+ currentX = x + (centered ? ((boxWidth - ((Double)textLayout.getBounds().getWidth()).intValue()) / 2) : 0);
+
+ textLayout.draw(g, currentX, currentY);
+ currentY += textLayout.getDescent() + textLayout.getLeading();
+ }
+
+ }
+
+ protected String fitTextToWidth(String original, int width) {
+ String text = original;
+
+ // remove length for "..."
+ int maxWidth = width - 10;
+
+ while (fontMetrics.stringWidth(text + "...") > maxWidth && text.length() > 0) {
+ text = text.substring(0, text.length() - 1);
+ }
+
+ if (!text.equals(original)) {
+ text = text + "...";
+ }
+
+ return text;
+ }
- textLayout.draw(g, currentX, currentY);
- currentY += textLayout.getDescent() + textLayout.getLeading();
+ public void drawUserTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(USERTASK_IMAGE, name, graphicInfo, scaleFactor);
}
- }
+ public void drawScriptTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(SCRIPTTASK_IMAGE, name, graphicInfo, scaleFactor);
+ }
+ public void drawServiceTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(SERVICETASK_IMAGE, name, graphicInfo, scaleFactor);
+ }
- protected String fitTextToWidth(String original, int width) {
- String text = original;
+ public void drawReceiveTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(RECEIVETASK_IMAGE, name, graphicInfo, scaleFactor);
+ }
- // remove length for "..."
- int maxWidth = width - 10;
+ public void drawSendTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(SENDTASK_IMAGE, name, graphicInfo, scaleFactor);
+ }
- while (fontMetrics.stringWidth(text + "...") > maxWidth && text.length() > 0) {
- text = text.substring(0, text.length() - 1);
+ public void drawManualTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(MANUALTASK_IMAGE, name, graphicInfo, scaleFactor);
}
- if (!text.equals(original)) {
- text = text + "...";
+ public void drawBusinessRuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(BUSINESS_RULE_TASK_IMAGE, name, graphicInfo, scaleFactor);
}
- return text;
- }
+ public void drawCamelTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(CAMEL_TASK_IMAGE, name, graphicInfo, scaleFactor);
+ }
- public void drawUserTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(USERTASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ public void drawMuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
+ drawTask(MULE_TASK_IMAGE, name, graphicInfo, scaleFactor);
+ }
- public void drawScriptTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(SCRIPTTASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ public void drawExpandedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent,
+ double scaleFactor) {
+ RoundRectangle2D rect = new RoundRectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(),
+ graphicInfo.getWidth(), graphicInfo.getHeight(), 8, 8);
+
+ // Use different stroke (dashed)
+ if (isTriggeredByEvent) {
+ Stroke originalStroke = g.getStroke();
+ g.setStroke(EVENT_SUBPROCESS_STROKE);
+ g.draw(rect);
+ g.setStroke(originalStroke);
+ } else {
+ Paint originalPaint = g.getPaint();
+ g.setPaint(SUBPROCESS_BOX_COLOR);
+ g.fill(rect);
+ g.setPaint(SUBPROCESS_BORDER_COLOR);
+ g.draw(rect);
+ g.setPaint(originalPaint);
+ }
- public void drawServiceTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(SERVICETASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ if (scaleFactor == 1.0 && name != null && !name.isEmpty()) {
+ String text = fitTextToWidth(name, (int)graphicInfo.getWidth());
+ g.drawString(text, (int)graphicInfo.getX() + 10, (int)graphicInfo.getY() + 15);
+ }
+ }
- public void drawReceiveTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(RECEIVETASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ public void drawCollapsedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent) {
+ drawCollapsedTask(name, graphicInfo, false);
+ }
- public void drawSendTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(SENDTASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ public void drawCollapsedCallActivity(String name, GraphicInfo graphicInfo) {
+ drawCollapsedTask(name, graphicInfo, true);
+ }
- public void drawManualTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(MANUALTASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ protected void drawCollapsedTask(String name, GraphicInfo graphicInfo, boolean thickBorder) {
+ // The collapsed marker is now visualized separately
+ drawTask(name, graphicInfo, thickBorder);
+ }
- public void drawBusinessRuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(BUSINESS_RULE_TASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ public void drawCollapsedMarker(int x, int y, int width, int height) {
+ // rectangle
+ int rectangleWidth = MARKER_WIDTH;
+ int rectangleHeight = MARKER_WIDTH;
+ Rectangle rect = new Rectangle(x + (width - rectangleWidth) / 2, y + height - rectangleHeight - 3,
+ rectangleWidth, rectangleHeight);
+ g.draw(rect);
+
+ // plus inside rectangle
+ Line2D.Double line =
+ new Line2D.Double(rect.getCenterX(), rect.getY() + 2, rect.getCenterX(), rect.getMaxY() - 2);
+ g.draw(line);
+ line = new Line2D.Double(rect.getMinX() + 2, rect.getCenterY(), rect.getMaxX() - 2, rect.getCenterY());
+ g.draw(line);
+ }
- public void drawCamelTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(CAMEL_TASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ public void drawActivityMarkers(int x, int y, int width, int height, boolean multiInstanceSequential,
+ boolean multiInstanceParallel, boolean collapsed) {
+ if (collapsed) {
+ if (!multiInstanceSequential && !multiInstanceParallel) {
+ drawCollapsedMarker(x, y, width, height);
+ } else {
+ drawCollapsedMarker(x - MARKER_WIDTH / 2 - 2, y, width, height);
+ if (multiInstanceSequential) {
+ drawMultiInstanceMarker(true, x + MARKER_WIDTH / 2 + 2, y, width, height);
+ } else {
+ drawMultiInstanceMarker(false, x + MARKER_WIDTH / 2 + 2, y, width, height);
+ }
+ }
+ } else {
+ if (multiInstanceSequential) {
+ drawMultiInstanceMarker(true, x, y, width, height);
+ } else if (multiInstanceParallel) {
+ drawMultiInstanceMarker(false, x, y, width, height);
+ }
+ }
+ }
- public void drawMuleTask(String name, GraphicInfo graphicInfo, double scaleFactor) {
- drawTask(MULE_TASK_IMAGE, name, graphicInfo, scaleFactor);
- }
+ public void drawGateway(GraphicInfo graphicInfo) {
+ Polygon rhombus = new Polygon();
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+
+ rhombus.addPoint(x, y + (height / 2));
+ rhombus.addPoint(x + (width / 2), y + height);
+ rhombus.addPoint(x + width, y + (height / 2));
+ rhombus.addPoint(x + (width / 2), y);
+ g.draw(rhombus);
+ }
- public void drawExpandedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent, double scaleFactor) {
- RoundRectangle2D rect = new RoundRectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(),
- graphicInfo.getWidth(), graphicInfo.getHeight(), 8, 8);
+ public void drawParallelGateway(GraphicInfo graphicInfo, double scaleFactor) {
+ // rhombus
+ drawGateway(graphicInfo);
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+
+ if (scaleFactor == 1.0) {
+ // plus inside rhombus
+ Stroke orginalStroke = g.getStroke();
+ g.setStroke(GATEWAY_TYPE_STROKE);
+ Line2D.Double line = new Line2D.Double(x + 10, y + height / 2, x + width - 10, y + height / 2); // horizontal
+ g.draw(line);
+ line = new Line2D.Double(x + width / 2, y + height - 10, x + width / 2, y + 10); // vertical
+ g.draw(line);
+ g.setStroke(orginalStroke);
+ }
+ }
- // Use different stroke (dashed)
- if (isTriggeredByEvent) {
- Stroke originalStroke = g.getStroke();
- g.setStroke(EVENT_SUBPROCESS_STROKE);
- g.draw(rect);
- g.setStroke(originalStroke);
- } else {
- Paint originalPaint = g.getPaint();
- g.setPaint(SUBPROCESS_BOX_COLOR);
- g.fill(rect);
- g.setPaint(SUBPROCESS_BORDER_COLOR);
- g.draw(rect);
- g.setPaint(originalPaint);
+ public void drawExclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) {
+ // rhombus
+ drawGateway(graphicInfo);
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+
+ int quarterWidth = width / 4;
+ int quarterHeight = height / 4;
+
+ if (scaleFactor == 1.0) {
+ // X inside rhombus
+ Stroke orginalStroke = g.getStroke();
+ g.setStroke(GATEWAY_TYPE_STROKE);
+ Line2D.Double line = new Line2D.Double(x + quarterWidth + 3, y + quarterHeight + 3,
+ x + 3 * quarterWidth - 3, y + 3 * quarterHeight - 3);
+ g.draw(line);
+ line = new Line2D.Double(x + quarterWidth + 3, y + 3 * quarterHeight - 3, x + 3 * quarterWidth - 3,
+ y + quarterHeight + 3);
+ g.draw(line);
+ g.setStroke(orginalStroke);
+ }
}
- if (scaleFactor == 1.0 && name != null && !name.isEmpty()) {
- String text = fitTextToWidth(name, (int) graphicInfo.getWidth());
- g.drawString(text, (int) graphicInfo.getX() + 10, (int) graphicInfo.getY() + 15);
+ public void drawInclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) {
+ // rhombus
+ drawGateway(graphicInfo);
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+
+ int diameter = width / 2;
+
+ if (scaleFactor == 1.0) {
+ // circle inside rhombus
+ Stroke orginalStroke = g.getStroke();
+ g.setStroke(GATEWAY_TYPE_STROKE);
+ Ellipse2D.Double circle =
+ new Ellipse2D.Double(((width - diameter) / 2) + x, ((height - diameter) / 2) + y, diameter, diameter);
+ g.draw(circle);
+ g.setStroke(orginalStroke);
+ }
}
- }
- public void drawCollapsedSubProcess(String name, GraphicInfo graphicInfo, Boolean isTriggeredByEvent) {
- drawCollapsedTask(name, graphicInfo, false);
- }
+ public void drawEventBasedGateway(GraphicInfo graphicInfo, double scaleFactor) {
+ // rhombus
+ drawGateway(graphicInfo);
+
+ if (scaleFactor == 1.0) {
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+
+ double scale = .6;
+
+ GraphicInfo eventInfo = new GraphicInfo();
+ eventInfo.setX(x + width * (1 - scale) / 2);
+ eventInfo.setY(y + height * (1 - scale) / 2);
+ eventInfo.setWidth(width * scale);
+ eventInfo.setHeight(height * scale);
+ drawCatchingEvent(eventInfo, true, null, "eventGateway", scaleFactor);
- public void drawCollapsedCallActivity(String name, GraphicInfo graphicInfo) {
- drawCollapsedTask(name, graphicInfo, true);
- }
+ double r = width / 6.;
- protected void drawCollapsedTask(String name, GraphicInfo graphicInfo, boolean thickBorder) {
- // The collapsed marker is now visualized separately
- drawTask(name, graphicInfo, thickBorder);
- }
+ // create pentagon (coords with respect to center)
+ int topX = (int)(.95 * r); // top right corner
+ int topY = (int)(-.31 * r);
+ int bottomX = (int)(.59 * r); // bottom right corner
+ int bottomY = (int)(.81 * r);
- public void drawCollapsedMarker(int x, int y, int width, int height) {
- // rectangle
- int rectangleWidth = MARKER_WIDTH;
- int rectangleHeight = MARKER_WIDTH;
- Rectangle rect = new Rectangle(x + (width - rectangleWidth) / 2, y + height - rectangleHeight - 3, rectangleWidth, rectangleHeight);
- g.draw(rect);
-
- // plus inside rectangle
- Line2D.Double line = new Line2D.Double(rect.getCenterX(), rect.getY() + 2, rect.getCenterX(), rect.getMaxY() - 2);
- g.draw(line);
- line = new Line2D.Double(rect.getMinX() + 2, rect.getCenterY(), rect.getMaxX() - 2, rect.getCenterY());
- g.draw(line);
- }
-
- public void drawActivityMarkers(int x, int y, int width, int height, boolean multiInstanceSequential, boolean multiInstanceParallel, boolean collapsed) {
- if (collapsed) {
- if (!multiInstanceSequential && !multiInstanceParallel) {
- drawCollapsedMarker(x, y, width, height);
- } else {
- drawCollapsedMarker(x - MARKER_WIDTH / 2 - 2, y, width, height);
- if (multiInstanceSequential) {
- drawMultiInstanceMarker(true, x + MARKER_WIDTH / 2 + 2, y, width, height);
+ int[] xPoints = new int[] {0, topX, bottomX, -bottomX, -topX};
+ int[] yPoints = new int[] {-(int)r, topY, bottomY, bottomY, topY};
+ Polygon pentagon = new Polygon(xPoints, yPoints, 5);
+ pentagon.translate(x + width / 2, y + width / 2);
+
+ // draw
+ g.drawPolygon(pentagon);
+ }
+ }
+
+ public void drawMultiInstanceMarker(boolean sequential, int x, int y, int width, int height) {
+ int rectangleWidth = MARKER_WIDTH;
+ int rectangleHeight = MARKER_WIDTH;
+ int lineX = x + (width - rectangleWidth) / 2;
+ int lineY = y + height - rectangleHeight - 3;
+
+ Stroke orginalStroke = g.getStroke();
+ g.setStroke(MULTI_INSTANCE_STROKE);
+
+ if (sequential) {
+ g.draw(new Line2D.Double(lineX, lineY, lineX + rectangleWidth, lineY));
+ g.draw(new Line2D.Double(lineX, lineY + rectangleHeight / 2, lineX + rectangleWidth,
+ lineY + rectangleHeight / 2));
+ g.draw(new Line2D.Double(lineX, lineY + rectangleHeight, lineX + rectangleWidth, lineY + rectangleHeight));
} else {
- drawMultiInstanceMarker(false, x + MARKER_WIDTH / 2 + 2, y, width, height);
+ g.draw(new Line2D.Double(lineX, lineY, lineX, lineY + rectangleHeight));
+ g.draw(new Line2D.Double(lineX + rectangleWidth / 2, lineY, lineX + rectangleWidth / 2,
+ lineY + rectangleHeight));
+ g.draw(new Line2D.Double(lineX + rectangleWidth, lineY, lineX + rectangleWidth, lineY + rectangleHeight));
}
- }
- } else {
- if (multiInstanceSequential) {
- drawMultiInstanceMarker(true, x, y, width, height);
- } else if (multiInstanceParallel) {
- drawMultiInstanceMarker(false, x, y, width, height);
- }
- }
- }
-
- public void drawGateway(GraphicInfo graphicInfo) {
- Polygon rhombus = new Polygon();
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- rhombus.addPoint(x, y + (height / 2));
- rhombus.addPoint(x + (width / 2), y + height);
- rhombus.addPoint(x + width, y + (height / 2));
- rhombus.addPoint(x + (width / 2), y);
- g.draw(rhombus);
- }
-
- public void drawParallelGateway(GraphicInfo graphicInfo, double scaleFactor) {
- // rhombus
- drawGateway(graphicInfo);
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- if (scaleFactor == 1.0) {
- // plus inside rhombus
- Stroke orginalStroke = g.getStroke();
- g.setStroke(GATEWAY_TYPE_STROKE);
- Line2D.Double line = new Line2D.Double(x + 10, y + height / 2, x + width - 10, y + height / 2); // horizontal
- g.draw(line);
- line = new Line2D.Double(x + width / 2, y + height - 10, x + width / 2, y + 10); // vertical
- g.draw(line);
- g.setStroke(orginalStroke);
- }
- }
-
- public void drawExclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) {
- // rhombus
- drawGateway(graphicInfo);
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- int quarterWidth = width / 4;
- int quarterHeight = height / 4;
-
- if (scaleFactor == 1.0) {
- // X inside rhombus
- Stroke orginalStroke = g.getStroke();
- g.setStroke(GATEWAY_TYPE_STROKE);
- Line2D.Double line = new Line2D.Double(x + quarterWidth + 3, y + quarterHeight + 3, x + 3 * quarterWidth - 3, y + 3 * quarterHeight - 3);
- g.draw(line);
- line = new Line2D.Double(x + quarterWidth + 3, y + 3 * quarterHeight - 3, x + 3 * quarterWidth - 3, y + quarterHeight + 3);
- g.draw(line);
- g.setStroke(orginalStroke);
- }
- }
-
- public void drawInclusiveGateway(GraphicInfo graphicInfo, double scaleFactor) {
- // rhombus
- drawGateway(graphicInfo);
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- int diameter = width / 2;
-
- if (scaleFactor == 1.0) {
- // circle inside rhombus
- Stroke orginalStroke = g.getStroke();
- g.setStroke(GATEWAY_TYPE_STROKE);
- Ellipse2D.Double circle = new Ellipse2D.Double(((width - diameter) / 2) + x, ((height - diameter) / 2) + y, diameter, diameter);
- g.draw(circle);
- g.setStroke(orginalStroke);
- }
- }
-
- public void drawEventBasedGateway(GraphicInfo graphicInfo, double scaleFactor) {
- // rhombus
- drawGateway(graphicInfo);
-
- if (scaleFactor == 1.0) {
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- double scale = .6;
-
- GraphicInfo eventInfo = new GraphicInfo();
- eventInfo.setX(x + width*(1-scale)/2);
- eventInfo.setY(y + height*(1-scale)/2);
- eventInfo.setWidth(width*scale);
- eventInfo.setHeight(height*scale);
- drawCatchingEvent(eventInfo, true, null, "eventGateway", scaleFactor);
-
- double r = width / 6.;
-
- // create pentagon (coords with respect to center)
- int topX = (int)(.95 * r); // top right corner
- int topY = (int)(-.31 * r);
- int bottomX = (int)(.59 * r); // bottom right corner
- int bottomY = (int)(.81 * r);
-
- int[] xPoints = new int[]{ 0, topX, bottomX, -bottomX, -topX };
- int[] yPoints = new int[]{ -(int)r, topY, bottomY, bottomY, topY };
- Polygon pentagon = new Polygon(xPoints, yPoints, 5);
- pentagon.translate(x+width/2, y+width/2);
-
- // draw
- g.drawPolygon(pentagon);
- }
- }
-
- public void drawMultiInstanceMarker(boolean sequential, int x, int y, int width, int height) {
- int rectangleWidth = MARKER_WIDTH;
- int rectangleHeight = MARKER_WIDTH;
- int lineX = x + (width - rectangleWidth) / 2;
- int lineY = y + height - rectangleHeight - 3;
-
- Stroke orginalStroke = g.getStroke();
- g.setStroke(MULTI_INSTANCE_STROKE);
-
- if (sequential) {
- g.draw(new Line2D.Double(lineX, lineY, lineX + rectangleWidth, lineY));
- g.draw(new Line2D.Double(lineX, lineY + rectangleHeight / 2, lineX + rectangleWidth, lineY + rectangleHeight / 2));
- g.draw(new Line2D.Double(lineX, lineY + rectangleHeight, lineX + rectangleWidth, lineY + rectangleHeight));
- } else {
- g.draw(new Line2D.Double(lineX, lineY, lineX, lineY + rectangleHeight));
- g.draw(new Line2D.Double(lineX + rectangleWidth / 2, lineY, lineX + rectangleWidth / 2, lineY + rectangleHeight));
- g.draw(new Line2D.Double(lineX + rectangleWidth, lineY, lineX + rectangleWidth, lineY + rectangleHeight));
- }
-
- g.setStroke(orginalStroke);
- }
-
- public void drawHighLight(int x, int y, int width, int height) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
-
- g.setPaint(HIGHLIGHT_COLOR);
-// g.setPaint(Color.GREEN);
- g.setStroke(THICK_TASK_BORDER_STROKE);
-
- RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20);
- g.draw(rect);
-
- g.setPaint(originalPaint);
- g.setStroke(originalStroke);
- }
-
-
- public void drawHighLight(int x, int y, int width, int height,Color color) {
- Paint originalPaint = g.getPaint();
- Stroke originalStroke = g.getStroke();
-
- g.setPaint(color);
-// g.setPaint(Color.GREEN);
- g.setStroke(THICK_TASK_BORDER_STROKE);
-
- RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20);
- g.draw(rect);
-
- g.setPaint(originalPaint);
- g.setStroke(originalStroke);
- }
-
- public void drawTextAnnotation(String text, GraphicInfo graphicInfo) {
- int x = (int) graphicInfo.getX();
- int y = (int) graphicInfo.getY();
- int width = (int) graphicInfo.getWidth();
- int height = (int) graphicInfo.getHeight();
-
- Font originalFont = g.getFont();
- Stroke originalStroke = g.getStroke();
-
- g.setFont(ANNOTATION_FONT);
-
- Path2D path = new Path2D.Double();
- x += .5;
- int lineLength = 18;
- path.moveTo(x + lineLength, y);
- path.lineTo(x, y);
- path.lineTo(x, y + height);
- path.lineTo(x + lineLength, y + height);
-
- path.lineTo(x + lineLength, y + height -1);
- path.lineTo(x + 1, y + height -1);
- path.lineTo(x + 1, y + 1);
- path.lineTo(x + lineLength, y + 1);
- path.closePath();
-
- g.draw(path);
-
- int boxWidth = width - (2 * ANNOTATION_TEXT_PADDING);
- int boxHeight = height - (2 * ANNOTATION_TEXT_PADDING);
- int boxX = x + width/2 - boxWidth/2;
- int boxY = y + height/2 - boxHeight/2;
-
- if (text != null && text.isEmpty() == false) {
- drawMultilineAnnotationText(text, boxX, boxY, boxWidth, boxHeight);
- }
-
- // restore originals
- g.setFont(originalFont);
- g.setStroke(originalStroke);
- }
-
- public void drawLabel(String text, GraphicInfo graphicInfo){
- drawLabel(text, graphicInfo, true);
- }
- public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered){
- float interline = 1.0f;
-
- // text
- if (text != null && text.length()>0) {
- Paint originalPaint = g.getPaint();
- Font originalFont = g.getFont();
-
- g.setPaint(LABEL_COLOR);
- g.setFont(LABEL_FONT);
-
- int wrapWidth = 100;
- int textY = (int) graphicInfo.getY();
-
- // TODO: use drawMultilineText()
- AttributedString as = new AttributedString(text);
- as.addAttribute(TextAttribute.FOREGROUND, g.getPaint());
- as.addAttribute(TextAttribute.FONT, g.getFont());
- AttributedCharacterIterator aci = as.getIterator();
- FontRenderContext frc = new FontRenderContext(null, true, false);
- LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);
-
- while (lbm.getPosition() < text.length()) {
- TextLayout tl = lbm.nextLayout(wrapWidth);
- textY += tl.getAscent();
- Rectangle2D bb = tl.getBounds();
- double tX = graphicInfo.getX();
- if (centered) {
- tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2);
- }
- tl.draw(g, (float) tX, textY);
- textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent();
- }
-
- // restore originals
- g.setFont(originalFont);
- g.setPaint(originalPaint);
- }
- }
-
- /**
- * This method makes coordinates of connection flow better.
- * @param sourceShapeType
- * @param targetShapeType
- * @param sourceGraphicInfo
- * @param targetGraphicInfo
- * @param graphicInfoList
- *
- */
- public List connectionPerfectionizer(SHAPE_TYPE sourceShapeType, SHAPE_TYPE targetShapeType, GraphicInfo sourceGraphicInfo, GraphicInfo targetGraphicInfo, List graphicInfoList) {
- Shape shapeFirst = createShape(sourceShapeType, sourceGraphicInfo);
- Shape shapeLast = createShape(targetShapeType, targetGraphicInfo);
-
- if (graphicInfoList != null && graphicInfoList.size() > 0) {
- GraphicInfo graphicInfoFirst = graphicInfoList.get(0);
- GraphicInfo graphicInfoLast = graphicInfoList.get(graphicInfoList.size()-1);
- if (shapeFirst != null) {
- graphicInfoFirst.setX(shapeFirst.getBounds2D().getCenterX());
- graphicInfoFirst.setY(shapeFirst.getBounds2D().getCenterY());
- }
- if (shapeLast != null) {
- graphicInfoLast.setX(shapeLast.getBounds2D().getCenterX());
- graphicInfoLast.setY(shapeLast.getBounds2D().getCenterY());
- }
-
- Point p = null;
-
- if (shapeFirst != null) {
- Line2D.Double lineFirst = new Line2D.Double(graphicInfoFirst.getX(), graphicInfoFirst.getY(), graphicInfoList.get(1).getX(), graphicInfoList.get(1).getY());
- p = getIntersection(shapeFirst, lineFirst);
- if (p != null) {
- graphicInfoFirst.setX(p.getX());
- graphicInfoFirst.setY(p.getY());
+
+ g.setStroke(orginalStroke);
+ }
+
+ public void drawHighLight(int x, int y, int width, int height) {
+ Paint originalPaint = g.getPaint();
+ Stroke originalStroke = g.getStroke();
+
+ g.setPaint(HIGHLIGHT_COLOR);
+ // g.setPaint(Color.GREEN);
+ g.setStroke(THICK_TASK_BORDER_STROKE);
+
+ RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20);
+ g.draw(rect);
+
+ g.setPaint(originalPaint);
+ g.setStroke(originalStroke);
+ }
+
+ public void drawHighLight(int x, int y, int width, int height, Color color) {
+ Paint originalPaint = g.getPaint();
+ Stroke originalStroke = g.getStroke();
+
+ g.setPaint(color);
+ // g.setPaint(Color.GREEN);
+ g.setStroke(THICK_TASK_BORDER_STROKE);
+
+ RoundRectangle2D rect = new RoundRectangle2D.Double(x, y, width, height, 20, 20);
+ g.draw(rect);
+
+ g.setPaint(originalPaint);
+ g.setStroke(originalStroke);
+ }
+
+ public void drawTextAnnotation(String text, GraphicInfo graphicInfo) {
+ int x = (int)graphicInfo.getX();
+ int y = (int)graphicInfo.getY();
+ int width = (int)graphicInfo.getWidth();
+ int height = (int)graphicInfo.getHeight();
+
+ Font originalFont = g.getFont();
+ Stroke originalStroke = g.getStroke();
+
+ g.setFont(ANNOTATION_FONT);
+
+ Path2D path = new Path2D.Double();
+ x += .5;
+ int lineLength = 18;
+ path.moveTo(x + lineLength, y);
+ path.lineTo(x, y);
+ path.lineTo(x, y + height);
+ path.lineTo(x + lineLength, y + height);
+
+ path.lineTo(x + lineLength, y + height - 1);
+ path.lineTo(x + 1, y + height - 1);
+ path.lineTo(x + 1, y + 1);
+ path.lineTo(x + lineLength, y + 1);
+ path.closePath();
+
+ g.draw(path);
+
+ int boxWidth = width - (2 * ANNOTATION_TEXT_PADDING);
+ int boxHeight = height - (2 * ANNOTATION_TEXT_PADDING);
+ int boxX = x + width / 2 - boxWidth / 2;
+ int boxY = y + height / 2 - boxHeight / 2;
+
+ if (text != null && text.isEmpty() == false) {
+ drawMultilineAnnotationText(text, boxX, boxY, boxWidth, boxHeight);
}
- }
-
- if (shapeLast != null) {
- Line2D.Double lineLast = new Line2D.Double(graphicInfoLast.getX(), graphicInfoLast.getY(), graphicInfoList.get(graphicInfoList.size()-2).getX(), graphicInfoList.get(graphicInfoList.size()-2).getY());
- p = getIntersection(shapeLast, lineLast);
- if (p != null) {
- graphicInfoLast.setX(p.getX());
- graphicInfoLast.setY(p.getY());
+
+ // restore originals
+ g.setFont(originalFont);
+ g.setStroke(originalStroke);
+ }
+
+ public void drawLabel(String text, GraphicInfo graphicInfo) {
+ drawLabel(text, graphicInfo, true);
+ }
+
+ public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) {
+ float interline = 1.0f;
+
+ // text
+ if (text != null && text.length() > 0) {
+ Paint originalPaint = g.getPaint();
+ Font originalFont = g.getFont();
+
+ g.setPaint(LABEL_COLOR);
+ g.setFont(LABEL_FONT);
+
+ int wrapWidth = 100;
+ int textY = (int)graphicInfo.getY();
+
+ // TODO: use drawMultilineText()
+ AttributedString as = new AttributedString(text);
+ as.addAttribute(TextAttribute.FOREGROUND, g.getPaint());
+ as.addAttribute(TextAttribute.FONT, g.getFont());
+ AttributedCharacterIterator aci = as.getIterator();
+ FontRenderContext frc = new FontRenderContext(null, true, false);
+ LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);
+
+ while (lbm.getPosition() < text.length()) {
+ TextLayout tl = lbm.nextLayout(wrapWidth);
+ textY += tl.getAscent();
+ Rectangle2D bb = tl.getBounds();
+ double tX = graphicInfo.getX();
+ if (centered) {
+ tX += (int)(graphicInfo.getWidth() / 2 - bb.getWidth() / 2);
+ }
+ tl.draw(g, (float)tX, textY);
+ textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent();
+ }
+
+ // restore originals
+ g.setFont(originalFont);
+ g.setPaint(originalPaint);
}
- }
- }
-
- return graphicInfoList;
- }
-
- /**
- * This method creates shape by type and coordinates.
- * @param shapeType
- * @param graphicInfo
- * @return Shape
- */
- private static Shape createShape(SHAPE_TYPE shapeType, GraphicInfo graphicInfo) {
- if (SHAPE_TYPE.Rectangle.equals(shapeType)) {
- // source is rectangle
- return new Rectangle2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight());
- } else if (SHAPE_TYPE.Rhombus.equals(shapeType)) {
- // source is rhombus
- Path2D.Double rhombus = new Path2D.Double();
- rhombus.moveTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2);
- rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2, graphicInfo.getY() + graphicInfo.getHeight());
- rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth(), graphicInfo.getY() + graphicInfo.getHeight() / 2);
- rhombus.lineTo(graphicInfo.getX() + graphicInfo.getWidth() / 2, graphicInfo.getY());
- rhombus.lineTo(graphicInfo.getX(), graphicInfo.getY() + graphicInfo.getHeight() / 2);
- rhombus.closePath();
- return rhombus;
- } else if (SHAPE_TYPE.Ellipse.equals(shapeType)) {
- // source is ellipse
- return new Ellipse2D.Double(graphicInfo.getX(), graphicInfo.getY(), graphicInfo.getWidth(), graphicInfo.getHeight());
- } else {
- // unknown source element, just do not correct coordinates
- }
- return null;
- }
-
- /**
- * This method returns intersection point of shape border and line.
- *
- * @param shape
- * @param line
- * @return Point
- */
- private static Point getIntersection(Shape shape, Line2D.Double line) {
- if (shape instanceof Ellipse2D) {
- return getEllipseIntersection(shape, line);
- } else if (shape instanceof Rectangle2D || shape instanceof Path2D) {
- return getShapeIntersection(shape, line);
- } else {
- // something strange
- return null;
- }
- }
+ }
/**
- * This method calculates ellipse intersection with line
- * @param shape
- * Bounds of this shape used to calculate parameters of inscribed into this bounds ellipse.
- * @param line
- * @return Intersection point
+ * This method makes coordinates of connection flow better.
+ *
+ * @param sourceShapeType
+ * @param targetShapeType
+ * @param sourceGraphicInfo
+ * @param targetGraphicInfo
+ * @param graphicInfoList
+ *
*/
- private static Point getEllipseIntersection(Shape shape, Line2D.Double line) {
- double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
- double x = shape.getBounds2D().getWidth()/2 * Math.cos(angle) + shape.getBounds2D().getCenterX();
- double y = shape.getBounds2D().getHeight()/2 * Math.sin(angle) + shape.getBounds2D().getCenterY();
- Point p = new Point();
- p.setLocation(x, y);
- return p;
- }
-
- /**
- * This method calculates shape intersection with line.
- *
- * @param shape
- * @param line
- * @return Intersection point
- */
- private static Point getShapeIntersection(Shape shape, Line2D.Double line) {
- PathIterator it = shape.getPathIterator(null);
- double[] coords = new double[6];
- double[] pos = new double[2];
- Line2D.Double l = new Line2D.Double();
- while (!it.isDone()) {
- int type = it.currentSegment(coords);
- switch (type) {
- case PathIterator.SEG_MOVETO:
- pos[0] = coords[0];
- pos[1] = coords[1];
- break;
- case PathIterator.SEG_LINETO:
- l = new Line2D.Double(pos[0], pos[1], coords[0], coords[1]);
- if (line.intersectsLine(l)) {
- return getLinesIntersection(line, l);
+ public List connectionPerfectionizer(SHAPE_TYPE sourceShapeType, SHAPE_TYPE targetShapeType,
+ GraphicInfo sourceGraphicInfo, GraphicInfo targetGraphicInfo, List graphicInfoList) {
+ Shape shapeFirst = createShape(sourceShapeType, sourceGraphicInfo);
+ Shape shapeLast = createShape(targetShapeType, targetGraphicInfo);
+
+ if (graphicInfoList != null && graphicInfoList.size() > 0) {
+ GraphicInfo graphicInfoFirst = graphicInfoList.get(0);
+ GraphicInfo graphicInfoLast = graphicInfoList.get(graphicInfoList.size() - 1);
+ if (shapeFirst != null) {
+ graphicInfoFirst.setX(shapeFirst.getBounds2D().getCenterX());
+ graphicInfoFirst.setY(shapeFirst.getBounds2D().getCenterY());
+ }
+ if (shapeLast != null) {
+ graphicInfoLast.setX(shapeLast.getBounds2D().getCenterX());
+ graphicInfoLast.setY(shapeLast.getBounds2D().getCenterY());
+ }
+
+ Point p = null;
+
+ if (shapeFirst != null) {
+ Line2D.Double lineFirst = new Line2D.Double(graphicInfoFirst.getX(), graphicInfoFirst.getY(),
+ graphicInfoList.get(1).getX(), graphicInfoList.get(1).getY());
+ p = getIntersection(shapeFirst, lineFirst);
+ if (p != null) {
+ graphicInfoFirst.setX(p.getX());
+ graphicInfoFirst.setY(p.getY());
+ }
+ }
+
+ if (shapeLast != null) {
+ Line2D.Double lineLast = new Line2D.Double(graphicInfoLast.getX(), graphicInfoLast.getY(),
+ graphicInfoList.get(graphicInfoList.size() - 2).getX(),
+ graphicInfoList.get(graphicInfoList.size() - 2).getY());
+ p = getIntersection(shapeLast, lineLast);
+ if (p != null) {
+ graphicInfoLast.setX(p.getX());
+ graphicInfoLast.setY(p.getY());
+ }
+ }
}
- pos[0] = coords[0];
- pos[1] = coords[1];
- break;
- case PathIterator.SEG_CLOSE:
- break;
- default:
- // whatever
- }
- it.next();
- }
- return null;
- }
-
- /**
- * This method calculates intersections of two lines.
- * @param a Line 1
- * @param b Line 2
- * @return Intersection point
- */
- private static Point getLinesIntersection(Line2D a, Line2D b) {
- double d = (a.getX1()-a.getX2())*(b.getY2()-b.getY1()) - (a.getY1()-a.getY2())*(b.getX2()-b.getX1());
- double da = (a.getX1()-b.getX1())*(b.getY2()-b.getY1()) - (a.getY1()-b.getY1())*(b.getX2()-b.getX1());
- // double db = (a.getX1()-a.getX2())*(a.getY1()-b.getY1()) - (a.getY1()-a.getY2())*(a.getX1()-b.getX1());
- double ta = da/d;
- // double tb = db/d;
- Point p = new Point();
- p.setLocation(a.getX1()+ta*(a.getX2()-a.getX1()), a.getY1()+ta*(a.getY2()-a.getY1()));
- return p;
- }
+
+ return graphicInfoList;
+ }
+
+ public enum SHAPE_TYPE {
+ Rectangle, Rhombus, Ellipse
+ }
}
diff --git a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java
index c4a72ab..9ffbcec 100644
--- a/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java
+++ b/len-activiti/src/main/java/org/activiti/image/impl/DefaultProcessDiagramGenerator.java
@@ -1,14 +1,12 @@
-/* Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
*/
package org.activiti.image.impl;
@@ -16,1149 +14,1135 @@ package org.activiti.image.impl;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
+import java.util.*;
import java.util.List;
-import java.util.Map;
-
-import org.activiti.bpmn.model.Activity;
-import org.activiti.bpmn.model.Artifact;
-import org.activiti.bpmn.model.Association;
-import org.activiti.bpmn.model.AssociationDirection;
-import org.activiti.bpmn.model.BaseElement;
-import org.activiti.bpmn.model.BoundaryEvent;
-import org.activiti.bpmn.model.BpmnModel;
-import org.activiti.bpmn.model.BusinessRuleTask;
-import org.activiti.bpmn.model.CallActivity;
-import org.activiti.bpmn.model.CompensateEventDefinition;
-import org.activiti.bpmn.model.EndEvent;
-import org.activiti.bpmn.model.ErrorEventDefinition;
+
+import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Event;
-import org.activiti.bpmn.model.EventDefinition;
-import org.activiti.bpmn.model.EventGateway;
-import org.activiti.bpmn.model.EventSubProcess;
-import org.activiti.bpmn.model.ExclusiveGateway;
-import org.activiti.bpmn.model.FlowElement;
-import org.activiti.bpmn.model.FlowElementsContainer;
-import org.activiti.bpmn.model.FlowNode;
-import org.activiti.bpmn.model.Gateway;
-import org.activiti.bpmn.model.GraphicInfo;
-import org.activiti.bpmn.model.InclusiveGateway;
-import org.activiti.bpmn.model.IntermediateCatchEvent;
-import org.activiti.bpmn.model.Lane;
-import org.activiti.bpmn.model.ManualTask;
-import org.activiti.bpmn.model.MessageEventDefinition;
-import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics;
-import org.activiti.bpmn.model.ParallelGateway;
-import org.activiti.bpmn.model.Pool;
import org.activiti.bpmn.model.Process;
-import org.activiti.bpmn.model.ReceiveTask;
-import org.activiti.bpmn.model.ScriptTask;
-import org.activiti.bpmn.model.SendTask;
-import org.activiti.bpmn.model.SequenceFlow;
-import org.activiti.bpmn.model.ServiceTask;
-import org.activiti.bpmn.model.SignalEventDefinition;
-import org.activiti.bpmn.model.StartEvent;
-import org.activiti.bpmn.model.SubProcess;
-import org.activiti.bpmn.model.Task;
-import org.activiti.bpmn.model.TextAnnotation;
-import org.activiti.bpmn.model.ThrowEvent;
-import org.activiti.bpmn.model.TimerEventDefinition;
-import org.activiti.bpmn.model.UserTask;
import org.activiti.image.HMProcessDiagramGenerator;
-import org.activiti.image.ProcessDiagramGenerator;
/**
- * Class to generate an image based the diagram interchange information in a
- * BPMN 2.0 process.
+ * Class to generate an image based the diagram interchange information in a BPMN 2.0 process.
*
* @author Joram Barrez
* @author Tijs Rademakers
*/
public class DefaultProcessDiagramGenerator implements HMProcessDiagramGenerator {
- protected Map, ActivityDrawInstruction> activityDrawInstructions = new HashMap, ActivityDrawInstruction>();
- protected Map, ArtifactDrawInstruction> artifactDrawInstructions = new HashMap, ArtifactDrawInstruction>();
-
- public DefaultProcessDiagramGenerator() {
- this(1.0);
- }
-
- // The instructions on how to draw a certain construct is
- // created statically and stored in a map for performance.
- public DefaultProcessDiagramGenerator(final double scaleFactor) {
- // start event
- activityDrawInstructions.put(StartEvent.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- StartEvent startEvent = (StartEvent) flowNode;
- if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) {
- EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0);
- if (eventDefinition instanceof TimerEventDefinition) {
- processDiagramCanvas.drawTimerStartEvent(graphicInfo, scaleFactor);
- } else if (eventDefinition instanceof ErrorEventDefinition) {
- processDiagramCanvas.drawErrorStartEvent(graphicInfo, scaleFactor);
- } else if (eventDefinition instanceof SignalEventDefinition) {
- processDiagramCanvas.drawSignalStartEvent(graphicInfo, scaleFactor);
- } else if (eventDefinition instanceof MessageEventDefinition) {
- processDiagramCanvas.drawMessageStartEvent(graphicInfo, scaleFactor);
- } else {
- processDiagramCanvas.drawNoneStartEvent(graphicInfo);
- }
+ protected Map, ActivityDrawInstruction> activityDrawInstructions =
+ new HashMap, ActivityDrawInstruction>();
+ protected Map, ArtifactDrawInstruction> artifactDrawInstructions =
+ new HashMap, ArtifactDrawInstruction>();
+
+ public DefaultProcessDiagramGenerator() {
+ this(1.0);
+ }
+
+ // The instructions on how to draw a certain construct is
+ // created statically and stored in a map for performance.
+ public DefaultProcessDiagramGenerator(final double scaleFactor) {
+ // start event
+ activityDrawInstructions.put(StartEvent.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ StartEvent startEvent = (StartEvent)flowNode;
+ if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) {
+ EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0);
+ if (eventDefinition instanceof TimerEventDefinition) {
+ processDiagramCanvas.drawTimerStartEvent(graphicInfo, scaleFactor);
+ } else if (eventDefinition instanceof ErrorEventDefinition) {
+ processDiagramCanvas.drawErrorStartEvent(graphicInfo, scaleFactor);
+ } else if (eventDefinition instanceof SignalEventDefinition) {
+ processDiagramCanvas.drawSignalStartEvent(graphicInfo, scaleFactor);
+ } else if (eventDefinition instanceof MessageEventDefinition) {
+ processDiagramCanvas.drawMessageStartEvent(graphicInfo, scaleFactor);
+ } else {
+ processDiagramCanvas.drawNoneStartEvent(graphicInfo);
+ }
+ } else {
+ processDiagramCanvas.drawNoneStartEvent(graphicInfo);
+ }
+ }
+ });
+
+ // signal catch
+ activityDrawInstructions.put(IntermediateCatchEvent.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ IntermediateCatchEvent intermediateCatchEvent = (IntermediateCatchEvent)flowNode;
+ if (intermediateCatchEvent.getEventDefinitions() != null
+ && !intermediateCatchEvent.getEventDefinitions().isEmpty()) {
+ if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
+ processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, true,
+ scaleFactor);
+ } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) {
+ processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, true, scaleFactor);
+ } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
+ processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, true,
+ scaleFactor);
+ }
+ }
+ }
+ });
+
+ // signal throw
+ activityDrawInstructions.put(ThrowEvent.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ ThrowEvent throwEvent = (ThrowEvent)flowNode;
+ if (throwEvent.getEventDefinitions() != null && !throwEvent.getEventDefinitions().isEmpty()) {
+ if (throwEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
+ processDiagramCanvas.drawThrowingSignalEvent(graphicInfo, scaleFactor);
+ } else if (throwEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) {
+ processDiagramCanvas.drawThrowingCompensateEvent(graphicInfo, scaleFactor);
+ } else {
+ processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor);
+ }
+ } else {
+ processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor);
+ }
+ }
+ });
+
+ // end event
+ activityDrawInstructions.put(EndEvent.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ EndEvent endEvent = (EndEvent)flowNode;
+ if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) {
+ if (endEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) {
+ processDiagramCanvas.drawErrorEndEvent(flowNode.getName(), graphicInfo, scaleFactor);
+ } else {
+ processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor);
+ }
+ } else {
+ processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor);
+ }
+ }
+ });
+
+ // task
+ activityDrawInstructions.put(Task.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawTask(flowNode.getName(), graphicInfo);
+ }
+ });
+
+ // user task
+ activityDrawInstructions.put(UserTask.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawUserTask(flowNode.getName(), graphicInfo, scaleFactor);
+ }
+ });
+
+ // script task
+ activityDrawInstructions.put(ScriptTask.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawScriptTask(flowNode.getName(), graphicInfo, scaleFactor);
+ }
+ });
+
+ // service task
+ activityDrawInstructions.put(ServiceTask.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ ServiceTask serviceTask = (ServiceTask)flowNode;
+ if ("camel".equalsIgnoreCase(serviceTask.getType())) {
+ processDiagramCanvas.drawCamelTask(serviceTask.getName(), graphicInfo, scaleFactor);
+ } else if ("mule".equalsIgnoreCase(serviceTask.getType())) {
+ processDiagramCanvas.drawMuleTask(serviceTask.getName(), graphicInfo, scaleFactor);
+ } else {
+ processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor);
+ }
+ }
+ });
+
+ // receive task
+ activityDrawInstructions.put(ReceiveTask.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawReceiveTask(flowNode.getName(), graphicInfo, scaleFactor);
+ }
+ });
+
+ // send task
+ activityDrawInstructions.put(SendTask.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawSendTask(flowNode.getName(), graphicInfo, scaleFactor);
+ }
+ });
+
+ // manual task
+ activityDrawInstructions.put(ManualTask.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawManualTask(flowNode.getName(), graphicInfo, scaleFactor);
+ }
+ });
+
+ // businessRuleTask task
+ activityDrawInstructions.put(BusinessRuleTask.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawBusinessRuleTask(flowNode.getName(), graphicInfo, scaleFactor);
+ }
+ });
+
+ // exclusive gateway
+ activityDrawInstructions.put(ExclusiveGateway.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawExclusiveGateway(graphicInfo, scaleFactor);
+ }
+ });
+
+ // inclusive gateway
+ activityDrawInstructions.put(InclusiveGateway.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawInclusiveGateway(graphicInfo, scaleFactor);
+ }
+ });
+
+ // parallel gateway
+ activityDrawInstructions.put(ParallelGateway.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawParallelGateway(graphicInfo, scaleFactor);
+ }
+ });
+
+ // event based gateway
+ activityDrawInstructions.put(EventGateway.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawEventBasedGateway(graphicInfo, scaleFactor);
+ }
+ });
+
+ // Boundary timer
+ activityDrawInstructions.put(BoundaryEvent.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ BoundaryEvent boundaryEvent = (BoundaryEvent)flowNode;
+ if (boundaryEvent.getEventDefinitions() != null && !boundaryEvent.getEventDefinitions().isEmpty()) {
+ if (boundaryEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) {
+
+ processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo,
+ boundaryEvent.isCancelActivity(), scaleFactor);
+
+ } else if (boundaryEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) {
+
+ processDiagramCanvas.drawCatchingErrorEvent(graphicInfo, boundaryEvent.isCancelActivity(),
+ scaleFactor);
+
+ } else if (boundaryEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
+ processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo,
+ boundaryEvent.isCancelActivity(), scaleFactor);
+
+ } else if (boundaryEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
+ processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo,
+ boundaryEvent.isCancelActivity(), scaleFactor);
+
+ } else if (boundaryEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) {
+ processDiagramCanvas.drawCatchingCompensateEvent(graphicInfo, boundaryEvent.isCancelActivity(),
+ scaleFactor);
+ }
+ }
+
+ }
+ });
+
+ // subprocess
+ activityDrawInstructions.put(SubProcess.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) {
+ processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false);
+ } else {
+ processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor);
+ }
+ }
+ });
+
+ // Event subprocess
+ activityDrawInstructions.put(EventSubProcess.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) {
+ processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, true);
+ } else {
+ processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor);
+ }
+ }
+ });
+
+ // call activity
+ activityDrawInstructions.put(CallActivity.class, new ActivityDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ processDiagramCanvas.drawCollapsedCallActivity(flowNode.getName(), graphicInfo);
+ }
+ });
+
+ // text annotation
+ artifactDrawInstructions.put(TextAnnotation.class, new ArtifactDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
+ TextAnnotation textAnnotation = (TextAnnotation)artifact;
+ processDiagramCanvas.drawTextAnnotation(textAnnotation.getText(), graphicInfo);
+ }
+ });
+
+ // association
+ artifactDrawInstructions.put(Association.class, new ArtifactDrawInstruction() {
+
+ public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) {
+ Association association = (Association)artifact;
+ String sourceRef = association.getSourceRef();
+ String targetRef = association.getTargetRef();
+
+ // source and target can be instance of FlowElement or Artifact
+ BaseElement sourceElement = bpmnModel.getFlowElement(sourceRef);
+ BaseElement targetElement = bpmnModel.getFlowElement(targetRef);
+ if (sourceElement == null) {
+ sourceElement = bpmnModel.getArtifact(sourceRef);
+ }
+ if (targetElement == null) {
+ targetElement = bpmnModel.getArtifact(targetRef);
+ }
+ List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
+ graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement,
+ targetElement, graphicInfoList);
+ int xPoints[] = new int[graphicInfoList.size()];
+ int yPoints[] = new int[graphicInfoList.size()];
+ for (int i = 1; i < graphicInfoList.size(); i++) {
+ GraphicInfo graphicInfo = graphicInfoList.get(i);
+ GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
+
+ if (i == 1) {
+ xPoints[0] = (int)previousGraphicInfo.getX();
+ yPoints[0] = (int)previousGraphicInfo.getY();
+ }
+ xPoints[i] = (int)graphicInfo.getX();
+ yPoints[i] = (int)graphicInfo.getY();
+ }
+
+ AssociationDirection associationDirection = association.getAssociationDirection();
+ processDiagramCanvas.drawAssociation(xPoints, yPoints, associationDirection, false, scaleFactor);
+ }
+ });
+ }
+
+ /**
+ * This method makes coordinates of connection flow better.
+ *
+ * @param processDiagramCanvas
+ * @param bpmnModel
+ * @param sourceElement
+ * @param targetElement
+ * @param graphicInfoList
+ * @return
+ */
+ protected static List connectionPerfectionizer(DefaultProcessDiagramCanvas processDiagramCanvas,
+ BpmnModel bpmnModel, BaseElement sourceElement, BaseElement targetElement, List graphicInfoList) {
+ GraphicInfo sourceGraphicInfo = bpmnModel.getGraphicInfo(sourceElement.getId());
+ GraphicInfo targetGraphicInfo = bpmnModel.getGraphicInfo(targetElement.getId());
+
+ DefaultProcessDiagramCanvas.SHAPE_TYPE sourceShapeType = getShapeType(sourceElement);
+ DefaultProcessDiagramCanvas.SHAPE_TYPE targetShapeType = getShapeType(targetElement);
+
+ return processDiagramCanvas.connectionPerfectionizer(sourceShapeType, targetShapeType, sourceGraphicInfo,
+ targetGraphicInfo, graphicInfoList);
+ }
+
+ /**
+ * This method returns shape type of base element.
+ * Each element can be presented as rectangle, rhombus, or ellipse.
+ *
+ * @param baseElement
+ * @return DefaultProcessDiagramCanvas.SHAPE_TYPE
+ */
+ protected static DefaultProcessDiagramCanvas.SHAPE_TYPE getShapeType(BaseElement baseElement) {
+ if (baseElement instanceof Task || baseElement instanceof Activity || baseElement instanceof TextAnnotation) {
+ return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rectangle;
+ } else if (baseElement instanceof Gateway) {
+ return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rhombus;
+ } else if (baseElement instanceof Event) {
+ return DefaultProcessDiagramCanvas.SHAPE_TYPE.Ellipse;
} else {
- processDiagramCanvas.drawNoneStartEvent(graphicInfo);
- }
- }
- });
-
- // signal catch
- activityDrawInstructions.put(IntermediateCatchEvent.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- IntermediateCatchEvent intermediateCatchEvent = (IntermediateCatchEvent) flowNode;
- if (intermediateCatchEvent.getEventDefinitions() != null && !intermediateCatchEvent.getEventDefinitions()
- .isEmpty()) {
- if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
- processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, true, scaleFactor);
- } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) {
- processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, true, scaleFactor);
- } else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
- processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, true, scaleFactor);
- }
+ // unknown source element, just do not correct coordinates
}
- }
- });
-
- // signal throw
- activityDrawInstructions.put(ThrowEvent.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- ThrowEvent throwEvent = (ThrowEvent) flowNode;
- if (throwEvent.getEventDefinitions() != null && !throwEvent.getEventDefinitions().isEmpty()) {
- if (throwEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
- processDiagramCanvas.drawThrowingSignalEvent(graphicInfo, scaleFactor);
- } else if (throwEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) {
- processDiagramCanvas.drawThrowingCompensateEvent(graphicInfo, scaleFactor);
- } else {
- processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor);
- }
- } else {
- processDiagramCanvas.drawThrowingNoneEvent(graphicInfo, scaleFactor);
+ return null;
+ }
+
+ protected static GraphicInfo getLineCenter(List graphicInfoList) {
+ GraphicInfo gi = new GraphicInfo();
+
+ int xPoints[] = new int[graphicInfoList.size()];
+ int yPoints[] = new int[graphicInfoList.size()];
+
+ double length = 0;
+ double[] lengths = new double[graphicInfoList.size()];
+ lengths[0] = 0;
+ double m;
+ for (int i = 1; i < graphicInfoList.size(); i++) {
+ GraphicInfo graphicInfo = graphicInfoList.get(i);
+ GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
+
+ if (i == 1) {
+ xPoints[0] = (int)previousGraphicInfo.getX();
+ yPoints[0] = (int)previousGraphicInfo.getY();
+ }
+ xPoints[i] = (int)graphicInfo.getX();
+ yPoints[i] = (int)graphicInfo.getY();
+
+ length += Math.sqrt(Math.pow((int)graphicInfo.getX() - (int)previousGraphicInfo.getX(), 2)
+ + Math.pow((int)graphicInfo.getY() - (int)previousGraphicInfo.getY(), 2));
+ lengths[i] = length;
}
- }
- });
-
- // end event
- activityDrawInstructions.put(EndEvent.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- EndEvent endEvent = (EndEvent) flowNode;
- if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) {
- if (endEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) {
- processDiagramCanvas.drawErrorEndEvent(flowNode.getName(), graphicInfo, scaleFactor);
- } else {
- processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor);
- }
- } else {
- processDiagramCanvas.drawNoneEndEvent(graphicInfo, scaleFactor);
+ m = length / 2;
+ int p1 = 0, p2 = 1;
+ for (int i = 1; i < lengths.length; i++) {
+ double len = lengths[i];
+ p1 = i - 1;
+ p2 = i;
+ if (len > m) {
+ break;
+ }
}
- }
- });
-
- // task
- activityDrawInstructions.put(Task.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawTask(flowNode.getName(), graphicInfo);
- }
- });
-
- // user task
- activityDrawInstructions.put(UserTask.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawUserTask(flowNode.getName(), graphicInfo, scaleFactor);
- }
- });
-
- // script task
- activityDrawInstructions.put(ScriptTask.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawScriptTask(flowNode.getName(), graphicInfo, scaleFactor);
- }
- });
-
- // service task
- activityDrawInstructions.put(ServiceTask.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- ServiceTask serviceTask = (ServiceTask) flowNode;
- if ("camel".equalsIgnoreCase(serviceTask.getType())) {
- processDiagramCanvas.drawCamelTask(serviceTask.getName(), graphicInfo, scaleFactor);
- } else if ("mule".equalsIgnoreCase(serviceTask.getType())) {
- processDiagramCanvas.drawMuleTask(serviceTask.getName(), graphicInfo, scaleFactor);
- } else {
- processDiagramCanvas.drawServiceTask(serviceTask.getName(), graphicInfo, scaleFactor);
+
+ GraphicInfo graphicInfo1 = graphicInfoList.get(p1);
+ GraphicInfo graphicInfo2 = graphicInfoList.get(p2);
+
+ double AB = (int)graphicInfo2.getX() - (int)graphicInfo1.getX();
+ double OA = (int)graphicInfo2.getY() - (int)graphicInfo1.getY();
+ double OB = lengths[p2] - lengths[p1];
+ double ob = m - lengths[p1];
+ double ab = AB * ob / OB;
+ double oa = OA * ob / OB;
+
+ double mx = graphicInfo1.getX() + ab;
+ double my = graphicInfo1.getY() + oa;
+
+ gi.setX(mx);
+ gi.setY(my);
+ return gi;
+ }
+
+ private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) {
+ processDiagramCanvas.drawHighLight((int)graphicInfo.getX(), (int)graphicInfo.getY(),
+ (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight());
+
+ }
+
+ private static void drawColorHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo,
+ Color color) {
+ processDiagramCanvas.drawHighLight((int)graphicInfo.getX(), (int)graphicInfo.getY(),
+ (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight(), color);
+
+ }
+
+ protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType,
+ String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
+
+ // We need to calculate maximum values to know how big the image will be in its entirety
+ double minX = Double.MAX_VALUE;
+ double maxX = 0;
+ double minY = Double.MAX_VALUE;
+ double maxY = 0;
+
+ for (Pool pool : bpmnModel.getPools()) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
+ minX = graphicInfo.getX();
+ maxX = graphicInfo.getX() + graphicInfo.getWidth();
+ minY = graphicInfo.getY();
+ maxY = graphicInfo.getY() + graphicInfo.getHeight();
}
- }
- });
-
- // receive task
- activityDrawInstructions.put(ReceiveTask.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawReceiveTask(flowNode.getName(), graphicInfo, scaleFactor);
- }
- });
-
- // send task
- activityDrawInstructions.put(SendTask.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawSendTask(flowNode.getName(), graphicInfo, scaleFactor);
- }
- });
-
- // manual task
- activityDrawInstructions.put(ManualTask.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawManualTask(flowNode.getName(), graphicInfo, scaleFactor);
- }
- });
-
- // businessRuleTask task
- activityDrawInstructions.put(BusinessRuleTask.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawBusinessRuleTask(flowNode.getName(), graphicInfo, scaleFactor);
- }
- });
-
- // exclusive gateway
- activityDrawInstructions.put(ExclusiveGateway.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawExclusiveGateway(graphicInfo, scaleFactor);
- }
- });
-
- // inclusive gateway
- activityDrawInstructions.put(InclusiveGateway.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawInclusiveGateway(graphicInfo, scaleFactor);
- }
- });
-
- // parallel gateway
- activityDrawInstructions.put(ParallelGateway.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawParallelGateway(graphicInfo, scaleFactor);
- }
- });
-
- // event based gateway
- activityDrawInstructions.put(EventGateway.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawEventBasedGateway(graphicInfo, scaleFactor);
- }
- });
-
-
- // Boundary timer
- activityDrawInstructions.put(BoundaryEvent.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- BoundaryEvent boundaryEvent = (BoundaryEvent) flowNode;
- if (boundaryEvent.getEventDefinitions() != null && !boundaryEvent.getEventDefinitions().isEmpty()) {
- if (boundaryEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) {
-
- processDiagramCanvas.drawCatchingTimerEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor);
-
- } else if (boundaryEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) {
-
- processDiagramCanvas.drawCatchingErrorEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor);
-
- } else if (boundaryEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
- processDiagramCanvas.drawCatchingSignalEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor);
-
- } else if (boundaryEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
- processDiagramCanvas.drawCatchingMessageEvent(flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor);
-
- } else if (boundaryEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) {
- processDiagramCanvas.drawCatchingCompensateEvent(graphicInfo, boundaryEvent.isCancelActivity(), scaleFactor);
- }
+
+ List flowNodes = gatherAllFlowNodes(bpmnModel);
+ for (FlowNode flowNode : flowNodes) {
+
+ GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+
+ // width
+ if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) {
+ maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth();
+ }
+ if (flowNodeGraphicInfo.getX() < minX) {
+ minX = flowNodeGraphicInfo.getX();
+ }
+ // height
+ if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) {
+ maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight();
+ }
+ if (flowNodeGraphicInfo.getY() < minY) {
+ minY = flowNodeGraphicInfo.getY();
+ }
+
+ for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
+ List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
+ if (graphicInfoList != null) {
+ for (GraphicInfo graphicInfo : graphicInfoList) {
+ // width
+ if (graphicInfo.getX() > maxX) {
+ maxX = graphicInfo.getX();
+ }
+ if (graphicInfo.getX() < minX) {
+ minX = graphicInfo.getX();
+ }
+ // height
+ if (graphicInfo.getY() > maxY) {
+ maxY = graphicInfo.getY();
+ }
+ if (graphicInfo.getY() < minY) {
+ minY = graphicInfo.getY();
+ }
+ }
+ }
+ }
}
-
- }
- });
- // subprocess
- activityDrawInstructions.put(SubProcess.class, new ActivityDrawInstruction() {
+ List artifacts = gatherAllArtifacts(bpmnModel);
+ for (Artifact artifact : artifacts) {
+
+ GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
+
+ if (artifactGraphicInfo != null) {
+ // width
+ if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) {
+ maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth();
+ }
+ if (artifactGraphicInfo.getX() < minX) {
+ minX = artifactGraphicInfo.getX();
+ }
+ // height
+ if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) {
+ maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight();
+ }
+ if (artifactGraphicInfo.getY() < minY) {
+ minY = artifactGraphicInfo.getY();
+ }
+ }
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) {
- processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, false);
- } else {
- processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, false, scaleFactor);
+ List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
+ if (graphicInfoList != null) {
+ for (GraphicInfo graphicInfo : graphicInfoList) {
+ // width
+ if (graphicInfo.getX() > maxX) {
+ maxX = graphicInfo.getX();
+ }
+ if (graphicInfo.getX() < minX) {
+ minX = graphicInfo.getX();
+ }
+ // height
+ if (graphicInfo.getY() > maxY) {
+ maxY = graphicInfo.getY();
+ }
+ if (graphicInfo.getY() < minY) {
+ minY = graphicInfo.getY();
+ }
+ }
+ }
}
- }
- });
-
- // Event subprocess
- activityDrawInstructions.put(EventSubProcess.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) {
- processDiagramCanvas.drawCollapsedSubProcess(flowNode.getName(), graphicInfo, true);
- } else {
- processDiagramCanvas.drawExpandedSubProcess(flowNode.getName(), graphicInfo, true, scaleFactor);
+
+ int nrOfLanes = 0;
+ for (Process process : bpmnModel.getProcesses()) {
+ for (Lane l : process.getLanes()) {
+
+ nrOfLanes++;
+
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(l.getId());
+ // // width
+ if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) {
+ maxX = graphicInfo.getX() + graphicInfo.getWidth();
+ }
+ if (graphicInfo.getX() < minX) {
+ minX = graphicInfo.getX();
+ }
+ // height
+ if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) {
+ maxY = graphicInfo.getY() + graphicInfo.getHeight();
+ }
+ if (graphicInfo.getY() < minY) {
+ minY = graphicInfo.getY();
+ }
+ }
}
- }
- });
-
- // call activity
- activityDrawInstructions.put(CallActivity.class, new ActivityDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- processDiagramCanvas.drawCollapsedCallActivity(flowNode.getName(), graphicInfo);
- }
- });
-
- // text annotation
- artifactDrawInstructions.put(TextAnnotation.class, new ArtifactDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
- TextAnnotation textAnnotation = (TextAnnotation) artifact;
- processDiagramCanvas.drawTextAnnotation(textAnnotation.getText(), graphicInfo);
- }
- });
-
- // association
- artifactDrawInstructions.put(Association.class, new ArtifactDrawInstruction() {
-
- public void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) {
- Association association = (Association) artifact;
- String sourceRef = association.getSourceRef();
- String targetRef = association.getTargetRef();
-
- // source and target can be instance of FlowElement or Artifact
- BaseElement sourceElement = bpmnModel.getFlowElement(sourceRef);
- BaseElement targetElement = bpmnModel.getFlowElement(targetRef);
- if (sourceElement == null) {
- sourceElement = bpmnModel.getArtifact(sourceRef);
+
+ // Special case, see https://activiti.atlassian.net/browse/ACT-1431
+ if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) {
+ // Nothing to show
+ minX = 0;
+ minY = 0;
}
- if (targetElement == null) {
- targetElement = bpmnModel.getArtifact(targetRef);
+
+ return new DefaultProcessDiagramCanvas((int)maxX + 10, (int)maxY + 10, (int)minX, (int)minY, imageType,
+ activityFontName, labelFontName, annotationFontName, customClassLoader);
+ }
+
+ protected static List gatherAllArtifacts(BpmnModel bpmnModel) {
+ List artifacts = new ArrayList();
+ for (Process process : bpmnModel.getProcesses()) {
+ artifacts.addAll(process.getArtifacts());
}
- List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
- graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList);
- int xPoints[]= new int[graphicInfoList.size()];
- int yPoints[]= new int[graphicInfoList.size()];
- for (int i=1; i gatherAllFlowNodes(BpmnModel bpmnModel) {
+ List flowNodes = new ArrayList();
+ for (Process process : bpmnModel.getProcesses()) {
+ flowNodes.addAll(gatherAllFlowNodes(process));
+ }
+ return flowNodes;
+ }
+
+ protected static List gatherAllFlowNodes(FlowElementsContainer flowElementsContainer) {
+ List flowNodes = new ArrayList();
+ for (FlowElement flowElement : flowElementsContainer.getFlowElements()) {
+ if (flowElement instanceof FlowNode) {
+ flowNodes.add((FlowNode)flowElement);
+ }
+ if (flowElement instanceof FlowElementsContainer) {
+ flowNodes.addAll(gatherAllFlowNodes((FlowElementsContainer)flowElement));
}
- xPoints[i] = (int) graphicInfo.getX();
- yPoints[i] = (int) graphicInfo.getY();
}
+ return flowNodes;
+ }
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName,
+ ClassLoader customClassLoader, double scaleFactor) {
- AssociationDirection associationDirection = association.getAssociationDirection();
- processDiagramCanvas.drawAssociation(xPoints, yPoints, associationDirection, false, scaleFactor);
- }
- });
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) {
-
- return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows,
- activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor).generateImage(imageType);
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor,
- List highLightedCurrentActivities) {
-
- return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows,
- activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor,highLightedCurrentActivities).generateImage(imageType);
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows) {
- return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, 1.0);
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType,
- List highLightedActivities, List highLightedFlows, double scaleFactor) {
- return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor);
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities) {
- return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList());
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities, double scaleFactor) {
- return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(), scaleFactor);
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
- return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(),
- activityFontName, labelFontName, annotationFontName, customClassLoader, 1.0);
- }
-
- public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName,
- String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) {
-
- return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(),
- activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor);
- }
-
- public InputStream generatePngDiagram(BpmnModel bpmnModel) {
- return generatePngDiagram(bpmnModel, 1.0);
- }
-
- public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor) {
- return generateDiagram(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor);
- }
-
- public InputStream generateJpgDiagram(BpmnModel bpmnModel) {
- return generateJpgDiagram(bpmnModel, 1.0);
- }
-
- public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor) {
- return generateDiagram(bpmnModel, "jpg", Collections.emptyList(), Collections.emptyList());
- }
-
- public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, List highLightedActivities, List highLightedFlows,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) {
-
- return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows,
- activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor).generateBufferedImage(imageType);
- }
-
- public BufferedImage generateImage(BpmnModel bpmnModel, String imageType,
- List highLightedActivities, List highLightedFlows, double scaleFactor) {
-
- return generateImage(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, scaleFactor);
- }
-
- public BufferedImage generatePngImage(BpmnModel bpmnModel, double scaleFactor) {
- return generateImage(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(), scaleFactor);
- }
-
- protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType,
- List highLightedActivities, List highLightedFlows,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) {
-
- prepareBpmnModel(bpmnModel);
-
- DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader);
-
- // Draw pool shape, if process is participant in collaboration
- for (Pool pool : bpmnModel.getPools()) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
- processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo);
+ return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, activityFontName,
+ labelFontName, annotationFontName, customClassLoader, scaleFactor).generateImage(imageType);
}
-
- // Draw lanes
- for (Process process : bpmnModel.getProcesses()) {
- for (Lane lane : process.getLanes()) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId());
- processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo);
- }
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName,
+ ClassLoader customClassLoader, double scaleFactor, List highLightedCurrentActivities) {
+
+ return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, activityFontName,
+ labelFontName, annotationFontName, customClassLoader, scaleFactor, highLightedCurrentActivities)
+ .generateImage(imageType);
}
-
- // Draw activities and their sequence-flows
- for (Process process: bpmnModel.getProcesses()) {
- for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) {
- drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor);
- }
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows) {
+ return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null,
+ 1.0);
}
-
- // Draw artifacts
- for (Process process : bpmnModel.getProcesses()) {
-
- for (Artifact artifact : process.getArtifacts()) {
- drawArtifact(processDiagramCanvas, bpmnModel, artifact);
- }
-
- List subProcesses = process.findFlowElementsOfType(SubProcess.class, true);
- if (subProcesses != null) {
- for (SubProcess subProcess : subProcesses) {
- for (Artifact subProcessArtifact : subProcess.getArtifacts()) {
- drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact);
- }
- }
- }
+
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, double scaleFactor) {
+ return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null,
+ scaleFactor);
}
-
- return processDiagramCanvas;
- }
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities) {
+ return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList());
+ }
- protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType,
- List highLightedActivities, List highLightedFlows,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor,
- List highCurrentLightedActivities) {
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ double scaleFactor) {
+ return generateDiagram(bpmnModel, imageType, highLightedActivities, Collections.emptyList(),
+ scaleFactor);
+ }
- prepareBpmnModel(bpmnModel);
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName,
+ String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
+ return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(),
+ activityFontName, labelFontName, annotationFontName, customClassLoader, 1.0);
+ }
- DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader);
+ public InputStream generateDiagram(BpmnModel bpmnModel, String imageType, String activityFontName,
+ String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) {
- // Draw pool shape, if process is participant in collaboration
- for (Pool pool : bpmnModel.getPools()) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
- processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo);
+ return generateDiagram(bpmnModel, imageType, Collections.emptyList(), Collections.emptyList(),
+ activityFontName, labelFontName, annotationFontName, customClassLoader, scaleFactor);
}
- // Draw lanes
- for (Process process : bpmnModel.getProcesses()) {
- for (Lane lane : process.getLanes()) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId());
- processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo);
- }
+ public InputStream generatePngDiagram(BpmnModel bpmnModel) {
+ return generatePngDiagram(bpmnModel, 1.0);
}
- // Draw activities and their sequence-flows
- for (Process process: bpmnModel.getProcesses()) {
- for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) {
- drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor,highCurrentLightedActivities);
- }
+ public InputStream generatePngDiagram(BpmnModel bpmnModel, double scaleFactor) {
+ return generateDiagram(bpmnModel, "png", Collections.emptyList(), Collections.emptyList(),
+ scaleFactor);
}
- // Draw artifacts
- for (Process process : bpmnModel.getProcesses()) {
+ public InputStream generateJpgDiagram(BpmnModel bpmnModel) {
+ return generateJpgDiagram(bpmnModel, 1.0);
+ }
- for (Artifact artifact : process.getArtifacts()) {
- drawArtifact(processDiagramCanvas, bpmnModel, artifact);
- }
+ public InputStream generateJpgDiagram(BpmnModel bpmnModel, double scaleFactor) {
+ return generateDiagram(bpmnModel, "jpg", Collections.emptyList(), Collections.emptyList());
+ }
- List subProcesses = process.findFlowElementsOfType(SubProcess.class, true);
- if (subProcesses != null) {
- for (SubProcess subProcess : subProcesses) {
- for (Artifact subProcessArtifact : subProcess.getArtifacts()) {
- drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact);
- }
- }
- }
+ public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, String activityFontName, String labelFontName, String annotationFontName,
+ ClassLoader customClassLoader, double scaleFactor) {
+
+ return generateProcessDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, activityFontName,
+ labelFontName, annotationFontName, customClassLoader, scaleFactor).generateBufferedImage(imageType);
}
- return processDiagramCanvas;
- }
-
- protected void prepareBpmnModel(BpmnModel bpmnModel) {
-
- // Need to make sure all elements have positive x and y.
- // Check all graphicInfo and update the elements accordingly
-
- List allGraphicInfos = new ArrayList();
- if (bpmnModel.getLocationMap() != null) {
- allGraphicInfos.addAll(bpmnModel.getLocationMap().values());
- }
- if (bpmnModel.getLabelLocationMap() != null) {
- allGraphicInfos.addAll(bpmnModel.getLabelLocationMap().values());
- }
- if (bpmnModel.getFlowLocationMap() != null) {
- for (List flowGraphicInfos : bpmnModel.getFlowLocationMap().values()) {
- allGraphicInfos.addAll(flowGraphicInfos);
- }
- }
-
- if (allGraphicInfos.size() > 0) {
-
- boolean needsTranslationX = false;
- boolean needsTranslationY = false;
-
- double lowestX = 0.0;
- double lowestY = 0.0;
-
- // Collect lowest x and y
- for (GraphicInfo graphicInfo : allGraphicInfos) {
-
- double x = graphicInfo.getX();
- double y = graphicInfo.getY();
-
- if (x < lowestX) {
- needsTranslationX = true;
- lowestX = x;
- }
- if (y < lowestY) {
- needsTranslationY = true;
- lowestY = y;
- }
-
- }
-
- // Update all graphicInfo objects
- if (needsTranslationX || needsTranslationY) {
-
- double translationX = Math.abs(lowestX);
- double translationY = Math.abs(lowestY);
-
- for (GraphicInfo graphicInfo : allGraphicInfos) {
- if (needsTranslationX) {
- graphicInfo.setX(graphicInfo.getX() + translationX);
- }
- if(needsTranslationY) {
- graphicInfo.setY(graphicInfo.getY() + translationY);
- }
- }
- }
-
- }
-
- }
-
- protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel,
- FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor) {
-
- ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass());
- if (drawInstruction != null) {
-
- drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
-
- // Gather info on the multi instance marker
- boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false;
- if (flowNode instanceof Activity) {
- Activity activity = (Activity) flowNode;
- MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
- if (multiInstanceLoopCharacteristics != null) {
- multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
- multiInstanceParallel = !multiInstanceSequential;
- }
- }
-
- // Gather info on the collapsed marker
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- if (flowNode instanceof SubProcess) {
- collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded();
- } else if (flowNode instanceof CallActivity) {
- collapsed = true;
- }
-
- if (scaleFactor == 1.0) {
- // Actually draw the markers
- processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(),(int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(),
- multiInstanceSequential, multiInstanceParallel, collapsed);
- }
-
- // Draw highlighted activities
- if (highLightedActivities.contains(flowNode.getId())) {
- drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
- }
+ public BufferedImage generateImage(BpmnModel bpmnModel, String imageType, List highLightedActivities,
+ List highLightedFlows, double scaleFactor) {
+ return generateImage(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null,
+ scaleFactor);
}
- // Outgoing transitions of activity
- for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
- boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId()));
- String defaultFlow = null;
- if (flowNode instanceof Activity) {
- defaultFlow = ((Activity) flowNode).getDefaultFlow();
- } else if (flowNode instanceof Gateway) {
- defaultFlow = ((Gateway) flowNode).getDefaultFlow();
- }
-
- boolean isDefault = false;
- if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) {
- isDefault = true;
- }
- boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway);
-
- String sourceRef = sequenceFlow.getSourceRef();
- String targetRef = sequenceFlow.getTargetRef();
- FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
- FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
- List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
- if (graphicInfoList != null && graphicInfoList.size() > 0) {
- graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList);
- int xPoints[]= new int[graphicInfoList.size()];
- int yPoints[]= new int[graphicInfoList.size()];
-
- for (int i=1; iemptyList(), Collections.emptyList(),
+ scaleFactor);
+ }
+
+ protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType,
+ List highLightedActivities, List highLightedFlows, String activityFontName,
+ String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) {
+
+ prepareBpmnModel(bpmnModel);
+ DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType,
+ activityFontName, labelFontName, annotationFontName, customClassLoader);
+
+ // Draw pool shape, if process is participant in collaboration
+ for (Pool pool : bpmnModel.getPools()) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
+ processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo);
}
- processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor);
+ // Draw lanes
+ for (Process process : bpmnModel.getProcesses()) {
+ for (Lane lane : process.getLanes()) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId());
+ processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo);
+ }
+ }
- // Draw sequenceflow label
- GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId());
- if (labelGraphicInfo != null) {
- processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false);
- }else
- {
- GraphicInfo lineCenter = getLineCenter(graphicInfoList);
- processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false);
+ // Draw activities and their sequence-flows
+ for (Process process : bpmnModel.getProcesses()) {
+ for (FlowNode flowNode : process.findFlowElementsOfType(FlowNode.class)) {
+ drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows,
+ scaleFactor);
+ }
}
- }
- }
- // Nested elements
- if (flowNode instanceof FlowElementsContainer) {
- for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) {
- if (nestedFlowElement instanceof FlowNode) {
- drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement,
- highLightedActivities, highLightedFlows, scaleFactor);
+ // Draw artifacts
+ for (Process process : bpmnModel.getProcesses()) {
+
+ for (Artifact artifact : process.getArtifacts()) {
+ drawArtifact(processDiagramCanvas, bpmnModel, artifact);
+ }
+
+ List subProcesses = process.findFlowElementsOfType(SubProcess.class, true);
+ if (subProcesses != null) {
+ for (SubProcess subProcess : subProcesses) {
+ for (Artifact subProcessArtifact : subProcess.getArtifacts()) {
+ drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact);
+ }
+ }
+ }
}
- }
+
+ return processDiagramCanvas;
}
- }
-
-
- protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel,
- FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor, List highLightedExecutedActivities) {
-
- ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass());
- if (drawInstruction != null) {
-
- drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
-
- // Gather info on the multi instance marker
- boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false;
- if (flowNode instanceof Activity) {
- Activity activity = (Activity) flowNode;
- MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
- if (multiInstanceLoopCharacteristics != null) {
- multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
- multiInstanceParallel = !multiInstanceSequential;
+
+ protected DefaultProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType,
+ List highLightedActivities, List highLightedFlows, String activityFontName,
+ String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor,
+ List highCurrentLightedActivities) {
+
+ prepareBpmnModel(bpmnModel);
+
+ DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType,
+ activityFontName, labelFontName, annotationFontName, customClassLoader);
+
+ // Draw pool shape, if process is participant in collaboration
+ for (Pool pool : bpmnModel.getPools()) {
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
+ processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo);
}
- }
-
- // Gather info on the collapsed marker
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
- if (flowNode instanceof SubProcess) {
- collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded();
- } else if (flowNode instanceof CallActivity) {
- collapsed = true;
- }
-
- if (scaleFactor == 1.0) {
- // Actually draw the markers
- processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(),(int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(),
- multiInstanceSequential, multiInstanceParallel, collapsed);
- }
-
- // Draw highlighted activities
- if (highLightedActivities.contains(flowNode.getId())) {
- drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
- }
-
- if (highLightedExecutedActivities.contains(flowNode.getId())) {
- processDiagramCanvas.HIGHLIGHT_COLOR = Color.RED;
- drawColorHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()),Color.RED);
- processDiagramCanvas.HIGHLIGHT_COLOR = Color.GREEN;
- }
- }
-
- // Outgoing transitions of activity
- for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
- boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId()));
- String defaultFlow = null;
- if (flowNode instanceof Activity) {
- defaultFlow = ((Activity) flowNode).getDefaultFlow();
- } else if (flowNode instanceof Gateway) {
- defaultFlow = ((Gateway) flowNode).getDefaultFlow();
- }
-
- boolean isDefault = false;
- if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) {
- isDefault = true;
- }
- boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway);
-
- String sourceRef = sequenceFlow.getSourceRef();
- String targetRef = sequenceFlow.getTargetRef();
- FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
- FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
- List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
- if (graphicInfoList != null && graphicInfoList.size() > 0) {
- graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList);
- int xPoints[]= new int[graphicInfoList.size()];
- int yPoints[]= new int[graphicInfoList.size()];
-
- for (int i=1; i subProcesses = process.findFlowElementsOfType(SubProcess.class, true);
+ if (subProcesses != null) {
+ for (SubProcess subProcess : subProcesses) {
+ for (Artifact subProcessArtifact : subProcess.getArtifacts()) {
+ drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact);
+ }
+ }
+ }
}
- }
- }
- }
-
- /**
- * This method makes coordinates of connection flow better.
- * @param processDiagramCanvas
- * @param bpmnModel
- * @param sourceElement
- * @param targetElement
- * @param graphicInfoList
- * @return
- */
- protected static List connectionPerfectionizer(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, BaseElement sourceElement, BaseElement targetElement, List graphicInfoList) {
- GraphicInfo sourceGraphicInfo = bpmnModel.getGraphicInfo(sourceElement.getId());
- GraphicInfo targetGraphicInfo = bpmnModel.getGraphicInfo(targetElement.getId());
-
- DefaultProcessDiagramCanvas.SHAPE_TYPE sourceShapeType = getShapeType(sourceElement);
- DefaultProcessDiagramCanvas.SHAPE_TYPE targetShapeType = getShapeType(targetElement);
-
- return processDiagramCanvas.connectionPerfectionizer(sourceShapeType, targetShapeType, sourceGraphicInfo, targetGraphicInfo, graphicInfoList);
- }
-
- /**
- * This method returns shape type of base element.
- * Each element can be presented as rectangle, rhombus, or ellipse.
- * @param baseElement
- * @return DefaultProcessDiagramCanvas.SHAPE_TYPE
- */
- protected static DefaultProcessDiagramCanvas.SHAPE_TYPE getShapeType(BaseElement baseElement) {
- if (baseElement instanceof Task || baseElement instanceof Activity || baseElement instanceof TextAnnotation) {
- return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rectangle;
- } else if (baseElement instanceof Gateway) {
- return DefaultProcessDiagramCanvas.SHAPE_TYPE.Rhombus;
- } else if (baseElement instanceof Event) {
- return DefaultProcessDiagramCanvas.SHAPE_TYPE.Ellipse;
- } else {
- // unknown source element, just do not correct coordinates
+
+ return processDiagramCanvas;
}
- return null;
- }
-
- protected static GraphicInfo getLineCenter(List graphicInfoList) {
- GraphicInfo gi = new GraphicInfo();
-
- int xPoints[]= new int[graphicInfoList.size()];
- int yPoints[]= new int[graphicInfoList.size()];
-
- double length = 0;
- double[] lengths = new double[graphicInfoList.size()];
- lengths[0] = 0;
- double m;
- for (int i=1; i allGraphicInfos = new ArrayList();
+ if (bpmnModel.getLocationMap() != null) {
+ allGraphicInfos.addAll(bpmnModel.getLocationMap().values());
}
- xPoints[i] = (int) graphicInfo.getX();
- yPoints[i] = (int) graphicInfo.getY();
-
- length += Math.sqrt(
- Math.pow((int) graphicInfo.getX() - (int) previousGraphicInfo.getX(), 2) +
- Math.pow((int) graphicInfo.getY() - (int) previousGraphicInfo.getY(), 2)
- );
- lengths[i] = length;
- }
- m = length / 2;
- int p1 = 0, p2 = 1;
- for (int i = 1; i < lengths.length; i++) {
- double len = lengths[i];
- p1 = i-1;
- p2 = i;
- if (len > m) {
- break;
- }
- }
-
- GraphicInfo graphicInfo1 = graphicInfoList.get(p1);
- GraphicInfo graphicInfo2 = graphicInfoList.get(p2);
-
- double AB = (int)graphicInfo2.getX() - (int)graphicInfo1.getX();
- double OA = (int)graphicInfo2.getY() - (int)graphicInfo1.getY();
- double OB = lengths[p2] - lengths[p1];
- double ob = m - lengths[p1];
- double ab = AB * ob / OB;
- double oa = OA * ob / OB;
-
- double mx = graphicInfo1.getX() + ab;
- double my = graphicInfo1.getY() + oa;
-
- gi.setX(mx);
- gi.setY(my);
- return gi;
- }
-
- protected void drawArtifact(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) {
- ArtifactDrawInstruction drawInstruction = artifactDrawInstructions.get(artifact.getClass());
- if (drawInstruction != null) {
- drawInstruction.draw(processDiagramCanvas, bpmnModel, artifact);
- }
- }
+ if (bpmnModel.getLabelLocationMap() != null) {
+ allGraphicInfos.addAll(bpmnModel.getLabelLocationMap().values());
+ }
+ if (bpmnModel.getFlowLocationMap() != null) {
+ for (List flowGraphicInfos : bpmnModel.getFlowLocationMap().values()) {
+ allGraphicInfos.addAll(flowGraphicInfos);
+ }
+ }
+
+ if (allGraphicInfos.size() > 0) {
+
+ boolean needsTranslationX = false;
+ boolean needsTranslationY = false;
+
+ double lowestX = 0.0;
+ double lowestY = 0.0;
+
+ // Collect lowest x and y
+ for (GraphicInfo graphicInfo : allGraphicInfos) {
- private static void drawHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) {
- processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight());
+ double x = graphicInfo.getX();
+ double y = graphicInfo.getY();
- }
+ if (x < lowestX) {
+ needsTranslationX = true;
+ lowestX = x;
+ }
+ if (y < lowestY) {
+ needsTranslationY = true;
+ lowestY = y;
+ }
+ }
+
+ // Update all graphicInfo objects
+ if (needsTranslationX || needsTranslationY) {
- private static void drawColorHighLight(DefaultProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo,Color color) {
- processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(),color);
+ double translationX = Math.abs(lowestX);
+ double translationY = Math.abs(lowestY);
- }
+ for (GraphicInfo graphicInfo : allGraphicInfos) {
+ if (needsTranslationX) {
+ graphicInfo.setX(graphicInfo.getX() + translationX);
+ }
+ if (needsTranslationY) {
+ graphicInfo.setY(graphicInfo.getY() + translationY);
+ }
+ }
+ }
- protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType,
- String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) {
-
- // We need to calculate maximum values to know how big the image will be in its entirety
- double minX = Double.MAX_VALUE;
- double maxX = 0;
- double minY = Double.MAX_VALUE;
- double maxY = 0;
+ }
- for (Pool pool : bpmnModel.getPools()) {
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
- minX = graphicInfo.getX();
- maxX = graphicInfo.getX() + graphicInfo.getWidth();
- minY = graphicInfo.getY();
- maxY = graphicInfo.getY() + graphicInfo.getHeight();
}
-
- List flowNodes = gatherAllFlowNodes(bpmnModel);
- for (FlowNode flowNode : flowNodes) {
-
- GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
-
- // width
- if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) {
- maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth();
- }
- if (flowNodeGraphicInfo.getX() < minX) {
- minX = flowNodeGraphicInfo.getX();
- }
- // height
- if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) {
- maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight();
- }
- if (flowNodeGraphicInfo.getY() < minY) {
- minY = flowNodeGraphicInfo.getY();
- }
-
- for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
- List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
- if (graphicInfoList != null) {
- for (GraphicInfo graphicInfo : graphicInfoList) {
- // width
- if (graphicInfo.getX() > maxX) {
- maxX = graphicInfo.getX();
+
+ protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel,
+ FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor) {
+
+ ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass());
+ if (drawInstruction != null) {
+
+ drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
+
+ // Gather info on the multi instance marker
+ boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false;
+ if (flowNode instanceof Activity) {
+ Activity activity = (Activity)flowNode;
+ MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
+ if (multiInstanceLoopCharacteristics != null) {
+ multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
+ multiInstanceParallel = !multiInstanceSequential;
+ }
}
- if (graphicInfo.getX() < minX) {
- minX = graphicInfo.getX();
+
+ // Gather info on the collapsed marker
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ if (flowNode instanceof SubProcess) {
+ collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded();
+ } else if (flowNode instanceof CallActivity) {
+ collapsed = true;
}
- // height
- if (graphicInfo.getY() > maxY) {
- maxY = graphicInfo.getY();
+
+ if (scaleFactor == 1.0) {
+ // Actually draw the markers
+ processDiagramCanvas.drawActivityMarkers((int)graphicInfo.getX(), (int)graphicInfo.getY(),
+ (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight(), multiInstanceSequential,
+ multiInstanceParallel, collapsed);
}
- if (graphicInfo.getY()< minY) {
- minY = graphicInfo.getY();
+
+ // Draw highlighted activities
+ if (highLightedActivities.contains(flowNode.getId())) {
+ drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
}
- }
- }
- }
- }
-
- List artifacts = gatherAllArtifacts(bpmnModel);
- for (Artifact artifact : artifacts) {
-
- GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
-
- if (artifactGraphicInfo != null) {
- // width
- if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) {
- maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth();
- }
- if (artifactGraphicInfo.getX() < minX) {
- minX = artifactGraphicInfo.getX();
- }
- // height
- if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) {
- maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight();
- }
- if (artifactGraphicInfo.getY() < minY) {
- minY = artifactGraphicInfo.getY();
- }
- }
-
- List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
- if (graphicInfoList != null) {
- for (GraphicInfo graphicInfo : graphicInfoList) {
- // width
- if (graphicInfo.getX() > maxX) {
- maxX = graphicInfo.getX();
- }
- if (graphicInfo.getX() < minX) {
- minX = graphicInfo.getX();
- }
- // height
- if (graphicInfo.getY() > maxY) {
- maxY = graphicInfo.getY();
- }
- if (graphicInfo.getY()< minY) {
- minY = graphicInfo.getY();
- }
- }
- }
- }
-
- int nrOfLanes = 0;
- for (Process process : bpmnModel.getProcesses()) {
- for (Lane l : process.getLanes()) {
-
- nrOfLanes++;
-
- GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(l.getId());
- // // width
- if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) {
- maxX = graphicInfo.getX() + graphicInfo.getWidth();
- }
- if (graphicInfo.getX() < minX) {
- minX = graphicInfo.getX();
+
}
- // height
- if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) {
- maxY = graphicInfo.getY() + graphicInfo.getHeight();
+
+ // Outgoing transitions of activity
+ for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
+ boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId()));
+ String defaultFlow = null;
+ if (flowNode instanceof Activity) {
+ defaultFlow = ((Activity)flowNode).getDefaultFlow();
+ } else if (flowNode instanceof Gateway) {
+ defaultFlow = ((Gateway)flowNode).getDefaultFlow();
+ }
+
+ boolean isDefault = false;
+ if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) {
+ isDefault = true;
+ }
+ boolean drawConditionalIndicator =
+ sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway);
+
+ String sourceRef = sequenceFlow.getSourceRef();
+ String targetRef = sequenceFlow.getTargetRef();
+ FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
+ FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
+ List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
+ if (graphicInfoList != null && graphicInfoList.size() > 0) {
+ graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement,
+ targetElement, graphicInfoList);
+ int xPoints[] = new int[graphicInfoList.size()];
+ int yPoints[] = new int[graphicInfoList.size()];
+
+ for (int i = 1; i < graphicInfoList.size(); i++) {
+ GraphicInfo graphicInfo = graphicInfoList.get(i);
+ GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
+
+ if (i == 1) {
+ xPoints[0] = (int)previousGraphicInfo.getX();
+ yPoints[0] = (int)previousGraphicInfo.getY();
+ }
+ xPoints[i] = (int)graphicInfo.getX();
+ yPoints[i] = (int)graphicInfo.getY();
+
+ }
+
+ processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault,
+ highLighted, scaleFactor);
+
+ // Draw sequenceflow label
+ GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId());
+ if (labelGraphicInfo != null) {
+ processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false);
+ } else {
+ GraphicInfo lineCenter = getLineCenter(graphicInfoList);
+ processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false);
+ }
+ }
}
- if (graphicInfo.getY() < minY) {
- minY = graphicInfo.getY();
+
+ // Nested elements
+ if (flowNode instanceof FlowElementsContainer) {
+ for (FlowElement nestedFlowElement : ((FlowElementsContainer)flowNode).getFlowElements()) {
+ if (nestedFlowElement instanceof FlowNode) {
+ drawActivity(processDiagramCanvas, bpmnModel, (FlowNode)nestedFlowElement, highLightedActivities,
+ highLightedFlows, scaleFactor);
+ }
+ }
}
- }
- }
-
- // Special case, see https://activiti.atlassian.net/browse/ACT-1431
- if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) {
- // Nothing to show
- minX = 0;
- minY = 0;
}
-
- return new DefaultProcessDiagramCanvas((int) maxX + 10,(int) maxY + 10, (int) minX, (int) minY,
- imageType, activityFontName, labelFontName, annotationFontName, customClassLoader);
- }
+ protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel,
+ FlowNode flowNode, List highLightedActivities, List highLightedFlows, double scaleFactor,
+ List highLightedExecutedActivities) {
- protected static List gatherAllArtifacts(BpmnModel bpmnModel) {
- List artifacts = new ArrayList();
- for (Process process : bpmnModel.getProcesses()) {
- artifacts.addAll(process.getArtifacts());
- }
- return artifacts;
- }
-
- protected static List gatherAllFlowNodes(BpmnModel bpmnModel) {
- List flowNodes = new ArrayList();
- for (Process process : bpmnModel.getProcesses()) {
- flowNodes.addAll(gatherAllFlowNodes(process));
- }
- return flowNodes;
- }
-
- protected static List gatherAllFlowNodes(FlowElementsContainer flowElementsContainer) {
- List flowNodes = new ArrayList();
- for (FlowElement flowElement : flowElementsContainer.getFlowElements()) {
- if (flowElement instanceof FlowNode) {
- flowNodes.add((FlowNode) flowElement);
- }
- if (flowElement instanceof FlowElementsContainer) {
- flowNodes.addAll(gatherAllFlowNodes((FlowElementsContainer) flowElement));
- }
+ ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass());
+ if (drawInstruction != null) {
+
+ drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
+
+ // Gather info on the multi instance marker
+ boolean multiInstanceSequential = false, multiInstanceParallel = false, collapsed = false;
+ if (flowNode instanceof Activity) {
+ Activity activity = (Activity)flowNode;
+ MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
+ if (multiInstanceLoopCharacteristics != null) {
+ multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
+ multiInstanceParallel = !multiInstanceSequential;
+ }
+ }
+
+ // Gather info on the collapsed marker
+ GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
+ if (flowNode instanceof SubProcess) {
+ collapsed = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded();
+ } else if (flowNode instanceof CallActivity) {
+ collapsed = true;
+ }
+
+ if (scaleFactor == 1.0) {
+ // Actually draw the markers
+ processDiagramCanvas.drawActivityMarkers((int)graphicInfo.getX(), (int)graphicInfo.getY(),
+ (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight(), multiInstanceSequential,
+ multiInstanceParallel, collapsed);
+ }
+
+ // Draw highlighted activities
+ if (highLightedActivities.contains(flowNode.getId())) {
+ drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
+ }
+
+ if (highLightedExecutedActivities.contains(flowNode.getId())) {
+ processDiagramCanvas.HIGHLIGHT_COLOR = Color.RED;
+ drawColorHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()), Color.RED);
+ processDiagramCanvas.HIGHLIGHT_COLOR = Color.GREEN;
+ }
+
+ }
+
+ // Outgoing transitions of activity
+ for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
+ boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId()));
+ String defaultFlow = null;
+ if (flowNode instanceof Activity) {
+ defaultFlow = ((Activity)flowNode).getDefaultFlow();
+ } else if (flowNode instanceof Gateway) {
+ defaultFlow = ((Gateway)flowNode).getDefaultFlow();
+ }
+
+ boolean isDefault = false;
+ if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) {
+ isDefault = true;
+ }
+ boolean drawConditionalIndicator =
+ sequenceFlow.getConditionExpression() != null && !(flowNode instanceof Gateway);
+
+ String sourceRef = sequenceFlow.getSourceRef();
+ String targetRef = sequenceFlow.getTargetRef();
+ FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
+ FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
+ List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
+ if (graphicInfoList != null && graphicInfoList.size() > 0) {
+ graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement,
+ targetElement, graphicInfoList);
+ int xPoints[] = new int[graphicInfoList.size()];
+ int yPoints[] = new int[graphicInfoList.size()];
+
+ for (int i = 1; i < graphicInfoList.size(); i++) {
+ GraphicInfo graphicInfo = graphicInfoList.get(i);
+ GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
+
+ if (i == 1) {
+ xPoints[0] = (int)previousGraphicInfo.getX();
+ yPoints[0] = (int)previousGraphicInfo.getY();
+ }
+ xPoints[i] = (int)graphicInfo.getX();
+ yPoints[i] = (int)graphicInfo.getY();
+
+ }
+
+ processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault,
+ highLighted, scaleFactor);
+
+ // Draw sequenceflow label
+ GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId());
+ if (labelGraphicInfo != null) {
+ processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false);
+ } else {
+ GraphicInfo lineCenter = getLineCenter(graphicInfoList);
+ processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false);
+ }
+ }
+ }
+
+ // Nested elements
+ if (flowNode instanceof FlowElementsContainer) {
+ for (FlowElement nestedFlowElement : ((FlowElementsContainer)flowNode).getFlowElements()) {
+ if (nestedFlowElement instanceof FlowNode) {
+ drawActivity(processDiagramCanvas, bpmnModel, (FlowNode)nestedFlowElement, highLightedActivities,
+ highLightedFlows, scaleFactor, highLightedExecutedActivities);
+ }
+ }
+ }
}
- return flowNodes;
- }
-
- public Map, ActivityDrawInstruction> getActivityDrawInstructions() {
- return activityDrawInstructions;
- }
- public void setActivityDrawInstructions(
- Map, ActivityDrawInstruction> activityDrawInstructions) {
- this.activityDrawInstructions = activityDrawInstructions;
- }
+ protected void drawArtifact(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel,
+ Artifact artifact) {
+ ArtifactDrawInstruction drawInstruction = artifactDrawInstructions.get(artifact.getClass());
+ if (drawInstruction != null) {
+ drawInstruction.draw(processDiagramCanvas, bpmnModel, artifact);
+ }
+ }
- public Map, ArtifactDrawInstruction> getArtifactDrawInstructions() {
- return artifactDrawInstructions;
- }
+ public Map, ActivityDrawInstruction> getActivityDrawInstructions() {
+ return activityDrawInstructions;
+ }
- public void setArtifactDrawInstructions(
- Map, ArtifactDrawInstruction> artifactDrawInstructions) {
- this.artifactDrawInstructions = artifactDrawInstructions;
- }
+ public void setActivityDrawInstructions(
+ Map, ActivityDrawInstruction> activityDrawInstructions) {
+ this.activityDrawInstructions = activityDrawInstructions;
+ }
+ public Map, ArtifactDrawInstruction> getArtifactDrawInstructions() {
+ return artifactDrawInstructions;
+ }
+ public void setArtifactDrawInstructions(
+ Map, ArtifactDrawInstruction> artifactDrawInstructions) {
+ this.artifactDrawInstructions = artifactDrawInstructions;
+ }
- protected interface ActivityDrawInstruction {
- void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode);
- }
+ protected interface ActivityDrawInstruction {
+ void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode);
+ }
- protected interface ArtifactDrawInstruction {
- void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact);
- }
+ protected interface ArtifactDrawInstruction {
+ void draw(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact);
+ }
}
diff --git a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java
index 2c9cab0..0afa0a5 100644
--- a/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java
+++ b/len-activiti/src/main/java/org/activiti/rest/ActivitiService.java
@@ -1,5 +1,12 @@
package org.activiti.rest;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
@@ -21,13 +28,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.io.InputStream;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
/**
* @author zhuxiaomeng
* @date 2019-03-10.
@@ -36,29 +36,22 @@ import java.util.stream.Collectors;
@Service
public class ActivitiService {
+ static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-hh mm:ss");
@Autowired
RuntimeService runtimeService;
-
@Autowired
TaskService taskService;
-
@Autowired
IdentityService identityService;
-
@Autowired
RepositoryService repositoryService;
-
@Autowired
ProcessEngineFactoryBean processEngine;
-
@Autowired
ProcessEngineConfiguration processEngineConfiguration;
-
@Autowired
HistoryService historyService;
- static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-hh mm:ss");
-
/**
* 获取需要高亮的线
*
@@ -66,44 +59,36 @@ public class ActivitiService {
* @param historicActivityInstances
* @return
*/
- private List getHighLightedFlows(
- ProcessDefinitionEntity processDefinitionEntity,
- List historicActivityInstances) {
+ private List getHighLightedFlows(ProcessDefinitionEntity processDefinitionEntity,
+ List historicActivityInstances) {
List highFlows = new ArrayList();
for (int i = 0; i < historicActivityInstances.size() - 1; i++) {
- ActivityImpl activityImpl = processDefinitionEntity
- .findActivity(historicActivityInstances.get(i)
- .getActivityId());
+ ActivityImpl activityImpl =
+ processDefinitionEntity.findActivity(historicActivityInstances.get(i).getActivityId());
List sameStartTimeNodes = new ArrayList();
- ActivityImpl sameActivityImpl1 = processDefinitionEntity
- .findActivity(historicActivityInstances.get(i + 1)
- .getActivityId());
+ ActivityImpl sameActivityImpl1 =
+ processDefinitionEntity.findActivity(historicActivityInstances.get(i + 1).getActivityId());
sameStartTimeNodes.add(sameActivityImpl1);
for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {
- HistoricActivityInstance activityImpl1 = historicActivityInstances
- .get(j);
- HistoricActivityInstance activityImpl2 = historicActivityInstances
- .get(j + 1);
+ HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);
+ HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + 1);
- if (activityImpl1.getStartTime().equals(
- activityImpl2.getStartTime())) {
+ if (activityImpl1.getStartTime().equals(activityImpl2.getStartTime())) {
- ActivityImpl sameActivityImpl2 = processDefinitionEntity
- .findActivity(activityImpl2.getActivityId());
+ ActivityImpl sameActivityImpl2 =
+ processDefinitionEntity.findActivity(activityImpl2.getActivityId());
sameStartTimeNodes.add(sameActivityImpl2);
} else {
break;
}
}
- List pvmTransitions = activityImpl
- .getOutgoingTransitions();
+ List pvmTransitions = activityImpl.getOutgoingTransitions();
for (PvmTransition pvmTransition : pvmTransitions) {
- ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition
- .getDestination();
+ ActivityImpl pvmActivityImpl = (ActivityImpl)pvmTransition.getDestination();
if (sameStartTimeNodes.contains(pvmActivityImpl)) {
Map