From 7a066b3026b23ea28ea3d34e6e9c386874e4a5a9 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Mon, 16 Jun 2025 10:09:19 +0800
Subject: [PATCH] 1.0.0
---
.gitignore | 5 +
App.vue | 68 +
common/ajax.js | 118 ++
common/cache.js | 29 +
common/free.css | 458 +++++++
common/html-parser.js | 352 ++++++
common/image.js | 76 ++
common/qqmap-wx-jssdk.js | 1122 +++++++++++++++++
common/toast.js | 56 +
common/util.js | 89 ++
components/i-account-list/i-account-list.vue | 38 +
components/i-account/i-account.vue | 56 +
components/i-address-list/i-address-list.vue | 64 +
components/i-cart-list/i-cart-list.vue | 49 +
components/i-list-top/i-list-top.vue | 49 +
components/i-loading/i-loading.vue | 39 +
components/i-message-list/i-message-list.vue | 67 +
components/i-my-list/i-my-list.vue | 40 +
components/i-nav-list/i-nav-list.vue | 44 +
components/i-news-list/i-news-list.vue | 55 +
components/i-nodata/i-nodata.vue | 54 +
components/i-notice-list/i-notice-list.vue | 48 +
components/i-order-list/i-order-list.vue | 113 ++
components/i-search/i-search.vue | 39 +
components/i-spread/i-spread.vue | 45 +
components/i-swiper/i-swiper.vue | 70 +
components/i-thumb-list/i-thumb-list.vue | 58 +
.../i-tutorial-list/i-tutorial-list.vue | 46 +
.../i-user-share-list/i-user-share-list.vue | 55 +
components/i-video-list/i-video-list.vue | 57 +
components/pick-regions/pick-regions.vue | 137 ++
components/pick-regions/regions.json | 1 +
.../u-parse/components/wxParseAudio.vue | 27 +
components/u-parse/components/wxParseImg.vue | 86 ++
.../u-parse/components/wxParseTable.vue | 55 +
.../u-parse/components/wxParseTemplate0.vue | 107 ++
.../u-parse/components/wxParseTemplate1.vue | 99 ++
.../u-parse/components/wxParseTemplate10.vue | 97 ++
.../u-parse/components/wxParseTemplate11.vue | 87 ++
.../u-parse/components/wxParseTemplate2.vue | 98 ++
.../u-parse/components/wxParseTemplate3.vue | 98 ++
.../u-parse/components/wxParseTemplate4.vue | 98 ++
.../u-parse/components/wxParseTemplate5.vue | 98 ++
.../u-parse/components/wxParseTemplate6.vue | 98 ++
.../u-parse/components/wxParseTemplate7.vue | 98 ++
.../u-parse/components/wxParseTemplate8.vue | 98 ++
.../u-parse/components/wxParseTemplate9.vue | 98 ++
.../u-parse/components/wxParseVideo.vue | 15 +
components/u-parse/libs/html2json.js | 261 ++++
components/u-parse/libs/htmlparser.js | 156 +++
components/u-parse/libs/wxDiscode.js | 195 +++
components/u-parse/parse.css | 258 ++++
components/u-parse/parse.vue | 228 ++++
components/u-parse/readme.md | 102 ++
components/u-parse/u-parse.css | 232 ++++
components/u-parse/u-parse.vue | 118 ++
index.html | 20 +
main.js | 22 +
manifest.json | 92 ++
pages.json | 227 ++++
pages/const/about.vue | 22 +
pages/const/help.vue | 22 +
pages/const/license.vue | 22 +
pages/const/more.vue | 89 ++
pages/const/privacy.vue | 22 +
pages/index/index.vue | 299 +++++
pages/message/message.vue | 90 ++
pages/news/detail.vue | 78 ++
pages/points-mall/buy.vue | 161 +++
pages/points-mall/detail.vue | 111 ++
pages/points-mall/index.vue | 82 ++
pages/thumb/detail.vue | 75 ++
pages/thumb/list.vue | 102 ++
pages/thumb/thumb.vue | 129 ++
pages/tutorial/detail.vue | 64 +
pages/tutorial/tutorial.vue | 91 ++
pages/user-share/detail.vue | 83 ++
pages/user-share/user-share.vue | 205 +++
pages/user/address.vue | 63 +
pages/user/address_edit.vue | 141 +++
pages/user/bind/bind.vue | 150 +++
pages/user/index.vue | 203 +++
pages/user/info.vue | 157 +++
pages/user/login.vue | 101 ++
pages/user/order.vue | 167 +++
pages/user/point.vue | 143 +++
pages/user/user_share.vue | 91 ++
static/images/addImage.png | Bin 0 -> 4119 bytes
static/images/delete.png | Bin 0 -> 842 bytes
static/images/icon-bszn-n.png | Bin 0 -> 950 bytes
static/images/icon-bszn.png | Bin 0 -> 1287 bytes
static/images/icon-city.png | Bin 0 -> 3356 bytes
static/images/icon-dzcs-n.png | Bin 0 -> 736 bytes
static/images/icon-dzcs.png | Bin 0 -> 1071 bytes
static/images/icon-guide.png | Bin 0 -> 3270 bytes
static/images/icon-home-n.png | Bin 0 -> 945 bytes
static/images/icon-home.png | Bin 0 -> 1313 bytes
static/images/icon-like.png | Bin 0 -> 439 bytes
static/images/icon-mall-n.png | Bin 0 -> 1338 bytes
static/images/icon-mall.png | Bin 0 -> 1634 bytes
static/images/icon-my-n.png | Bin 0 -> 1324 bytes
static/images/icon-my.png | Bin 0 -> 1672 bytes
static/images/icon-nolike.png | Bin 0 -> 535 bytes
static/images/icon-photograph.png | Bin 0 -> 4249 bytes
static/images/icon-store.png | Bin 0 -> 3522 bytes
static/images/icon-time.png | Bin 0 -> 520 bytes
static/images/icon-warn.png | Bin 0 -> 460 bytes
static/images/user-no-avatar.png | Bin 0 -> 4577 bytes
static/logo.png | Bin 0 -> 4023 bytes
uni.promisify.adaptor.js | 13 +
uni.scss | 76 ++
uni_modules/uni-ajax/README.md | 83 ++
uni_modules/uni-ajax/changelog.md | 35 +
uni_modules/uni-ajax/js_sdk/index.d.ts | 103 ++
uni_modules/uni-ajax/js_sdk/index.js | 14 +
.../uni-ajax/js_sdk/lib/adapters/Fetcher.js | 22 +
.../uni-ajax/js_sdk/lib/adapters/http.js | 16 +
uni_modules/uni-ajax/js_sdk/lib/core/Ajax.js | 72 ++
.../js_sdk/lib/core/InterceptorManager.js | 32 +
.../js_sdk/lib/core/dispatchRequest.js | 29 +
.../uni-ajax/js_sdk/lib/core/handleCancel.js | 35 +
uni_modules/uni-ajax/js_sdk/lib/defaults.js | 16 +
.../uni-ajax/js_sdk/lib/helpers/buildURL.js | 83 ++
.../uni-ajax/js_sdk/lib/helpers/isCallback.js | 8 +
.../js_sdk/lib/helpers/mergeConfig.js | 41 +
uni_modules/uni-ajax/js_sdk/lib/utils.js | 77 ++
uni_modules/uni-ajax/package.json | 74 ++
uni_modules/uni-badge/changelog.md | 33 +
.../components/uni-badge/uni-badge.vue | 268 ++++
uni_modules/uni-badge/package.json | 85 ++
uni_modules/uni-badge/readme.md | 10 +
uni_modules/uni-calendar/changelog.md | 28 +
.../components/uni-calendar/calendar.js | 546 ++++++++
.../components/uni-calendar/i18n/en.json | 12 +
.../components/uni-calendar/i18n/index.js | 8 +
.../components/uni-calendar/i18n/zh-Hans.json | 12 +
.../components/uni-calendar/i18n/zh-Hant.json | 12 +
.../uni-calendar/uni-calendar-item.vue | 187 +++
.../components/uni-calendar/uni-calendar.vue | 567 +++++++++
.../components/uni-calendar/util.js | 360 ++++++
uni_modules/uni-calendar/package.json | 85 ++
uni_modules/uni-calendar/readme.md | 103 ++
uni_modules/uni-card/changelog.md | 26 +
.../uni-card/components/uni-card/uni-card.vue | 270 ++++
uni_modules/uni-card/package.json | 90 ++
uni_modules/uni-card/readme.md | 12 +
uni_modules/uni-collapse/changelog.md | 38 +
.../uni-collapse-item/uni-collapse-item.vue | 402 ++++++
.../components/uni-collapse/uni-collapse.vue | 147 +++
uni_modules/uni-collapse/package.json | 86 ++
uni_modules/uni-collapse/readme.md | 12 +
uni_modules/uni-combox/changelog.md | 15 +
.../components/uni-combox/uni-combox.vue | 275 ++++
uni_modules/uni-combox/package.json | 90 ++
uni_modules/uni-combox/readme.md | 11 +
uni_modules/uni-countdown/changelog.md | 26 +
.../components/uni-countdown/i18n/en.json | 6 +
.../components/uni-countdown/i18n/index.js | 8 +
.../uni-countdown/i18n/zh-Hans.json | 6 +
.../uni-countdown/i18n/zh-Hant.json | 6 +
.../uni-countdown/uni-countdown.vue | 281 +++++
uni_modules/uni-countdown/package.json | 83 ++
uni_modules/uni-countdown/readme.md | 10 +
uni_modules/uni-data-checkbox/changelog.md | 49 +
.../uni-data-checkbox/uni-data-checkbox.vue | 849 +++++++++++++
uni_modules/uni-data-checkbox/package.json | 84 ++
uni_modules/uni-data-checkbox/readme.md | 18 +
uni_modules/uni-data-picker/changelog.md | 77 ++
.../components/uni-data-picker/keypress.js | 45 +
.../uni-data-picker/uni-data-picker.uvue | 380 ++++++
.../uni-data-picker/uni-data-picker.vue | 551 ++++++++
.../uni-data-pickerview/loading.uts | 1 +
.../uni-data-pickerview/uni-data-picker.js | 622 +++++++++
.../uni-data-pickerview/uni-data-picker.uts | 693 ++++++++++
.../uni-data-pickerview.css | 76 ++
.../uni-data-pickerview.uvue | 69 +
.../uni-data-pickerview.vue | 323 +++++
uni_modules/uni-data-picker/package.json | 91 ++
uni_modules/uni-data-picker/readme.md | 22 +
uni_modules/uni-data-select/changelog.md | 39 +
.../uni-data-select/uni-data-select.vue | 562 +++++++++
uni_modules/uni-data-select/package.json | 86 ++
uni_modules/uni-data-select/readme.md | 8 +
uni_modules/uni-dateformat/changelog.md | 10 +
.../components/uni-dateformat/date-format.js | 200 +++
.../uni-dateformat/uni-dateformat.vue | 88 ++
uni_modules/uni-dateformat/package.json | 88 ++
uni_modules/uni-dateformat/readme.md | 11 +
uni_modules/uni-datetime-picker/changelog.md | 160 +++
.../uni-datetime-picker/calendar-item.vue | 177 +++
.../uni-datetime-picker/calendar.vue | 947 ++++++++++++++
.../uni-datetime-picker/i18n/en.json | 22 +
.../uni-datetime-picker/i18n/index.js | 8 +
.../uni-datetime-picker/i18n/zh-Hans.json | 22 +
.../uni-datetime-picker/i18n/zh-Hant.json | 22 +
.../uni-datetime-picker/time-picker.vue | 940 ++++++++++++++
.../uni-datetime-picker.vue | 1057 ++++++++++++++++
.../components/uni-datetime-picker/util.js | 421 +++++++
uni_modules/uni-datetime-picker/package.json | 88 ++
uni_modules/uni-datetime-picker/readme.md | 21 +
uni_modules/uni-drawer/changelog.md | 13 +
.../components/uni-drawer/keypress.js | 45 +
.../components/uni-drawer/uni-drawer.vue | 183 +++
uni_modules/uni-drawer/package.json | 87 ++
uni_modules/uni-drawer/readme.md | 10 +
uni_modules/uni-easyinput/changelog.md | 113 ++
.../components/uni-easyinput/common.js | 54 +
.../uni-easyinput/uni-easyinput.vue | 693 ++++++++++
uni_modules/uni-easyinput/package.json | 88 ++
uni_modules/uni-easyinput/readme.md | 11 +
uni_modules/uni-fab/changelog.md | 23 +
.../uni-fab/components/uni-fab/uni-fab.vue | 491 ++++++++
uni_modules/uni-fab/package.json | 84 ++
uni_modules/uni-fab/readme.md | 9 +
uni_modules/uni-fav/changelog.md | 19 +
.../uni-fav/components/uni-fav/i18n/en.json | 4 +
.../uni-fav/components/uni-fav/i18n/index.js | 8 +
.../components/uni-fav/i18n/zh-Hans.json | 4 +
.../components/uni-fav/i18n/zh-Hant.json | 4 +
.../uni-fav/components/uni-fav/uni-fav.vue | 161 +++
uni_modules/uni-fav/package.json | 89 ++
uni_modules/uni-fav/readme.md | 10 +
uni_modules/uni-file-picker/changelog.md | 75 ++
.../uni-file-picker/choose-and-upload-file.js | 287 +++++
.../uni-file-picker/uni-file-picker.vue | 678 ++++++++++
.../uni-file-picker/upload-file.vue | 325 +++++
.../uni-file-picker/upload-image.vue | 292 +++++
.../components/uni-file-picker/utils.js | 110 ++
uni_modules/uni-file-picker/package.json | 83 ++
uni_modules/uni-file-picker/readme.md | 11 +
uni_modules/uni-forms/changelog.md | 94 ++
.../uni-forms-item/uni-forms-item.vue | 627 +++++++++
.../components/uni-forms/uni-forms.vue | 397 ++++++
.../uni-forms/components/uni-forms/utils.js | 293 +++++
.../components/uni-forms/validate.js | 486 +++++++
uni_modules/uni-forms/package.json | 88 ++
uni_modules/uni-forms/readme.md | 23 +
uni_modules/uni-goods-nav/changelog.md | 18 +
.../components/uni-goods-nav/i18n/en.json | 6 +
.../components/uni-goods-nav/i18n/index.js | 8 +
.../uni-goods-nav/i18n/zh-Hans.json | 6 +
.../uni-goods-nav/i18n/zh-Hant.json | 6 +
.../uni-goods-nav/uni-goods-nav.vue | 229 ++++
uni_modules/uni-goods-nav/package.json | 88 ++
uni_modules/uni-goods-nav/readme.md | 10 +
uni_modules/uni-grid/changelog.md | 13 +
.../uni-grid-item/uni-grid-item.vue | 127 ++
.../uni-grid/components/uni-grid/uni-grid.vue | 142 +++
uni_modules/uni-grid/package.json | 86 ++
uni_modules/uni-grid/readme.md | 11 +
uni_modules/uni-group/changelog.md | 16 +
.../components/uni-group/uni-group.vue | 134 ++
uni_modules/uni-group/package.json | 87 ++
uni_modules/uni-group/readme.md | 9 +
uni_modules/uni-icons/changelog.md | 40 +
.../uni-icons/components/uni-icons/icons.js | 132 ++
.../components/uni-icons/uni-icons.uvue | 91 ++
.../components/uni-icons/uni-icons.vue | 110 ++
.../uni-icons/components/uni-icons/uni.ttf | Bin 0 -> 26164 bytes
.../components/uni-icons/uniicons.css | 664 ++++++++++
.../components/uni-icons/uniicons.ttf | Bin 0 -> 35824 bytes
.../components/uni-icons/uniicons_file.ts | 664 ++++++++++
.../components/uni-icons/uniicons_file_vue.js | 649 ++++++++++
uni_modules/uni-icons/package.json | 88 ++
uni_modules/uni-icons/readme.md | 8 +
uni_modules/uni-indexed-list/changelog.md | 17 +
.../uni-indexed-list-item.vue | 144 +++
.../uni-indexed-list/uni-indexed-list.vue | 367 ++++++
uni_modules/uni-indexed-list/package.json | 89 ++
uni_modules/uni-indexed-list/readme.md | 11 +
uni_modules/uni-link/changelog.md | 17 +
.../uni-link/components/uni-link/uni-link.vue | 128 ++
uni_modules/uni-link/package.json | 87 ++
uni_modules/uni-link/readme.md | 11 +
uni_modules/uni-list/changelog.md | 46 +
.../components/uni-list-ad/uni-list-ad.vue | 107 ++
.../uni-list-chat/uni-list-chat.scss | 58 +
.../uni-list-chat/uni-list-chat.vue | 593 +++++++++
.../uni-list-item/uni-list-item.vue | 534 ++++++++
.../uni-list/components/uni-list/uni-list.vue | 123 ++
.../components/uni-list/uni-refresh.vue | 65 +
.../components/uni-list/uni-refresh.wxs | 87 ++
uni_modules/uni-list/package.json | 88 ++
uni_modules/uni-list/readme.md | 346 +++++
uni_modules/uni-load-more/changelog.md | 19 +
.../components/uni-load-more/i18n/en.json | 5 +
.../components/uni-load-more/i18n/index.js | 8 +
.../uni-load-more/i18n/zh-Hans.json | 5 +
.../uni-load-more/i18n/zh-Hant.json | 5 +
.../uni-load-more/uni-load-more.vue | 399 ++++++
uni_modules/uni-load-more/package.json | 86 ++
uni_modules/uni-load-more/readme.md | 14 +
uni_modules/uni-nav-bar/changelog.md | 51 +
.../components/uni-nav-bar/uni-nav-bar.vue | 357 ++++++
.../components/uni-nav-bar/uni-status-bar.vue | 24 +
uni_modules/uni-nav-bar/package.json | 86 ++
uni_modules/uni-nav-bar/readme.md | 15 +
uni_modules/uni-notice-bar/changelog.md | 20 +
.../uni-notice-bar/uni-notice-bar.vue | 431 +++++++
uni_modules/uni-notice-bar/package.json | 87 ++
uni_modules/uni-notice-bar/readme.md | 13 +
uni_modules/uni-number-box/changelog.md | 39 +
.../uni-number-box/uni-number-box.vue | 232 ++++
uni_modules/uni-number-box/package.json | 83 ++
uni_modules/uni-number-box/readme.md | 13 +
uni_modules/uni-pagination/changelog.md | 27 +
.../components/uni-pagination/i18n/en.json | 5 +
.../components/uni-pagination/i18n/es.json | 5 +
.../components/uni-pagination/i18n/fr.json | 5 +
.../components/uni-pagination/i18n/index.js | 12 +
.../uni-pagination/i18n/zh-Hans.json | 5 +
.../uni-pagination/i18n/zh-Hant.json | 5 +
.../uni-pagination/uni-pagination.vue | 465 +++++++
uni_modules/uni-pagination/package.json | 83 ++
uni_modules/uni-pagination/readme.md | 11 +
uni_modules/uni-popup/changelog.md | 84 ++
.../components/uni-popup-dialog/keypress.js | 45 +
.../uni-popup-dialog/uni-popup-dialog.vue | 316 +++++
.../uni-popup-message/uni-popup-message.vue | 143 +++
.../uni-popup-share/uni-popup-share.vue | 187 +++
.../components/uni-popup/i18n/en.json | 7 +
.../components/uni-popup/i18n/index.js | 8 +
.../components/uni-popup/i18n/zh-Hans.json | 7 +
.../components/uni-popup/i18n/zh-Hant.json | 7 +
.../components/uni-popup/keypress.js | 45 +
.../uni-popup/components/uni-popup/popup.js | 26 +
.../components/uni-popup/uni-popup.uvue | 90 ++
.../components/uni-popup/uni-popup.vue | 503 ++++++++
uni_modules/uni-popup/package.json | 88 ++
uni_modules/uni-popup/readme.md | 17 +
uni_modules/uni-rate/changelog.md | 25 +
.../uni-rate/components/uni-rate/uni-rate.vue | 361 ++++++
uni_modules/uni-rate/package.json | 88 ++
uni_modules/uni-rate/readme.md | 12 +
uni_modules/uni-row/changelog.md | 10 +
.../uni-row/components/uni-col/uni-col.vue | 317 +++++
.../uni-row/components/uni-row/uni-row.vue | 190 +++
uni_modules/uni-row/package.json | 87 ++
uni_modules/uni-row/readme.md | 10 +
uni_modules/uni-scss/changelog.md | 8 +
uni_modules/uni-scss/index.scss | 1 +
uni_modules/uni-scss/package.json | 82 ++
uni_modules/uni-scss/readme.md | 4 +
uni_modules/uni-scss/styles/index.scss | 7 +
.../uni-scss/styles/setting/_border.scss | 3 +
.../uni-scss/styles/setting/_color.scss | 66 +
.../uni-scss/styles/setting/_radius.scss | 55 +
.../uni-scss/styles/setting/_space.scss | 56 +
.../uni-scss/styles/setting/_styles.scss | 167 +++
.../uni-scss/styles/setting/_text.scss | 24 +
.../uni-scss/styles/setting/_variables.scss | 146 +++
.../uni-scss/styles/tools/functions.scss | 19 +
uni_modules/uni-scss/theme.scss | 31 +
uni_modules/uni-scss/variables.scss | 62 +
uni_modules/uni-search-bar/changelog.md | 47 +
.../components/uni-search-bar/i18n/en.json | 4 +
.../components/uni-search-bar/i18n/index.js | 8 +
.../uni-search-bar/i18n/zh-Hans.json | 4 +
.../uni-search-bar/i18n/zh-Hant.json | 4 +
.../uni-search-bar/uni-search-bar.vue | 309 +++++
uni_modules/uni-search-bar/package.json | 87 ++
uni_modules/uni-search-bar/readme.md | 14 +
uni_modules/uni-section/changelog.md | 2 +
.../components/uni-section/uni-section.vue | 167 +++
uni_modules/uni-section/package.json | 87 ++
uni_modules/uni-section/readme.md | 8 +
.../uni-segmented-control/changelog.md | 15 +
.../uni-segmented-control.vue | 146 +++
.../uni-segmented-control/package.json | 85 ++
uni_modules/uni-segmented-control/readme.md | 13 +
uni_modules/uni-steps/changelog.md | 18 +
.../components/uni-steps/uni-steps.vue | 280 ++++
uni_modules/uni-steps/package.json | 87 ++
uni_modules/uni-steps/readme.md | 13 +
uni_modules/uni-swipe-action/changelog.md | 47 +
.../uni-swipe-action-item/bindingx.js | 302 +++++
.../components/uni-swipe-action-item/isPC.js | 12 +
.../uni-swipe-action-item/mpalipay.js | 195 +++
.../uni-swipe-action-item/mpother.js | 260 ++++
.../components/uni-swipe-action-item/mpwxs.js | 84 ++
.../uni-swipe-action-item/render.js | 270 ++++
.../uni-swipe-action-item.vue | 348 +++++
.../components/uni-swipe-action-item/wx.wxs | 341 +++++
.../uni-swipe-action/uni-swipe-action.vue | 60 +
uni_modules/uni-swipe-action/package.json | 84 ++
uni_modules/uni-swipe-action/readme.md | 11 +
uni_modules/uni-swiper-dot/changelog.md | 12 +
.../uni-swiper-dot/uni-swiper-dot.vue | 218 ++++
uni_modules/uni-swiper-dot/package.json | 87 ++
uni_modules/uni-swiper-dot/readme.md | 11 +
uni_modules/uni-table/changelog.md | 29 +
.../components/uni-table/uni-table.vue | 455 +++++++
.../components/uni-tbody/uni-tbody.vue | 29 +
.../uni-table/components/uni-td/uni-td.vue | 90 ++
.../components/uni-th/filter-dropdown.vue | 511 ++++++++
.../uni-table/components/uni-th/uni-th.vue | 285 +++++
.../components/uni-thead/uni-thead.vue | 129 ++
.../components/uni-tr/table-checkbox.vue | 179 +++
.../uni-table/components/uni-tr/uni-tr.vue | 175 +++
uni_modules/uni-table/i18n/en.json | 9 +
uni_modules/uni-table/i18n/es.json | 9 +
uni_modules/uni-table/i18n/fr.json | 9 +
uni_modules/uni-table/i18n/index.js | 12 +
uni_modules/uni-table/i18n/zh-Hans.json | 9 +
uni_modules/uni-table/i18n/zh-Hant.json | 9 +
uni_modules/uni-table/package.json | 83 ++
uni_modules/uni-table/readme.md | 13 +
uni_modules/uni-tag/changelog.md | 23 +
.../uni-tag/components/uni-tag/uni-tag.vue | 252 ++++
uni_modules/uni-tag/package.json | 84 ++
uni_modules/uni-tag/readme.md | 13 +
uni_modules/uni-title/changelog.md | 10 +
.../components/uni-title/uni-title.vue | 171 +++
uni_modules/uni-title/package.json | 88 ++
uni_modules/uni-title/readme.md | 14 +
uni_modules/uni-tooltip/changelog.md | 16 +
.../components/uni-tooltip/uni-tooltip.vue | 108 ++
uni_modules/uni-tooltip/package.json | 86 ++
uni_modules/uni-tooltip/readme.md | 8 +
uni_modules/uni-transition/changelog.md | 24 +
.../uni-transition/createAnimation.js | 131 ++
.../uni-transition/uni-transition.vue | 286 +++++
uni_modules/uni-transition/package.json | 85 ++
uni_modules/uni-transition/readme.md | 11 +
uni_modules/uni-ui/changelog.md | 566 +++++++++
.../uni-ui/components/uni-ui/uni-ui.vue | 7 +
uni_modules/uni-ui/package.json | 129 ++
uni_modules/uni-ui/readme.md | 247 ++++
428 files changed, 50385 insertions(+)
create mode 100644 .gitignore
create mode 100644 App.vue
create mode 100644 common/ajax.js
create mode 100644 common/cache.js
create mode 100644 common/free.css
create mode 100644 common/html-parser.js
create mode 100644 common/image.js
create mode 100644 common/qqmap-wx-jssdk.js
create mode 100644 common/toast.js
create mode 100644 common/util.js
create mode 100644 components/i-account-list/i-account-list.vue
create mode 100644 components/i-account/i-account.vue
create mode 100644 components/i-address-list/i-address-list.vue
create mode 100644 components/i-cart-list/i-cart-list.vue
create mode 100644 components/i-list-top/i-list-top.vue
create mode 100644 components/i-loading/i-loading.vue
create mode 100644 components/i-message-list/i-message-list.vue
create mode 100644 components/i-my-list/i-my-list.vue
create mode 100644 components/i-nav-list/i-nav-list.vue
create mode 100644 components/i-news-list/i-news-list.vue
create mode 100644 components/i-nodata/i-nodata.vue
create mode 100644 components/i-notice-list/i-notice-list.vue
create mode 100644 components/i-order-list/i-order-list.vue
create mode 100644 components/i-search/i-search.vue
create mode 100644 components/i-spread/i-spread.vue
create mode 100644 components/i-swiper/i-swiper.vue
create mode 100644 components/i-thumb-list/i-thumb-list.vue
create mode 100644 components/i-tutorial-list/i-tutorial-list.vue
create mode 100644 components/i-user-share-list/i-user-share-list.vue
create mode 100644 components/i-video-list/i-video-list.vue
create mode 100644 components/pick-regions/pick-regions.vue
create mode 100644 components/pick-regions/regions.json
create mode 100644 components/u-parse/components/wxParseAudio.vue
create mode 100644 components/u-parse/components/wxParseImg.vue
create mode 100644 components/u-parse/components/wxParseTable.vue
create mode 100644 components/u-parse/components/wxParseTemplate0.vue
create mode 100644 components/u-parse/components/wxParseTemplate1.vue
create mode 100644 components/u-parse/components/wxParseTemplate10.vue
create mode 100644 components/u-parse/components/wxParseTemplate11.vue
create mode 100644 components/u-parse/components/wxParseTemplate2.vue
create mode 100644 components/u-parse/components/wxParseTemplate3.vue
create mode 100644 components/u-parse/components/wxParseTemplate4.vue
create mode 100644 components/u-parse/components/wxParseTemplate5.vue
create mode 100644 components/u-parse/components/wxParseTemplate6.vue
create mode 100644 components/u-parse/components/wxParseTemplate7.vue
create mode 100644 components/u-parse/components/wxParseTemplate8.vue
create mode 100644 components/u-parse/components/wxParseTemplate9.vue
create mode 100644 components/u-parse/components/wxParseVideo.vue
create mode 100644 components/u-parse/libs/html2json.js
create mode 100644 components/u-parse/libs/htmlparser.js
create mode 100644 components/u-parse/libs/wxDiscode.js
create mode 100644 components/u-parse/parse.css
create mode 100644 components/u-parse/parse.vue
create mode 100644 components/u-parse/readme.md
create mode 100644 components/u-parse/u-parse.css
create mode 100644 components/u-parse/u-parse.vue
create mode 100644 index.html
create mode 100644 main.js
create mode 100644 manifest.json
create mode 100644 pages.json
create mode 100644 pages/const/about.vue
create mode 100644 pages/const/help.vue
create mode 100644 pages/const/license.vue
create mode 100644 pages/const/more.vue
create mode 100644 pages/const/privacy.vue
create mode 100644 pages/index/index.vue
create mode 100644 pages/message/message.vue
create mode 100644 pages/news/detail.vue
create mode 100644 pages/points-mall/buy.vue
create mode 100644 pages/points-mall/detail.vue
create mode 100644 pages/points-mall/index.vue
create mode 100644 pages/thumb/detail.vue
create mode 100644 pages/thumb/list.vue
create mode 100644 pages/thumb/thumb.vue
create mode 100644 pages/tutorial/detail.vue
create mode 100644 pages/tutorial/tutorial.vue
create mode 100644 pages/user-share/detail.vue
create mode 100644 pages/user-share/user-share.vue
create mode 100644 pages/user/address.vue
create mode 100644 pages/user/address_edit.vue
create mode 100644 pages/user/bind/bind.vue
create mode 100644 pages/user/index.vue
create mode 100644 pages/user/info.vue
create mode 100644 pages/user/login.vue
create mode 100644 pages/user/order.vue
create mode 100644 pages/user/point.vue
create mode 100644 pages/user/user_share.vue
create mode 100644 static/images/addImage.png
create mode 100644 static/images/delete.png
create mode 100644 static/images/icon-bszn-n.png
create mode 100644 static/images/icon-bszn.png
create mode 100644 static/images/icon-city.png
create mode 100644 static/images/icon-dzcs-n.png
create mode 100644 static/images/icon-dzcs.png
create mode 100644 static/images/icon-guide.png
create mode 100644 static/images/icon-home-n.png
create mode 100644 static/images/icon-home.png
create mode 100644 static/images/icon-like.png
create mode 100644 static/images/icon-mall-n.png
create mode 100644 static/images/icon-mall.png
create mode 100644 static/images/icon-my-n.png
create mode 100644 static/images/icon-my.png
create mode 100644 static/images/icon-nolike.png
create mode 100644 static/images/icon-photograph.png
create mode 100644 static/images/icon-store.png
create mode 100644 static/images/icon-time.png
create mode 100644 static/images/icon-warn.png
create mode 100644 static/images/user-no-avatar.png
create mode 100644 static/logo.png
create mode 100644 uni.promisify.adaptor.js
create mode 100644 uni.scss
create mode 100644 uni_modules/uni-ajax/README.md
create mode 100644 uni_modules/uni-ajax/changelog.md
create mode 100644 uni_modules/uni-ajax/js_sdk/index.d.ts
create mode 100644 uni_modules/uni-ajax/js_sdk/index.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/adapters/Fetcher.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/adapters/http.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/core/Ajax.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/core/InterceptorManager.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/core/dispatchRequest.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/core/handleCancel.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/defaults.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/helpers/buildURL.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/helpers/isCallback.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/helpers/mergeConfig.js
create mode 100644 uni_modules/uni-ajax/js_sdk/lib/utils.js
create mode 100644 uni_modules/uni-ajax/package.json
create mode 100644 uni_modules/uni-badge/changelog.md
create mode 100644 uni_modules/uni-badge/components/uni-badge/uni-badge.vue
create mode 100644 uni_modules/uni-badge/package.json
create mode 100644 uni_modules/uni-badge/readme.md
create mode 100644 uni_modules/uni-calendar/changelog.md
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/calendar.js
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/en.json
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/index.js
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
create mode 100644 uni_modules/uni-calendar/components/uni-calendar/util.js
create mode 100644 uni_modules/uni-calendar/package.json
create mode 100644 uni_modules/uni-calendar/readme.md
create mode 100644 uni_modules/uni-card/changelog.md
create mode 100644 uni_modules/uni-card/components/uni-card/uni-card.vue
create mode 100644 uni_modules/uni-card/package.json
create mode 100644 uni_modules/uni-card/readme.md
create mode 100644 uni_modules/uni-collapse/changelog.md
create mode 100644 uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue
create mode 100644 uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue
create mode 100644 uni_modules/uni-collapse/package.json
create mode 100644 uni_modules/uni-collapse/readme.md
create mode 100644 uni_modules/uni-combox/changelog.md
create mode 100644 uni_modules/uni-combox/components/uni-combox/uni-combox.vue
create mode 100644 uni_modules/uni-combox/package.json
create mode 100644 uni_modules/uni-combox/readme.md
create mode 100644 uni_modules/uni-countdown/changelog.md
create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/en.json
create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/index.js
create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue
create mode 100644 uni_modules/uni-countdown/package.json
create mode 100644 uni_modules/uni-countdown/readme.md
create mode 100644 uni_modules/uni-data-checkbox/changelog.md
create mode 100644 uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue
create mode 100644 uni_modules/uni-data-checkbox/package.json
create mode 100644 uni_modules/uni-data-checkbox/readme.md
create mode 100644 uni_modules/uni-data-picker/changelog.md
create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/keypress.js
create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue
create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue
create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts
create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js
create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts
create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css
create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue
create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue
create mode 100644 uni_modules/uni-data-picker/package.json
create mode 100644 uni_modules/uni-data-picker/readme.md
create mode 100644 uni_modules/uni-data-select/changelog.md
create mode 100644 uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
create mode 100644 uni_modules/uni-data-select/package.json
create mode 100644 uni_modules/uni-data-select/readme.md
create mode 100644 uni_modules/uni-dateformat/changelog.md
create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/date-format.js
create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue
create mode 100644 uni_modules/uni-dateformat/package.json
create mode 100644 uni_modules/uni-dateformat/readme.md
create mode 100644 uni_modules/uni-datetime-picker/changelog.md
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
create mode 100644 uni_modules/uni-datetime-picker/package.json
create mode 100644 uni_modules/uni-datetime-picker/readme.md
create mode 100644 uni_modules/uni-drawer/changelog.md
create mode 100644 uni_modules/uni-drawer/components/uni-drawer/keypress.js
create mode 100644 uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue
create mode 100644 uni_modules/uni-drawer/package.json
create mode 100644 uni_modules/uni-drawer/readme.md
create mode 100644 uni_modules/uni-easyinput/changelog.md
create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/common.js
create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
create mode 100644 uni_modules/uni-easyinput/package.json
create mode 100644 uni_modules/uni-easyinput/readme.md
create mode 100644 uni_modules/uni-fab/changelog.md
create mode 100644 uni_modules/uni-fab/components/uni-fab/uni-fab.vue
create mode 100644 uni_modules/uni-fab/package.json
create mode 100644 uni_modules/uni-fab/readme.md
create mode 100644 uni_modules/uni-fav/changelog.md
create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/en.json
create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/index.js
create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-fav/components/uni-fav/uni-fav.vue
create mode 100644 uni_modules/uni-fav/package.json
create mode 100644 uni_modules/uni-fav/readme.md
create mode 100644 uni_modules/uni-file-picker/changelog.md
create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js
create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue
create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue
create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue
create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/utils.js
create mode 100644 uni_modules/uni-file-picker/package.json
create mode 100644 uni_modules/uni-file-picker/readme.md
create mode 100644 uni_modules/uni-forms/changelog.md
create mode 100644 uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue
create mode 100644 uni_modules/uni-forms/components/uni-forms/uni-forms.vue
create mode 100644 uni_modules/uni-forms/components/uni-forms/utils.js
create mode 100644 uni_modules/uni-forms/components/uni-forms/validate.js
create mode 100644 uni_modules/uni-forms/package.json
create mode 100644 uni_modules/uni-forms/readme.md
create mode 100644 uni_modules/uni-goods-nav/changelog.md
create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json
create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js
create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue
create mode 100644 uni_modules/uni-goods-nav/package.json
create mode 100644 uni_modules/uni-goods-nav/readme.md
create mode 100644 uni_modules/uni-grid/changelog.md
create mode 100644 uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue
create mode 100644 uni_modules/uni-grid/components/uni-grid/uni-grid.vue
create mode 100644 uni_modules/uni-grid/package.json
create mode 100644 uni_modules/uni-grid/readme.md
create mode 100644 uni_modules/uni-group/changelog.md
create mode 100644 uni_modules/uni-group/components/uni-group/uni-group.vue
create mode 100644 uni_modules/uni-group/package.json
create mode 100644 uni_modules/uni-group/readme.md
create mode 100644 uni_modules/uni-icons/changelog.md
create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js
create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue
create mode 100644 uni_modules/uni-icons/components/uni-icons/uni.ttf
create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css
create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf
create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file.ts
create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js
create mode 100644 uni_modules/uni-icons/package.json
create mode 100644 uni_modules/uni-icons/readme.md
create mode 100644 uni_modules/uni-indexed-list/changelog.md
create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue
create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue
create mode 100644 uni_modules/uni-indexed-list/package.json
create mode 100644 uni_modules/uni-indexed-list/readme.md
create mode 100644 uni_modules/uni-link/changelog.md
create mode 100644 uni_modules/uni-link/components/uni-link/uni-link.vue
create mode 100644 uni_modules/uni-link/package.json
create mode 100644 uni_modules/uni-link/readme.md
create mode 100644 uni_modules/uni-list/changelog.md
create mode 100644 uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue
create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss
create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue
create mode 100644 uni_modules/uni-list/components/uni-list-item/uni-list-item.vue
create mode 100644 uni_modules/uni-list/components/uni-list/uni-list.vue
create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.vue
create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.wxs
create mode 100644 uni_modules/uni-list/package.json
create mode 100644 uni_modules/uni-list/readme.md
create mode 100644 uni_modules/uni-load-more/changelog.md
create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json
create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js
create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue
create mode 100644 uni_modules/uni-load-more/package.json
create mode 100644 uni_modules/uni-load-more/readme.md
create mode 100644 uni_modules/uni-nav-bar/changelog.md
create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue
create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue
create mode 100644 uni_modules/uni-nav-bar/package.json
create mode 100644 uni_modules/uni-nav-bar/readme.md
create mode 100644 uni_modules/uni-notice-bar/changelog.md
create mode 100644 uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
create mode 100644 uni_modules/uni-notice-bar/package.json
create mode 100644 uni_modules/uni-notice-bar/readme.md
create mode 100644 uni_modules/uni-number-box/changelog.md
create mode 100644 uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue
create mode 100644 uni_modules/uni-number-box/package.json
create mode 100644 uni_modules/uni-number-box/readme.md
create mode 100644 uni_modules/uni-pagination/changelog.md
create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/en.json
create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/es.json
create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json
create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/index.js
create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue
create mode 100644 uni_modules/uni-pagination/package.json
create mode 100644 uni_modules/uni-pagination/readme.md
create mode 100644 uni_modules/uni-popup/changelog.md
create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/keypress.js
create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue
create mode 100644 uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue
create mode 100644 uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue
create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/en.json
create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/index.js
create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-popup/components/uni-popup/keypress.js
create mode 100644 uni_modules/uni-popup/components/uni-popup/popup.js
create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.uvue
create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.vue
create mode 100644 uni_modules/uni-popup/package.json
create mode 100644 uni_modules/uni-popup/readme.md
create mode 100644 uni_modules/uni-rate/changelog.md
create mode 100644 uni_modules/uni-rate/components/uni-rate/uni-rate.vue
create mode 100644 uni_modules/uni-rate/package.json
create mode 100644 uni_modules/uni-rate/readme.md
create mode 100644 uni_modules/uni-row/changelog.md
create mode 100644 uni_modules/uni-row/components/uni-col/uni-col.vue
create mode 100644 uni_modules/uni-row/components/uni-row/uni-row.vue
create mode 100644 uni_modules/uni-row/package.json
create mode 100644 uni_modules/uni-row/readme.md
create mode 100644 uni_modules/uni-scss/changelog.md
create mode 100644 uni_modules/uni-scss/index.scss
create mode 100644 uni_modules/uni-scss/package.json
create mode 100644 uni_modules/uni-scss/readme.md
create mode 100644 uni_modules/uni-scss/styles/index.scss
create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss
create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss
create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss
create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss
create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss
create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss
create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss
create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss
create mode 100644 uni_modules/uni-scss/theme.scss
create mode 100644 uni_modules/uni-scss/variables.scss
create mode 100644 uni_modules/uni-search-bar/changelog.md
create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json
create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js
create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue
create mode 100644 uni_modules/uni-search-bar/package.json
create mode 100644 uni_modules/uni-search-bar/readme.md
create mode 100644 uni_modules/uni-section/changelog.md
create mode 100644 uni_modules/uni-section/components/uni-section/uni-section.vue
create mode 100644 uni_modules/uni-section/package.json
create mode 100644 uni_modules/uni-section/readme.md
create mode 100644 uni_modules/uni-segmented-control/changelog.md
create mode 100644 uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue
create mode 100644 uni_modules/uni-segmented-control/package.json
create mode 100644 uni_modules/uni-segmented-control/readme.md
create mode 100644 uni_modules/uni-steps/changelog.md
create mode 100644 uni_modules/uni-steps/components/uni-steps/uni-steps.vue
create mode 100644 uni_modules/uni-steps/package.json
create mode 100644 uni_modules/uni-steps/readme.md
create mode 100644 uni_modules/uni-swipe-action/changelog.md
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs
create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue
create mode 100644 uni_modules/uni-swipe-action/package.json
create mode 100644 uni_modules/uni-swipe-action/readme.md
create mode 100644 uni_modules/uni-swiper-dot/changelog.md
create mode 100644 uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue
create mode 100644 uni_modules/uni-swiper-dot/package.json
create mode 100644 uni_modules/uni-swiper-dot/readme.md
create mode 100644 uni_modules/uni-table/changelog.md
create mode 100644 uni_modules/uni-table/components/uni-table/uni-table.vue
create mode 100644 uni_modules/uni-table/components/uni-tbody/uni-tbody.vue
create mode 100644 uni_modules/uni-table/components/uni-td/uni-td.vue
create mode 100644 uni_modules/uni-table/components/uni-th/filter-dropdown.vue
create mode 100644 uni_modules/uni-table/components/uni-th/uni-th.vue
create mode 100644 uni_modules/uni-table/components/uni-thead/uni-thead.vue
create mode 100644 uni_modules/uni-table/components/uni-tr/table-checkbox.vue
create mode 100644 uni_modules/uni-table/components/uni-tr/uni-tr.vue
create mode 100644 uni_modules/uni-table/i18n/en.json
create mode 100644 uni_modules/uni-table/i18n/es.json
create mode 100644 uni_modules/uni-table/i18n/fr.json
create mode 100644 uni_modules/uni-table/i18n/index.js
create mode 100644 uni_modules/uni-table/i18n/zh-Hans.json
create mode 100644 uni_modules/uni-table/i18n/zh-Hant.json
create mode 100644 uni_modules/uni-table/package.json
create mode 100644 uni_modules/uni-table/readme.md
create mode 100644 uni_modules/uni-tag/changelog.md
create mode 100644 uni_modules/uni-tag/components/uni-tag/uni-tag.vue
create mode 100644 uni_modules/uni-tag/package.json
create mode 100644 uni_modules/uni-tag/readme.md
create mode 100644 uni_modules/uni-title/changelog.md
create mode 100644 uni_modules/uni-title/components/uni-title/uni-title.vue
create mode 100644 uni_modules/uni-title/package.json
create mode 100644 uni_modules/uni-title/readme.md
create mode 100644 uni_modules/uni-tooltip/changelog.md
create mode 100644 uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue
create mode 100644 uni_modules/uni-tooltip/package.json
create mode 100644 uni_modules/uni-tooltip/readme.md
create mode 100644 uni_modules/uni-transition/changelog.md
create mode 100644 uni_modules/uni-transition/components/uni-transition/createAnimation.js
create mode 100644 uni_modules/uni-transition/components/uni-transition/uni-transition.vue
create mode 100644 uni_modules/uni-transition/package.json
create mode 100644 uni_modules/uni-transition/readme.md
create mode 100644 uni_modules/uni-ui/changelog.md
create mode 100644 uni_modules/uni-ui/components/uni-ui/uni-ui.vue
create mode 100644 uni_modules/uni-ui/package.json
create mode 100644 uni_modules/uni-ui/readme.md
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..64057b6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+.hbuilderx
+unpackage
+.vscode
+.idea
+node_modules
\ No newline at end of file
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..eda367b
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,68 @@
+
+
+
+
diff --git a/common/ajax.js b/common/ajax.js
new file mode 100644
index 0000000..4bb67a5
--- /dev/null
+++ b/common/ajax.js
@@ -0,0 +1,118 @@
+import ajax from '@/uni_modules/uni-ajax/js_sdk/index.js';
+import {
+ TaCache
+} from './cache';
+import {
+ TaToast
+} from './toast';
+import {
+ objectHasKey
+} from './util';
+
+// 执行队列
+let _tasks = []
+let _status = true
+
+export const baseUrl = 'https://www.gafzgc.com/'
+// export const baseUrl = 'http://127.0.0.1:8000/'
+
+// 创建请求实例,检查登录状态及业务异常,返回 Body 内容( 建议使用 TaPost 处理)
+const TaHttp = ajax.create({
+ baseURL: baseUrl
+})
+
+// 创建请求实例,不检查登录状态及业务异常,返回 Body 内容
+export const TaAjax = ajax.create({
+ baseURL: baseUrl
+})
+
+// 通用 POST 提交,检查登录状态及业务异常,返回 Body 内容,可中断请求
+export function TaPost(uri, data = {}, load = '', options = {}) {
+ load.length > 0 && TaToast.loading(load)
+ return new Promise((resolve, reject) => {
+ if (_status) {
+ _tasks.push(options.fetcher = new ajax.Fetcher())
+ TaHttp.post(uri, data, options).then((ret) => {
+ ret.code === 1 ? resolve(ret) : reject(ret)
+ }).finally(() => {
+ load.length > 0 && TaToast.loadhide()
+ _tasks.splice(_tasks.indexOf(options.fetcher), 1)
+ })
+ } else {
+ load.length > 0 && TaToast.loadhide()
+ reject({
+ code: 0,
+ info: '请求已被阻止!'
+ })
+ }
+ })
+}
+
+// 阻止 POST 请求 ( 20毫秒内阻止请求 )
+export function TaPostAbort() {
+ _status = false;
+ _tasks.forEach((x, i) => (x.abort(), _tasks.splice(i, 1)))
+ return new Promise(resolve => setTimeout(() => resolve(_status = true), 20))
+}
+
+// 添加请求拦截器
+TaHttp.interceptors.request.use(useRequestInterceptor, error => Promise.reject(error))
+TaAjax.interceptors.request.use(useRequestInterceptor, error => Promise.reject(error))
+
+// 添加响应拦截器
+TaHttp.interceptors.response.use(response => useResponseInterceptor(response, true), error => Promise.reject(error))
+TaAjax.interceptors.response.use(response => useResponseInterceptor(response, false), error => Promise.reject(error))
+
+// 定义请求拦截函数
+function useRequestInterceptor(config) {
+ // 检查是否有 Api-Token 配置,没有则自动追加配置
+ let token = TaCache.get('auth.token')
+ if (token) config.header['Api-Token'] = token
+ // 检查是否有 Content-Type 配置,没有则自动追加配置
+ if (!objectHasKey(config.header, 'content-type')) {
+ config.header['Content-Type'] = 'application/x-www-form-urlencoded'
+ }
+ return config
+}
+
+// 定义结果拦截函数
+function useResponseInterceptor(response, checkAuth) {
+ // 获取返回的数据
+ let body = response.data || {
+ code: 0,
+ info: 'unknow',
+ data: {}
+ }
+ // 网络请求异常处理
+ if (response.statusCode === 404) {
+ TaToast.error(body.info || '资源不存在!')
+ return Promise.reject(body)
+ } else if (response.statusCode === 500) {
+ TaToast.error(body.info || '服务异常!')
+ return Promise.reject(body)
+ } else if (response.statusCode !== 200) {
+ TaToast.error(body.info || '请求异常!' + body.code)
+ return Promise.reject(body)
+ }
+ // 接口返回异常处理
+ if (checkAuth) {
+ if (body.code === 402) {
+ TaPostAbort(), TaToast.error(body.info || '请完善资料!').then(() => uni.navigateTo({
+ url: '/pages/user/bind/bind'
+ }))
+ return Promise.reject(body)
+ } else if ((body.code === 401 || body.code === 403)) {
+ TaPostAbort(), TaToast.error(body.info || '需要登录授权!').then(() => DataUser.logout())
+ return Promise.reject(body)
+ } else if (body.code !== 1) {
+ body.info && TaToast.error(body.info)
+ return Promise.reject(body)
+ }
+ }
+ // 任何请求,如果有返回 Token 都进行保存授权令牌
+ if (body.data && typeof body.data.token === 'string') {
+ TaCache.set('auth.token', body.data.token)
+ }
+ // 返回主体内容
+ return Promise.resolve(body);
+}
\ No newline at end of file
diff --git a/common/cache.js b/common/cache.js
new file mode 100644
index 0000000..733630b
--- /dev/null
+++ b/common/cache.js
@@ -0,0 +1,29 @@
+
+// 本地缓存封装
+export const TaCache = {
+
+ // 写入缓存数据,可配置有效时间(毫秒)
+ set(name, value, expire = 0) {
+ expire = expire > 0 ? Date.now() + expire : 0
+ uni.setStorageSync(name, JSON.stringify([value, expire]))
+ return value;
+ },
+
+ /* 获取缓存数据 */
+ get(name, defa = null) {
+ try {
+ let text = uni.getStorageSync(name)
+ if (!text) return defa
+ let data = JSON.parse(text)
+ let isExpire = (data[1] || 0) > 0 && data[1] < Date.now()
+ return isExpire ? (TaCache.del(name), defa) : data[0]
+ } catch (e) {
+ return defa
+ }
+ },
+
+ /* 删除缓存数据 */
+ del(name) {
+ uni.removeStorageSync(name)
+ },
+}
diff --git a/common/free.css b/common/free.css
new file mode 100644
index 0000000..96932a3
--- /dev/null
+++ b/common/free.css
@@ -0,0 +1,458 @@
+/* #ifndef APP-PLUS-NVUE */
+.status_bar {height: var(--status-bar-height); width: 100%;}
+/* scroll-view */
+.scroll-row{ width: 100%;white-space: nowrap; }
+.scroll-row-item{ display: inline-block!important; }
+/* #endif */
+/* 图标 */
+.iconfont{
+ font-family:iconfont;
+}
+.view,.text{
+ font-size:28rpx;
+ line-height:1.8;
+ color:#000000;
+}
+.img-in{font-size:0;}
+/* 宽度 */
+/* #ifndef APP-PLUS-NVUE */
+.w-100{ width: 100%; }
+.w-80{width: 80%;}
+.w-33{width: 33%;}
+/* #endif */
+.w-50{width: 50%;}
+.w-25{width: 25%;}
+.w-20{width: 20%;}
+.row {
+ margin-right: -20rpx;
+ margin-left: -20rpx;
+ /* #ifndef APP-PLUS-NVUE */
+ display: flex;
+ /* #endif */
+ flex-wrap: wrap;
+ flex-direction: row;
+}
+
+
+.col-12 { width: 750rpx;}
+.col-11 { width: 687.5rpx; }
+.col-10 { width: 625rpx; }
+.col-9 { width: 562.5rpx; }
+.col-8 { width: 500rpx; }
+.col-7 { width: 437.5rpx; }
+.col-6 { width: 375rpx; }
+.col-5 { width: 312.5rpx;}
+.col-4 {width: 250rpx;}
+.col-3 {width: 187.5rpx;}
+.col-2 {width: 125rpx;}
+
+
+.col-1 {width: 62.5rpx;}
+
+.col-offset-12 { margin-left: 750rpx;}
+.col-offset-11 { margin-left: 687.5rpx; }
+.col-offset-10 { margin-left: 625rpx; }
+.col-offset-9 { margin-left: 562.5rpx; }
+.col-offset-8 { margin-left: 500rpx; }
+.col-offset-7 { margin-left: 437.5rpx; }
+.col-offset-6 { margin-left: 375rpx; }
+.col-offset-5 { margin-left: 312.5rpx;}
+.col-offset-4 {margin-left: 250rpx;}
+.col-offset-3 {margin-left: 187.5rpx;}
+.col-offset-2 {margin-left: 125rpx;}
+.col-offset-1 {margin-left: 62.5rpx;}
+.col-offset-0 {margin-left: 0;}
+
+/* flex 布局 */
+.flex{
+ /* #ifndef APP-PLUS-NVUE */
+ display:flex!important;
+ /* #endif */
+ flex-direction:row;
+}
+.flex-row{ flex-direction:row!important; }
+.flex-column{ flex-direction:column!important; }
+.flex-row-reverse{ flex-direction:row-reverse!important; }
+.flex-column-reverse{ flex-direction:column-reverse!important; }
+.flex-wrap{ flex-wrap:wrap;}
+.flex-nowrap{ flex-wrap:nowrap;}
+.justify-start{justify-content:flex-start;}
+.justify-end{justify-content:flex-end;}
+.justify-between{justify-content:space-between;}
+.justify-center{justify-content:center;}
+.align-center{ align-items: center; }
+.align-stretch{ align-items: stretch; }
+.align-start{ align-items: flex-start; }
+.align-end{ align-items: flex-end; }
+/* #ifndef APP-PLUS-NVUE */
+.content-start {align-content: flex-start;}
+.content-end {align-content: flex-end;}
+.content-center {align-content: center;}
+.content-between {align-content: space-between;}
+.content-around {align-content: space-around;}
+.content-stretch {align-content: stretch;}
+/* #endif */
+.flex-1{ flex: 1; }
+.flex-2{ flex: 2; }
+.flex-3{ flex: 3; }
+.flex-4{ flex: 4; }
+.flex-5{ flex: 5; }
+/* #ifndef APP-PLUS-NVUE */
+.flex-shrink{ flex-shrink: 0; }
+/* #endif */
+
+.containerx {
+ padding-right: 20rpx;
+ padding-left: 20rpx;
+}
+/* -- 内外边距 -- */
+.m-0 { margin: 0; }
+/* #ifndef APP-PLUS-NVUE */
+.m-auto{ margin: auto; }
+/* #endif */
+.m-1 { margin: 10rpx; }
+.m-2 { margin: 20rpx; }
+.m-3 { margin: 30rpx; }
+.m-4 { margin: 40rpx; }
+.m-5 { margin: 50rpx; }
+.mt-0 { margin-top: 0; }
+/* #ifndef APP-PLUS-NVUE */
+.mt-auto { margin-top: auto; }
+/* #endif */
+.mt-1 { margin-top: 10rpx; }
+.mt-2 { margin-top: 20rpx; }
+.mt-3 { margin-top: 30rpx; }
+.mt-4 { margin-top: 40rpx; }
+.mt-5 { margin-top: 50rpx; }
+.mb-0 { margin-bottom: 0; }
+/* #ifndef APP-PLUS-NVUE */
+.mb-auto { margin-bottom: auto; }
+/* #endif */
+.mb-1 { margin-bottom: 10rpx; }
+.mb-2 { margin-bottom: 20rpx; }
+.mb-3 { margin-bottom: 30rpx; }
+.mb-4 { margin-bottom: 40rpx; }
+.mb-5 { margin-bottom: 50rpx; }
+.mb-6 { margin-bottom: 60rpx; }
+.mb-7 { margin-bottom: 70rpx; }
+.ml-0 { margin-left: 0; }
+/* #ifndef APP-PLUS-NVUE */
+.ml-auto { margin-left: auto; }
+/* #endif */
+.ml-1 { margin-left: 10rpx; }
+.ml-2 { margin-left: 20rpx; }
+.ml-3 { margin-left: 30rpx; }
+.ml-4 { margin-left: 40rpx; }
+.ml-5 { margin-left: 50rpx; }
+.mr-0 { margin-right: 0; }
+/* #ifndef APP-PLUS-NVUE */
+.mr-auto { margin-right: auto; }
+/* #endif */
+.mr-1 { margin-right: 10rpx; }
+.mr-2 { margin-right: 20rpx; }
+.mr-3 { margin-right: 30rpx; }
+.mr-4 { margin-right: 40rpx; }
+.mr-5 { margin-right: 50rpx; }
+.my-0 { margin-top: 0; margin-bottom: 0; }
+/* #ifndef APP-PLUS-NVUE */
+.my-auto { margin-top: auto; margin-bottom: auto; }
+/* #endif */
+.my-1 { margin-top: 10rpx; margin-bottom: 10rpx; }
+.my-2 { margin-top: 20rpx; margin-bottom: 20rpx; }
+.my-3 { margin-top: 30rpx; margin-bottom: 30rpx; }
+.my-4 { margin-top: 40rpx; margin-bottom: 40rpx; }
+.my-5 { margin-top: 50rpx; margin-bottom: 50rpx; }
+.mx-0 { margin-left: 0; margin-right: 0; }
+/* #ifndef APP-PLUS-NVUE */
+.mx-auto { margin-left: auto; margin-right: auto; }
+/* #endif */
+.mx-1 { margin-left: 10rpx; margin-right: 10rpx;}
+.mx-2 { margin-left: 20rpx; margin-right: 20rpx;}
+.mx-3 { margin-left: 30rpx; margin-right: 30rpx;}
+.mx-4 { margin-left: 40rpx; margin-right: 40rpx;}
+.mx-5 { margin-left: 50rpx; margin-right: 50rpx;}
+
+.p-0 { padding: 0; }
+.p { padding: 5rpx; }
+.p-1 { padding: 10rpx; }
+.p-2 { padding: 20rpx; }
+.p-3 { padding: 30rpx; }
+.p-4 { padding: 40rpx; }
+.p-5 { padding: 50rpx; }
+.pt-0 { padding-top: 0; }
+.pt { padding-top: 5rpx; }
+.pt-1 { padding-top: 10rpx; }
+.pt-2 { padding-top: 20rpx; }
+.pt-3 { padding-top: 30rpx; }
+.pt-4 { padding-top: 40rpx; }
+.pt-5 { padding-top: 50rpx; }
+.pb-0 { padding-bottom: 0; }
+.pb-1 { padding-bottom: 10rpx; }
+.pb { padding-bottom: 5rpx; }
+.pb-2 { padding-bottom: 20rpx; }
+.pb-3 { padding-bottom: 30rpx; }
+.pb-4 { padding-bottom: 40rpx; }
+.pb-5 { padding-bottom: 50rpx; }
+.pl-0 { padding-left: 0; }
+.pl { padding-left: 5rpx; }
+.pl-1 { padding-left: 10rpx; }
+.pl-2 { padding-left: 20rpx; }
+.pl-3 { padding-left: 30rpx; }
+.pl-4 { padding-left: 40rpx; }
+.pl-5 { padding-left: 50rpx; }
+.pl-9 { padding-left: 90rpx; }
+.pr-0 { padding-right: 0; }
+.pr { padding-right: 5rpx; }
+.pr-1 { padding-right: 10rpx; }
+.pr-2 { padding-right: 20rpx; }
+.pr-3 { padding-right: 30rpx; }
+.pr-4 { padding-right: 40rpx; }
+.pr-5 { padding-right: 50rpx; }
+.py-0 { padding-top: 0; padding-bottom: 0; }
+.py { padding-top: 5rpx; padding-bottom: 5rpx; }
+.py-1 { padding-top: 10rpx; padding-bottom: 10rpx; }
+.py-2 { padding-top: 20rpx; padding-bottom: 20rpx; }
+.py-25{padding-top: 25rpx; padding-bottom: 25rpx;}
+.py-3 { padding-top: 30rpx; padding-bottom: 30rpx; }
+.py-4 { padding-top: 40rpx; padding-bottom: 40rpx; }
+.py-5 { padding-top: 50rpx; padding-bottom: 50rpx; }
+.px-0 { padding-left: 0; padding-right: 0; }
+.px-1 { padding-left: 10rpx; padding-right: 10rpx;}
+.px { padding-left: 5rpx; padding-right: 5rpx;}
+.px-2 { padding-left: 20rpx; padding-right: 20rpx;}
+.px-3 { padding-left: 30rpx; padding-right: 30rpx;}
+.px-4 { padding-left: 40rpx; padding-right: 40rpx;}
+.px-5 { padding-left: 50rpx; padding-right: 50rpx;}
+
+.font16{font-size: 16rpx!important;}
+.font18{font-size: 18rpx!important;}
+.font20{font-size: 20rpx!important;}
+.font22{font-size: 22rpx!important;}
+.font24{font-size: 24rpx!important;}
+.font26{font-size: 26rpx!important;}
+.font28{font-size: 28rpx!important;}
+.font30{font-size: 30rpx!important;}
+.font32{font-size: 32rpx!important;}
+.font34{font-size: 34rpx!important;}
+.font36{font-size: 36rpx!important;}
+.font38{font-size: 38rpx!important;}
+.font40{font-size: 40rpx!important;}
+.font50{font-size: 50rpx!important;}
+.font60{font-size: 60rpx!important;}
+/* 文字缩进 */
+/* #ifndef APP-PLUS-NVUE */
+.text-indent{text-indent:2;}
+.line15{line-height: 1.5;}
+.line2{line-height: 1.8;}
+/* #endif */
+/* 文字划线 */
+.text-through{text-decoration:line-through;}
+/* 文字对齐 */
+.text-left { text-align: left;}
+.text-right { text-align: right;}
+.text-center { text-align: center;}
+/* 文字换行溢出处理 */
+.text-ellipsis {
+ /* #ifndef APP-PLUS-NVUE */
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ /* #endif */
+ /* #ifdef APP-PLUS-NVUE */
+ lines: 1;
+ /* #endif */
+}
+.text-ellipsis-1 {
+ /* #ifndef APP-PLUS-NVUE */
+ text-overflow: -o-ellipsis-lastline;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 1;
+ line-clamp: 1;
+ -webkit-box-orient: vertical;
+ /* #endif */
+}
+
+
+ .text-ellipsis-2 {
+ /* #ifndef APP-PLUS-NVUE */
+ text-overflow: -o-ellipsis-lastline;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ line-clamp: 2;
+ -webkit-box-orient: vertical;
+ /* #endif */}
+/* 文字粗细和斜体 */
+.font-weight-light {font-weight: 300;} /*细*/
+.font-weight-lighter {font-weight: 100;}/*更细*/
+.font-weight-normal { font-weight: 400;} /*正常*/
+.font-weight-bold { font-weight: 700;} /*粗*/
+.font-weight-bolder { font-weight: bold;} /*更粗*/
+.font-italic { font-style: italic;} /*斜体*/
+/* 文字颜色 */
+.text-white {color: #ffffff;}
+.text-primary {color: #2979ff;}
+.text-hover-primary { color: #94bcff;}
+.text-secondary {color: #6c757d;}
+.text-hover-secondary { color: #494f54;}
+.text-success {color: #18bc37;}
+.text-hover-success{color: #8cde9b;}
+.text-info { color: #8f939c;}
+.text-hover-info {color: #c7c9ce;}
+.text-warning {color: #ffc107;}
+.text-hover-warning { color: #f9d39f;}
+.text-danger { color: #e43d33 ;}
+.text-hover-danger { color: #f29e99;}
+.text-light { color: #e9e9eb;}
+.text-hover-light { color: #cbd3da;}
+.text-dark { color: #343a40;}
+.text-hover-dark{ color: #8f939c;}
+.text-body { color: #000000;}
+.text-muted { color: #979797;}
+/* 浅灰色 */
+.text-light-muted { color: #A9A5A0;}
+.text-light-black { color: rgba(0, 0, 0, 0.5);}
+.text-light-white { color: rgba(255, 255, 255, 0.5);}
+
+/* 背景颜色 */
+
+.bg-primary { background-color: #2979ff;}
+.bg-hover-primary:hover{ background-color: #94bcff;}
+.bg-secondary { background-color: #6c757d;}
+.bg-hover-secondary:hover{ background-color: #545b62;}
+.bg-success { background-color: #18bc37;}
+.bg-hover-success { background-color: #8cde9b;}
+.bg-info { background-color: #8f939c;}
+.bg-hover-info { background-color: #c7c9ce;}
+.bg-warning { background-color: #f3a73f;}
+.bg-hover-warning { background-color: #f9d39f;}
+.bg-danger { background-color: #e43d33 ;}
+.bg-hover-danger{ background-color: #f29e99;}
+.bg-light { background-color: #e9e9eb;}
+.bg-hover-light{ background-color: #f1f1f1;}
+.bg-dark { background-color: #333333;}
+.bg-hover-dark { background-color: #1d2124;}
+.bg-white { background-color: #ffffff;}
+.bg-transparent { background-color: transparent;}
+/* 边框 */
+.border { border-width: 1rpx;border-style: solid;border-color: #dee2e6;}
+.border-top {
+ border-top-width: 1rpx;
+ border-top-style: solid;
+ border-top-color: #dee2e6;
+}
+.border-right {
+ border-right-width: 1rpx;
+ border-right-style: solid;
+ border-right-color: #dee2e6;
+}
+.border-bottom {
+ border-bottom-width: 1rpx;
+ border-bottom-style: solid;
+ border-bottom-color: #dee2e6;
+}
+.border-left {
+ border-left-width: 1rpx;
+ border-left-style: solid;
+ border-left-color: #dee2e6;
+}
+.border-dotted-bottom {
+ border-bottom-width: 1rpx;
+ border-bottom-style: dotted;
+ border-bottom-color: #dee2e6;
+}
+.border-0 { border-width: 0!important;}
+.border-top-0 { border-top-width: 0!important;}
+.border-right-0 {border-right-width: 0!important;}
+.border-bottom-0 {border-bottom-width: 0!important;}
+.border-left-0 {border-left-width: 0!important;}
+.border-primary { border-color: #2979ff;}
+.border-secondary {border-color: #6c757d;}
+.border-light-secondary {border-color: #E9E8E5;}
+.border-success {border-color: #18bc37;}
+.border-info {border-color: #8f939c;}
+.border-warning {border-color: #f3a73f;}
+.border-danger {border-color:#e43d33 ;}
+.border-light {border-color: #e9e9eb;}
+.border-dark {border-color: #343a40;}
+.border-white {border-color: #FFFFFF;}
+
+
+/* 圆角 */
+.rounded { border-radius: 8rpx;}
+.rounded-lg { border-radius: 14rpx;}
+.rounded-top {
+ border-top-left-radius: 8rpx;
+ border-top-right-radius: 8rpx;
+}
+.rounded-top-lg {
+ border-top-left-radius: 14rpx;
+ border-top-right-radius: 14rpx;
+}
+.rounded-right {
+ border-top-right-radius: 8rpx;
+ border-bottom-right-radius: 8rpx;
+}
+.rounded-bottom {
+ border-bottom-right-radius: 8rpx;
+ border-bottom-left-radius: 8rpx;
+}
+.rounded-bottom-lg {
+ border-bottom-right-radius: 14rpx;
+ border-bottom-left-radius: 14rpx;
+}
+.rounded-left {
+ border-top-left-radius: 8rpx;
+ border-bottom-left-radius: 8rpx;
+ }
+.rounded-circle { border-radius: 100rpx;}
+.rounded-circle-left { border-radius: 100rpx 0 0 100rpx;}
+.rounded-circle-right { border-radius:0 100rpx 100rpx 0 ;}
+.rounded-0 { border-radius: 0;}
+/* 显示 */
+/* #ifndef APP-PLUS-NVUE */
+.d-none{ display: none; }
+.d-inline-block{ display: inline-block; }
+.d-block{ display: block; }
+/* #endif */
+/* 内容溢出 */
+.overflow-hidden { overflow: hidden;}
+/* 定位 */
+.position-relative { position: relative;}
+.position-absolute { position: absolute;}
+.position-fixed { position: fixed;}
+.position-sticky{position: sticky;top: 0; z-index: 1000;}
+/* 定位 - 固定顶部 */
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+}
+/* 定位 - 固定底部 */
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 3;
+}
+.top-0 { top: 0; }
+.left-0 { left: 0; }
+.right-0 { right: 0; }
+.bottom-0 { bottom: 0; }
+
+/* 阴影 */
+/* #ifndef APP-PLUS-NVUE */
+.shadow { box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.15);}
+.shadow-lg { box-shadow: 0rpx 40rpx 100rpx 0rpx rgba(0, 0, 0, 0.175);}
+.shadow-none { box-shadow: none !important;}
+/* #endif */
+.cu-tabbar-height {height: 110upx;}
+.cny::before {content: "¥";font-size: 60%;margin-right: 10rpx;}
+.cny_jf::before {content: "积分";font-size: 60%;margin-right: 10rpx;}
+.opacity9{opacity: 0.9;}
\ No newline at end of file
diff --git a/common/html-parser.js b/common/html-parser.js
new file mode 100644
index 0000000..20a89b2
--- /dev/null
+++ b/common/html-parser.js
@@ -0,0 +1,352 @@
+/*
+ * HTML5 Parser By Sam Blowes
+ *
+ * Designed for HTML5 documents
+ *
+ * Original code by John Resig (ejohn.org)
+ * http://ejohn.org/blog/pure-javascript-html-parser/
+ * Original code by Erik Arvidsson, Mozilla Public License
+ * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
+ *
+ * ----------------------------------------------------------------------------
+ * License
+ * ----------------------------------------------------------------------------
+ *
+ * This code is triple licensed using Apache Software License 2.0,
+ * Mozilla Public License or GNU Public License
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * 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
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * The Original Code is Simple HTML Parser.
+ *
+ * The Initial Developer of the Original Code is Erik Arvidsson.
+ * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights
+ * Reserved.
+ *
+ * ////////////////////////////////////////////////////////////////////////////
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ----------------------------------------------------------------------------
+ * Usage
+ * ----------------------------------------------------------------------------
+ *
+ * // Use like so:
+ * HTMLParser(htmlString, {
+ * start: function(tag, attrs, unary) {},
+ * end: function(tag) {},
+ * chars: function(text) {},
+ * comment: function(text) {}
+ * });
+ *
+ * // or to get an XML string:
+ * HTMLtoXML(htmlString);
+ *
+ * // or to get an XML DOM Document
+ * HTMLtoDOM(htmlString);
+ *
+ * // or to inject into an existing document/DOM node
+ * HTMLtoDOM(htmlString, document);
+ * HTMLtoDOM(htmlString, document.body);
+ *
+ */
+// Regular Expressions for parsing tags and attributes
+var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5
+
+var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); // Block Elements - HTML 5
+// fixed by xxx 将 ins 标签从块级名单中移除
+
+var block = makeMap('a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); // Inline Elements - HTML 5
+
+var inline = makeMap('abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); // Elements that you can, intentionally, leave open
+// (and which close themselves)
+
+var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled"
+
+var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); // Special Elements (can contain anything)
+
+var special = makeMap('script,style');
+function HTMLParser(html, handler) {
+ var index;
+ var chars;
+ var match;
+ var stack = [];
+ var last = html;
+
+ stack.last = function () {
+ return this[this.length - 1];
+ };
+
+ while (html) {
+ chars = true; // Make sure we're not in a script or style element
+
+ if (!stack.last() || !special[stack.last()]) {
+ // Comment
+ if (html.indexOf('');
+
+ if (index >= 0) {
+ if (handler.comment) {
+ handler.comment(html.substring(4, index));
+ }
+
+ html = html.substring(index + 3);
+ chars = false;
+ } // end tag
+
+ } else if (html.indexOf('') == 0) {
+ match = html.match(endTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(endTag, parseEndTag);
+ chars = false;
+ } // start tag
+
+ } else if (html.indexOf('<') == 0) {
+ match = html.match(startTag);
+
+ if (match) {
+ html = html.substring(match[0].length);
+ match[0].replace(startTag, parseStartTag);
+ chars = false;
+ }
+ }
+
+ if (chars) {
+ index = html.indexOf('<');
+ var text = index < 0 ? html : html.substring(0, index);
+ html = index < 0 ? '' : html.substring(index);
+
+ if (handler.chars) {
+ handler.chars(text);
+ }
+ }
+ } else {
+ html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function (all, text) {
+ text = text.replace(/|/g, '$1$2');
+
+ if (handler.chars) {
+ handler.chars(text);
+ }
+
+ return '';
+ });
+ parseEndTag('', stack.last());
+ }
+
+ if (html == last) {
+ throw 'Parse Error: ' + html;
+ }
+
+ last = html;
+ } // Clean up any remaining tags
+
+
+ parseEndTag();
+
+ function parseStartTag(tag, tagName, rest, unary) {
+ tagName = tagName.toLowerCase();
+
+ if (block[tagName]) {
+ while (stack.last() && inline[stack.last()]) {
+ parseEndTag('', stack.last());
+ }
+ }
+
+ if (closeSelf[tagName] && stack.last() == tagName) {
+ parseEndTag('', tagName);
+ }
+
+ unary = empty[tagName] || !!unary;
+
+ if (!unary) {
+ stack.push(tagName);
+ }
+
+ if (handler.start) {
+ var attrs = [];
+ rest.replace(attr, function (match, name) {
+ var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[name] ? name : '';
+ attrs.push({
+ name: name,
+ value: value,
+ escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // "
+
+ });
+ });
+
+ if (handler.start) {
+ handler.start(tagName, attrs, unary);
+ }
+ }
+ }
+
+ function parseEndTag(tag, tagName) {
+ // If no tag name is provided, clean shop
+ if (!tagName) {
+ var pos = 0;
+ } // Find the closest opened tag of the same type
+ else {
+ for (var pos = stack.length - 1; pos >= 0; pos--) {
+ if (stack[pos] == tagName) {
+ break;
+ }
+ }
+ }
+
+ if (pos >= 0) {
+ // Close all the open elements, up the stack
+ for (var i = stack.length - 1; i >= pos; i--) {
+ if (handler.end) {
+ handler.end(stack[i]);
+ }
+ } // Remove the open elements from the stack
+
+
+ stack.length = pos;
+ }
+ }
+}
+
+function makeMap(str) {
+ var obj = {};
+ var items = str.split(',');
+
+ for (var i = 0; i < items.length; i++) {
+ obj[items[i]] = true;
+ }
+
+ return obj;
+}
+
+function removeDOCTYPE(html) {
+ return html.replace(/<\?xml.*\?>\n/, '').replace(/\n/, '').replace(/\n/, '');
+}
+
+function parseAttrs(attrs) {
+ return attrs.reduce(function (pre, attr) {
+ var value = attr.value;
+ var name = attr.name;
+
+ if (pre[name]) {
+ pre[name] = pre[name] + " " + value;
+ } else {
+ pre[name] = value;
+ }
+
+ return pre;
+ }, {});
+}
+
+function parseHtml(html) {
+ html = removeDOCTYPE(html);
+ var stacks = [];
+ var results = {
+ node: 'root',
+ children: []
+ };
+ HTMLParser(html, {
+ start: function start(tag, attrs, unary) {
+ var node = {
+ name: tag
+ };
+
+ if (attrs.length !== 0) {
+ node.attrs = parseAttrs(attrs);
+ }
+
+ if (unary) {
+ var parent = stacks[0] || results;
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ } else {
+ stacks.unshift(node);
+ }
+ },
+ end: function end(tag) {
+ var node = stacks.shift();
+ if (node.name !== tag) console.error('invalid state: mismatch end tag');
+
+ if (stacks.length === 0) {
+ results.children.push(node);
+ } else {
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ },
+ chars: function chars(text) {
+ var node = {
+ type: 'text',
+ text: text
+ };
+
+ if (stacks.length === 0) {
+ results.children.push(node);
+ } else {
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ },
+ comment: function comment(text) {
+ var node = {
+ node: 'comment',
+ text: text
+ };
+ var parent = stacks[0];
+
+ if (!parent.children) {
+ parent.children = [];
+ }
+
+ parent.children.push(node);
+ }
+ });
+ return results.children;
+}
+
+export default parseHtml;
diff --git a/common/image.js b/common/image.js
new file mode 100644
index 0000000..66ad9e3
--- /dev/null
+++ b/common/image.js
@@ -0,0 +1,76 @@
+// 读取图片 Base64 内容
+export function TaImageToBase64(file, maxw = 500) {
+ return new Promise((resolve, reject) => {
+ if (uni.compressImage) {
+ uni.compressImage({
+ src: file,
+ quality: 80,
+ width: maxw + "px",
+ fail: err => reject(err),
+ success: res =>
+ readFileAsBase64(res.tempFilePath)
+ .then(resolve)
+ .catch(reject)
+ })
+ } else {
+ let img = new Image();
+ (img.crossOrigin = "Anonymous"),
+ (img.onload = () => {
+ let c = document.createElement("canvas")
+ let w = img.naturalWidth,
+ h = img.naturalHeight;
+ (c.width = Math.min(maxw, w)), (c.height = c.width * (h / w))
+ // @ts-ignore
+ c.getContext("2d").drawImage(img, 0, 0, c.width, c.height)
+ resolve(c.toDataURL("image/jpeg", 0.8))
+ }),
+ (img.src = file),
+ (img.onerror = () => reject(new Error("Failed to load image")))
+ }
+ })
+
+ // 读取文件为 base64 格式
+ function readFileAsBase64(file) {
+ return new Promise((resolve, reject) => {
+ let rd = new plus.io.FileReader()
+ rd.onerror = e => reject(e)
+ rd.onloadend = v => resolve(v.target.result)
+ // @ts-ignore
+ rd.readAsDataURL(plus.io.convertLocalFileSystemURL(file))
+ })
+ }
+}
+
+// 下载图片到本地
+export function TaImageDownload(imgUrl, name = "") {
+ return new Promise((resolve, reject) => {
+ // #ifdef H5
+ const link = document.createElement("a")
+ link.href = imgUrl
+ link.download =
+ name ||
+ Math.random()
+ .toString()
+ .replace("0.", "img") + `.png`
+ link.style.display = "none"
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ resolve(true)
+ // #endif
+
+ // #ifndef H5
+ uni.downloadFile({
+ url: imgUrl,
+ success: ret => {
+ if (ret.statusCode === 200)
+ uni.saveImageToPhotosAlbum({
+ filePath: ret.tempFilePath,
+ fail: err => TaToast.error("保存失败!", err).then(reject),
+ success: () => TaToast.success("保存成功!").then(resolve)
+ })
+ }
+ })
+ // #endif
+ })
+}
\ No newline at end of file
diff --git a/common/qqmap-wx-jssdk.js b/common/qqmap-wx-jssdk.js
new file mode 100644
index 0000000..595b65b
--- /dev/null
+++ b/common/qqmap-wx-jssdk.js
@@ -0,0 +1,1122 @@
+/**
+ * 微信小程序JavaScriptSDK
+ *
+ * @version 1.2
+ * @date 2019-03-06
+ */
+
+var ERROR_CONF = {
+ KEY_ERR: 311,
+ KEY_ERR_MSG: 'key格式错误',
+ PARAM_ERR: 310,
+ PARAM_ERR_MSG: '请求参数信息有误',
+ SYSTEM_ERR: 600,
+ SYSTEM_ERR_MSG: '系统错误',
+ WX_ERR_CODE: 1000,
+ WX_OK_CODE: 200
+};
+var BASE_URL = 'https://apis.map.qq.com/ws/';
+var URL_SEARCH = BASE_URL + 'place/v1/search';
+var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion';
+var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/';
+var URL_CITY_LIST = BASE_URL + 'district/v1/list';
+var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren';
+var URL_DISTANCE = BASE_URL + 'distance/v1/';
+var URL_DIRECTION = BASE_URL + 'direction/v1/';
+var MODE = {
+ driving: 'driving',
+ transit: 'transit'
+};
+var EARTH_RADIUS = 6378136.49;
+var Utils = {
+ /**
+ * md5加密方法
+ * 版权所有©2011 Sebastian Tschan,https://blueimp.net
+ */
+ safeAdd(x, y) {
+ var lsw = (x & 0xffff) + (y & 0xffff);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xffff);
+ },
+ bitRotateLeft(num, cnt) {
+ return (num << cnt) | (num >>> (32 - cnt));
+ },
+ md5cmn(q, a, b, x, s, t) {
+ return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b);
+ },
+ md5ff(a, b, c, d, x, s, t) {
+ return this.md5cmn((b & c) | (~b & d), a, b, x, s, t);
+ },
+ md5gg(a, b, c, d, x, s, t) {
+ return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t);
+ },
+ md5hh(a, b, c, d, x, s, t) {
+ return this.md5cmn(b ^ c ^ d, a, b, x, s, t);
+ },
+ md5ii(a, b, c, d, x, s, t) {
+ return this.md5cmn(c ^ (b | ~d), a, b, x, s, t);
+ },
+ binlMD5(x, len) {
+ /* append padding */
+ x[len >> 5] |= 0x80 << (len % 32);
+ x[((len + 64) >>> 9 << 4) + 14] = len;
+
+ var i;
+ var olda;
+ var oldb;
+ var oldc;
+ var oldd;
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+
+ for (i = 0; i < x.length; i += 16) {
+ olda = a;
+ oldb = b;
+ oldc = c;
+ oldd = d;
+
+ a = this.md5ff(a, b, c, d, x[i], 7, -680876936);
+ d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+ c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+ b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+ a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+ d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+ c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+ b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+ a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+ d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+ c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063);
+ b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+ a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+ d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+ c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+ b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+
+ a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+ d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+ c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+ b = this.md5gg(b, c, d, a, x[i], 20, -373897302);
+ a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+ d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+ c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+ b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+ a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+ d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+ c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+ b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+ a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+ d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+ c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+ b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+
+ a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558);
+ d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+ c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+ b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+ a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+ d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+ c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+ b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+ a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+ d = this.md5hh(d, a, b, c, x[i], 11, -358537222);
+ c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+ b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+ a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+ d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+ c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+ b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+
+ a = this.md5ii(a, b, c, d, x[i], 6, -198630844);
+ d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+ c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+ b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+ a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+ d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+ c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+ b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+ a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+ d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+ c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+ b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+ a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+ d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+ c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+ b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+
+ a = this.safeAdd(a, olda);
+ b = this.safeAdd(b, oldb);
+ c = this.safeAdd(c, oldc);
+ d = this.safeAdd(d, oldd);
+ }
+ return [a, b, c, d];
+ },
+ binl2rstr(input) {
+ var i;
+ var output = '';
+ var length32 = input.length * 32;
+ for (i = 0; i < length32; i += 8) {
+ output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);
+ }
+ return output;
+ },
+ rstr2binl(input) {
+ var i;
+ var output = [];
+ output[(input.length >> 2) - 1] = undefined;
+ for (i = 0; i < output.length; i += 1) {
+ output[i] = 0;
+ }
+ var length8 = input.length * 8;
+ for (i = 0; i < length8; i += 8) {
+ output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);
+ }
+ return output;
+ },
+ rstrMD5(s) {
+ return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8));
+ },
+ rstrHMACMD5(key, data) {
+ var i;
+ var bkey = this.rstr2binl(key);
+ var ipad = [];
+ var opad = [];
+ var hash;
+ ipad[15] = opad[15] = undefined;
+ if (bkey.length > 16) {
+ bkey = this.binlMD5(bkey, key.length * 8);
+ }
+ for (i = 0; i < 16; i += 1) {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5c5c5c5c;
+ }
+ hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8);
+ return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128));
+ },
+ rstr2hex(input) {
+ var hexTab = '0123456789abcdef';
+ var output = '';
+ var x;
+ var i;
+ for (i = 0; i < input.length; i += 1) {
+ x = input.charCodeAt(i);
+ output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
+ }
+ return output;
+ },
+ str2rstrUTF8(input) {
+ return unescape(encodeURIComponent(input));
+ },
+ rawMD5(s) {
+ return this.rstrMD5(this.str2rstrUTF8(s));
+ },
+ hexMD5(s) {
+ return this.rstr2hex(this.rawMD5(s));
+ },
+ rawHMACMD5(k, d) {
+ return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d));
+ },
+ hexHMACMD5(k, d) {
+ return this.rstr2hex(this.rawHMACMD5(k, d));
+ },
+
+ md5(string, key, raw) {
+ if (!key) {
+ if (!raw) {
+ return this.hexMD5(string);
+ }
+ return this.rawMD5(string);
+ }
+ if (!raw) {
+ return this.hexHMACMD5(key, string);
+ }
+ return this.rawHMACMD5(key, string);
+ },
+ /**
+ * 得到md5加密后的sig参数
+ * @param {Object} requestParam 接口参数
+ * @param {String} sk签名字符串
+ * @param {String} featrue 方法名
+ * @return 返回加密后的sig参数
+ */
+ getSig(requestParam, sk, feature, mode) {
+ var sig = null;
+ var requestArr = [];
+ Object.keys(requestParam).sort().forEach(function(key){
+ requestArr.push(key + '=' + requestParam[key]);
+ });
+ if (feature == 'search') {
+ sig = '/ws/place/v1/search?' + requestArr.join('&') + sk;
+ }
+ if (feature == 'suggest') {
+ sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk;
+ }
+ if (feature == 'reverseGeocoder') {
+ sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
+ }
+ if (feature == 'geocoder') {
+ sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
+ }
+ if (feature == 'getCityList') {
+ sig = '/ws/district/v1/list?' + requestArr.join('&') + sk;
+ }
+ if (feature == 'getDistrictByCityId') {
+ sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk;
+ }
+ if (feature == 'calculateDistance') {
+ sig = '/ws/distance/v1/?' + requestArr.join('&') + sk;
+ }
+ if (feature == 'direction') {
+ sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk;
+ }
+ sig = this.md5(sig);
+ return sig;
+ },
+ /**
+ * 得到终点query字符串
+ * @param {Array|String} 检索数据
+ */
+ location2query(data) {
+ if (typeof data == 'string') {
+ return data;
+ }
+ var query = '';
+ for (var i = 0; i < data.length; i++) {
+ var d = data[i];
+ if (!!query) {
+ query += ';';
+ }
+ if (d.location) {
+ query = query + d.location.lat + ',' + d.location.lng;
+ }
+ if (d.latitude && d.longitude) {
+ query = query + d.latitude + ',' + d.longitude;
+ }
+ }
+ return query;
+ },
+
+ /**
+ * 计算角度
+ */
+ rad(d) {
+ return d * Math.PI / 180.0;
+ },
+ /**
+ * 处理终点location数组
+ * @return 返回终点数组
+ */
+ getEndLocation(location){
+ var to = location.split(';');
+ var endLocation = [];
+ for (var i = 0; i < to.length; i++) {
+ endLocation.push({
+ lat: parseFloat(to[i].split(',')[0]),
+ lng: parseFloat(to[i].split(',')[1])
+ })
+ }
+ return endLocation;
+ },
+
+ /**
+ * 计算两点间直线距离
+ * @param a 表示纬度差
+ * @param b 表示经度差
+ * @return 返回的是距离,单位m
+ */
+ getDistance(latFrom, lngFrom, latTo, lngTo) {
+ var radLatFrom = this.rad(latFrom);
+ var radLatTo = this.rad(latTo);
+ var a = radLatFrom - radLatTo;
+ var b = this.rad(lngFrom) - this.rad(lngTo);
+ var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2)));
+ distance = distance * EARTH_RADIUS;
+ distance = Math.round(distance * 10000) / 10000;
+ return parseFloat(distance.toFixed(0));
+ },
+ /**
+ * 使用微信接口进行定位
+ */
+ getWXLocation(success, fail, complete) {
+ wx.getLocation({
+ type: 'gcj02',
+ success: success,
+ fail: fail,
+ complete: complete
+ });
+ },
+
+ /**
+ * 获取location参数
+ */
+ getLocationParam(location) {
+ if (typeof location == 'string') {
+ var locationArr = location.split(',');
+ if (locationArr.length === 2) {
+ location = {
+ latitude: location.split(',')[0],
+ longitude: location.split(',')[1]
+ };
+ } else {
+ location = {};
+ }
+ }
+ return location;
+ },
+
+ /**
+ * 回调函数默认处理
+ */
+ polyfillParam(param) {
+ param.success = param.success || function () { };
+ param.fail = param.fail || function () { };
+ param.complete = param.complete || function () { };
+ },
+
+ /**
+ * 验证param对应的key值是否为空
+ *
+ * @param {Object} param 接口参数
+ * @param {String} key 对应参数的key
+ */
+ checkParamKeyEmpty(param, key) {
+ if (!param[key]) {
+ var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误');
+ param.fail(errconf);
+ param.complete(errconf);
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * 验证参数中是否存在检索词keyword
+ *
+ * @param {Object} param 接口参数
+ */
+ checkKeyword(param){
+ return !this.checkParamKeyEmpty(param, 'keyword');
+ },
+
+ /**
+ * 验证location值
+ *
+ * @param {Object} param 接口参数
+ */
+ checkLocation(param) {
+ var location = this.getLocationParam(param.location);
+ if (!location || !location.latitude || !location.longitude) {
+ var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误');
+ param.fail(errconf);
+ param.complete(errconf);
+ return false;
+ }
+ return true;
+ },
+
+ /**
+ * 构造错误数据结构
+ * @param {Number} errCode 错误码
+ * @param {Number} errMsg 错误描述
+ */
+ buildErrorConfig(errCode, errMsg) {
+ return {
+ status: errCode,
+ message: errMsg
+ };
+ },
+
+ /**
+ *
+ * 数据处理函数
+ * 根据传入参数不同处理不同数据
+ * @param {String} feature 功能名称
+ * search 地点搜索
+ * suggest关键词提示
+ * reverseGeocoder逆地址解析
+ * geocoder地址解析
+ * getCityList获取城市列表:父集
+ * getDistrictByCityId获取区县列表:子集
+ * calculateDistance距离计算
+ * @param {Object} param 接口参数
+ * @param {Object} data 数据
+ */
+ handleData(param,data,feature){
+ if (feature == 'search') {
+ var searchResult = data.data;
+ var searchSimplify = [];
+ for (var i = 0; i < searchResult.length; i++) {
+ searchSimplify.push({
+ id: searchResult[i].id || null,
+ title: searchResult[i].title || null,
+ latitude: searchResult[i].location && searchResult[i].location.lat || null,
+ longitude: searchResult[i].location && searchResult[i].location.lng || null,
+ address: searchResult[i].address || null,
+ category: searchResult[i].category || null,
+ tel: searchResult[i].tel || null,
+ adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null,
+ city: searchResult[i].ad_info && searchResult[i].ad_info.city || null,
+ district: searchResult[i].ad_info && searchResult[i].ad_info.district || null,
+ province: searchResult[i].ad_info && searchResult[i].ad_info.province || null
+ })
+ }
+ param.success(data, {
+ searchResult: searchResult,
+ searchSimplify: searchSimplify
+ })
+ } else if (feature == 'suggest') {
+ var suggestResult = data.data;
+ var suggestSimplify = [];
+ for (var i = 0; i < suggestResult.length; i++) {
+ suggestSimplify.push({
+ adcode: suggestResult[i].adcode || null,
+ address: suggestResult[i].address || null,
+ category: suggestResult[i].category || null,
+ city: suggestResult[i].city || null,
+ district: suggestResult[i].district || null,
+ id: suggestResult[i].id || null,
+ latitude: suggestResult[i].location && suggestResult[i].location.lat || null,
+ longitude: suggestResult[i].location && suggestResult[i].location.lng || null,
+ province: suggestResult[i].province || null,
+ title: suggestResult[i].title || null,
+ type: suggestResult[i].type || null
+ })
+ }
+ param.success(data, {
+ suggestResult: suggestResult,
+ suggestSimplify: suggestSimplify
+ })
+ } else if (feature == 'reverseGeocoder') {
+ var reverseGeocoderResult = data.result;
+ var reverseGeocoderSimplify = {
+ address: reverseGeocoderResult.address || null,
+ latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null,
+ longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null,
+ adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null,
+ city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null,
+ district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null,
+ nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null,
+ province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null,
+ street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null,
+ street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null,
+ recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null,
+ rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null
+ };
+ if (reverseGeocoderResult.pois) {//判断是否返回周边poi
+ var pois = reverseGeocoderResult.pois;
+ var poisSimplify = [];
+ for (var i = 0;i < pois.length;i++) {
+ poisSimplify.push({
+ id: pois[i].id || null,
+ title: pois[i].title || null,
+ latitude: pois[i].location && pois[i].location.lat || null,
+ longitude: pois[i].location && pois[i].location.lng || null,
+ address: pois[i].address || null,
+ category: pois[i].category || null,
+ adcode: pois[i].ad_info && pois[i].ad_info.adcode || null,
+ city: pois[i].ad_info && pois[i].ad_info.city || null,
+ district: pois[i].ad_info && pois[i].ad_info.district || null,
+ province: pois[i].ad_info && pois[i].ad_info.province || null
+ })
+ }
+ param.success(data,{
+ reverseGeocoderResult: reverseGeocoderResult,
+ reverseGeocoderSimplify: reverseGeocoderSimplify,
+ pois: pois,
+ poisSimplify: poisSimplify
+ })
+ } else {
+ param.success(data, {
+ reverseGeocoderResult: reverseGeocoderResult,
+ reverseGeocoderSimplify: reverseGeocoderSimplify
+ })
+ }
+ } else if (feature == 'geocoder') {
+ var geocoderResult = data.result;
+ var geocoderSimplify = {
+ title: geocoderResult.title || null,
+ latitude: geocoderResult.location && geocoderResult.location.lat || null,
+ longitude: geocoderResult.location && geocoderResult.location.lng || null,
+ adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null,
+ province: geocoderResult.address_components && geocoderResult.address_components.province || null,
+ city: geocoderResult.address_components && geocoderResult.address_components.city || null,
+ district: geocoderResult.address_components && geocoderResult.address_components.district || null,
+ street: geocoderResult.address_components && geocoderResult.address_components.street || null,
+ street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null,
+ level: geocoderResult.level || null
+ };
+ param.success(data,{
+ geocoderResult: geocoderResult,
+ geocoderSimplify: geocoderSimplify
+ });
+ } else if (feature == 'getCityList') {
+ var provinceResult = data.result[0];
+ var cityResult = data.result[1];
+ var districtResult = data.result[2];
+ param.success(data,{
+ provinceResult: provinceResult,
+ cityResult: cityResult,
+ districtResult: districtResult
+ });
+ } else if (feature == 'getDistrictByCityId') {
+ var districtByCity = data.result[0];
+ param.success(data, districtByCity);
+ } else if (feature == 'calculateDistance') {
+ var calculateDistanceResult = data.result.elements;
+ var distance = [];
+ for (var i = 0; i < calculateDistanceResult.length; i++){
+ distance.push(calculateDistanceResult[i].distance);
+ }
+ param.success(data, {
+ calculateDistanceResult: calculateDistanceResult,
+ distance: distance
+ });
+ } else if (feature == 'direction') {
+ var direction = data.result.routes;
+ param.success(data,direction);
+ } else {
+ param.success(data);
+ }
+ },
+
+ /**
+ * 构造微信请求参数,公共属性处理
+ *
+ * @param {Object} param 接口参数
+ * @param {Object} param 配置项
+ * @param {String} feature 方法名
+ */
+ buildWxRequestConfig(param, options, feature) {
+ var that = this;
+ options.header = { "content-type": "application/json" };
+ options.method = 'GET';
+ options.success = function (res) {
+ var data = res.data;
+ if (data.status === 0) {
+ that.handleData(param, data, feature);
+ } else {
+ param.fail(data);
+ }
+ };
+ options.fail = function (res) {
+ res.statusCode = ERROR_CONF.WX_ERR_CODE;
+ param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+ };
+ options.complete = function (res) {
+ var statusCode = +res.statusCode;
+ switch(statusCode) {
+ case ERROR_CONF.WX_ERR_CODE: {
+ param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+ break;
+ }
+ case ERROR_CONF.WX_OK_CODE: {
+ var data = res.data;
+ if (data.status === 0) {
+ param.complete(data);
+ } else {
+ param.complete(that.buildErrorConfig(data.status, data.message));
+ }
+ break;
+ }
+ default:{
+ param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG));
+ }
+
+ }
+ };
+ return options;
+ },
+
+ /**
+ * 处理用户参数是否传入坐标进行不同的处理
+ */
+ locationProcess(param, locationsuccess, locationfail, locationcomplete) {
+ var that = this;
+ locationfail = locationfail || function (res) {
+ res.statusCode = ERROR_CONF.WX_ERR_CODE;
+ param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+ };
+ locationcomplete = locationcomplete || function (res) {
+ if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
+ param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+ }
+ };
+ if (!param.location) {
+ that.getWXLocation(locationsuccess, locationfail, locationcomplete);
+ } else if (that.checkLocation(param)) {
+ var location = Utils.getLocationParam(param.location);
+ locationsuccess(location);
+ }
+ }
+};
+
+
+class QQMapWX {
+
+ /**
+ * 构造函数
+ *
+ * @param {Object} options 接口参数,key 为必选参数
+ */
+ constructor(options) {
+ if (!options.key) {
+ throw Error('key值不能为空');
+ }
+ this.key = options.key;
+ };
+
+ /**
+ * POI周边检索
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 参数对象结构可以参考
+ * @see http://lbs.qq.com/webservice_v1/guide-search.html
+ */
+ search(options) {
+ var that = this;
+ options = options || {};
+
+ Utils.polyfillParam(options);
+
+ if (!Utils.checkKeyword(options)) {
+ return;
+ }
+
+ var requestParam = {
+ keyword: options.keyword,
+ orderby: options.orderby || '_distance',
+ page_size: options.page_size || 10,
+ page_index: options.page_index || 1,
+ output: 'json',
+ key: that.key
+ };
+
+ if (options.address_format) {
+ requestParam.address_format = options.address_format;
+ }
+
+ if (options.filter) {
+ requestParam.filter = options.filter;
+ }
+
+ var distance = options.distance || "1000";
+ var auto_extend = options.auto_extend || 1;
+ var region = null;
+ var rectangle = null;
+
+ //判断城市限定参数
+ if (options.region) {
+ region = options.region;
+ }
+
+ //矩形限定坐标(暂时只支持字符串格式)
+ if (options.rectangle) {
+ rectangle = options.rectangle;
+ }
+
+ var locationsuccess = function (result) {
+ if (region && !rectangle) {
+ //城市限定参数拼接
+ requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")";
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+ }
+ } else if (rectangle && !region) {
+ //矩形搜索
+ requestParam.boundary = "rectangle(" + rectangle + ")";
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+ }
+ } else {
+ requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")";
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+ }
+ }
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_SEARCH,
+ data: requestParam
+ }, 'search'));
+ };
+ Utils.locationProcess(options, locationsuccess);
+ };
+
+ /**
+ * sug模糊检索
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 参数对象结构可以参考
+ * http://lbs.qq.com/webservice_v1/guide-suggestion.html
+ */
+ getSuggestion(options) {
+ var that = this;
+ options = options || {};
+ Utils.polyfillParam(options);
+
+ if (!Utils.checkKeyword(options)) {
+ return;
+ }
+
+ var requestParam = {
+ keyword: options.keyword,
+ region: options.region || '全国',
+ region_fix: options.region_fix || 0,
+ policy: options.policy || 0,
+ page_size: options.page_size || 10,//控制显示条数
+ page_index: options.page_index || 1,//控制页数
+ get_subpois : options.get_subpois || 0,//返回子地点
+ output: 'json',
+ key: that.key
+ };
+ //长地址
+ if (options.address_format) {
+ requestParam.address_format = options.address_format;
+ }
+ //过滤
+ if (options.filter) {
+ requestParam.filter = options.filter;
+ }
+ //排序
+ if (options.location) {
+ var locationsuccess = function (result) {
+ requestParam.location = result.latitude + ',' + result.longitude;
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
+ }
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_SUGGESTION,
+ data: requestParam
+ }, "suggest"));
+ };
+ Utils.locationProcess(options, locationsuccess);
+ } else {
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
+ }
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_SUGGESTION,
+ data: requestParam
+ }, "suggest"));
+ }
+ };
+
+ /**
+ * 逆地址解析
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 请求参数结构可以参考
+ * http://lbs.qq.com/webservice_v1/guide-gcoder.html
+ */
+ reverseGeocoder(options) {
+ var that = this;
+ options = options || {};
+ Utils.polyfillParam(options);
+ var requestParam = {
+ coord_type: options.coord_type || 5,
+ get_poi: options.get_poi || 0,
+ output: 'json',
+ key: that.key
+ };
+ if (options.poi_options) {
+ requestParam.poi_options = options.poi_options
+ }
+
+ var locationsuccess = function (result) {
+ requestParam.location = result.latitude + ',' + result.longitude;
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder');
+ }
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_GET_GEOCODER,
+ data: requestParam
+ }, 'reverseGeocoder'));
+ };
+ Utils.locationProcess(options, locationsuccess);
+ };
+
+ /**
+ * 地址解析
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 请求参数结构可以参考
+ * http://lbs.qq.com/webservice_v1/guide-geocoder.html
+ */
+ geocoder(options) {
+ var that = this;
+ options = options || {};
+ Utils.polyfillParam(options);
+
+ if (Utils.checkParamKeyEmpty(options, 'address')) {
+ return;
+ }
+
+ var requestParam = {
+ address: options.address,
+ output: 'json',
+ key: that.key
+ };
+
+ //城市限定
+ if (options.region) {
+ requestParam.region = options.region;
+ }
+
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder');
+ }
+
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_GET_GEOCODER,
+ data: requestParam
+ },'geocoder'));
+ };
+
+
+ /**
+ * 获取城市列表
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 请求参数结构可以参考
+ * http://lbs.qq.com/webservice_v1/guide-region.html
+ */
+ getCityList(options) {
+ var that = this;
+ options = options || {};
+ Utils.polyfillParam(options);
+ var requestParam = {
+ output: 'json',
+ key: that.key
+ };
+
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList');
+ }
+
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_CITY_LIST,
+ data: requestParam
+ },'getCityList'));
+ };
+
+ /**
+ * 获取对应城市ID的区县列表
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 请求参数结构可以参考
+ * http://lbs.qq.com/webservice_v1/guide-region.html
+ */
+ getDistrictByCityId(options) {
+ var that = this;
+ options = options || {};
+ Utils.polyfillParam(options);
+
+ if (Utils.checkParamKeyEmpty(options, 'id')) {
+ return;
+ }
+
+ var requestParam = {
+ id: options.id || '',
+ output: 'json',
+ key: that.key
+ };
+
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId');
+ }
+
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_AREA_LIST,
+ data: requestParam
+ },'getDistrictByCityId'));
+ };
+
+ /**
+ * 用于单起点到多终点的路线距离(非直线距离)计算:
+ * 支持两种距离计算方式:步行和驾车。
+ * 起点到终点最大限制直线距离10公里。
+ *
+ * 新增直线距离计算。
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 请求参数结构可以参考
+ * http://lbs.qq.com/webservice_v1/guide-distance.html
+ */
+ calculateDistance(options) {
+ var that = this;
+ options = options || {};
+ Utils.polyfillParam(options);
+
+ if (Utils.checkParamKeyEmpty(options, 'to')) {
+ return;
+ }
+
+ var requestParam = {
+ mode: options.mode || 'walking',
+ to: Utils.location2query(options.to),
+ output: 'json',
+ key: that.key
+ };
+
+ if (options.from) {
+ options.location = options.from;
+ }
+
+ //计算直线距离
+ if(requestParam.mode == 'straight'){
+ var locationsuccess = function (result) {
+ var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标
+ var data = {
+ message:"query ok",
+ result:{
+ elements:[]
+ },
+ status:0
+ };
+ for (var i = 0; i < locationTo.length; i++) {
+ data.result.elements.push({//将坐标存入
+ distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng),
+ duration:0,
+ from:{
+ lat: result.latitude,
+ lng:result.longitude
+ },
+ to:{
+ lat: locationTo[i].lat,
+ lng: locationTo[i].lng
+ }
+ });
+ }
+ var calculateResult = data.result.elements;
+ var distanceResult = [];
+ for (var i = 0; i < calculateResult.length; i++) {
+ distanceResult.push(calculateResult[i].distance);
+ }
+ return options.success(data,{
+ calculateResult: calculateResult,
+ distanceResult: distanceResult
+ });
+ };
+
+ Utils.locationProcess(options, locationsuccess);
+ } else {
+ var locationsuccess = function (result) {
+ requestParam.from = result.latitude + ',' + result.longitude;
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance');
+ }
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: URL_DISTANCE,
+ data: requestParam
+ },'calculateDistance'));
+ };
+
+ Utils.locationProcess(options, locationsuccess);
+ }
+ };
+
+ /**
+ * 路线规划:
+ *
+ * @param {Object} options 接口参数对象
+ *
+ * 请求参数结构可以参考
+ * https://lbs.qq.com/webservice_v1/guide-road.html
+ */
+ direction(options) {
+ var that = this;
+ options = options || {};
+ Utils.polyfillParam(options);
+
+ if (Utils.checkParamKeyEmpty(options, 'to')) {
+ return;
+ }
+
+ var requestParam = {
+ output: 'json',
+ key: that.key
+ };
+
+ //to格式处理
+ if (typeof options.to == 'string') {
+ requestParam.to = options.to;
+ } else {
+ requestParam.to = options.to.latitude + ',' + options.to.longitude;
+ }
+ //初始化局部请求域名
+ var SET_URL_DIRECTION = null;
+ //设置默认mode属性
+ options.mode = options.mode || MODE.driving;
+
+ //设置请求域名
+ SET_URL_DIRECTION = URL_DIRECTION + options.mode;
+
+ if (options.from) {
+ options.location = options.from;
+ }
+
+ if (options.mode == MODE.driving) {
+ if (options.from_poi) {
+ requestParam.from_poi = options.from_poi;
+ }
+ if (options.heading) {
+ requestParam.heading = options.heading;
+ }
+ if (options.speed) {
+ requestParam.speed = options.speed;
+ }
+ if (options.accuracy) {
+ requestParam.accuracy = options.accuracy;
+ }
+ if (options.road_type) {
+ requestParam.road_type = options.road_type;
+ }
+ if (options.to_poi) {
+ requestParam.to_poi = options.to_poi;
+ }
+ if (options.from_track) {
+ requestParam.from_track = options.from_track;
+ }
+ if (options.waypoints) {
+ requestParam.waypoints = options.waypoints;
+ }
+ if (options.policy) {
+ requestParam.policy = options.policy;
+ }
+ if (options.plate_number) {
+ requestParam.plate_number = options.plate_number;
+ }
+ }
+
+ if (options.mode == MODE.transit) {
+ if (options.departure_time) {
+ requestParam.departure_time = options.departure_time;
+ }
+ if (options.policy) {
+ requestParam.policy = options.policy;
+ }
+ }
+
+ var locationsuccess = function (result) {
+ requestParam.from = result.latitude + ',' + result.longitude;
+ if (options.sig) {
+ requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction',options.mode);
+ }
+ wx.request(Utils.buildWxRequestConfig(options, {
+ url: SET_URL_DIRECTION,
+ data: requestParam
+ }, 'direction'));
+ };
+
+ Utils.locationProcess(options, locationsuccess);
+ }
+};
+
+module.exports = QQMapWX;
\ No newline at end of file
diff --git a/common/toast.js b/common/toast.js
new file mode 100644
index 0000000..4459bc9
--- /dev/null
+++ b/common/toast.js
@@ -0,0 +1,56 @@
+// Toast 默认延时关闭时间
+const _time_ = 2000;
+
+// Toast 消息处理,最多显示七个汉字
+export const TaToast = {
+
+ // 隐藏消息显示
+ hide() {
+ uni.hideToast()
+ },
+
+ // 通用消息显示
+ show(info, type = 'none', mask = true, time = _time_) {
+ return new Promise(resolve => {
+ setTimeout(resolve, time)
+ uni.showToast({
+ mask: mask || false,
+ icon: type || 'none',
+ title: info,
+ duration: time
+ })
+ })
+ },
+
+ // 异常消息显示
+ error(info, mask = true, time = _time_) {
+ return this.show(info, 'error', mask, time)
+ },
+
+ // 成功消息显示
+ success(info, mask = true, time = _time_) {
+ return this.show(info, 'success', mask, time)
+ },
+
+ // 确认消息框架
+ confirm(content, title = '操作确认?') {
+ return new Promise((resolve, reject) => uni.showModal({
+ title,
+ content,
+ success: (res) => (res.cancel && reject(), res.confirm && resolve(res))
+ }))
+ },
+
+ // 显示加载消息
+ loading(info = '', mask = true) {
+ uni.showLoading({
+ mask: mask,
+ title: info
+ })
+ },
+
+ // 隐藏加载消息
+ loadhide() {
+ uni.hideLoading()
+ }
+}
\ No newline at end of file
diff --git a/common/util.js b/common/util.js
new file mode 100644
index 0000000..d7c3887
--- /dev/null
+++ b/common/util.js
@@ -0,0 +1,89 @@
+function friendlyDate(timestamp) {
+ var formats = {
+ 'year': '%n% 年前',
+ 'month': '%n% 月前',
+ 'day': '%n% 天前',
+ 'hour': '%n% 小时前',
+ 'minute': '%n% 分钟前',
+ 'second': '%n% 秒前',
+ };
+
+ var now = Date.now();
+ var seconds = Math.floor((now - timestamp) / 1000);
+ var minutes = Math.floor(seconds / 60);
+ var hours = Math.floor(minutes / 60);
+ var days = Math.floor(hours / 24);
+ var months = Math.floor(days / 30);
+ var years = Math.floor(months / 12);
+
+ var diffType = '';
+ var diffValue = 0;
+ if (years > 0) {
+ diffType = 'year';
+ diffValue = years;
+ } else {
+ if (months > 0) {
+ diffType = 'month';
+ diffValue = months;
+ } else {
+ if (days > 0) {
+ diffType = 'day';
+ diffValue = days;
+ } else {
+ if (hours > 0) {
+ diffType = 'hour';
+ diffValue = hours;
+ } else {
+ if (minutes > 0) {
+ diffType = 'minute';
+ diffValue = minutes;
+ } else {
+ diffType = 'second';
+ diffValue = seconds === 0 ? (seconds = 1) : seconds;
+ }
+ }
+ }
+ }
+ }
+ return formats[diffType].replace('%n%', diffValue);
+}
+
+function objectHasKey(o, k) {
+ return Object.keys(o).some((v) => v.toLowerCase() === k.toLowerCase())
+}
+
+
+// 下载图片到本地
+function TaImageDownload(imgUrl, name = '') {
+ return new Promise((resolve, reject) => {
+
+ // #ifdef H5
+ const link = document.createElement('a')
+ link.href = imgUrl
+ link.download = name || (Math.random().toString().replace('0.', 'img') + `.png`)
+ link.style.display = 'none'
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ resolve(true)
+ // #endif
+
+ // #ifndef H5
+ uni.downloadFile({
+ url: imgUrl, success: (ret) => {
+ if (ret.statusCode === 200) uni.saveImageToPhotosAlbum({
+ filePath: ret.tempFilePath,
+ fail: (err) => TaToast.error('保存失败!', err).then(reject),
+ success: () => TaToast.success('保存成功!').then(resolve),
+ });
+ }
+ });
+ // #endif
+ })
+}
+
+export {
+ TaImageDownload,
+ friendlyDate,
+ objectHasKey
+}
diff --git a/components/i-account-list/i-account-list.vue b/components/i-account-list/i-account-list.vue
new file mode 100644
index 0000000..fa26f09
--- /dev/null
+++ b/components/i-account-list/i-account-list.vue
@@ -0,0 +1,38 @@
+
+
l`K|JYwSok&Dw&oDqkDx$R=QPjta{vMyDR7ew|3*Y*dJFIx#`xGd0=O_5cPsr{em zsJ{-6^QA)Jd=60J-@gJi%QDo2!o6dG(1;f@U7RYV!q5=Fnol)$rIT46eD0FfD3tIc z!^&f?bGDrNVz3f@!CUga&OkUaN(fW1EIqMBekdo&4GXb!hfa&&hxhw z9Y$nqo{XQmS=J3TOgEvXs4 Rg0st<OCf0aT6 Kj0vLe68e6UwEG?Q(B)Ejxz79T{sE7vk~VE)gX{nR002ovPDHLkV1j=tWqtqv literal 0 HcmV?d00001 diff --git a/static/images/icon-city.png b/static/images/icon-city.png new file mode 100644 index 0000000000000000000000000000000000000000..25ad0d28e04375c91a8de47022df9a0a0ddd216d GIT binary patch literal 3356 zcmV+%4de2OP) Px>)=5M`RCr$PolR35#~sF>US2Fv5-l>=vg24#k(^2n5me>k93)Z6C6@%sl3h84 z{RDzfAoK}@K7r6lRW<~4N)Cy^a%|ZS2`GuBltoI*!LltRv9b+%S=f&LJu|yKGu_kO zv$Jb~*bCIY%+5Uh^sk@(Pwxyv7LU1$y=ZCcM=Lu9@P2UQ0oDsfe>uPy#9uIg(O>^T zPtzm#oAkW=o~-|`ZLb7|5`ZOu6~S>8k8`sa7^dgydPEP=eq%!1_T$L$KLG4_NGz3r zT5 7p~d4ONSgVxEkqPq)C0=KoF25=leZ_JUggOi=?JKL!tq_)pa zxOh*p+ja?H6WGX|a~0f8==Y~jgJGm9u+9;7I~_rYszCzeMDSwTzUg&)C&w}8eYOO~ zCUE$TGqwn@6WVj}95{%(x-a*i-&RZxJKK0{u?AnlW_cJt{e96SxLN4SQ$t|vJb=7W zWUC$B7EDeyQ}{Sbs8q)A+MAO}VkZktr~t;z9G26=j$*Q*_eu`ud<=(APUyte3w`;W zQLx-uE0L|797WEyVzS-fnPcPVQ*&D_^yTRhFc2=n8CNOjGsR>xQYsk6p%b%FXUB!6 zfv>fFahJ)G$=oJXC9v`U`oaTbT u{n zMg`+Wk$0JF9wdp^2Wz~pNj5i=M{DJ#SD%nmMD+h%CRdG^jFcjHc`!go?XBcy?ngP@ zAZX>}9hQ@m5n)OrlQ?*yP}@Y*&545UGTDgMnzBVyJXd>?{%v{`fIc%@Ir$mL$yRZ< zmR3Zircx=O@6AbH=s(T@TwUt4DPOw9AB${mliyRvuk_z r$y&atGEf z(lD9M)&(c-n0Eq?YS-lGnJ4GShH9<0o0BbbavVo`gU*wqZ`z%b3ed8flanWOk<=l? z=S$>h8VJ4Fp!cM7w%YFmK})4VijMs$o^RIoXa7AVax_l|dwVALKDQUAdJZAq(k74X z>Lj2V{neim&z@Ub#?m8yHGoMV)9V>AS=ckeYK9M|cq7+c *6uw|#GdT SJ=W(S)Oa)L2GOejP!Fjeu67Ndtu9{YgxgRP-55j&5L1Zko_4bm(xHfynv* zp_*9}qd(TAj&w|prWb*ZW;mLJ&RD>Dm>k^~hL0sjC$T!^K|EDL+aM()CdY;T#E*A2 z1%6{Pi4Uqm=vSJ+=-c06>hP;{emM5#e-W)1gwT#>G#uXFbfHx}FJ*7E(?!i>@0SiW z!5KaYQb#sSj_zEN(37PVoV&M-Ql)InwWD2!aH{K&a-KN(%?b*>qkCIBF|_w(>{HcM zBIvkUzK_|BTU9}_WO6ipd5&&m>PSGx;L2spudiC4aNw`KVHA4i!0SS2+sFLFRSe#~ z9P8?CB?%1?q=seqyF3Mtv&Cs7S9H;lyq?kX8>^n9x61k-4Ebf-W1Za?fBt95LNj3Q zrK33B(POK#c;Ddd_b~tHPOMkC f?X|8zh{iUtwr&^UVd^DCHLzZJ``p@x?l zmj75YVIiRdbkJb9rw7H&b@bi(b9~zXX1ZU;P)BW269`>R9Tv3 AE83+C?;7MVTB=9f8mdDlaxwXhO#eHFUT*n$VF{Pj+Q; zyzoy#r$vLs=b9$;Js%yZg{BJ>B(HCAE~AFfv1C|oU?FBwLyi2PN$9w@Aa>*3G(z8B zz=i5yXevk8F*%ABhCpZ+K@*r9O(Me42O2yWuCJg#gCU`#Cj~n0Q|gc|xuL4hM`{-) zCdX3;39Z_&i||RQBSC1Iuw2^s0;S4hHBS9~$miN|Y)?1(+iSlyl|MiwPO4YXLooU| zFWxPcOStr)b_Ru>JJOcN(4O##fkNPD>nXVZ?Iw++*BP!lqz==D6@m+NXdFHK#TD;V zQt(J y4mP7-?T&Q(m@Up7uwXwx(ap%SR-5jdJ=cJC58d`FYe#jTCdS!p8d-1A3qyuDW8 z6OMkUEBvQpa%ewAt;0rW2PQ{bQZV{OJ);R9%0`PQD$nGiVhf?yd~`@cldD5mVnCj? zBcBT|h!>82C^=fw!|HK3!@nB5+%LAha6JZqEini_{?rZM&7i*OH^_S>KXi$Yh~2 zK#D*|qlMn^2SZ97-8FQ$2u+Tz$Fb3#9G|fK+hH(FNEf 0{i)PmCX1Ug=5@PviXL5`->L5ado z9oFdhh8QhR!QFGR?)Zb}!$M~*IDn=JUGh^$N}&a#P0I~j(J8&3;XfIs4n;!=bTrt} z#jSM=to~KRw#DvW$KspG*#&a+Bj3^T;zXUWDbVT(o#KP03Cr2;pJOzC*mR6f&FeIS zJon%R#vfb@l}i&B)Hpbt;nNIKhoYg@`hM%|tnXTN5_|u>OWtm%Flu8+`Lm%~M<8^@ ze5P}JbmqD`3ybcgN!3QaU$gCV50^3f`19J7-NCVmJzPw|Kb@-m=-ze188?n|oNC}X zK2wS?O;94jmq_SEF!VcqP~W{YT_?L8Z_K)j=sCV c uy zA9GzeW6^dnlS8KEoEI3bU+e|i=$fRpN811Eh(G%8--b+%(1Aa0?ee7g@6?=syN~qw zF>T{WJ!z*fIm~Cwqx0mTC(re_N5FFDQ@c6?k@e`>eoU5m&np zwzSj5V8b`H(M>>H8bp(5b|RA{MXPR(9zJk`F4oN(bm@89oW8x899Ud-b6jY8=Cdh^ zdKR~8GUx7Rkja70OT6>sfXtP69g7gs*5=(FB$5ZM>ekMv+5R~>qDzUh%>i_nZVy62 zEl&;6Pd%IlMvIx{4rj9eiveChNBq87`l|2$=ssE8@jh9$9G0=OGnh=K f&s>w24w zA)E(qNg&3G9Oc32z?aU^@~2ir&ZgS6`6iND)NFqybGpMaf3b8N01kx9gk$0000 Px%nn^@KR7gwhS3PJ`Q562ZoA{az6(>mtYZp;BmpVv?B3c|32Y(ia_VvDYl7du3 z1x3)M6hTd2W)&ByC<-bipeQPccF_(B78=^RbWllS-@8X|iIRvfzTlH6c*o?N^PTVf zKcY#GO~OSDaG_90Pft%DNTpKyjWMg@Iz@5;zy+=K)7U!Ig1KC7uTtuYh@?oC;}{VU zMKU8I3&xl|LqkJP;^@^d_I>{vfPErziR80521F!H@(6(S01j)d{Wy9x!1;WBLPT~e zrFvc0y&uPbl^Gu&zelpiIxsLWa6XP+Byh1 2oHu=a zeIKfSj|_FGRC)klQznyfqQJv2oEaP(d|wIm&N@yOMdXm@d6VB{k}R$r0N#qo>< cI&RD=f5NsqlMzUU2zaZHwB3BawZfR+GTrQV8>`1IrT%SD8oAG`BZeqYm zO|FJR-85hT%V8LvCD|4gYNgZ-*L9EA8<`C=HpX-TI0_#{j0%>GZDU<>l*% d*tXk1a>5v6 zuMtzFyB5GP0Bc0#U@Db*=(_Ig%69U7-(HC)M5MK{6zpjmGyvRM>36I18Gt>TzCAk! z?Em)JE98{cdUORipU-!R$cTv4TY(Mu@pDn7)JLV%Xn%kIqrc-5=C>&|VBiaZIqNPB S)t+Pk0000 Px&=}AOER9HvtmqBP;RTPH5^WK}8WHOngskkXhpt`UtK}w-SorP#pNsWu32;xo= zQEI0lRg}KEQKYdI4cLto6$C{BE@rAlELx!jg$AJuwcw&frJ|{gCVBJTJ#t? 54B<(O$enuAB z^{+t;`I KNhm&C`~#1I8vy>u6S;^9^u-H7`U zCIJT_ND@#DjtCjx7ljAQMLC pXoDE z fxW1!j)Axwq*@bS1@Yxr&<++Maet7AhZLe3iD78O!0 z)e|m9!moBa1nyo1__Be=P8Q{}nplmFs(WP@TQY9r1RE(#fx8qgqFidqL FBkBa)Y=kL+n@UBg31$3a*w<{7B_GulXFWt{5LbCh zmE0<6J{5SpnTmL)RbdVu)qXL2F3`UW!fM5Ej=rF7OX?va!*)>)uOZ*x1`ZFU4U-B3 zE9u1Q5WwTdHFa^0zG{IsKsbCYhHa*@_@-EK2!Dp%e3zc(LxsY+AZ*~Fr!^C7r`LkC zTNB|N!JPrWpUZI)*#Ja*kN9M|bL1l7-6XPYA2!;-U*+GJ#TPSlL_ggi#A2fDv7Oz; zlnBG|-4PMG@Eo#2VVd|ZjufWKMR{S A zOw>c5-0RG9A?jp6m5x>n8gl-VgEIY(WWqv}4#=q_S8`n3n^hCdnfM>V7Uq9Y56N%ll Px>fJsC_RCr$Pom-4uRT; kLJSVA?`r7#^HfyUsa(8QRCCblo455|tM zVh1QQZPi{(=aBefqRgqal$j26kd_f?net*(lo{g-Eio1hAhxxW^x_5E4yXYKx|jX- z?X11_y6xN0IWs4j%*@%Bv-WTO*Z=$0I(x6hP{M0uGw+zku#^F}abPKDm=B->9P_z! z{`h|mh}%;832!9!lXgs MU*TamFZ9fyeZXz#3*mO? z3SG96O_2T1va8kCg02NPmY0;>xWdDZtiUsY9^K0OJYWr&ZwvaSpI6CM0n4vs{~{HY zGszelYad|uyE=jsXi_n+VT^}>mC6X;bW}#7@J6*(>&fYIXzWLfEy6BGJ&x7u8f?M_ z+zR@@7QU)h!(I+Qz^Q9kFlb$Xn^B%@X#rB*PkJ1^>l$p>1ltJOw+e>3Xl}F2laszK z*@)P(33hjbHFU7Gpbu{2Jq+k~O2=B=lWlg=%!cag8fxEGf Y`FhW7u&$lE^!Etm-`?Y^`w$I!Jd|+|&LR5c|iU|Ba zP5|f620!$k5~KpYsbV6vUfUi(CAjao%3PjTj{wh(B=-?pm@T_VDOt$m5}=(=WJ%!` zv;%kCXTB)iR)S4xkAD9<%J3~JC$(NpY9*+hz_o%}vy|k?9|He6BUQF44Rlm;v|9|i zsFEX3rr(Qi25$XQmdn%cOA06Gho1({oo((% HGHE?&=EiaeyBePs`N1w#6G_+2()Fs2=t$y56@VFk|Sj7iO8c%9J?UU zpD0PuBE-L)0DiGMFupsw1B)p8<%2$=h!ct)pUIQsZQ*e-=rZ% 9g;+hHx+6=yi(8`0|?*vQQ2A!&PSjlMT>DKq28vm zD8KTOA=CftXPY(Yoiqd}*>ljFnq{CBJwEeyi$bOpgHH9dbWO# bMxR&MsWNO03XIL2n4uw)TN) zTFh@K>o}a@$pD9#v$+~qW-Fs5xY8T2!ebrkeu*-8?iwV8*- zljW}Xk_r_)5PEb~iuOTESw|jEmirqq=pvphH?vj)U4~z?ecvg6P^nVTy@7pxtG}8& z`k8&9M~A0(?MK*bHUZkUvz%S%?usYSpROpqd#E=k#dLtSwsMEeBVrnZ*5!ew>_WF~ z$?};C`q%q{JlYD`lwXHnM5b2It|}LOY^Hn*XDut$i?03N*6Fl0r7ELOrbKFSQ z@#Shfba!YS>nieSQuNCONAFVZU;>>-$x#K6N3UoB&?;bg9}DyqU6zs~4YvYlUCdGn zP+=ExN|*v&M9I?yn#$N+p>@2ZvJPEOQRB%XX!@J|^xNvuJ6DyfDuz6|D(iTVJemXD z+Ia+u#fD!A9xXB`D!>?Y(G!UQvK2tP_6A+8#0Q-xhc V_w%67;T~z#85S(6aBQddh~N7=te2$#U%z=-Vnv@2Up k!Bm%^&H+Rf7IWc!T>rJBno&x}! 1TD7guGQ>tT_7`e)m_I>as;Im(^Msbycehi?jLzhEm zRdUlhHfe6#we*BcBUe{11itdU>OfP`?ybN&=!vX7+kv;j2bScg)e_g7@y30&H&nDK zwKIKyZX4Oht*h)$LS?OvouNmU4f^$S!1zJn*o$F_bRbOvlqRVa*~Fk-n}qh6L`4DU z`I4Jf03TisT(dAMQuY32gMQ;2@P~2W_zS@6=hcvlC^@zcQgoSpdf8H GkpqX9g6QH6Z`b3p|WSW+zgCdFp%4-}aoMWbZ@I-A=j z33M=Xqo}mJHeynS?fg<(Ou K!|yT@pd#56rDFpUZ#Utl_yIde~3N2iT6XC>L)`pGTDIh1>{w-6w#bpfGviY zTC+*XrW_h*u%V5drui8aWmjrbvQ3IrP>~Yv;;k}ckI$)9dgx-idw9pZ8cyaa@SG=` zr{WJ)?oDBVKf&P8Mm|Q%ePs4ATT{|BQ#pubYC#2CfU~8EQZ=mqVoL8q9gc4wU@Lvl zgB$o77S4TVO}}g&CuSEa#m@pyP6)|E@Ae_q@IjM(wAC=ifaU@=MS?;VN-mO)WeD&o z#k=LniQHWPJ?TwhQGJ-vEa|~(a092=9M>3cd7ATNCr=i1R__}O7FUQt`>JLbqs7Fu zJ~rpc#+lGX%iy%QS*Yd&X!>VQkFf5F&1>agq4Vz9=E+TNv6@q$>5YM2PN|+hvtuF~ zumMxpN}=pxW_q%ZnU?A68)VBwEv8njAPcE6$K^p>=1-PehT#~wVp5f@fgitJV2nna zre*KIO!69*)gMZ(pQT*zW}t_!;w Cic%t|(8Lq*b5lU*vdaSy%qA@zD$#zn~<> J_kd<}qp7A~{rSENcMwqU7Ka^B;LR7}S4WRZ D(Z*qQwLHd-(h-J=_-o&;8AagIY7ihPdV}6K)q9yO;pOxW{n6 zi;4?@jt(Z^Z5KhKeqX%w;prjPR`O(yaR85cZ5YoAIO3JbI&@8hpyMJ|wbk%3c azf4Ssu5`ocdga7~l07*qoM6N<$ Ef{x`={{R30 literal 0 HcmV?d00001 diff --git a/static/images/icon-home-n.png b/static/images/icon-home-n.png new file mode 100644 index 0000000000000000000000000000000000000000..2ce44eafa17d78bdf1f2121c7e00341c1af1cda0 GIT binary patch literal 945 zcmV;i15W&jP) Px&Ye_^wR7gwhmrZC~RTRg6=jKg1A(%jHEfOoGL_`q$q6<+%vk+WJ6&F##O^nH# zab)l-T3tx6C`d4jvH0@Fd|(zzhi**$+DH~%Nh`Fdh>2hq#!%Df!Wo+;dG|Os%#>PZ z+L l&y!+1Y-1GkDo&OW+Tq7eRt?ljY-KzS4h_pmebktgVDwRs*>j@?GY|du0 z`&BgsJO;#pi@*g{{mdBi?%?3y$y(#p1fH9l^A;8s237SH;AY@t6h$u@W8xz6Ca@nk zD HE|+UsSy|cB)YSBrsy+eyuBx-KSS;P&-~XqJ9ERae;Ehrh zIz;4SRXwz{wDjxn@bE@8dR4G{mThfqPXdR4JtA_#T05FZB#u`Kmd$1l0?(`J{lL$v zI@;0E@nLUo?}bYHD}sX{xIsjY8Ds8N)mGqeEEapOudnaCh-jrisw&gd(>vGJ)}9rS z*MYo KViDw$0FcI7?)0GAZ|sH$dwwqp5y5Rv|RMB@PC #jXPxYwc7rnLK+fp;Wpa1i@ZoOcHns@BsJh!$cx+#_it(PfSeQXRZA} zRc~{OHO8d7y1GvF^z>8}M=i;Wjg9Sy#bS3DV~zm#0Nk#B{OO^gp+dDD+!DAE4gJ3XZyGz` zURCX^WXu|I+LD1>6p?S5o0}gIXV&NE=bbBj6*vccQTjq?1g{*!DZU%n2OKFB3a@Q? zu97i(**OECvysHhV!0R3thM&AQ~f2EIWsfUn$PEVd!E X9JP) Px(+et)0R9HvNn0;tfWf;JJ&wI|jSMS}fI_F0$DFO?`$O_89WKft6x1<;p^hfk1 zp?x`*n_!;mkFx19u|TD$2&@z$UCs@JLH$vbpjbf>WTcVJk87LGd+s^ssdL+x+r7J| z&7kMc`##U}{@(ZbIL~{9QsStopNDjRj|`|*L*Q&g5z$iSQPu|?k5r!LXnfja5@j)B z>SMc#33aSE>U;Q8ExgQmE_H1rJ5iX?5UNtWl_{2xu=_VIb{Z>(W<7G5>HK+krR1WV zx{%Ig5RRkfi%FDQ36fD9njA?C3o$Gr098IJPx8&4Rni;9en4jkLRD65WlA4Rj^e=h zED(4Y;a(sCxWGkKK2vz(;9B`Qil0zt5Mr65>0k<}Qid8}8+gdTDxeDGh{B85B*dc$ zVF7Sll$IdQ+wD(Fwv^92M75)KJVk}rSj7xtipfEhQJMu-02zf2&t`)O_~-hS3KP&M zLM>1M>^2rny%~P%a>Og DdVzQg%=ch5f1u3t2!IykCB^5{l{wc{!T^UV;4AmjR-FR<-m_>Xb9j)sTgOW zuj@I %%>?Ud{~YE`3F>H8Gw W1FWaUG%j2dXU^~LCz;}W2Xjsa52x}_S!|oX5D2rLV2Gl8h;@LD0W`2|_ z7|>C&9c$!lA(Pt8TIs_!ga=jGnK3*o_4R6X-_EpzMa+U(1iTB($=NI%7XXlr)6+FZ z*R0#5<(|z+;0NDOmoL$~UnL#3Y7;P9;C-OdH{9}X4nJHseV#LW90@yUQK{LYCs4YL zVR^n;)jFE=lcd$+stH4k5sKkNqabk9)Rs}<33Da_;R!)ShI6HEAz!*9ZzBBhi5(jI zrI&dYd@$Z{7>f(-Ptg-)z9 Mc;Je(s)gYBZ(1TNiN8te01DkPC13OTxKtImr1RNKm-{cGiPA)O^Hnu^&} z2QEk3*U5=OIunAZY1LMg$ADvAz{<`>`F8jwOImckZFmc1z6zhWH%K`CjgkpLEN#^$ zqd5I@WmpNvRQXCEP+_jXqW(1>*n6Ns9=PHV%eLtZ@mQnqxG2*L#$GuGd=%u^bg)^D zUvY@gVSTGk&UoAqGb~lOPvGYKM#4`DpW?IM7mjo`%7tPHI-zis%KE75|8IyTEjrUS z>_xf5Q>qFLrBP2hmR^1z;UtE`Bv^6TGccU8Qsw#SxEVMFw1+dwmDqTgk8rAA3|yzM zy-Zj?>OmY1r4r|Pfx7$)>%WoH0{eWIm&58Q_}4&x$D8G8w0G$^IJ1cyr}nLrp3wF$ Xu1ZfTSiPs<00000NkvXXu0mjfeK2mI literal 0 HcmV?d00001 diff --git a/static/images/icon-like.png b/static/images/icon-like.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8ed46d0e0ebbc6a1602e88372df928e266b40c GIT binary patch literal 439 zcmV;o0Z9IdP) Px$aY;l$R5(wyl(A02P!xv$Q!0Zc3U7dkqlt_T8pB4QBslBf18Cylrh`T|V`Ab9 znD_ufXd8CfF>y7qZ-7Htp!CSSX`7N(L8y1U=brEU=iL8ZLduI$<{<`jYPB;`lx=1% z5n!|DwQ`pABnms#>M><9`$@4tSP1M_D#fg-z5pn(AB|M&0#E_$#A3|$a6B#-Ivrc2 z$((+pk Mvzb-JSJiUybV>gTxd4GBygbXHvle|oadEh7}pZ$==wVWTZ;mH zm0is+_5y`LSBo-b-b5k&8}OBZ-K9*)Y-^^uk=msY^ZBZ2-iNkXaotY>@(T?y;>EB_ z`9g^9d;|Z9J0?0 }j*uMB#6y*ZIrr3+L_~Clq>AGcgk_yhWp7^q$D2MX0m|Hp1eE3cI hOyC@|oH~*^@EZ)WiWTbyuloQ1002ovPDHLkV1f*v#Yq4F literal 0 HcmV?d00001 diff --git a/static/images/icon-mall-n.png b/static/images/icon-mall-n.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fe2ca7bf942ecfd578487da7d9a15a1dd86515 GIT binary patch literal 1338 zcmV-A1;zS_P) Px(^hrcPR7gwhS8Z%lWfXqSd;8(ym@*+*D<*_2PNPvUCgKOt8KWrpkr)epps=mI ztDBQ7F@iz4C{c{bf|Jp8a|JXQC?Qb Q1Fno$c-IBa;O%A+U(h=FOWgN~hD;D5X|s!EOSO5RuhxxBI=u#>P|Hd1q&* z*X#8@2w*LM82}E8NQ>L;-k-M_FNg_&dwYB5G4qoE9sqEhncoD^8xDtmAJ0)N7P~B+ zPB#)!1Au8nw3CRoghHW@O9IyCm^HKj+y=l4;C;t&tcr??#Ij|}{wY?%Xf*0pO3iQ_ z=OrT2RY(EY%gieZ13sIvKF3TZa}N<&B2r642b5B4Yin!w)YsRKPIhKv-&>ZY{C@vk zBJv7=%K`kQlzK)fwL4$_Gr*Q*xoT=^UL~S-07n7DTrSu8VrNuJAdyJqQl->G0G`%O z31Fkg<9SY3?hJ5GPtR--*+oQCnE9z>GP%vNtg^D4C=i{L-|v51MAqxfGnveS*4EY^ z^T4-?NF2aPm& ~6=GFP~`+UB+B2r=7_7`n! zZRt|VtH;aba?Q)m_sQz&>ivO0z|r4DqtPD#OrI1u7K=@{ZF?&b%>nR <7EN&_xHPw969o^h`az`7JwlU=`ajqYg1FxA4DYDVLTo; zhKGlziOAg|(y1#%L`OwrU0q$>mi$DNoN+$0?(Xhu0X#}Xx;tlz$UY+Ka~x;a>C>m} zs;a8Th-it3+?<~X06R?6{Ap};$_CDzx5wx6)ny4q&*cJ53`BI0nOP}yorqjWL^0jD zLqkJ{#+!)$1Y8ig2G#*wnR|YSncKqQ@Mn{pe`(EC%t=>Q*X-=r?bbG %-x&X1k)-|G prfUk0ER z#}I(mnR&-VYNJ%(T&BwbXjP)grz4q6KC6>DM+h+ULS}wVXAa e^xPpLPl$-t zPRB$f=Jk5}8X6jY8?W)S+5iw#N;Ltv1i-sWsg1#4aNl_LMRj#fhs`0PE&!UV2eV|g zDxFU6% ToH)En@@u7qd|8J@#LzHUIzs07*qoM6N<$f}p5 Px*97#k$R9Hu~mw#+sbrrxr=X>vcuYG-c9o^6X6BZyEHz!C!7W@&)Txjc7oGcX+ z<1bVo4hQX++W^BwjVpnTGK3(DO9nxdW^n b^~^L@`b-_QB^&R3}R`D!{AA&38pB%;j_`gfp+Xf^d(&QBPgD!j 06W(q7&^+>z#SC+SD4cwRHeCxMn_1ylNV3tjZ;Dk0i~gN z4FBnRDb?b2C7Dwod|%D)>zL!D$<$&{1M0-(0;61nVy)8GILbeJeJR$WpU9kqP?c3Z zH0GhcCIiZaj`C&T3&00r9p#|HFT;RG`!~v;YqA3;i>=MqT-ZoMHO0`7^(<>pRw;Z? zU_cE|8l|Ypb-*RSL4k)d!nWQn$yc)(N21wRH`PFsxHy#*!XhFLIb-;!qjV`;3Jj{U zCGhAoA)|58T2ctDzy^f{0&k$KaV;-Dxj{yzgAq_^et?DyWNq cJ{BAXDSz_ucjr(T!i##0uy;(2YgZ?h4LGO zEovB4C`{+surjoyf#A?E3qr#WLuIuHqXK<-VdHaM@^-ndbUdNX=pap@#Z3<4yqEZ_ z2 N#npL*ORhER+Y2k8 -frwCaMxs5ctLyN8D@ 5^98|Aea!kNpwWIBrF zGJ%Ih7&0zxrOC>l4FpP|zf0b&q|<(n&JTq@D&$o7;=V5Vopf}lb9gCdq#e9S=>&w~ zh!w7gXHbYM!X-wj6XiwgFylllq!<}kBcpBGG;IoeMni@gUgG86UWp^RVvD}2aOMe! zs704|lS@W*B?#9rPXm53-fBw_o*!?)%~tu>bkWHj<(;uC=Ud?i5IgdRLV<54by5KW z+I`K~3_0r|(?!BjR*BFFoCo|H!$V=fuWTJhOhEjX?kPq~ t5s >MQ zWGsErd06C%zD;uA{{|s&_|g$R-k&4gP$U)23Uc5U(L$OchZ&3V-MU#9niRi%-yrs^ zlaE#N>ivcoHp*pB-6BV30+}tuRd?x}z~v=iZrQ{<^@^5mUF>-586P%H3ODCRc%)LB zC0etAi2kSQ=I|v0_bZHu;i|oz^2%u|f3vT3nJhm>_zrML;l6^ z_M(V3G;+3De1vu;*1-Ws@u!aQX`g}Ra4mQ1a>wvBU^Q@rkR5^HXTM%2Z&h+)<&X57 zFwM6yd<&ST%5GzLa8H*!UrD|uh)8iVMV~-;K;a_-2N7;pmtFhTO1$(&GS=nu3U>l$ zqr5P_qTHEs_{;82jzZ-Jbj=Wn2OV3r{ ^&mCd=)V$ABd;c{=WVFNA)X^;GJ3^~K9?Sj) gmp5v8`jtcd2W!UTKzBhH_5c6?07*qoM6N<$f{D)m5&!@I literal 0 HcmV?d00001 diff --git a/static/images/icon-my-n.png b/static/images/icon-my-n.png new file mode 100644 index 0000000000000000000000000000000000000000..994ab546ca194af3ae797a91c129b0552bbcd521 GIT binary patch literal 1324 zcmV+{1=IS8P) Px(=1D|BR7gw3ms@O9RTPH*wL2HEl1>NIPQAofg7<(vU=$N1k|@fXIPntE0zKzU zZHh*;XpA0>L5diqDb6`lOGP8%h;JgAXd;Qk$b-;;mk>2Xp;IHY(`YSo>0Zui=9uX) z&>=u<(x-Fw{`T5ut^far@IU=gwcNhGzG {%5!9*;kwlzJ4v8~`Bz(*XF3fE<8-0Q?Q$N3He7SS D0Im|qth#mm27{C!`?(zHmZ>(Io z@~?9EN#G*%Edciekkh`Rl-gQXS9dHLjgFu03YnP_iNs6*D*!wXARq_!`FySA@JZlg zG8q^e8d^(4&lRp}h=`sT7#P@L+qRzSo0UGdZCf=qHZEi4HvxnT&+JqxwXwAECV^eo zy&b>@(y>Ie$}o)NnE=b*O(YUgW_}yM2s1xsS=N`{JLTZ-07#>B6i;|Ym6n60@<=4I z20$l(e$zDPodk}@<98{gJ_GOtfCo*}Ja#tKdTV=ndM;t+kC}Oa)_Qp?7JE;gO;jwS z6NyB25z(z$>(!=dZXqH*7vN+vS(8qu+n9MhfIWdgU} 1(gcSynanNab9%OiD9-t}0ImXHnWnkT zt9W%mab9EQ_btn6K3h tFyCn z#`Njavr{#lG||}DSfHb$W0EP9G}o2Pyvnky9TQjG-Q9h?-|ycAKr!>ZmSy#ORSPr} z3jM~+yL~?2nx>|v!;2Oznq>AxZJw>Q-ateP)9LgTrEu4EZv^nE=mrrjH4J0_1X$8V zHk*|>UO+@^L!nT&=R|VaKp@aXM9TpjAR Z~avbMQB6?>kTNG^%hr{*3U@)6XrAAK`@Jem5 zXgpt61Q*RhY|K8FL4cXpg~Q?XrTMF>=mTJjVHn4!ax8J8k&%&ET5Cz9)kh!i8YFk+ za=9mos71n_cr-I_C!)QXOy*Ffuonmfu2D+eAz7{114jUC_W699s|tG_T=LiO@bLUX z$9737DJae;GfTG~XXbrGG+3Pb%Zcc^f*eTqO2bK)_cQZTgM)*+Pxbw)4fK*u Px*LP yC846^sw#~GcIpNKtw20Q8|qd_ZEPnMk&LKSB?z?@g`(2_0|f;|iQis( z@4aX6*?8UEjW@f7EA1bvGc)HqbLM>WjZp0i)bwmXF8mcKn09~-4xxx>HTPQ9R|1zC zZwNHmT2CsSAfYjSPBG5LOQLZ^yv`$ CVK%#1~-1-WL&On=O3ysyBOw3M%+kp27v;avU z;rtXrfq7sS;Z w0A zR>+AkXk&(akBgyTE2Vi_nS5a%3*7^>M{uVI-*VR`Fyuviy&Q=2JgMI7dD?7@UmVnn zNvg10U=J{14d3>a;j3+4@Lz=N*glzb|J{o_*UV0oL7;7^aDw?+`iqNJTs_dh`c$Iy zDm-P=(jET@Xi`J3!n4&1tgs$s$(^}RE*9H&9o5@Veu6S(g*#65%9)iXS`mchIp79_ z2Ms)0O9oazB*>lFT?)cw zES}ykSNPmIsMkc6r%|?`+&+?#U*&nCr$@aDn`upXm*2Ya@Fe8d2sfeJA0|0rB1ZwW ze~U?G#_pEcau2uH+-7zo^eK#IXSl_&tboeaKAMZDdZTA?2vsegw?41dzWrs(<|!^# z;)HDjdZP!!fQ>^sPal-O =L*i<+riN-m04x8MsE)HpxV#EEG(;`t@-Yc8YTE zNJbu6=^bBrOcQTpX-mdrg#7ROk>T)KKp2m?(R-MwrZ2h%^a$_`5e^OSmj_B(dFMTv zlIwWD834y)!*^;0;ke;rIVOTYDl%zNCJrMUTor^X(yo5?s^E~Gw1&H@fpEe`>zE(C z#4I%caPhhZ^k)j6yW%=lP#)FKqCDyfGlotvlxPCiPZA+HSFk2al+7`-n#6Mjn8=bW z?-NCZd7Ub|Ml rOJFHbRQxK`k!BDie6SK&7#xodQfIQ`+6N47uAokn>C;f48WI^7{w zRoh+t`UQkvB8>ZnPd&3&{!@UuwNG1;exAzjTUJ%BTV|J4TAf0hzyiuc67tyaH)W#W z+ug70V|c=846AG}sIH2Vf5(8nq;R7u2R6^rUtaZ}_@2JaHyl9NB1*e1%_1oCA`FL? z6VKf%uN3FFxPdvfHPR~|F05Asv3)>4Zj_(nq?)j6WWPMQ+Dma=xW0|naGqSWz+5G9 zThhwmGp920d{q!Gcte`ZlFA62oz^_HwZrE4q%kxP|p$#22f|yJ}?QfP@M5iRH@(??CyTHJmVTPJLcm zsr= hIrM6W;- SNANrV0000 } literal 0 HcmV?d00001 diff --git a/static/images/icon-nolike.png b/static/images/icon-nolike.png new file mode 100644 index 0000000000000000000000000000000000000000..08de4c8547f0a118ff0bd652d9c667925fd22450 GIT binary patch literal 535 zcmV+y0_gpTP) Px$(Md!>R5(wyR55E*K@k3CFU=hm`3VLr>`Y;yMKA{z+G(wY)y^#_c#zIOB4;Bg zCs^#ws|0J&RHjofkQ9OeTOld@0ak~Fx05&Ld*PY9c;|6$^I+%gH{Z-R-w@_}XwG;z z1t=m9iRhB5E(17BDQ$%iURmN8 zKtxw834pyy%#yZ42zLLQVZYyBY_(cn0Q^iTg%HBWGNZ9_&h-kwz|8N;n26j`)gBT3 z8V-l;Znyhm447q^Jy;{6tKR$llYPyy%vhr?7Gqp>&V9(^o6P)p3^*7Jz7o-QX1+O# zNFwqcz&U1K83T%lmKkOQ+$i4De*^qvjrHEQXJlw4Uu5Q`swnFzrKM8-X@N~JRow-! z&dkrNV{<@6`~SkSm|asC rtbqQPi1dU~>_6^oiJPgPU9ZA9cHfcxfKB3kp_zbTf3xgwgP zXH{|L`YJqZWf_wl^LhTgZi_=zA9OmM?Ycfs+=m75oxE2Is=CF@Fa9RjM8Ij(uKqK3 Zz$2BW+Z7*B0&oBT002ovPDHLkV1lsF?G*q3 literal 0 HcmV?d00001 diff --git a/static/images/icon-photograph.png b/static/images/icon-photograph.png new file mode 100644 index 0000000000000000000000000000000000000000..ea90a70e1fb200e324f619753a1a5e8d963b0e8c GIT binary patch literal 4249 zcmV;K5N7X*P) Px_Q%OWYRCr$PU3+j9)fxZJy?GEV7^bzIfoMau%0n?=c*!4v)7L+0&~{pU3<-TG z3KGWZC^H?fDn_)E@X%_NCI&~*jzz8Qv>lbu@d52vK;_X^F(cYPv@?b%CO66MDc|m% zv*)>wdvBtVd;hwR-Lt#D^E?dT&26W(1e`h`MG;e0y+T>$V*pHtb9 zFX*X(_5pU+0FVU$v{quMaLuV0DzM(na=#np--^m)Hn8}RGj#^Coe `0(}sc_ed4V*}t>;oz42Y!|*&SZtUbk$oooz!Ln z+Y0pjPNx|NX{7?PHfxrO$)iw{!$=$etyxmuA#2~dvC631MxZa~#DM3vOPwh?3gi0( z{#S@9k$zg$Lff(P?KFWIHkT8{Wc@cWA8;4F{qvKbR++5 ?*(^!%;v9!hClT;Tg6`s6g4YzEvHb<8Rc-&{3GWVHme8vII{9IMF& zSHi+2S$p`VP_H@A3)*S*K$gA(K&!R%wWP^DIgLTk;z9trsY4br3E@DCY_?grRPN#n z;*%3-vej!7ARUKqu4=+IJfQ2^Y4u5r&9M $BPe zdS0i~OaNL-np}t``_iIWKi6&QzV%BT0nqLaTd8xD)sqXXU0A?UeZ5t$RZHl#*VTQ? zNec 3651T?v~BGX%?>^CekBVy8KU?C6J_S!{+PmYioCB>&e+Q_^PcRK~z zpi4(mCMVcV)woz^qfb-C*CcqNZ1KBVs?5D{bnU|IlkH9;yf`6y?jmzLoOb}gn=vVA za*;Gyn07<335C66PKWc6H(RYZ^Z427l24ZHoX%unr1T)8eT<_rIdQ0K*2XkcOiKxb zMug*ul2AW^z=W~HJSWJ99D5Ufp~V*f_-`-3!4F;N%^4(Pm^E3M8}Ps&bJ~5N*`SGM za`83!%IO)nYI?>4xtOos9EHuh9O&HRNHZhDt;r@AA^~j+II)b^ST1y3jJrUPZ=Rnm zCcau*n|2Ms=3PU{gQUTs7&}LC7m}0&n6UlGoc19_I&3S5im%CID*#^larv-<%o@LF zOAg-ewOdv0Sz BrI`$~6R WcF`;M)PB8fui`D%#O9?k}S-cm>Cg9BbygK>_ JV&vbx2^9p;~8Qq$(K V1 e2Mt^{xYpw+#frGTL1Tejtz> zgL@G)Ujo|K=fX6ZY5Yq|%VBKgXo4A_x1Yj!8~Y`o 068BSEy_!tnk=_L;q~h(^45(*A5vKU++bLnP)C&XIb1 zW01Gs{g;-*x6jPaR@S0)7}``Bs`_M;T=4T{Ku1eQGEG*6J|9M-Tr7HQ06xyyQ`xZ< z#0#>xt!*tF>h-f%S3=Dx>2 xHTfuT-9=iU8Joomm|a7l^ZUs{B0vdVbk0WIlsI(K1QnhOAFfJUcr{d0rd;@}w| zo3|!pGwX;ep2z`~K}9w_&`<&2`DStl!hyDEZJfKX`Drra!5}kK%1zO;;bCX!lH*_Y zo6D08dE6Ffsn_lFD`%|Nm(MAK74y>RD^}k&zC0-D{L1-duyTHKtLXvlg{Q(aS*zY5 z(1o}QQ{YGoG|o`tvH;O1ufDJxmds4fMBEpF#&Tzv6ad^XzYLnw0KLwaj cjF4n5f{VS47$MdMse;AN#6&8yg{Xz0J@M0Ek%fW7?p8VjVbQ*00 zI_9s+MysbJJRImkH90((|8D<^ Gj$KDwxZ?4gpwIq!>|0p{ z yuSYmi{S$>pB>ti^XK7ZU<5TjTd(H?*?EuW`#lwsu@S%nX4;e zD{^QL7e77#IR7Vh_?*+Tux)Yj4rf58$@o~W$g&`IlrJ*mykCdX5tX#q+=a?yw%vgn z(p?~?)3^M^*J<%sQ%)uD=nw5+qkq0;`+zsA?e833^5csuVeaYa0%}dbXg# WblTU zhXBD=J3JpY<6%9Zi=fHUqyS@dF`3LTI+&8txE~gWu6lC7TWjG1m*0Oz##R#eQ&YN( zknynQj$?{GCt$L&?Ac`X$aItrqovD_$%O!o`yxxPd~!fo*KA3H^zF>v6^F@80m-?@=%h;wgs84DUY1liQ~;wz01)t}-gLZ$E#7*$ejfm| ze#l@f7@@PsXEwzI^n}|#QG#)>l`;da`ed7|aOv=Y&Y#JuWUvDk3uqG8`iwS$EU{Yl$+4Ls0&SCl zG@7iQ*guxVXLNBFJ<`7)?WZthy=w1-vyl9?WY(m=cgvvr%1q8dMvH;ZVw>VLIc&pk zp!4#Ig4S1zG{|_oSGpazyt9vMwBUNBzXwK@MCBR4F#M5oHVe`rj2Tf+M38NoECEdc z7ER51i&;j~tLce;`18NyGAq-OaKuJ1S-o+A0GtQ3nXTzG*<|c-_8L>?(eQd=?+`RU z+pneHA*<7AvN{^bw1CmNd?d&W1A6l=F-Q>3lHin7u@)f~yVH*JxbWn@A-H#^Uk?`n zk|iRYCTp%^+9p*xEKHU_74MiOi@G*CD8RTe029X&nEcfsEmp2Z45a)7wKq&U4abvg zLf93ic17tsa@6&7S(AqZwF?zUes;pOiF!?@ZOY-@XQV&f=cCE-+8vylZK-RKg0MAE z@%F<587-VfsQffp867=j>ZaTtyiphnt0qQDgo!y}9q<^&8!k*Dvr@8@2Sf4JUFfVX zOp_JHcav$G`gc(3-9}z2xU0iX@BR2yoj!)~rB1mcW$ChOrY y1ej_~pSt PhOhzu^z5jdHk8fi@*B*cT(hj^^nC>=`x{DLqCmTTbaO)vCI;p2^d=Fp3 zb5>ifod9iAt8iwPr^pOX44=$wv$PPN0$JPJa*FqG1r9U@MT)GZjMYh*T+(EYvOKBF z*(?E#AI@sctpNz0yJ8D`C7;awYh;#6$=craKASb5eX#r9K~~4xy^ #@2k-T7o_Q(NE<^wg{|E2M5IUo$WxVwKEaQ6CGwwaskRh4vvfpJR zrliRhP4?{^p-msRjMtu -*s)9D z&shISBV;nIK*4*=UVPCfx(XK=sl~I?>d=PR5D9ou>&fAn=@S<{l+vb;*N@kpj};jV zO|-AQtFJawMp3i `o)bu*J?VDn%o$JbocvbSH@93R6$8Uf1UM+(rLA#|Y{_)<%U zy2Cf_>BHw6HXpy0y8jSKWkCr)x!BGab@gOble;M;9imS*ft#Aq;tsWIKdOe4$E+mO zZ3asGxke9IUgL|X0Gd B@k6TM`x*1T@>(1H7ud5oqR80RM5-Ouy{~ z_E9s(r)qMS3-pmJKv!CTSwpeGFm6cT?+Ch6S>8ZM<~-s*!n!U9o&w_o;tPIp#F(6X vjt?Ke-VK!EQ Px?d`Uz>RCr$PU3ridM;-opw;)v^No`UdDaf&42zOW@972VF5EEk#Aevw(0$ZlE z)K~#aA@C2IDq^Ch!UARV4|F*M2?3T%Zrx3(7!s*nf(CN{Pa!dC8D3Z@j)m9K)AQc+ z^mO<1%$r%ByE|3OF1s^5(_er6{k~s!ziEO54!UDhCCYMDp!9A4RRAiGLnR0*K-mqP zf81~4&+aeXU-5H<|M-5+KPWA-9I<@)*^mV&`)US|!6kAK7tU=W)tPLuFp; r9Q82$Q8ASLkI~5L!#7z5lGOB3J> cG|lO?Qr*g)*|p?+U`~SG(0@1(TI>Swm(VRqD19Xu4z6OqA0)y;O8qO;&h# zDF)FT)9g($vjaf8fv>4klXY$?BnD9@;Ta+a$RN c^v* eUP3&edDd4Gp7C`!pX@1sYFI%eWT1CoIr(~~nib#x?Xdak zuE#Ft@f96w>>^6fjUb1fB4luZj3?j9WH`{wGZQQdN`{HOCdr7apQg&hEwdPDi<=h+ zapzL5ntbE qj5r1?bPJpSh`FEn;t D47+_(nSaiHUsX; z8J7Q3O;+3DT0(b@s0YO){k&c=!9;A3xaGvPlWoyZrew<(;~E*z$3UrO#zZbC29rg$ z7K%&5v82?HW}mFq &LB2mIXtOQfw_v zsxocS)sxB##GY;^ZH&=g4MUwq*q}=UP5#uKz^xAhS9j-MNgP6*g*6O7YYXu4Vc_US z;G_LTtTVCI 3;LHj2LY!nYSxEdi z=p5+C_NoX?zUvpjr-xq&h`oEBJ^^fd5V&y4Zt+f-PnI=V>{)KZ2|%ae1f(u>>qEe> zg;y5j{M`>O1`aOK04?|2=$c%hv mWG}8&^~}^bg3L0#sV!Tgr|wi 8lWwhtn5zmjfHZUh5OR35(D~cp55~W zu;MjYmLx*A4HaBRf<9SZ=gfe 8gfv-RMc@K$!Q`l#EC*MX2@Zcw58knQ zVE=p$&cLVmSKMRwG%v_aZ34Ppr!J|f7HD29Wr%iT7jEm=B|MZdddm VPY0@=(L=}ddFurJ;N5xv_tonGGBp4j%h>%mFNZPt-ZlEOnQZ+2`vuIB`K*n) zp+bO`K3@`<)dJ}KzYPos33B`A0Y~e3#czKC7{(YL;b18>ORZTDbR=jsaN{UTpp(^P zPPoE9E~BG<`pLWA&t6e3 {e9QbA9zSOAcqW_3|(I#t}YIHGCn^b8 4=x$k++@C=1N39wIRSfDM17@?{1Ljj%5@$2`=#_bzA;OI9uvZW zW@j8)3cR({JC~*HeP;ll9m(~Z0m#Oe*-+;{_5epVctMGQJpSjv4gJIK#nSI}W77QG zVqq*r0y;rWmNW|EmII#|5nlQH8ElaLz;nQbmXHs53W>9!_2V*n3+TA!Gh?z!w1{#P*(OF)z5 zH6bq0Vg)pn$v=(F0|m5>0uSts4z$R;<9mUVZvzZ`271?PfgAd9IWaklu!dbZ&@cfI zAqHtbhMmt0Hw|{jI!pkY#y~6${?sDV>M+3K{(bFecc|2qw3)JIJ7N-AKiGd}q{tg# z2E0^(-gqDI-@h8 lqeHO%{VEvvm_zrpwH@ zr8j;Lc=uI #zB6K){Q3{Zz70#{yb6YSn56M`E&t`Tl#^QfIq+FUM;@gBQBHG4vhnyv?j|5 zfCKakaiK`}x z^rEd(gQ4^Jpin6u%-U`FiY3st8MGiDZetO;exRSS`TrH8$?^=#=U)JNO({i~fe-fq zTfQ0+ i6tAOKy2PnI>==lLlx_GRGaiKPj2%W+`!sCaHlVdHd5=s3{Ecg@*a zKSM)JT*U`}O7UPo|H^%~1T|Tne AF+jlRaae{*rm2hwh!pScU+i}1;X z`if-;c?Y4d4iJ2Fh}erD%kq#1L#0uZ8p5ZQ(gxF1{>uz#+nyV?noEJ9vw)@mbc~G8 zR-+z05O3)~TY >-u{Lr=?NT-)k$#;@xN6MBqQ}P^m9*NzV3$ z03E|O3cAD@LV@Y;#{;0Pu40Tn#TXr C7%dxMvhWZrSsC-=QiK_J^F`o|7d86q)*(vZ*SIo5U+E{f4!Pju zGzwE*D?R7I wXj#CoRxLrnN^+mT+V5 zzN5eH%XXePmiFYN(~1F2Yp0rAaByz@&X!%zUog0)PXj>5*~v!;13NX@vzZJFLL14P zmhl|u)xBo|&V~sQrgThJODd z5c(`NF_=^>u|5TqmjOUfjqyj<8G#6JqvHh$YSQ!_PqS_^_g z1A7* j3NIgKS{No{^4^f;=Okxl!EuYL|RR*+m zyd3yc7=~^fDPBbDD%t*q>^1e?ek~nhJXs`^gGdG>w>+Qqsep|v9SSL7TTwrKd0S^c z;Du)~XhX=N^NYTO9g`m7C$BTI)yPAYIQHxq 4vvdVTX)?`T w9#~_EMi!K9!cJd9uDqGd%Z6^=8zvwB1IJ10ggls(7XSbN07*qoM6N<$f^*K1`~Uy| literal 0 HcmV?d00001 diff --git a/static/images/icon-time.png b/static/images/icon-time.png new file mode 100644 index 0000000000000000000000000000000000000000..3d66c98246477906f2110f5de67c5f372dbc6211 GIT binary patch literal 520 zcmV+j0{8uiP) Px$!bwCyR5(wyl-+H@Fc8Pj79X#41K5CW027oEQYkjP6(*oeQ2GXOq=pI7P5>K} z4Pb-jIY_?xDvXTtAs%R?JS6u0?(2WY;LZ=bg%<=t2LR~Jk|fFMY$}11$)t;jb3_~f zK-YmB&3BUL`Fk0>6ey*f8^Ei9?Eqi{0Q=MFlr@{p4rA;I00N2_5ob!N#ErNBJj14C zmt8~aRBJtp<9KP$u7Fa?5dfrG>tP(n6y4ur(_gRG&t*`~d2h8^Q7OO&{+LvjQ4}p) z!!Qg7ob#>uU&v@Y9)D=9yGp6y74U47=6T-pi(Lm4Li9~tzipHkk5bAvMC@Bnw?;_! zq?89lTu_59KnfiZvnYyYzRqlfMk)_wQV~LI8Dl#tl^bDd Y+W Px$hDk(0R7gv;Rm)MsFcjQp&hexK(gBoU!=0pqqywlRNd?dWbU?U6Ob4U`T!P0w z<7NCwBFB;}%_P41>8;-GYM <1_Agrnj^piDAxdP+6$!+?oi?b!PQ2hEHhoy z2v9c`SpujU+rA7X7jj>0bVXVKCgBpq%8Ne1i$wX;>6sn?lkgeDqgV5Nv0x=pzE;n6 z0QfnYB9M1ubHQ8vkC+>4$c5Y$O&xF)naOwzmcIbTM#18|z7V$|Efb~^=aW7_BkHS- z8gT;vlqn7rF&VvsGCd1`a3fJM>r%80D|)P!be;g%Nu1xF0@!$M1aqZGsXbC;7w#+o zKS~tnrEsxnbMoLMFOi)epH}2yn`V%p77i>Et08nYZ6A=uN&J?$h}t?Eoz+Dq`-JUA z#n2Qk8kC%=$*K!G|0F%;LN8HGaqXX|nk4N!v{Q$)$y#NTG5p#yDaf^&plUDc%B&N% z{F}Bbvs#z?DA_@nRx8ugxR<8R9``I9T>75 DdjrX@u*4OGxl_ya_xREUZc5JW;z zvH}VSi39;s{)kjnpoUdjNUMsbX_JO3(0sK`Dv{l?^}HE-v&q_?8GG#ce(xQ0#-6Qr z?fHHm_s#lBtF<)uo_o%@zjr^+2f`SZY&NR`z@h O!vyw6d}iYBuq$h~^>yEt)`! z2y`<5z7=)`*^W{Lp#LMl^Aa#9@B$H@H;lO-ojQeeJ36$RrY8Zgw6bza(#;PM(1!rv z7i=8xUiz;Rz_UpBb)QfA`pJ_gf848qXuo>~0Gg&P65($F&~E^?zH;FT0sJo#oKqC( z3-j~yOTsaD07F6pV0n3YLD$Vs5W>e0;2mC2=pG(_fPm-Bfba2z t&!cHRFg^o+{Q%NaBuRg hp+5PV?kA0J7Qa zEe6432=Fsb3oCMe1n@sH!Y5Oy)OjcQbPNDQBx_pkEFjzu0J4)pdZ;f05I(CWlV=gp zaDs0~0Kj+i2Eo4~z|T1$l-K*%oeh55iMI#a0ibEiA2Z2(3=t;0J}^%5PXyZ%N}p8K z`Ez#mYa0NTmI_lKl^(rOclcHf8Ug$pn3JDcSeV|lisoKAwgBMr<;&q}z40{!xWf*n zZ#0@j@N_8Xzx(*{ XrfE(xppt^@jd!M0kr;%pKC%uK^;u7!3H|f8xZ6 z6)W^(2>@1BR;HV}@e%-}tzhbqMt2Pmz>;5)&zwAYvM{QyMh3v@>gvSycKI1VJUuEi zhwTT@0MUyR6Os4N&dzQR&}v`RkpOV s$zLAD9&u;@ z>|X6Y0SLb`9Q)3-l4S*aiVqYY|F3|e_(75+Fio@d9wtfH`dil<(A0I%n>y%56Lej7 zj>(~WqOYo{)IGyKBn=IKB`x~}1o+LN`L?;CB*_p6_#xmALLd+vsyD;Xp;oU!wOR%K zTi8PI&*^mP4~F4yC;((K%Xb5sUm2!DyW1#=0^#rkgo4&uhF5D lt$`0sKqzGGz+cZZ&jyvMkU-b~3N5D7N3RT`=Yaq~ zM5t-m7ew0eBO*k?M<5c33?lc)b<5>4lq*~8RWvd!s|fIwaav7&V37U5Kmb_Mw1*Jz zL8}-Zm5$G+z|>?6c$4Qw;eEkosR+%cIQs(vI=i5%5A~~$z5$?V+U*4RGyq8b61TIS z-yeXf$!Kdg?`GlC!)9p%8VzAQ!%PX`1F2N%nSS)r7Xa9XFO$u^hyXv^4^g}8@UET* zpQnEj3NHf;f_l9s0y{tiFQ?Vyt%%6y+^(fB4K8WgeF*q)FJeyo9t?(IYEn!)(#_H) z)M}Q$*bb#u0{YB?sy@=IaZdoOtgM`9G>r=)SoH9;AB#@+lF8NIiyH+YmIET%3iy3* zpPQSz)J-8h0g%zOCjjsxu4 7O=`MvbOdxAnSFUZ9aolC1~SD%Zn0MIn; z9s>N2UP3$ZI}g6k=Xav3k^5*g8c^JD&DY}^{t@U7RaKwuBve-bWHjwr0A&ArS4$)u zfr*J$Fb~g^t?d$2DrEuqrT )9`sPO4*(f0 z%h9b|x9$xFL#_M%aVW)N9vaPt>!J|Bj~CLZQypgjQ8s_f;Kalch=jep{ =mtih%dJ4plZcipE;@eB)5~m2hLTD1;~k^bZTFdfz?( z5RsD6vache5DPCK|JclH910tZ6pEI4bB(4FqARMJnnT2v70cBbK&0uP89O?A(`bSU z)S4fNcq1rE+50|l6#$~_{#i-<@)w^;h@vk`_*h+gQ;3rQ3$yn$a1{U pqX2br z>;`MHgvXP~WU)2iBE9=FKY>61qElj9{tOC$;zkh~4KZv6cQ$`JjwCxXfTlfyfPXls zP &n8| zp;I>gWFydVD*3`X=z3Eqk@#JJ0q{En_&Jd{8^?>F_57+3mO*>R8G(Kmmo)8f5b)1L z0sy;w%_feC#L`H-umkbx+8ZO$u%j{G2x2Ca{SqL2)Q%2Dp&6e!3bO33 X)s7Cn85gV{0gWc<>nn;uZQ4W-{8FfOu3i=Emtg zfSpB~0@wuZ8)KpzigpXwW|G6aCE`LDCyo4Vh-3?JjW9%47yvay42&$L4FuRI#I5*0 zR*BQpn@}jMTSd-NIz&_#8UT}%QxFP nmkBAu+tk)>8Gl(dm;|}I^=OReRtKc@nJpCu)M?JR;h(Gwvc{Rcdc`1E|-fL zCh?=S=ge^30)cMmu(44TBrJU2 ?IK`g!|Q;-|uhT7TQ^aw(#jga3WewtEm(F!o;;Mgair{*@r9#R 3-4M2i(TjDQ?njH8U%QAD=z?N{Eep<-LJKqh+;5#G`-LDA~j8DgHD zJJ`v?!zGheQww|f7dBk{uu5jPa=RXj_|}h|JiJ=^3KuU@!iYf??L=e|VcooXD~lwA zg;Xk~b)5nDM^RG7^p@$`8cswQ=SW|C58%CWaN;PTlSU1qWGAhMOIsUIt$O6ycUOs> z5=aW4Hm)BK`29O!<(x_;&LLlR3_rw){MlVk1E!7h(vdJ6j=&KYvWhYY*ypbzNG6bO z0O*!J))T2?4-$^OhI!!K_8Q_@ptQ9m@T=gEsbgDr0=e9sXwo C#-i(R>XN9S_*U-ob4D$H}Akp~p*w6Gqk>wU&`6+YdNhh+y0AlNV2(Jo$R} z{Xrj`Eos_)2>5UxRV}H)8N);2FoZ)9VW# @y`XN5|&>gcI~fIhRJs*m*IyXO+X z1c*q=Xt@^<;oZFm4*NT==Nu+J7z~5o=dG{3UzwZDCRA%>V9y~2hFygKzL!oV&mdyY zsi!Xhv^Ipx%cs#WU$mNO-pz9)5FYq(i459HN2Y1CE|S=|grkUBT}YPBEX>cp)DPXh z0nh@0ragp!5B5X2R~ !;-Ckgk@o;?0z`zGmVF)&&kQqY zt!X|Ggit8r`K;i>$lt9^Yk8=ap;jMZc_4a8Ra3VjV&Ch_Kr;XfkjY$50ybXZ?5_PP zfir=Jf)NOXLclxw!_rv;d}7#H9?FA;m)`*L|8zQiJU57b2L=EW?>EaB2YZZ!dEmvl zv>8M>Zq{vGE>$bQfhKs*(6f;Ak#u_gt3B&oS79gs?Cb|}4 $HVkGGysT5*0R}u2f(}A9rGH`L7vCq{635_?QFw9;1u+gO8MF&B*E8I zHF@_S>;7IohXw!>xp N-482~h*3TS0 zI{iZ{da?`v%*^KI<|#zwRasU-Rxo!+<5~^qx?Uk_zSD{?|LVrwY9;6Ml{rPB^NONO zSWWvzrq^sXwwq1qZHYwWvXy$UbOvZMRw|Wd3=?1T`~2gP^217v4?(L|tFOwkxfqQ` zEe}3u3jo?OuB{cm9}Y)u8A9g6Caq_9fNE{~ %XQbp?~rD z6mMsP8gz7f)NeNRimq2b5s$~eVlnBi f?ym$Gfk!@NfkHZ4rva@+}1B69K<}-deG|L9O0sEF(zw#A1;jxW%!n0B8%nx|;tz zpU?Mqet#h5mLi<&x7lnIbkhGQ9*ce6$$k&&O9%k$xi`4i@Av<;qWH!V2)f=ZRvYy{ zJ(iex% CwgmH^l*RH0D#Frsq5EX${5*`_#f z!)kH2onaUaUDsbU&BobyJpQc_$vM(o=oz4s2J-oh4-&w=vLwG(QIv#RrsjNv)Ai=6 zVHn>r4Em?p+1Pg+88r(#@gxBD%Ae2YCyC@w0l=?IvUEyOlu22VZIR0`4AKp~WSZs$ zGL0`9M)T2Q$BvaP91q7y*`g@NrMRxcVzKxx!=SrB!rNp?emjE1_KJQ)Nk#-203}5B zQQ2`)*>&GGiHMyk4I<)y4FYqGOyf1vr0>cyJ{gO}UUgeGtNZ_dseLjVuJC5l00000 LNkvXXu0mjfThfl& literal 0 HcmV?d00001 diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 zcmaJ^c|25Y`#+XyC`+ 5OUafkYqmlSEl)+V zC53EJB$S8m@9Vz4*Y&-Yb3W(3Y;(d~fM1#)0003Cv n<7K1}HtM`$d{YenwQ;C^-S(Bw!dKGPRQ{5d$=<+Bb^=&62=9 zyT3g7ffNAnXPh^N0JjBz*>4v5+kn2( URc+5KlGCVF`&O ikMw zfqqB8XK2+;V}LL3B>(G>)mVo1y5YXue4A!H*}eQbcg`t# #g9HFply&`y$2%Ui`qzhj;o^=JbnXrW48s;xu1fDr z0))La)fp=QkX*N#V0eTJXiqO11AyvJlBY^iBrIQo0Kg>g;^BKnJ9a%2Wz`F2Ka;Jl zm*B>3H!<9`zg|z+c>6eWFMqydnvs-!J))2I(LEmNyxo~2!VjOpv<0SyMNVCup-60Z zm&|RDtd8R2HEIU!!OA0Ic6-G4K{`MZ8S%UjEL!s#vj{vLBWeqI(M&DkE;aT|aziV8 zRiTRN#GNwykvPx{R==`-rP>^pa`AyJ&s**Q!zU$j(pO&Q(YolGLT=2o0>3Wlhx?Gs z#|6b*$3F$ofzT`QIA#}2(Cg}Z?5V5KrtX)WrInh*aTCsP#{@V|*7<0lm`r^xmJQm^ z9n0J^3p#yCxWPX>G11)F(iv5vIIHkbqzdH37jX&JZ~&5AV*OAtL}axw*aLAt(b -!Vf)wRw=S8((e`~WLqlDBobRbj)NXB zS>W`fibSDA>uYN*&&Ml75iep!E%^%eV~SElj=}K;6TCNXs2gYG-L`En&3y~H9fP=W z(t?;5Xalv2F5ROUkg3?7C5~z>QYq|tok{Q}toT5u=~a9mBKDc4zfSM=`?O F-lS(V+pE1(m&x$HE_9vj;Cy)b@OiPMS0bs1 zRL9h?)T!I{4m1aY9>(pR_IDhF?wocEy=CU`m(5ry-&^rJJ*Bb^PfNARJ1{|*1e;FV zGljKhHo|}41Rg|1n&m~I3+-_gFQww-#b2u97o3fIsg67|%6`|aJX{~F&RPa;TayWd zp0l(=(QbROypp_fCeOBW3BJ5PJg@UU`&fs3hd{?U6&@7>mHWNEWnN`rWk>r%`fK|= z=BRVxb2I(y07{Nwj&jZtf{0iN;H%QAvaO1&8VKn8tp5f#! zN#ZlRm)#|IR8144l_=#8)5guWCE`B$T_;p_&0iWR+1=_>mDK1{*kw_8pi=2ewD%Z1 zSVG^6Mc(Vd()@@Y^wYz75Yz{X8jD_x*B)w5@yqn8>U#Kw-qzNvJjm)}wamur^kn R_o)EvaGVkz%1gB=%{GIq3%OVcBFpT?D{PKZ079tIh|$fvf?svxl^`nuZV1~ zE?xILl^)O*=ufGhDH_pyUfNjteA>xd#yg*uvj~^Cbv&_EBt0-)!j4#crI>Uhq&0Oy z`b$;!qc=;1Sx>VD%ia^;erQ9!2)(mrrJ5zv;`SWLHu^Td;yik`Z7ioatGHn?aSD1m z@U+Y6wVHj_e`PD>_Noz^2O3?6Yg*5_BlMB@A05*?`Y-jlZ-m^4uDw+Y8A8@7g!P7H zgzZ?*UDN&1x{>g`ZiMkweBs14cdln#6I?YHr7!-) nyY$73 zckv0h$WfEY^%7rYR&g4G-pZL>Vy{3sVkc#OsI@6s?(5whAJqvO5)LEZTD6>Rdkl&h zHusOIlp{!GNUVm69y+XkTlKT;Lp%Ce`igQdYushcyC!}iq4eq#-2van)Ie{RuRq2g zH=9+-th`-$F*y3W=|Z{)eb0Wrxy$2?eT~S=V>Iq5|4fbS@l5+PI<9 0O)5aZFv- z{-7I*`r#90Z5HrSgU=dsgpnk5?TNyom7_`TM^@+iv+q@OQnFLB3o!zOw1-FDsZ|`T zu=YA~Bw1jbF-d$SlN|kOWn5vEwm2Z>A8FZD_z+WWBPebOEjbeGD(M