From 5397e103492099bb3fdece2b5de752605570ec2f Mon Sep 17 00:00:00 2001
From: mac <user@users-MacBook-Pro.local>
Date: 星期三, 15 五月 2024 15:37:09 +0800
Subject: [PATCH] Merge branch 'wjc_new' into wxw_new

---
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASVGAttributes.java             |   40 
 app/src/main/res/drawable/social_contribution_3.png                                                             |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartFontWeightType.java          |    7 
 app/src/main/res/layout/fragment_me_line.xml                                                                    |  112 
 pickerview/src/main/java/com/bigkoo/pickerview/view/OptionsPickerView.java                                      |  197 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALine.java                      |    9 
 app/src/main/java/com/hdl/photovoltaic/bean/PageNumberObject.java                                               |   61 
 app/src/main/res/layout/activity_home_login.xml                                                                 |    2 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACredits.java                   |   34 
 app/src/main/res/drawable/line_c1c1c1.xml                                                                       |    7 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartStackingType.java            |    7 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AADate.java                             |   23 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAChart.java                     |  123 
 aa_chart_core/src/main/res/drawable-xxhdpi/star4.png                                                            |    0 
 pickerview/src/main/java/com/bigkoo/pickerview/utils/LunarCalendar.java                                         |  429 +
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStyle.java                     |  192 
 app/src/main/java/com/hdl/photovoltaic/ui/message/MessageInfoActivity.java                                      |   57 
 wheelview/build.gradle                                                                                          |   47 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartZoomType.java                |    8 
 app/src/main/java/com/hdl/photovoltaic/internet/HttpClient.java                                                 |   26 
 app/src/main/res/drawable/state_b9b9b9.xml                                                                      |    4 
 app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpService.java                               |    2 
 app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchDeviceAdapter.java                                      |   99 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataElement.java               |   40 
 app/src/main/java/com/hdl/photovoltaic/ui/me/ContactUsActivity.java                                             |  122 
 app/src/main/res/drawable/next_step.png                                                                         |    0 
 app/src/main/res/drawable/last_step.png                                                                         |    0 
 pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java                            |   13 
 app/src/main/res/values/themes.xml                                                                              |    2 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAnimationType.java           |   39 
 app/src/main/java/com/hdl/photovoltaic/other/HdlResidenceLogic.java                                             |  217 
 aa_chart_core/src/main/res/drawable-xxhdpi/star7.png                                                            |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAxis.java                      |   55 
 app/src/main/res/values/colors.xml                                                                              |    2 
 app/src/main/res/layout/dialog_default_filtering.xml                                                            |  331 
 app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java                                                  |   30 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAYAxis.java                     |  259 
 app/src/main/java/com/hdl/photovoltaic/enums/PowerStationStatus.java                                            |   10 
 app/src/main/res/drawable/bj.png                                                                                |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHover.java                     |   46 
 wheelview/src/main/java/com/contrarywind/view/WheelView.java                                                    |  840 +
 app/src/main/java/com/hdl/photovoltaic/ui/home/HomePageFragment.java                                            |  544 +
 app/src/main/res/layout/fragment_home_page.xml                                                                  |  760 +
 app/src/main/java/com/hdl/photovoltaic/ui/test/TestLogActivity.java                                             |    2 
 app/src/main/java/com/hdl/photovoltaic/ui/adapter/HouseInfoAdapter.java                                         |   20 
 app/src/main/res/drawable/state_06b92a.xml                                                                      |    4 
 app/src/main/java/com/hdl/photovoltaic/jpush/JPushReceiverService.java                                          |    6 
 aa_chart_core/src/main/assets/AAChartView.html                                                                  |   27 
 app/src/main/java/com/hdl/photovoltaic/ui/me/TemperatureUnitActivity.java                                       |    6 
 app/src/main/res/layout/activity_contact_us.xml                                                                 |   80 
 third-zxing/src/main/res/layout/activity_capture.xml                                                            |    2 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArea.java                      |    9 
 app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java                                                |   12 
 app/src/main/java/com/hdl/photovoltaic/ui/me/SetActivity.java                                                   |    4 
 pickerview/src/main/res/layout/pickerview_time.xml                                                              |   64 
 app/src/main/java/com/hdl/photovoltaic/HDLApp.java                                                              |   59 
 app/src/main/res/drawable/descending_order.png                                                                  |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAreaspline.java                |   10 
 app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchMessageAdapter.java                                     |  128 
 wheelview/src/main/res/values/strings.xml                                                                       |    3 
 app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java                                                    |    8 
 app/src/main/res/drawable/history_del.png                                                                       |    0 
 app/src/main/res/layout/fragment_house_list.xml                                                                 |  572 +
 wheelview/src/main/java/com/contrarywind/listener/LoopViewGestureListener.java                                  |   25 
 wheelview/proguard-rules.pro                                                                                    |   25 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScatter.java                   |   46 
 app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHouseAdapter.java                                       |  102 
 pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java                                  |    8 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPie.java                       |   83 
 app/src/main/java/com/hdl/photovoltaic/ui/me/BindMailActivity.java                                              |    9 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeries.java                    |  158 
 app/src/main/res/drawable/ascending_descending_order_select.xml                                                 |    6 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHalo.java                      |   24 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPoint.java                     |   10 
 app/src/main/res/drawable/home_page_unselected.png                                                              |    0 
 app/src/main/res/drawable/power_station_selected.png                                                            |    0 
 third-zxing/src/main/java/com/zxing/qrcode/CaptureActivity.java                                                 |    2 
 wheelview/src/main/java/com/contrarywind/timer/MessageHandler.java                                              |   42 
 wheelview/src/main/java/com/contrarywind/timer/SmoothScrollTimerTask.java                                       |   64 
 app/src/main/java/com/hdl/photovoltaic/ui/powerstation/DeviceSearchActivity.java                                |  393 
 app/src/main/java/com/hdl/photovoltaic/ui/adapter/MessageAdapter.java                                           |   53 
 aa_chart_core/.gitignore                                                                                        |    3 
 app/src/main/res/drawable/social_contribution_2.png                                                             |    0 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/StatisticsBean.java                                              |   41 
 app/src/main/java/com/hdl/photovoltaic/ui/BPowerStationActivity.java                                            |  739 +
 app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java                                                   |   10 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAOptions.java                   |  108 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPointEvents.java               |   56 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABoxplot.java                   |   82 
 wheelview/src/androidTest/java/test/wheelview/ExampleInstrumentedTest.java                                      |   26 
 aa_chart_core/src/main/assets/AAEasing.js                                                                       |    1 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeriesEvents.java              |   13 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/CloudInverterDeviceBean.java                                     |    2 
 wheelview/src/main/java/com/contrarywind/listener/OnItemSelectedListener.java                                   |    6 
 app/build.gradle                                                                                                |   21 
 aa_chart_core/src/main/AndroidManifest.xml                                                                      |    3 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASpline.java                    |    9 
 app/src/main/res/drawable/default_condition.png                                                                 |    0 
 app/src/main/res/drawable/me_selected.png                                                                       |    0 
 aa_chart_core/build.gradle                                                                                      |   33 
 app/src/main/res/drawable/me_unselected.png                                                                     |    0 
 aa_chart_core/src/main/res/drawable-xxhdpi/star5.png                                                            |    0 
 app/src/main/res/drawable/state_ffb300.xml                                                                      |    4 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAlignType.java               |    7 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AALinearGradientDirection.java          |   12 
 app/src/main/res/drawable/edit.png                                                                              |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartType.java                    |   23 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseIdBean.java                                                 |   37 
 app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java                                          |  624 +
 app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java                                          |    6 
 app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHistoryAdapter.java                                     |   97 
 app/src/main/res/drawable/device_image.png                                                                      |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolStyleType.java         |    7 
 app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/AAChartSymbolConst.java                                  |   11 
 app/src/main/res/layout/item_data.xml                                                                           |   30 
 pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java                                |  292 
 pickerview/src/main/res/values-en/strings.xml                                                                   |   11 
 app/src/main/java/com/hdl/photovoltaic/ui/adapter/DeviceInfoAdapter.java                                        |  112 
 app/src/main/java/com/hdl/photovoltaic/other/HdlPowerStationDataStatisticsLogic.java                            |  158 
 pickerview/proguard-rules.pro                                                                                   |   17 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArearange.java                 |   10 
 app/src/main/res/drawable/message_select.png                                                                    |    0 
 app/src/main/res/drawable/message_selected.png                                                                  |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotOptions.java               |   84 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseInfoBean.java                                               |   31 
 aa_chart_core/src/main/assets/AARounded-Corners.js                                                              |    8 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAxisType.java                |    8 
 app/src/main/res/layout/toolbar_top_view_52.xml                                                                 |    2 
 wheelview/src/main/res/values/attrs.xml                                                                         |   16 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartModel.java                |  354 
 pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml                                                    |   18 
 pickerview/src/main/res/values/integers.xml                                                                     |    5 
 pickerview/src/main/AndroidManifest.xml                                                                         |    5 
 pickerview/src/main/res/layout/pickerview_options.xml                                                           |   46 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartVerticalAlignType.java       |    7 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAJSStringPurer.java                    |   26 
 settings.gradle                                                                                                 |    4 
 app/src/main/res/layout/item_station.xml                                                                        |   34 
 app/src/main/java/com/hdl/photovoltaic/ui/StartActivity.java                                                    |   21 
 app/src/main/res/drawable/search_back.png                                                                       |    0 
 app/src/main/res/drawable/search_bj_ff05000000.xml                                                              |    5 
 pickerview/.gitignore                                                                                           |   12 
 app/src/main/AndroidManifest.xml                                                                                |   19 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAGradientColor.java                    |  292 
 app/src/main/java/com/hdl/photovoltaic/internet/api/TopicApi.java                                               |   34 
 pickerview/src/main/res/layout/include_pickerview_topbar.xml                                                    |   44 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabels.java                    |   97 
 app/src/main/res/layout/activity_house_search.xml                                                               |  167 
 aa_chart_core/src/main/res/drawable-xxhdpi/star1.png                                                            |    0 
 app/src/main/res/layout/activity_test_log.xml                                                                   |    2 
 pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java                                         |  361 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataLabels.java                |  151 
 app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java                                                |   18 
 app/src/main/java/com/hdl/photovoltaic/enums/HomepageTitleTabSwitch.java                                        |    1 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/StatusOverviewBean.java                                          |   58 
 app/src/main/res/drawable/bj_13fffffff.xml                                                                      |    6 
 pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java                                 |   47 
 pickerview/src/main/res/values/strings.xml                                                                      |   11 
 wheelview/src/main/java/com/contrarywind/adapter/WheelAdapter.java                                              |   25 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAColor.java                            |  116 
 pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java                                 |   26 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AASeriesElement.java             |  281 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolType.java              |    9 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartEvents.java               |   31 
 app/src/main/java/com/hdl/photovoltaic/utils/TimeUtils.java                                                     |  149 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAItemStyle.java                 |   35 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarker.java                    |   46 
 pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectListener.java                               |   14 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPane.java                      |   34 
 app/src/main/java/com/hdl/photovoltaic/ui/home/AutoSizeMyAAChart.java                                           |   32 
 app/src/main/res/drawable/point_38c494.xml                                                                      |    6 
 app/src/main/java/com/hdl/photovoltaic/ui/me/BindPhoneActivity.java                                             |    4 
 app/src/main/java/com/hdl/photovoltaic/other/HdlJpushLogic.java                                                 |    6 
 app/src/main/res/layout/item_search_message.xml                                                                 |   76 
 pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java                                      |   13 
 aa_chart_core/src/main/assets/AAHighcharts.js                                                                   |  598 +
 app/src/main/res/drawable/time_selected_38c494.xml                                                              |    8 
 pickerview/src/main/res/layout/layout_basepickerview.xml                                                        |   16 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotBandsElement.java          |   53 
 app/src/main/java/com/hdl/photovoltaic/ui/me/languageSelectionActivity.java                                     |    5 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/SocialContributionBean.java                                      |   37 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerStates.java              |   11 
 app/src/main/res/values/strings.xml                                                                             |   47 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLineDashStyleType.java       |   15 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAInactive.java                  |   16 
 aa_chart_core/src/main/res/values/strings.xml                                                                   |    3 
 app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/BasicChartComposer.java                                  |  229 
 app/src/main/res/drawable/info_1.png                                                                            |    0 
 wheelview/src/main/java/com/contrarywind/interfaces/IPickerViewData.java                                        |    8 
 app/src/main/res/layout/item_plant_details.xml                                                                  |  214 
 aa_chart_core/src/main/res/values/colors.xml                                                                    |   16 
 pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java                                   |  315 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumn.java                    |   83 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerHover.java               |   48 
 app/src/main/res/drawable/social_contribution_1.png                                                             |    0 
 aa_chart_core/src/main/res/drawable-xxhdpi/star6.png                                                            |    0 
 pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml                                                    |   11 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACrosshair.java                 |   22 
 pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java                                     |   13 
 app/src/main/res/values/styles.xml                                                                              |   29 
 pickerview/src/main/java/com/bigkoo/pickerview/listener/ISelectTimeCallback.java                                |   10 
 app/src/main/java/com/hdl/photovoltaic/ui/CPowerStationActivity.java                                            |   10 
 app/src/main/res/layout/toolbar_top_view_44.xml                                                                 |    2 
 app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java                                             |   17 
 app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java                                                   |  363 
 app/src/main/res/layout/item_type_title.xml                                                                     |    1 
 aa_chart_core/src/main/assets/AAHighcharts-More.js                                                              |  202 
 app/src/main/java/com/hdl/photovoltaic/ui/me/WebActivity.java                                                   |    5 
 pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml                                                     |   19 
 app/src/main/java/com/hdl/photovoltaic/ui/newC/MessageCenterList.java                                           |    7 
 pickerview/build.gradle                                                                                         |   49 
 app/src/main/java/com/hdl/photovoltaic/ui/me/MeChangePasswordActivity.java                                      |    4 
 app/src/main/java/com/hdl/photovoltaic/enums/TimeType.java                                                      |   16 
 pickerview/src/main/res/values/styles.xml                                                                       |   31 
 app/src/main/res/drawable/power_station_unselected.png                                                          |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAMoveOverEventMessageModel.java |   37 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPosition.java                  |   29 
 aa_chart_core/src/main/assets/AAChartView.js                                                                    |  153 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScrollablePlotArea.java        |   34 
 app/src/main/res/layout/item_history_title.xml                                                                  |   19 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALegend.java                    |  103 
 app/src/main/res/drawable/clear.png                                                                             |    0 
 app/src/main/res/layout/item_search_house.xml                                                                   |   39 
 app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseSearchActivity.java                                 |  394 
 app/src/main/java/com/hdl/photovoltaic/widget/TypeTitleListDialog.java                                          |   46 
 app/src/main/res/drawable/location.png                                                                          |    0 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumnrange.java               |   46 
 app/src/main/res/drawable/selected_38c494.xml                                                                   |    5 
 app/src/main/res/drawable/bj_13_ffffff.xml                                                                      |   25 
 app/src/main/java/com/hdl/photovoltaic/enums/SortValue.java                                                     |    7 
 aa_chart_core/src/main/res/values/dimens.xml                                                                    |   11 
 aa_chart_core/src/main/res/drawable-xxhdpi/star2.png                                                            |    0 
 app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java                                                |  188 
 aa_chart_core/src/main/res/drawable-xxhdpi/star3.png                                                            |    0 
 app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java                                |    2 
 aa_chart_core/src/main/res/values/attrs.xml                                                                     |   38 
 app/src/main/java/com/hdl/photovoltaic/ui/LoginActivity.java                                                    |  569 +
 wheelview/src/main/res/values/dimens.xml                                                                        |   13 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABackgroundElement.java         |   46 
 app/src/main/res/drawable/reset.png                                                                             |    0 
 app/src/main/res/layout/fragment_message.xml                                                                    |  354 
 pickerview/src/main/java/com/bigkoo/pickerview/utils/ChinaDate.java                                             |  352 
 pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java                                         |  293 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAXAxis.java                     |  238 
 app/src/main/res/drawable/house_list_line_parent_bg.xml                                                         |    2 
 app/src/main/res/drawable/search_path.png                                                                       |    0 
 wheelview/src/main/java/com/contrarywind/timer/InertiaTimerTask.java                                            |   79 
 app/src/main/res/drawable/ffffff_13.xml                                                                         |    5 
 aa_chart_core/proguard-rules.pro                                                                                |   17 
 pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java                                   |   44 
 app/src/main/res/drawable/home_page_selected.png                                                                |    0 
 pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java                                           |  428 +
 pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java                                              |  900 ++
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATooltip.java                   |  141 
 app/src/main/java/com/hdl/photovoltaic/enums/SortType.java                                                      |   45 
 pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectChangeListener.java                         |   12 
 app/src/main/java/com/hdl/photovoltaic/other/HdlMessageLogic.java                                               |   44 
 pickerview/src/main/res/drawable/selector_pickerview_btn.xml                                                    |    6 
 pickerview/src/main/res/values/dimens.xml                                                                       |   13 
 app/src/main/res/layout/fragment_me.xml                                                                         |   31 
 third-zxing/build.gradle                                                                                        |    6 
 pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java                                     |  114 
 app/src/main/res/layout/activity_test_main.xml                                                                  |    2 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADateTimeLabelFormats.java      |   53 
 app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java                                                        |   36 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabel.java                     |   72 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/ContactBean.java                                                 |   28 
 app/src/main/res/layout/activity_device_search.xml                                                              |  168 
 pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml                                                     |   11 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAOptionsConstructor.java        |  297 
 app/src/main/res/drawable/message_unselected.png                                                                |    0 
 app/src/main/res/layout/activity_as_regards.xml                                                                 |   47 
 app/src/main/res/layout/activity_search_messge.xml                                                              |  167 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartView.java                 |  399 
 app/src/main/res/layout/swipe_right_layout.xml                                                                  |    6 
 app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java                                       |    4 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStates.java                    |   24 
 app/src/main/java/com/hdl/photovoltaic/enums/GridType.java                                                      |    8 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/DataOverBean.java                                                |   75 
 aa_chart_core/src/main/res/drawable-xxhdpi/star8.png                                                            |    0 
 app/src/main/java/com/hdl/photovoltaic/widget/DefaultFilteringDialog.java                                       |  345 
 app/src/main/res/drawable/add.png                                                                               |    0 
 app/src/main/res/drawable/station_status_no_ffffff.xml                                                          |    5 
 aa_chart_core/src/main/assets/AAFunnel.js                                                                       |   21 
 wheelview/.gitignore                                                                                            |   12 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAnimation.java                 |   16 
 app/src/main/res/drawable/ascending_sort.png                                                                    |    0 
 app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/CustomStyleChartComposer.java                            | 2100 ++++
 wheelview/src/main/res/values/colors.xml                                                                        |   14 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAShadow.java                    |   35 
 app/src/main/res/layout/activity_my_power_station.xml                                                           |   56 
 app/src/main/res/layout/item_message.xml                                                                        |   16 
 app/src/main/java/com/hdl/photovoltaic/other/HdlLogLogic.java                                                   |   55 
 app/src/main/java/com/hdl/photovoltaic/ui/message/SearchMessageActivity.java                                    |  404 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASelect.java                    |   28 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASubtitle.java                  |   48 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/UnCountBean.java                                                 |   36 
 pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java                      |   11 
 app/src/main/java/com/hdl/photovoltaic/widget/ConfirmationExceptionDialog.java                                  |    2 
 app/src/main/res/layout/item_device_details.xml                                                                 |  210 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAZonesElement.java              |   28 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABar.java                       |   82 
 app/src/main/java/com/hdl/photovoltaic/base/BaseDialog.java                                                     |    3 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABubble.java                    |   35 
 app/src/main/res/drawable/state_e34343.xml                                                                      |    4 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLayoutType.java              |    6 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAResetZoomButton.java           |   26 
 aa_chart_core/README.md                                                                                         |    1 
 /dev/null                                                                                                       |    3 
 app/src/main/res/drawable/disc.png                                                                              |    0 
 wheelview/src/main/AndroidManifest.xml                                                                          |    4 
 app/src/main/java/com/hdl/photovoltaic/ui/test/TestMainActivity.java                                            |    6 
 app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListEditActivity.java                               |    6 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALang.java                      |   34 
 app/src/main/java/com/hdl/photovoltaic/ui/bean/DeviceBean.java                                                  |   78 
 app/src/main/java/com/hdl/photovoltaic/ui/me/AccountAndSecurityActivity.java                                    |    4 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATitle.java                     |   49 
 aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotLinesElement.java          |   50 
 app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListFragment.java                                   |  579 +
 app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java                                             |    7 
 app/src/main/res/drawable/station_status_sele_38c494.xml                                                        |    5 
 321 files changed, 24,619 insertions(+), 1,033 deletions(-)

diff --git a/aa_chart_core/.gitignore b/aa_chart_core/.gitignore
new file mode 100644
index 0000000..426601d
--- /dev/null
+++ b/aa_chart_core/.gitignore
@@ -0,0 +1,3 @@
+/build
+.DS_Store
+
diff --git a/aa_chart_core/README.md b/aa_chart_core/README.md
new file mode 100644
index 0000000..8be81ff
--- /dev/null
+++ b/aa_chart_core/README.md
@@ -0,0 +1 @@
+# AAChartCore
\ No newline at end of file
diff --git a/aa_chart_core/build.gradle b/aa_chart_core/build.gradle
new file mode 100644
index 0000000..85c958f
--- /dev/null
+++ b/aa_chart_core/build.gradle
@@ -0,0 +1,33 @@
+apply plugin: 'com.android.library'
+
+android {
+    compileSdk 31
+
+    defaultConfig {
+        minSdk 23
+        targetSdk 31
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+}
+
+
+dependencies {
+    implementation 'com.google.code.gson:gson:2.10.1'
+}
+
+
+
diff --git a/aa_chart_core/proguard-rules.pro b/aa_chart_core/proguard-rules.pro
new file mode 100644
index 0000000..41afecb
--- /dev/null
+++ b/aa_chart_core/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in D:\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/aa_chart_core/src/main/AndroidManifest.xml b/aa_chart_core/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..5aa7bdb
--- /dev/null
+++ b/aa_chart_core/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+<manifest package="com.github.AAChartModel.AAChartCore" xmlns:android="http://schemas.android.com/apk/res/android">
+
+</manifest>
diff --git a/aa_chart_core/src/main/assets/AAChartView.html b/aa_chart_core/src/main/assets/AAChartView.html
new file mode 100755
index 0000000..d97f494
--- /dev/null
+++ b/aa_chart_core/src/main/assets/AAChartView.html
@@ -0,0 +1,27 @@
+<html>
+    <head>
+        <meta charset="UTF-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=3.0,user-scalable = no">
+            <title>AAChartKit-Swift</title>
+<!--                    <script src="https://code.highcharts.com/highcharts.js"></script>-->
+
+        <script src="AAChartView.js" ></script>
+        <script src="AAHighcharts.js"></script>
+        <script src="AAHighcharts-More.js"></script>
+        <script src="AAFunnel.js"></script>
+        <script src="AAEasing.js"></script>
+        <script src="AARounded-Corners.js"></script>
+
+        <style>
+                *{
+                    -webkit-user-select: none;
+                    user-select: none;
+                }
+            </style>
+            </head>
+    <body style="margin:0px 0px 0px 0px;">
+    <div id="container" style="width:100%; height: 100%;"></div>
+        </div>
+
+    </body>
+</html>
diff --git a/aa_chart_core/src/main/assets/AAChartView.js b/aa_chart_core/src/main/assets/AAChartView.js
new file mode 100644
index 0000000..c61d060
--- /dev/null
+++ b/aa_chart_core/src/main/assets/AAChartView.js
@@ -0,0 +1,153 @@
+
+        var aaGlobalChart;
+
+        function loadTheHighChartView (sender,receivedWidth, receivedHeight) {
+            var aaOptions = JSON.parse(sender, function (key, value) {
+            if (   typeof(value) == 'string'
+                && value.indexOf('function') != -1) {
+                  return eval(value)
+                }
+                return value;
+                });
+
+            if (aaOptions.xAxisArray) {
+                aaOptions.xAxis = aaOptions.xAxisArray
+                }
+
+            if (aaOptions.yAxisArray) {
+                aaOptions.yAxis = aaOptions.yAxisArray
+                }
+
+            if (aaOptions.defaultOptions) {
+                Highcharts.setOptions({
+                 lang: aaOptions.defaultOptions
+                   });
+                 }
+
+            if (aaOptions.plotOptions) {
+                configurePlotOptions(aaOptions);
+                }
+
+            aaGlobalChart = Highcharts.chart('container', aaOptions);
+           //鍏ㄥ眬閰嶇疆(鍙�氳繃鍏ㄥ眬閰嶇疆璁剧疆涓婚)https://api.hcharts.cn/highcharts#Highcharts.setOptions
+        };
+
+        function configurePlotOptions(aaOptions) {
+                    var aaPlotOptions = aaOptions.plotOptions;
+                    var animation = aaPlotOptions.series.animation;
+                    if (animation) {//鎳掕皟鐢�(鍙湁鍦� AAChartModel 瀹炰緥瀵硅薄璁剧疆浜� animationType 灞炴�у�肩殑鏃跺�欐墠浼氳皟鐢ㄨ缃姩鐢荤被鍨嬬殑鍑芥暟,鍚﹀垯涓嶈皟鐢�)
+                        var animationEasingType = animation.easing;
+                        animation.easing = configureTheChartAnimationEasingType(animationEasingType);
+                    }
+                    // 娣诲姞榧犳爣浜嬩欢
+                    if (aaOptions.touchEventEnabled == true && aaPlotOptions.series) {
+                        configureChartTouchEvent(aaPlotOptions);
+                    }
+                }
+
+        function configureChartTouchEvent(aaPlotOptions) {
+                    var mouseOverFunc = function(){
+                        var message = {
+                            name: this.series.name,
+                            y :this.y,
+                            x: this.x,
+                            category: this.category ? this.category:"",
+                            offset: {plotX:this.plotX,plotY:this.plotY},
+                            index: this.index,
+                        };
+
+                        var messageStr = JSON.stringify(message);
+                        window.androidObject.androidMethod(messageStr);
+                    };
+
+                    if (aaPlotOptions.series.point) {// set property directly for series point
+                        aaPlotOptions.series.point.events.mouseOver = mouseOverFunc;
+                    } else {// create a new series point object instance
+                        var seriesPoint = {
+                            events:{
+                                mouseOver: mouseOverFunc,
+                             }
+                         };
+                    aaPlotOptions.series.point = seriesPoint;
+                    }
+                }
+
+        function onlyRefreshTheChartDataWithSeries(receivedSeries, animation) {
+            var receivedSeriesArr = JSON.parse(receivedSeries);
+            var seriesArrLength = receivedSeriesArr.length;
+            for (var i = 0; i < seriesArrLength; i++) {
+                var receivedSeriesElementData = receivedSeriesArr[i].data;
+                // 鑾峰彇series
+                var seriesElement = aaGlobalChart.series[i];
+                // 鎵ц鍙埛鏂版暟鎹殑鍑芥暟
+                seriesElement.setData(receivedSeriesElementData, false);
+            }
+
+            var animationBool = (animation == "true") ? true:false;
+            aaGlobalChart.redraw(animationBool);
+        }
+
+        function updateChart(optionsStr, redraw) {
+            var options = JSON.parse(optionsStr);
+            aaGlobalChart.update(options,redraw);
+        }
+
+        function addPointToChartSeries(elementIndex, optionsStr, redraw, shift, animation) {
+            var options = JSON.parse(optionsStr);
+            var redrawBool = (redraw == "true") ? true:false;
+            var shiftBool = (shift == "true") ? true:false;
+            var animationBool = (animation == "true") ? true:false;
+
+            var seriesElement = aaGlobalChart.series[elementIndex];
+            seriesElement.addPoint(options, redrawBool, shiftBool, animationBool);
+        }
+
+        //pragma mark -- setter method
+        function setTheChartViewContentWidth(receivedWidth) {
+            var container = document.getElementById('container'); //鑾峰緱鍏冪礌
+            container.style.width = receivedWidth; //璁剧疆瀹藉害
+            aaGlobalChart.reflow();
+        }
+
+        function setTheChartViewContentHeight(receivedHeight) {
+            var container = document.getElementById('container'); //鑾峰緱鍏冪礌
+            container.style.height = receivedHeight; //璁剧疆楂樺害
+            aaGlobalChart.reflow();
+        }
+
+        function setChartSeriesHidden(hidden) {
+            for (var i = 0; i < aaGlobalChart.series.length; i++) {
+                var seriesElement = aaGlobalChart.series[i];
+                if (hidden == true) {
+                    seriesElement.hide();
+                } else {
+                    seriesElement.show();
+                }
+            }
+        }
+
+        function showTheSeriesElementContentWithIndex(elementIndex) {
+            var seriesElement = aaGlobalChart.series[elementIndex];
+            seriesElement.show();
+        }
+
+        function hideTheSeriesElementContentWithIndex(elementIndex) {
+            var seriesElement = aaGlobalChart.series[elementIndex];
+            seriesElement.hide();
+        }
+
+        function addElementToChartSeriesWithElement(elementStr) {
+            var seriesElement = JSON.parse(elementStr);
+            aaGlobalChart.addSeries(seriesElement);
+        }
+
+        function removeElementFromChartSeriesWithElementIndex(elementIndex) {
+            var seriesElement = aaGlobalChart.series[elementIndex];
+            if (seriesElement) {
+                seriesElement.remove(true);
+            }
+        }
+
+        function evaluateTheJavaScriptStringFunction(jsStringFunction) {
+            eval(jsStringFunction);
+        }
\ No newline at end of file
diff --git a/aa_chart_core/src/main/assets/AAEasing.js b/aa_chart_core/src/main/assets/AAEasing.js
new file mode 100644
index 0000000..3fdb61b
--- /dev/null
+++ b/aa_chart_core/src/main/assets/AAEasing.js
@@ -0,0 +1 @@
+function configureTheChartAnimationEasingType(easingType){var animationObject={easeInQuad:function(pos){return Math.pow(pos,2)},easeOutQuad:function(pos){return -(Math.pow((pos-1),2)-1)},easeInOutQuad:function(pos){if((pos/=0.5)<1){return 0.5*Math.pow(pos,2)}return -0.5*((pos-=2)*pos-2)},easeInCubic:function(pos){return Math.pow(pos,3)},easeOutCubic:function(pos){return(Math.pow((pos-1),3)+1)},easeInOutCubic:function(pos){if((pos/=0.5)<1){return 0.5*Math.pow(pos,3)}return 0.5*(Math.pow((pos-2),3)+2)},easeInQuart:function(pos){return Math.pow(pos,4)},easeOutQuart:function(pos){return -(Math.pow((pos-1),4)-1)},easeInOutQuart:function(pos){if((pos/=0.5)<1){return 0.5*Math.pow(pos,4)}return -0.5*((pos-=2)*Math.pow(pos,3)-2)},easeInQuint:function(pos){return Math.pow(pos,5)},easeOutQuint:function(pos){return(Math.pow((pos-1),5)+1)},easeInOutQuint:function(pos){if((pos/=0.5)<1){return 0.5*Math.pow(pos,5)}return 0.5*(Math.pow((pos-2),5)+2)},easeInSine:function(pos){return -Math.cos(pos*(Math.PI/2))+1},easeOutSine:function(pos){return Math.sin(pos*(Math.PI/2))},easeInOutSine:function(pos){return(-0.5*(Math.cos(Math.PI*pos)-1))},easeInExpo:function(pos){return(pos===0)?0:Math.pow(2,10*(pos-1))},easeOutExpo:function(pos){return(pos===1)?1:-Math.pow(2,-10*pos)+1},easeInOutExpo:function(pos){if(pos===0){return 0}if(pos===1){return 1}if((pos/=0.5)<1){return 0.5*Math.pow(2,10*(pos-1))}return 0.5*(-Math.pow(2,-10*--pos)+2)},easeInCirc:function(pos){return -(Math.sqrt(1-(pos*pos))-1)},easeOutCirc:function(pos){return Math.sqrt(1-Math.pow((pos-1),2))},easeInOutCirc:function(pos){if((pos/=0.5)<1){return -0.5*(Math.sqrt(1-pos*pos)-1)}return 0.5*(Math.sqrt(1-(pos-=2)*pos)+1)},easeOutBounce:function(pos){if((pos)<(1/2.75)){return(7.5625*pos*pos)}else{if(pos<(2/2.75)){return(7.5625*(pos-=(1.5/2.75))*pos+0.75)}else{if(pos<(2.5/2.75)){return(7.5625*(pos-=(2.25/2.75))*pos+0.9375)}else{return(7.5625*(pos-=(2.625/2.75))*pos+0.984375)}}}},easeInBack:function(pos){var s=1.70158;return(pos)*pos*((s+1)*pos-s)},easeOutBack:function(pos){var s=1.70158;return(pos=pos-1)*pos*((s+1)*pos+s)+1},easeInOutBack:function(pos){var s=1.70158;if((pos/=0.5)<1){return 0.5*(pos*pos*(((s*=(1.525))+1)*pos-s))}return 0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos+s)+2)},elastic:function(pos){return -1*Math.pow(4,-8*pos)*Math.sin((pos*6-1)*(2*Math.PI)/2)+1},swingFromTo:function(pos){var s=1.70158;return((pos/=0.5)<1)?0.5*(pos*pos*(((s*=(1.525))+1)*pos-s)):0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos+s)+2)},swingFrom:function(pos){var s=1.70158;return pos*pos*((s+1)*pos-s)},swingTo:function(pos){var s=1.70158;return(pos-=1)*pos*((s+1)*pos+s)+1},bounce:function(pos){if(pos<(1/2.75)){return(7.5625*pos*pos)}else{if(pos<(2/2.75)){return(7.5625*(pos-=(1.5/2.75))*pos+0.75)}else{if(pos<(2.5/2.75)){return(7.5625*(pos-=(2.25/2.75))*pos+0.9375)}else{return(7.5625*(pos-=(2.625/2.75))*pos+0.984375)}}}},bouncePast:function(pos){if(pos<(1/2.75)){return(7.5625*pos*pos)}else{if(pos<(2/2.75)){return 2-(7.5625*(pos-=(1.5/2.75))*pos+0.75)}else{if(pos<(2.5/2.75)){return 2-(7.5625*(pos-=(2.25/2.75))*pos+0.9375)}else{return 2-(7.5625*(pos-=(2.625/2.75))*pos+0.984375)}}}},easeFromTo:function(pos){if((pos/=0.5)<1){return 0.5*Math.pow(pos,4)}return -0.5*((pos-=2)*Math.pow(pos,3)-2)},easeFrom:function(pos){return Math.pow(pos,4)},easeTo:function(pos){return Math.pow(pos,0.25)}};return animationObject[easingType]};
\ No newline at end of file
diff --git a/aa_chart_core/src/main/assets/AAFunnel.js b/aa_chart_core/src/main/assets/AAFunnel.js
new file mode 100644
index 0000000..7f1796e
--- /dev/null
+++ b/aa_chart_core/src/main/assets/AAFunnel.js
@@ -0,0 +1,21 @@
+/*
+ Highcharts JS v10.0.0 (2022-03-07)
+
+ Highcharts funnel module
+
+ (c) 2010-2021 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(a){"object"===typeof module&&module.exports?(a["default"]=a,module.exports=a):"function"===typeof define&&define.amd?define("highcharts/modules/funnel",["highcharts"],function(n){a(n);a.Highcharts=n;return a}):a("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(a){function n(a,l,f,d){a.hasOwnProperty(l)||(a[l]=d.apply(null,f),"function"===typeof CustomEvent&&window.dispatchEvent(new CustomEvent("HighchartsModuleLoaded",{detail:{path:l,module:a[l]}})))}a=a?a._modules:{};n(a,"Series/Funnel/FunnelSeries.js",
+[a["Core/Chart/Chart.js"],a["Core/Globals.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,l,f,d){var n=this&&this.__extends||function(){var a=function(b,g){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(g,e){g.__proto__=e}||function(g,e){for(var a in e)e.hasOwnProperty(a)&&(g[a]=e[a])};return a(b,g)};return function(b,g){function D(){this.constructor=b}a(b,g);b.prototype=null===g?Object.create(g):(D.prototype=g.prototype,new D)}}(),J=l.noop,y=f.series,
+c=f.seriesTypes.pie;l=d.addEvent;var z=d.extend,L=d.fireEvent,A=d.isArray,B=d.merge,I=d.pick;d=function(a){function b(){var g=null!==a&&a.apply(this,arguments)||this;g.data=void 0;g.options=void 0;g.points=void 0;return g}n(b,a);b.prototype.alignDataLabel=function(g,a,e,b,k){var u=g.series;b=u.options.reversed;var h=g.dlBox||g.shapeArgs,d=e.align,c=e.verticalAlign,f=((u.options||{}).dataLabels||{}).inside,m=u.center[1];u=u.getWidthAt((b?2*m-g.plotY:g.plotY)-h.height/2+a.height);u="middle"===c?(h.topWidth-
+h.bottomWidth)/4:(u-h.bottomWidth)/2;m=h.y;var p=h.x,D=I(a.height,a.getBBox().height);"middle"===c?m=h.y-h.height/2+D/2:"top"===c&&(m=h.y-h.height+D+e.padding);if("top"===c&&!b||"bottom"===c&&b||"middle"===c)"right"===d?p=h.x-e.padding+u:"left"===d&&(p=h.x+e.padding-u);b={x:p,y:b?m-h.height:m,width:h.bottomWidth,height:h.height};e.verticalAlign="bottom";f&&!g.visible||y.prototype.alignDataLabel.call(this,g,a,e,b,k);f&&(!g.visible&&g.dataLabel&&(g.dataLabel.placed=!1),g.contrastColor&&a.css({color:g.contrastColor}))};
+b.prototype.drawDataLabels=function(){var a=this.data,b=this.options.dataLabels.distance,e,c=a.length;for(this.center[2]-=2*b;c--;){var k=a[c];var d=(e=k.half)?1:-1;var h=k.plotY;k.labelDistance=I(k.options.dataLabels&&k.options.dataLabels.distance,b);this.maxLabelDistance=Math.max(k.labelDistance,this.maxLabelDistance||0);var y=this.getX(h,e,k);k.labelPosition={natural:{x:0,y:h},"final":{},alignment:e?"right":"left",connectorPosition:{breakAt:{x:y+(k.labelDistance-5)*d,y:h},touchingSliceAt:{x:y+
+k.labelDistance*d,y:h}}}}f.seriesTypes[this.options.dataLabels.inside?"column":"pie"].prototype.drawDataLabels.call(this)};b.prototype.translate=function(){function a(a,b){return/%$/.test(a)?b*parseInt(a,10)/100:parseInt(a,10)}var b=0,e=this,c=e.chart,k=e.options,d=k.reversed,h=k.ignoreHiddenPoint,f=c.plotWidth;c=c.plotHeight;var y=0,l=k.center,m=a(l[0],f),p=a(l[1],c),n=a(k.width,f),v,w=a(k.height,c),z=a(k.neckWidth,f),H=a(k.neckHeight,c),A=p-w/2+w-H;f=e.data;var B,F,K="left"===k.dataLabels.position?
+1:0,E,q,G,x,r,C,t;e.getWidthAt=function(a){var b=p-w/2;return a>A||w===H?z:z+(n-z)*(1-(a-b)/(w-H))};e.getX=function(a,b,c){return m+(b?-1:1)*(e.getWidthAt(d?2*p-a:a)/2+c.labelDistance)};e.center=[m,p,w];e.centerX=m;f.forEach(function(a){h&&!1===a.visible||(b+=a.y)});f.forEach(function(a){t=null;F=b?a.y/b:0;q=p-w/2+y*w;r=q+F*w;v=e.getWidthAt(q);E=m-v/2;G=E+v;v=e.getWidthAt(r);x=m-v/2;C=x+v;q>A?(E=x=m-z/2,G=C=m+z/2):r>A&&(t=r,v=e.getWidthAt(A),x=m-v/2,C=x+v,r=A);d&&(q=2*p-q,r=2*p-r,null!==t&&(t=2*p-
+t));B=[["M",E,q],["L",G,q],["L",C,r]];null!==t&&B.push(["L",C,t],["L",x,t]);B.push(["L",x,r],["Z"]);a.shapeType="path";a.shapeArgs={d:B};a.percentage=100*F;a.plotX=m;a.plotY=(q+(t||r))/2;a.tooltipPos=[m,a.plotY];a.dlBox={x:x,y:q,topWidth:G-E,bottomWidth:C-x,height:Math.abs(I(t,r)-q),width:NaN};a.slice=J;a.half=K;h&&!1===a.visible||(y+=F)});L(e,"afterTranslate")};b.prototype.sortByAngle=function(a){a.sort(function(a,b){return a.plotY-b.plotY})};b.defaultOptions=B(c.defaultOptions,{animation:!1,center:["50%",
+"50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",reversed:!1,size:!0,dataLabels:{connectorWidth:1,verticalAlign:"middle"},states:{select:{color:"#cccccc",borderColor:"#000000"}}});return b}(c);z(d.prototype,{animate:J});l(a,"afterHideAllOverlappingLabels",function(){this.series.forEach(function(a){var b=a.options&&a.options.dataLabels;A(b)&&(b=b[0]);a.is("pie")&&a.placeDataLabels&&b&&!b.inside&&a.placeDataLabels()})});f.registerSeriesType("funnel",d);"";return d});n(a,"Series/Pyramid/PyramidSeries.js",
+[a["Series/Funnel/FunnelSeries.js"],a["Core/Series/SeriesRegistry.js"],a["Core/Utilities.js"]],function(a,l,f){var d=this&&this.__extends||function(){var a=function(d,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])};return a(d,c)};return function(d,c){function f(){this.constructor=d}a(d,c);d.prototype=null===c?Object.create(c):(f.prototype=c.prototype,new f)}}(),n=f.merge;f=function(f){function l(){var a=
+null!==f&&f.apply(this,arguments)||this;a.data=void 0;a.options=void 0;a.points=void 0;return a}d(l,f);l.defaultOptions=n(a.defaultOptions,{neckWidth:"0%",neckHeight:"0%",reversed:!0});return l}(a);l.registerSeriesType("pyramid",f);"";return f});n(a,"masters/modules/funnel.src.js",[],function(){})});
+//# sourceMappingURL=funnel.js.map
\ No newline at end of file
diff --git a/aa_chart_core/src/main/assets/AAHighcharts-More.js b/aa_chart_core/src/main/assets/AAHighcharts-More.js
new file mode 100644
index 0000000..0112d7b
--- /dev/null
+++ b/aa_chart_core/src/main/assets/AAHighcharts-More.js
@@ -0,0 +1,202 @@
+/*
+ Highcharts JS v10.0.0 (2022-03-07)
+
+ (c) 2009-2021 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(d){"object"===typeof module&&module.exports?(d["default"]=d,module.exports=d):"function"===typeof define&&define.amd?define("highcharts/highcharts-more",["highcharts"],function(A){d(A);d.Highcharts=A;return d}):d("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(d){function A(d,e,l,a){d.hasOwnProperty(e)||(d[e]=a.apply(null,l),"function"===typeof CustomEvent&&window.dispatchEvent(new CustomEvent("HighchartsModuleLoaded",{detail:{path:e,module:d[e]}})))}d=d?d._modules:{};A(d,
+"Extensions/Pane.js",[d["Core/Chart/Chart.js"],d["Series/CenteredUtilities.js"],d["Core/Globals.js"],d["Core/Pointer.js"],d["Core/Utilities.js"]],function(d,e,l,a,c){function t(b,m,n){return Math.sqrt(Math.pow(b-n[0],2)+Math.pow(m-n[1],2))<=n[2]/2}var p=c.addEvent,k=c.extend,x=c.merge,w=c.pick,b=c.splat;d.prototype.collectionsWithUpdate.push("pane");c=function(){function g(b,g){this.options=this.chart=this.center=this.background=void 0;this.coll="pane";this.defaultOptions={center:["50%","50%"],size:"85%",
+innerSize:"0%",startAngle:0};this.defaultBackgroundOptions={shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"};this.init(b,g)}g.prototype.init=function(b,g){this.chart=g;this.background=[];g.pane.push(this);this.setOptions(b)};g.prototype.setOptions=function(b){this.options=x(this.defaultOptions,this.chart.angular?{background:{}}:void 0,
+b)};g.prototype.render=function(){var g=this.options,n=this.options.background,q=this.chart.renderer;this.group||(this.group=q.g("pane-group").attr({zIndex:g.zIndex||0}).add());this.updateCenter();if(n)for(n=b(n),g=Math.max(n.length,this.background.length||0),q=0;q<g;q++)n[q]&&this.axis?this.renderBackground(x(this.defaultBackgroundOptions,n[q]),q):this.background[q]&&(this.background[q]=this.background[q].destroy(),this.background.splice(q,1))};g.prototype.renderBackground=function(b,g){var n="animate",
+m={"class":"highcharts-pane "+(b.className||"")};this.chart.styledMode||k(m,{fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth});this.background[g]||(this.background[g]=this.chart.renderer.path().add(this.group),n="attr");this.background[g][n]({d:this.axis.getPlotBandPath(b.from,b.to,b)}).attr(m)};g.prototype.updateCenter=function(b){this.center=(b||this.axis||{}).center=e.getCenter.call(this)};g.prototype.update=function(b,g){x(!0,this.options,b);this.setOptions(this.options);
+this.render();this.chart.axes.forEach(function(b){b.pane===this&&(b.pane=null,b.update({},g))},this)};return g}();d.prototype.getHoverPane=function(b){var g=this,n;b&&g.pane.forEach(function(q){var m=b.chartX-g.plotLeft,a=b.chartY-g.plotTop;t(g.inverted?a:m,g.inverted?m:a,q.center)&&(n=q)});return n};p(d,"afterIsInsidePlot",function(b){this.polar&&(b.isInsidePlot=this.pane.some(function(g){return t(b.x,b.y,g.center)}))});p(a,"beforeGetHoverData",function(b){var g=this.chart;g.polar?(g.hoverPane=g.getHoverPane(b),
+b.filter=function(n){return n.visible&&!(!b.shared&&n.directTouch)&&w(n.options.enableMouseTracking,!0)&&(!g.hoverPane||n.xAxis.pane===g.hoverPane)}):g.hoverPane=void 0});p(a,"afterGetHoverData",function(b){var g=this.chart;b.hoverPoint&&b.hoverPoint.plotX&&b.hoverPoint.plotY&&g.hoverPane&&!t(b.hoverPoint.plotX,b.hoverPoint.plotY,g.hoverPane.center)&&(b.hoverPoint=void 0)});l.Pane=c;return l.Pane});A(d,"Core/Axis/RadialAxis.js",[d["Core/Axis/AxisDefaults.js"],d["Core/DefaultOptions.js"],d["Core/Globals.js"],
+d["Core/Utilities.js"]],function(d,e,l,a){var c=e.defaultOptions,t=l.noop,p=a.addEvent,k=a.correctFloat,x=a.defined,w=a.extend,b=a.fireEvent,g=a.merge,m=a.pick,n=a.relativeLength,q=a.wrap,H;(function(a){function e(){this.autoConnect=this.isCircular&&"undefined"===typeof m(this.userMax,this.options.max)&&k(this.endAngleRad-this.startAngleRad)===k(2*Math.PI);!this.isCircular&&this.chart.inverted&&this.max++;this.autoConnect&&(this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0)}
+function y(){var h=this;return function(){if(h.isRadial&&h.tickPositions&&h.options.labels&&!0!==h.options.labels.allowOverlap)return h.tickPositions.map(function(f){return h.ticks[f]&&h.ticks[f].label}).filter(function(h){return!!h})}}function z(){return t}function f(h,f,b){var r=this.pane.center,u=h.value;if(this.isCircular){if(x(u))h.point&&(g=h.point.shapeArgs||{},g.start&&(u=this.chart.inverted?this.translate(h.point.rectPlotY,!0):h.point.x));else{var g=h.chartX||0;var v=h.chartY||0;u=this.translate(Math.atan2(v-
+b,g-f)-this.startAngleRad,!0)}h=this.getPosition(u);g=h.x;v=h.y}else x(u)||(g=h.chartX,v=h.chartY),x(g)&&x(v)&&(b=r[1]+this.chart.plotTop,u=this.translate(Math.min(Math.sqrt(Math.pow(g-f,2)+Math.pow(v-b,2)),r[2]/2)-r[3]/2,!0));return[u,g||0,v||0]}function h(h,f,b){h=this.pane.center;var r=this.chart,u=this.left||0,g=this.top||0,v=m(f,h[2]/2-this.offset);"undefined"===typeof b&&(b=this.horiz?0:this.center&&-this.center[3]/2);b&&(v+=b);this.isCircular||"undefined"!==typeof f?(f=this.chart.renderer.symbols.arc(u+
+h[0],g+h[1],v,v,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}),f.xBounds=[u+h[0]],f.yBounds=[g+h[1]-v]):(f=this.postTranslate(this.angleRad,v),f=[["M",this.center[0]+r.plotLeft,this.center[1]+r.plotTop],["L",f.x,f.y]]);return f}function u(){this.constructor.prototype.getOffset.call(this);this.chart.axisOffset[this.side]=0}function r(h,f,b){var r=this.chart,u=function(h){if("string"===typeof h){var f=parseInt(h,10);y.test(h)&&(f=f*B/100);return f}return h},g=this.center,v=this.startAngleRad,
+B=g[2]/2,n=Math.min(this.offset,0),q=this.left||0,a=this.top||0,y=/%$/,z=this.isCircular,c=m(u(b.outerRadius),B),k=u(b.innerRadius);u=m(u(b.thickness),10);if("polygon"===this.options.gridLineInterpolation)n=this.getPlotLinePath({value:h}).concat(this.getPlotLinePath({value:f,reverse:!0}));else{h=Math.max(h,this.min);f=Math.min(f,this.max);h=this.translate(h);f=this.translate(f);z||(c=h||0,k=f||0);if("circle"!==b.shape&&z)b=v+(h||0),v+=f||0;else{b=-Math.PI/2;v=1.5*Math.PI;var E=!0}c-=n;n=r.renderer.symbols.arc(q+
+g[0],a+g[1],c,c,{start:Math.min(b,v),end:Math.max(b,v),innerR:m(k,c-(u-n)),open:E});z&&(z=(v+b)/2,q=q+g[0]+g[2]/2*Math.cos(z),n.xBounds=z>-Math.PI/2&&z<Math.PI/2?[q,r.plotWidth]:[0,q],n.yBounds=[a+g[1]+g[2]/2*Math.sin(z)],n.yBounds[0]+=z>-Math.PI&&0>z||z>Math.PI?-10:10)}return n}function B(h){var f=this,b=this.pane.center,r=this.chart,u=r.inverted,g=h.reverse,v=this.pane.options.background?this.pane.options.background[0]||this.pane.options.background:{},B=v.innerRadius||"0%",q=v.outerRadius||"100%",
+a=b[0]+r.plotLeft,z=b[1]+r.plotTop,c=this.height,y=h.isCrosshair;v=b[3]/2;var m=h.value,k;var E=this.getPosition(m);var e=E.x;E=E.y;y&&(E=this.getCrosshairPosition(h,a,z),m=E[0],e=E[1],E=E[2]);if(this.isCircular)m=Math.sqrt(Math.pow(e-a,2)+Math.pow(E-z,2)),g="string"===typeof B?n(B,1):B/m,r="string"===typeof q?n(q,1):q/m,b&&v&&(v/=m,g<v&&(g=v),r<v&&(r=v)),b=[["M",a+g*(e-a),z-g*(z-E)],["L",e-(1-r)*(e-a),E+(1-r)*(z-E)]];else if((m=this.translate(m))&&(0>m||m>c)&&(m=0),"circle"===this.options.gridLineInterpolation)b=
+this.getLinePath(0,m,v);else if(b=[],r[u?"yAxis":"xAxis"].forEach(function(h){h.pane===f.pane&&(k=h)}),k)for(a=k.tickPositions,k.autoConnect&&(a=a.concat([a[0]])),g&&(a=a.slice().reverse()),m&&(m+=v),z=0;z<a.length;z++)v=k.getPosition(a[z],m),b.push(z?["L",v.x,v.y]:["M",v.x,v.y]);return b}function v(h,f){h=this.translate(h);return this.postTranslate(this.isCircular?h:this.angleRad,m(this.isCircular?f:0>h?0:h,this.center[2]/2)-this.offset)}function E(){var h=this.center,f=this.chart,b=this.options.title;
+return{x:f.plotLeft+h[0]+(b.x||0),y:f.plotTop+h[1]-{high:.5,middle:.25,low:0}[b.align]*h[2]+(b.y||0)}}function l(b){b.beforeSetTickPositions=e;b.createLabelCollector=y;b.getCrosshairPosition=f;b.getLinePath=h;b.getOffset=u;b.getPlotBandPath=r;b.getPlotLinePath=B;b.getPosition=v;b.getTitlePosition=E;b.postTranslate=O;b.setAxisSize=A;b.setAxisTranslation=P;b.setOptions=Q}function L(){var h=this.chart,f=this.options,b=this.pane,r=b&&b.options;h.angular&&this.isXAxis||!b||!h.angular&&!h.polar||(this.angleRad=
+(f.angle||0)*Math.PI/180,this.startAngleRad=(r.startAngle-90)*Math.PI/180,this.endAngleRad=(m(r.endAngle,r.startAngle+360)-90)*Math.PI/180,this.offset=f.offset||0)}function H(h){this.isRadial&&(h.align=void 0,h.preventDefault())}function K(){if(this.chart&&this.chart.labelCollectors){var h=this.labelCollector?this.chart.labelCollectors.indexOf(this.labelCollector):-1;0<=h&&this.chart.labelCollectors.splice(h,1)}}function C(h){var f=this.chart,b=f.inverted,r=f.angular,u=f.polar,v=this.isXAxis,B=this.coll,
+n=r&&v,a=f.options;h=h.userOptions.pane||0;h=this.pane=f.pane&&f.pane[h];var q;if("colorAxis"===B)this.isRadial=!1;else{if(r){if(n?(this.isHidden=!0,this.createLabelCollector=z,this.getOffset=t,this.render=this.redraw=G,this.setTitle=this.setCategories=this.setScale=t):l(this),q=!v)this.defaultPolarOptions=R}else u&&(l(this),this.defaultPolarOptions=(q=this.horiz)?S:g("xAxis"===B?d.defaultXAxisOptions:d.defaultYAxisOptions,T),b&&"yAxis"===B&&(this.defaultPolarOptions.stackLabels=d.defaultYAxisOptions.stackLabels,
+this.defaultPolarOptions.reversedStacks=!0));r||u?(this.isRadial=!0,a.chart.zoomType=null,this.labelCollector||(this.labelCollector=this.createLabelCollector()),this.labelCollector&&f.labelCollectors.push(this.labelCollector)):this.isRadial=!1;h&&q&&(h.axis=this);this.isCircular=q}}function U(){this.isRadial&&this.beforeSetTickPositions()}function J(h){var f=this.label;if(f){var b=this.axis,r=f.getBBox(),u=b.options.labels,v=(b.translate(this.pos)+b.startAngleRad+Math.PI/2)/Math.PI*180%360,g=Math.round(v),
+B=x(u.y)?0:.3*-r.height,a=u.y,q=20,z=u.align,c="end",y=0>g?g+360:g,E=y,k=0,e=0;if(b.isRadial){var l=b.getPosition(this.pos,b.center[2]/2+n(m(u.distance,-25),b.center[2]/2,-b.center[2]/2));"auto"===u.rotation?f.attr({rotation:v}):x(a)||(a=b.chart.renderer.fontMetrics(f.styles&&f.styles.fontSize).b-r.height/2);x(z)||(b.isCircular?(r.width>b.len*b.tickInterval/(b.max-b.min)&&(q=0),z=v>q&&v<180-q?"left":v>180+q&&v<360-q?"right":"center"):z="center",f.attr({align:z}));if("auto"===z&&2===b.tickPositions.length&&
+b.isCircular){90<y&&180>y?y=180-y:270<y&&360>=y&&(y=540-y);180<E&&360>=E&&(E=360-E);if(b.pane.options.startAngle===g||b.pane.options.startAngle===g+360||b.pane.options.startAngle===g-360)c="start";z=-90<=g&&90>=g||-360<=g&&-270>=g||270<=g&&360>=g?"start"===c?"right":"left":"start"===c?"left":"right";70<E&&110>E&&(z="center");15>y||180<=y&&195>y?k=.3*r.height:15<=y&&35>=y?k="start"===c?0:.75*r.height:195<=y&&215>=y?k="start"===c?.75*r.height:0:35<y&&90>=y?k="start"===c?.25*-r.height:r.height:215<y&&
+270>=y&&(k="start"===c?r.height:.25*-r.height);15>E?e="start"===c?.15*-r.height:.15*r.height:165<E&&180>=E&&(e="start"===c?.15*r.height:.15*-r.height);f.attr({align:z});f.translate(e,k+B)}h.pos.x=l.x+(u.x||0);h.pos.y=l.y+(a||0)}}}function V(h){this.axis.getPosition&&w(h.pos,this.axis.getPosition(this.pos))}function O(h,f){var b=this.chart,r=this.center;h=this.startAngleRad+h;return{x:b.plotLeft+r[0]+Math.cos(h)*f,y:b.plotTop+r[1]+Math.sin(h)*f}}function G(){this.isDirty=!1}function A(){this.constructor.prototype.setAxisSize.call(this);
+if(this.isRadial){this.pane.updateCenter(this);var h=this.center=this.pane.center.slice();if(this.isCircular)this.sector=this.endAngleRad-this.startAngleRad;else{var f=this.postTranslate(this.angleRad,h[3]/2);h[0]=f.x-this.chart.plotLeft;h[1]=f.y-this.chart.plotTop}this.len=this.width=this.height=(h[2]-h[3])*m(this.sector,1)/2}}function P(){this.constructor.prototype.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):
+(this.center[2]-this.center[3])/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)}function Q(h){h=this.options=g(this.constructor.defaultOptions,this.defaultPolarOptions,c[this.coll],h);h.plotBands||(h.plotBands=[]);b(this,"afterSetOptions")}function W(h,f,b,r,u,g,v){var B=this.axis;B.isRadial?(h=B.getPosition(this.pos,B.center[2]/2+r),f=["M",f,b,"L",h.x,h.y]):f=h.call(this,f,b,r,u,g,v);return f}var N=[],S={gridLineWidth:1,labels:{align:void 0,distance:15,
+x:0,y:void 0,style:{textOverflow:"none"}},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},R={labels:{align:"center",x:0,y:void 0},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},T={gridLineInterpolation:"circle",gridLineWidth:1,labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}};a.compose=function(h,f){-1===N.indexOf(h)&&
+(N.push(h),p(h,"afterInit",L),p(h,"autoLabelAlign",H),p(h,"destroy",K),p(h,"init",C),p(h,"initialAxisTranslation",U));-1===N.indexOf(f)&&(N.push(f),p(f,"afterGetLabelPosition",J),p(f,"afterGetPosition",V),q(f.prototype,"getMarkPath",W));return h}})(H||(H={}));return H});A(d,"Series/AreaRange/AreaRangePoint.js",[d["Series/Area/AreaSeries.js"],d["Core/Series/Point.js"],d["Core/Utilities.js"]],function(d,e,l){var a=this&&this.__extends||function(){var a=function(c,k){a=Object.setPrototypeOf||{__proto__:[]}instanceof
+Array&&function(b,g){b.__proto__=g}||function(b,g){for(var a in g)g.hasOwnProperty(a)&&(b[a]=g[a])};return a(c,k)};return function(c,k){function b(){this.constructor=c}a(c,k);c.prototype=null===k?Object.create(k):(b.prototype=k.prototype,new b)}}(),c=e.prototype,t=l.defined,p=l.isNumber;return function(k){function e(){var a=null!==k&&k.apply(this,arguments)||this;a.high=void 0;a.low=void 0;a.options=void 0;a.plotHigh=void 0;a.plotLow=void 0;a.plotHighX=void 0;a.plotLowX=void 0;a.plotX=void 0;a.series=
+void 0;return a}a(e,k);e.prototype.setState=function(){var a=this.state,b=this.series,g=b.chart.polar;t(this.plotHigh)||(this.plotHigh=b.yAxis.toPixels(this.high,!0));t(this.plotLow)||(this.plotLow=this.plotY=b.yAxis.toPixels(this.low,!0));b.stateMarkerGraphic&&(b.lowerStateMarkerGraphic=b.stateMarkerGraphic,b.stateMarkerGraphic=b.upperStateMarkerGraphic);this.graphic=this.upperGraphic;this.plotY=this.plotHigh;g&&(this.plotX=this.plotHighX);c.setState.apply(this,arguments);this.state=a;this.plotY=
+this.plotLow;this.graphic=this.lowerGraphic;g&&(this.plotX=this.plotLowX);b.stateMarkerGraphic&&(b.upperStateMarkerGraphic=b.stateMarkerGraphic,b.stateMarkerGraphic=b.lowerStateMarkerGraphic,b.lowerStateMarkerGraphic=void 0);c.setState.apply(this,arguments)};e.prototype.haloPath=function(){var a=this.series.chart.polar,b=[];this.plotY=this.plotLow;a&&(this.plotX=this.plotLowX);this.isInside&&(b=c.haloPath.apply(this,arguments));this.plotY=this.plotHigh;a&&(this.plotX=this.plotHighX);this.isTopInside&&
+(b=b.concat(c.haloPath.apply(this,arguments)));return b};e.prototype.isValid=function(){return p(this.low)&&p(this.high)};return e}(d.prototype.pointClass)});A(d,"Series/AreaRange/AreaRangeSeries.js",[d["Series/AreaRange/AreaRangePoint.js"],d["Series/Area/AreaSeries.js"],d["Series/Column/ColumnSeries.js"],d["Core/Globals.js"],d["Core/Series/Series.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l,a,c,t,p){var k=this&&this.__extends||function(){var b=function(g,a){b=Object.setPrototypeOf||
+{__proto__:[]}instanceof Array&&function(b,f){b.__proto__=f}||function(b,f){for(var h in f)f.hasOwnProperty(h)&&(b[h]=f[h])};return b(g,a)};return function(g,a){function n(){this.constructor=g}b(g,a);g.prototype=null===a?Object.create(a):(n.prototype=a.prototype,new n)}}(),x=e.prototype,w=l.prototype;l=a.noop;var b=c.prototype,g=p.defined,m=p.extend,n=p.isArray,q=p.pick,H=p.merge;c=function(a){function c(){var b=null!==a&&a.apply(this,arguments)||this;b.data=void 0;b.options=void 0;b.points=void 0;
+b.lowerStateMarkerGraphic=void 0;b.xAxis=void 0;return b}k(c,a);c.prototype.toYData=function(b){return[b.low,b.high]};c.prototype.highToXY=function(b){var g=this.chart,f=this.xAxis.postTranslate(b.rectPlotX||0,this.yAxis.len-b.plotHigh);b.plotHighX=f.x-g.plotLeft;b.plotHigh=f.y-g.plotTop;b.plotLowX=b.plotX};c.prototype.translate=function(){var b=this,g=b.yAxis;x.translate.apply(b);b.points.forEach(function(f){var h=f.high,u=f.plotY;f.isNull?f.plotY=null:(f.plotLow=u,f.plotHigh=g.translate(b.dataModify?
+b.dataModify.modifyValue(h):h,0,1,0,1),b.dataModify&&(f.yBottom=f.plotHigh))});this.chart.polar&&this.points.forEach(function(f){b.highToXY(f);f.tooltipPos=[(f.plotHighX+f.plotLowX)/2,(f.plotHigh+f.plotLow)/2]})};c.prototype.getGraphPath=function(b){var g=[],f=[],h,u=x.getGraphPath;var r=this.options;var a=this.chart.polar,v=a&&!1!==r.connectEnds,n=r.connectNulls,c=r.step;b=b||this.points;for(h=b.length;h--;){var m=b[h];var k=a?{plotX:m.rectPlotX,plotY:m.yBottom,doCurve:!1}:{plotX:m.plotX,plotY:m.plotY,
+doCurve:!1};m.isNull||v||n||b[h+1]&&!b[h+1].isNull||f.push(k);var e={polarPlotY:m.polarPlotY,rectPlotX:m.rectPlotX,yBottom:m.yBottom,plotX:q(m.plotHighX,m.plotX),plotY:m.plotHigh,isNull:m.isNull};f.push(e);g.push(e);m.isNull||v||n||b[h-1]&&!b[h-1].isNull||f.push(k)}b=u.call(this,b);c&&(!0===c&&(c="left"),r.step={left:"right",center:"center",right:"left"}[c]);g=u.call(this,g);f=u.call(this,f);r.step=c;r=[].concat(b,g);!this.chart.polar&&f[0]&&"M"===f[0][0]&&(f[0]=["L",f[0][1],f[0][2]]);this.graphPath=
+r;this.areaPath=b.concat(f);r.isArea=!0;r.xMap=b.xMap;this.areaPath.xMap=b.xMap;return r};c.prototype.drawDataLabels=function(){var g=this.points,a=g.length,f,h=[],u=this.options.dataLabels,r,B=this.chart.inverted;if(u){if(n(u)){var v=u[0]||{enabled:!1};var c=u[1]||{enabled:!1}}else v=m({},u),v.x=u.xHigh,v.y=u.yHigh,c=m({},u),c.x=u.xLow,c.y=u.yLow;if(v.enabled||this._hasPointLabels){for(f=a;f--;)if(r=g[f]){var q=v.inside?r.plotHigh<r.plotLow:r.plotHigh>r.plotLow;r.y=r.high;r._plotY=r.plotY;r.plotY=
+r.plotHigh;h[f]=r.dataLabel;r.dataLabel=r.dataLabelUpper;r.below=q;B?v.align||(v.align=q?"right":"left"):v.verticalAlign||(v.verticalAlign=q?"top":"bottom")}this.options.dataLabels=v;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments);for(f=a;f--;)if(r=g[f])r.dataLabelUpper=r.dataLabel,r.dataLabel=h[f],delete r.dataLabels,r.y=r.low,r.plotY=r._plotY}if(c.enabled||this._hasPointLabels){for(f=a;f--;)if(r=g[f])q=c.inside?r.plotHigh<r.plotLow:r.plotHigh>r.plotLow,r.below=!q,B?c.align||(c.align=q?
+"left":"right"):c.verticalAlign||(c.verticalAlign=q?"bottom":"top");this.options.dataLabels=c;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments)}if(v.enabled)for(f=a;f--;)if(r=g[f])r.dataLabels=[r.dataLabelUpper,r.dataLabel].filter(function(h){return!!h});this.options.dataLabels=u}};c.prototype.alignDataLabel=function(){w.alignDataLabel.apply(this,arguments)};c.prototype.drawPoints=function(){var a=this.points.length,c;b.drawPoints.apply(this,arguments);for(c=0;c<a;){var f=this.points[c];f.origProps=
+{plotY:f.plotY,plotX:f.plotX,isInside:f.isInside,negative:f.negative,zone:f.zone,y:f.y};f.lowerGraphic=f.graphic;f.graphic=f.upperGraphic;f.plotY=f.plotHigh;g(f.plotHighX)&&(f.plotX=f.plotHighX);f.y=q(f.high,f.origProps.y);f.negative=f.y<(this.options.threshold||0);this.zones.length&&(f.zone=f.getZone());this.chart.polar||(f.isInside=f.isTopInside="undefined"!==typeof f.plotY&&0<=f.plotY&&f.plotY<=this.yAxis.len&&0<=f.plotX&&f.plotX<=this.xAxis.len);c++}b.drawPoints.apply(this,arguments);for(c=0;c<
+a;)f=this.points[c],f.upperGraphic=f.graphic,f.graphic=f.lowerGraphic,f.origProps&&(m(f,f.origProps),delete f.origProps),c++};c.defaultOptions=H(e.defaultOptions,{lineWidth:1,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">\u25cf</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},trackByArea:!0,dataLabels:{align:void 0,verticalAlign:void 0,xLow:0,xHigh:0,yLow:0,yHigh:0}});return c}(e);m(c.prototype,{pointArrayMap:["low","high"],pointValKey:"low",deferTranslatePolar:!0,
+pointClass:d,setStackedPoints:l});t.registerSeriesType("arearange",c);"";return c});A(d,"Series/AreaSplineRange/AreaSplineRangeSeries.js",[d["Series/AreaRange/AreaRangeSeries.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l){var a=this&&this.__extends||function(){var a=function(c,k){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,g){b.__proto__=g}||function(b,g){for(var a in g)g.hasOwnProperty(a)&&(b[a]=g[a])};return a(c,k)};return function(c,k){function b(){this.constructor=
+c}a(c,k);c.prototype=null===k?Object.create(k):(b.prototype=k.prototype,new b)}}(),c=e.seriesTypes.spline,t=l.merge;l=l.extend;var p=function(c){function k(){var a=null!==c&&c.apply(this,arguments)||this;a.options=void 0;a.data=void 0;a.points=void 0;return a}a(k,c);k.defaultOptions=t(d.defaultOptions);return k}(d);l(p.prototype,{getPointSpline:c.prototype.getPointSpline});e.registerSeriesType("areasplinerange",p);"";return p});A(d,"Series/BoxPlot/BoxPlotSeries.js",[d["Series/Column/ColumnSeries.js"],
+d["Core/Globals.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l,a){var c=this&&this.__extends||function(){var a=function(c,b){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,a){b.__proto__=a}||function(b,a){for(var g in a)a.hasOwnProperty(g)&&(b[g]=a[g])};return a(c,b)};return function(c,b){function g(){this.constructor=c}a(c,b);c.prototype=null===b?Object.create(b):(g.prototype=b.prototype,new g)}}();e=e.noop;var t=a.extend,p=a.merge,k=a.pick;a=
+function(a){function e(){var b=null!==a&&a.apply(this,arguments)||this;b.data=void 0;b.options=void 0;b.points=void 0;return b}c(e,a);e.prototype.pointAttribs=function(){return{}};e.prototype.translate=function(){var b=this.yAxis,g=this.pointArrayMap;a.prototype.translate.apply(this);this.points.forEach(function(a){g.forEach(function(g){null!==a[g]&&(a[g+"Plot"]=b.translate(a[g],0,1,0,1))});a.plotHigh=a.highPlot})};e.prototype.drawPoints=function(){var b=this,g=b.options,a=b.chart,c=a.renderer,q,
+e,l,d,y,z,f=0,h,u,r,B,v=!1!==b.doQuartiles,E,p=b.options.whiskerLength;b.points.forEach(function(n){var m=n.graphic,H=m?"animate":"attr",t=n.shapeArgs,x={},I={},w={},L={},M=n.color||b.color;"undefined"!==typeof n.plotY&&(h=Math.round(t.width),u=Math.floor(t.x),r=u+h,B=Math.round(h/2),q=Math.floor(v?n.q1Plot:n.lowPlot),e=Math.floor(v?n.q3Plot:n.lowPlot),l=Math.floor(n.highPlot),d=Math.floor(n.lowPlot),m||(n.graphic=m=c.g("point").add(b.group),n.stem=c.path().addClass("highcharts-boxplot-stem").add(m),
+p&&(n.whiskers=c.path().addClass("highcharts-boxplot-whisker").add(m)),v&&(n.box=c.path(void 0).addClass("highcharts-boxplot-box").add(m)),n.medianShape=c.path(void 0).addClass("highcharts-boxplot-median").add(m)),a.styledMode||(I.stroke=n.stemColor||g.stemColor||M,I["stroke-width"]=k(n.stemWidth,g.stemWidth,g.lineWidth),I.dashstyle=n.stemDashStyle||g.stemDashStyle||g.dashStyle,n.stem.attr(I),p&&(w.stroke=n.whiskerColor||g.whiskerColor||M,w["stroke-width"]=k(n.whiskerWidth,g.whiskerWidth,g.lineWidth),
+w.dashstyle=n.whiskerDashStyle||g.whiskerDashStyle||g.dashStyle,n.whiskers.attr(w)),v&&(x.fill=n.fillColor||g.fillColor||M,x.stroke=g.lineColor||M,x["stroke-width"]=g.lineWidth||0,x.dashstyle=n.boxDashStyle||g.boxDashStyle||g.dashStyle,n.box.attr(x)),L.stroke=n.medianColor||g.medianColor||M,L["stroke-width"]=k(n.medianWidth,g.medianWidth,g.lineWidth),L.dashstyle=n.medianDashStyle||g.medianDashStyle||g.dashStyle,n.medianShape.attr(L)),z=n.stem.strokeWidth()%2/2,f=u+B+z,m=[["M",f,e],["L",f,l],["M",
+f,q],["L",f,d]],n.stem[H]({d:m}),v&&(z=n.box.strokeWidth()%2/2,q=Math.floor(q)+z,e=Math.floor(e)+z,u+=z,r+=z,m=[["M",u,e],["L",u,q],["L",r,q],["L",r,e],["L",u,e],["Z"]],n.box[H]({d:m})),p&&(z=n.whiskers.strokeWidth()%2/2,l+=z,d+=z,E=/%$/.test(p)?B*parseFloat(p)/100:p/2,m=[["M",f-E,l],["L",f+E,l],["M",f-E,d],["L",f+E,d]],n.whiskers[H]({d:m})),y=Math.round(n.medianPlot),z=n.medianShape.strokeWidth()%2/2,y+=z,m=[["M",u,y],["L",r,y]],n.medianShape[H]({d:m}))})};e.prototype.toYData=function(b){return[b.low,
+b.q1,b.median,b.q3,b.high]};e.defaultOptions=p(d.defaultOptions,{threshold:null,tooltip:{pointFormat:'<span style="color:{point.color}">\u25cf</span> <b> {series.name}</b><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,whiskerWidth:2});return e}(d);t(a.prototype,{pointArrayMap:["low","q1","median","q3","high"],pointValKey:"high",drawDataLabels:e,
+setStackedPoints:e});l.registerSeriesType("boxplot",a);"";return a});A(d,"Series/Bubble/BubbleLegendDefaults.js",[],function(){return{borderColor:void 0,borderWidth:2,className:void 0,color:void 0,connectorClassName:void 0,connectorColor:void 0,connectorDistance:60,connectorWidth:1,enabled:!1,labels:{className:void 0,allowOverlap:!1,format:"",formatter:void 0,align:"right",style:{fontSize:"10px",color:"#000000"},x:0,y:0},maxSize:60,minSize:10,legendIndex:0,ranges:{value:void 0,borderColor:void 0,
+color:void 0,connectorColor:void 0},sizeBy:"area",sizeByAbsoluteValue:!1,zIndex:1,zThreshold:0}});A(d,"Series/Bubble/BubbleLegendItem.js",[d["Core/Color/Color.js"],d["Core/FormatUtilities.js"],d["Core/Globals.js"],d["Core/Utilities.js"]],function(d,e,l,a){var c=d.parse,t=l.noop,p=a.arrayMax,k=a.arrayMin,x=a.isNumber,w=a.merge,b=a.pick,g=a.stableSort;"";return function(){function a(b,a){this.options=this.symbols=this.visible=this.selected=this.ranges=this.movementX=this.maxLabel=this.legendSymbol=
+this.legendItemWidth=this.legendItemHeight=this.legendItem=this.legendGroup=this.legend=this.fontMetrics=this.chart=void 0;this.setState=t;this.init(b,a)}a.prototype.init=function(b,a){this.options=b;this.visible=!0;this.chart=a.chart;this.legend=a};a.prototype.addToLegend=function(b){b.splice(this.options.legendIndex,0,this)};a.prototype.drawLegendSymbol=function(a){var c=this.chart,n=this.options,e=b(a.options.itemDistance,20),k=n.ranges,m=n.connectorDistance;this.fontMetrics=c.renderer.fontMetrics(n.labels.style.fontSize);
+k&&k.length&&x(k[0].value)?(g(k,function(b,f){return f.value-b.value}),this.ranges=k,this.setOptions(),this.render(),a=this.getMaxLabelSize(),k=this.ranges[0].radius,c=2*k,m=m-k+a.width,m=0<m?m:0,this.maxLabel=a,this.movementX="left"===n.labels.align?m:0,this.legendItemWidth=c+m+e,this.legendItemHeight=c+this.fontMetrics.h/2):a.options.bubbleLegend.autoRanges=!0};a.prototype.setOptions=function(){var a=this.ranges,g=this.options,k=this.chart.series[g.seriesIndex],e=this.legend.baseline,m={zIndex:g.zIndex,
+"stroke-width":g.borderWidth},l={zIndex:g.zIndex,"stroke-width":g.connectorWidth},z={align:this.legend.options.rtl||"left"===g.labels.align?"right":"left",zIndex:g.zIndex},f=k.options.marker.fillOpacity,h=this.chart.styledMode;a.forEach(function(u,r){h||(m.stroke=b(u.borderColor,g.borderColor,k.color),m.fill=b(u.color,g.color,1!==f?c(k.color).setOpacity(f).get("rgba"):k.color),l.stroke=b(u.connectorColor,g.connectorColor,k.color));a[r].radius=this.getRangeRadius(u.value);a[r]=w(a[r],{center:a[0].radius-
+a[r].radius+e});h||w(!0,a[r],{bubbleAttribs:w(m),connectorAttribs:w(l),labelAttribs:z})},this)};a.prototype.getRangeRadius=function(b){var a=this.options;return this.chart.series[this.options.seriesIndex].getRadius.call(this,a.ranges[a.ranges.length-1].value,a.ranges[0].value,a.minSize,a.maxSize,b)};a.prototype.render=function(){var b=this.chart.renderer,a=this.options.zThreshold;this.symbols||(this.symbols={connectors:[],bubbleItems:[],labels:[]});this.legendSymbol=b.g("bubble-legend");this.legendItem=
+b.g("bubble-legend-item");this.legendSymbol.translateX=0;this.legendSymbol.translateY=0;this.ranges.forEach(function(b){b.value>=a&&this.renderRange(b)},this);this.legendSymbol.add(this.legendItem);this.legendItem.add(this.legendGroup);this.hideOverlappingLabels()};a.prototype.renderRange=function(b){var a=this.options,g=a.labels,c=this.chart,n=c.series[a.seriesIndex],k=c.renderer,e=this.symbols;c=e.labels;var f=b.center,h=Math.abs(b.radius),u=a.connectorDistance||0,r=g.align,B=a.connectorWidth,v=
+this.ranges[0].radius||0,m=f-h-a.borderWidth/2+B/2,l=this.fontMetrics;l=l.f/2-(l.h-l.f)/2;var d=k.styledMode;u=this.legend.options.rtl||"left"===r?-u:u;"center"===r&&(u=0,a.connectorDistance=0,b.labelAttribs.align="center");r=m+a.labels.y;var p=v+u+a.labels.x;e.bubbleItems.push(k.circle(v,f+((m%1?1:.5)-(B%2?0:.5)),h).attr(d?{}:b.bubbleAttribs).addClass((d?"highcharts-color-"+n.colorIndex+" ":"")+"highcharts-bubble-legend-symbol "+(a.className||"")).add(this.legendSymbol));e.connectors.push(k.path(k.crispLine([["M",
+v,m],["L",v+u,m]],a.connectorWidth)).attr(d?{}:b.connectorAttribs).addClass((d?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-connectors "+(a.connectorClassName||"")).add(this.legendSymbol));b=k.text(this.formatLabel(b),p,r+l).attr(d?{}:b.labelAttribs).css(d?{}:g.style).addClass("highcharts-bubble-legend-labels "+(a.labels.className||"")).add(this.legendSymbol);c.push(b);b.placed=!0;b.alignAttr={x:p,y:r+l}};a.prototype.getMaxLabelSize=function(){var b,a;this.symbols.labels.forEach(function(g){a=
+g.getBBox(!0);b=b?a.width>b.width?a:b:a});return b||{}};a.prototype.formatLabel=function(b){var a=this.options,g=a.labels.formatter;a=a.labels.format;var c=this.chart.numberFormatter;return a?e.format(a,b):g?g.call(b):c(b.value,1)};a.prototype.hideOverlappingLabels=function(){var b=this.chart,a=this.symbols;!this.options.labels.allowOverlap&&a&&(b.hideOverlappingLabels(a.labels),a.labels.forEach(function(b,g){b.newOpacity?b.newOpacity!==b.oldOpacity&&a.connectors[g].show():a.connectors[g].hide()}))};
+a.prototype.getRanges=function(){var a=this.legend.bubbleLegend,g=a.options.ranges,c,e=Number.MAX_VALUE,m=-Number.MAX_VALUE;a.chart.series.forEach(function(a){a.isBubble&&!a.ignoreSeries&&(c=a.zData.filter(x),c.length&&(e=b(a.options.zMin,Math.min(e,Math.max(k(c),!1===a.options.displayNegative?a.options.zThreshold:-Number.MAX_VALUE))),m=b(a.options.zMax,Math.max(m,p(c)))))});var l=e===m?[{value:m}]:[{value:e},{value:(e+m)/2},{value:m,autoRanges:!0}];g.length&&g[0].radius&&l.reverse();l.forEach(function(b,
+f){g&&g[f]&&(l[f]=w(g[f],b))});return l};a.prototype.predictBubbleSizes=function(){var b=this.chart,a=this.fontMetrics,g=b.legend.options,c=g.floating,k=(g="horizontal"===g.layout)?b.legend.lastLineHeight:0,e=b.plotSizeX,m=b.plotSizeY,f=b.series[this.options.seriesIndex],h=f.getPxExtremes();b=Math.ceil(h.minPxSize);h=Math.ceil(h.maxPxSize);var u=Math.min(m,e);f=f.options.maxSize;if(c||!/%$/.test(f))a=h;else if(f=parseFloat(f),a=(u+k-a.h/2)*f/100/(f/100+1),g&&m-a>=e||!g&&e-a>=m)a=h;return[b,Math.ceil(a)]};
+a.prototype.updateRanges=function(b,a){var g=this.legend.options.bubbleLegend;g.minSize=b;g.maxSize=a;g.ranges=this.getRanges()};a.prototype.correctSizes=function(){var b=this.legend,a=this.chart.series[this.options.seriesIndex].getPxExtremes();1<Math.abs(Math.ceil(a.maxPxSize)-this.options.maxSize)&&(this.updateRanges(this.options.minSize,a.maxPxSize),b.render())};return a}()});A(d,"Series/Bubble/BubbleLegendComposition.js",[d["Series/Bubble/BubbleLegendDefaults.js"],d["Series/Bubble/BubbleLegendItem.js"],
+d["Core/DefaultOptions.js"],d["Core/Utilities.js"]],function(d,e,l,a){var c=l.setOptions,t=a.addEvent,p=a.objectEach,k=a.wrap,x;(function(a){function b(b,a,c){var f=this.legend,h=0<=g(this);if(f&&f.options.enabled&&f.bubbleLegend&&f.options.bubbleLegend.autoRanges&&h){var u=f.bubbleLegend.options;h=f.bubbleLegend.predictBubbleSizes();f.bubbleLegend.updateRanges(h[0],h[1]);u.placed||(f.group.placed=!1,f.allItems.forEach(function(h){h.legendGroup.translateY=null}));f.render();this.getMargins();this.axes.forEach(function(h){h.visible&&
+h.render();u.placed||(h.setScale(),h.updateNames(),p(h.ticks,function(h){h.isNew=!0;h.isNewLabel=!0}))});u.placed=!0;this.getMargins();b.call(this,a,c);f.bubbleLegend.correctSizes();x(f,m(f))}else b.call(this,a,c),f&&f.options.enabled&&f.bubbleLegend&&(f.render(),x(f,m(f)))}function g(b){b=b.series;for(var a=0;a<b.length;){if(b[a]&&b[a].isBubble&&b[a].visible&&b[a].zData.length)return a;a++}return-1}function m(b){b=b.allItems;var a=[],g=b.length,f,h=0;for(f=0;f<g;f++)if(b[f].legendItemHeight&&(b[f].itemHeight=
+b[f].legendItemHeight),b[f]===b[g-1]||b[f+1]&&b[f]._legendItemPos[1]!==b[f+1]._legendItemPos[1]){a.push({height:0});var u=a[a.length-1];for(h;h<=f;h++)b[h].itemHeight>u.height&&(u.height=b[h].itemHeight);u.step=f}return a}function n(b){var a=this.bubbleLegend,c=this.options,f=c.bubbleLegend,h=g(this.chart);a&&a.ranges&&a.ranges.length&&(f.ranges.length&&(f.autoRanges=!!f.ranges[0].autoRanges),this.destroyItem(a));0<=h&&c.enabled&&f.enabled&&(f.seriesIndex=h,this.bubbleLegend=new e(f,this),this.bubbleLegend.addToLegend(b.allItems))}
+function l(){var b=this.chart,a=this.visible,c=this.chart.legend;c&&c.bubbleLegend&&(this.visible=!a,this.ignoreSeries=a,b=0<=g(b),c.bubbleLegend.visible!==b&&(c.update({bubbleLegend:{enabled:b}}),c.bubbleLegend.visible=b),this.visible=a)}function x(b,a){var g=b.options.rtl,f,h,u,r=0;b.allItems.forEach(function(b,c){f=b.legendGroup.translateX;h=b._legendItemPos[1];if((u=b.movementX)||g&&b.ranges)u=g?f-b.options.maxSize/2:f+u,b.legendGroup.attr({translateX:u});c>a[r].step&&r++;b.legendGroup.attr({translateY:Math.round(h+
+a[r].height/2)});b._legendItemPos[1]=h+a[r].height/2})}var w=[];a.compose=function(a,g,e){-1===w.indexOf(a)&&(w.push(a),c({legend:{bubbleLegend:d}}),k(a.prototype,"drawChartBox",b));-1===w.indexOf(g)&&(w.push(g),t(g,"afterGetAllItems",n));-1===w.indexOf(e)&&(w.push(e),t(e,"legendItemClick",l))}})(x||(x={}));return x});A(d,"Series/Bubble/BubblePoint.js",[d["Core/Series/Point.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l){var a=this&&this.__extends||function(){var a=
+function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function k(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(k.prototype=e.prototype,new k)}}();l=l.extend;e=function(c){function e(){var a=null!==c&&c.apply(this,arguments)||this;a.options=void 0;a.series=void 0;return a}a(e,c);e.prototype.haloPath=function(a){return d.prototype.haloPath.call(this,
+0===a?0:(this.marker?this.marker.radius||0:0)+a)};return e}(e.seriesTypes.scatter.prototype.pointClass);l(e.prototype,{ttBelow:!1});return e});A(d,"Series/Bubble/BubbleSeries.js",[d["Core/Axis/Axis.js"],d["Series/Bubble/BubbleLegendComposition.js"],d["Series/Bubble/BubblePoint.js"],d["Core/Color/Color.js"],d["Core/Globals.js"],d["Core/Series/Series.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l,a,c,t,p,k){var x=this&&this.__extends||function(){var b=function(f,h){b=
+Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,h){b.__proto__=h}||function(b,h){for(var f in h)h.hasOwnProperty(f)&&(b[f]=h[f])};return b(f,h)};return function(f,h){function a(){this.constructor=f}b(f,h);f.prototype=null===h?Object.create(h):(a.prototype=h.prototype,new a)}}(),w=a.parse;a=c.noop;var b=p.seriesTypes;c=b.column;var g=b.scatter;b=k.addEvent;var m=k.arrayMax,n=k.arrayMin,q=k.clamp,H=k.extend,K=k.isNumber,I=k.merge,y=k.pick;k=function(b){function f(){var h=null!==b&&
+b.apply(this,arguments)||this;h.data=void 0;h.maxPxSize=void 0;h.minPxSize=void 0;h.options=void 0;h.points=void 0;h.radii=void 0;h.yData=void 0;h.zData=void 0;return h}x(f,b);f.prototype.animate=function(b){!b&&this.points.length<this.options.animationLimit&&this.points.forEach(function(b){var h=b.graphic;h&&h.width&&(this.hasRendered||h.attr({x:b.plotX,y:b.plotY,width:1,height:1}),h.animate(this.markerAttribs(b),this.options.animation))},this)};f.prototype.getRadii=function(){var b=this,f=this.zData,
+a=this.yData,g=[],c=this.chart.bubbleZExtremes;var e=this.getPxExtremes();var m=e.minPxSize,k=e.maxPxSize;if(!c){var n=Number.MAX_VALUE,l=-Number.MAX_VALUE,d;this.chart.series.forEach(function(h){h.bubblePadding&&(h.visible||!b.chart.options.chart.ignoreHiddenSeries)&&(h=h.getZExtremes())&&(n=Math.min(n||h.zMin,h.zMin),l=Math.max(l||h.zMax,h.zMax),d=!0)});d?(c={zMin:n,zMax:l},this.chart.bubbleZExtremes=c):c={zMin:0,zMax:0}}var p=0;for(e=f.length;p<e;p++){var q=f[p];g.push(this.getRadius(c.zMin,c.zMax,
+m,k,q,a[p]))}this.radii=g};f.prototype.getRadius=function(b,f,a,g,c,e){var h=this.options,r="width"!==h.sizeBy,u=h.zThreshold,v=f-b,m=.5;if(null===e||null===c)return null;if(K(c)){h.sizeByAbsoluteValue&&(c=Math.abs(c-u),v=Math.max(f-u,Math.abs(b-u)),b=0);if(c<b)return a/2-1;0<v&&(m=(c-b)/v)}r&&0<=m&&(m=Math.sqrt(m));return Math.ceil(a+m*(g-a))/2};f.prototype.hasData=function(){return!!this.processedXData.length};f.prototype.pointAttribs=function(b,f){var h=this.options.marker.fillOpacity;b=t.prototype.pointAttribs.call(this,
+b,f);1!==h&&(b.fill=w(b.fill).setOpacity(h).get("rgba"));return b};f.prototype.translate=function(){b.prototype.translate.call(this);this.getRadii();this.translateBubble()};f.prototype.translateBubble=function(){for(var b=this.data,f=this.radii,a=this.getPxExtremes().minPxSize,g=b.length;g--;){var c=b[g],e=f?f[g]:0;K(e)&&e>=a/2?(c.marker=H(c.marker,{radius:e,width:2*e,height:2*e}),c.dlBox={x:c.plotX-e,y:c.plotY-e,width:2*e,height:2*e}):c.shapeArgs=c.plotY=c.dlBox=void 0}};f.prototype.getPxExtremes=
+function(){var b=Math.min(this.chart.plotWidth,this.chart.plotHeight),f=function(h){if("string"===typeof h){var f=/%$/.test(h);h=parseInt(h,10)}return f?b*h/100:h},a=f(y(this.options.minSize,8));f=Math.max(f(y(this.options.maxSize,"20%")),a);return{minPxSize:a,maxPxSize:f}};f.prototype.getZExtremes=function(){var b=this.options,f=(this.zData||[]).filter(K);if(f.length){var a=y(b.zMin,q(n(f),!1===b.displayNegative?b.zThreshold||0:-Number.MAX_VALUE,Number.MAX_VALUE));b=y(b.zMax,m(f));if(K(a)&&K(b))return{zMin:a,
+zMax:b}}};f.compose=e.compose;f.defaultOptions=I(g.defaultOptions,{dataLabels:{formatter:function(){var b=this.series.chart.numberFormatter,f=this.point.z;return K(f)?b(f,-1):""},inside:!0,verticalAlign:"middle"},animationLimit:250,marker:{lineColor:null,lineWidth:1,fillOpacity:.5,radius:null,states:{hover:{radiusPlus:0}},symbol:"circle"},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0,
+zoneAxis:"z"});return f}(g);H(k.prototype,{alignDataLabel:c.prototype.alignDataLabel,applyZones:a,bubblePadding:!0,buildKDTree:a,directTouch:!0,isBubble:!0,pointArrayMap:["y","z"],pointClass:l,parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],specialGroup:"group",zoneAxis:"z"});b(k,"updatedData",function(b){delete b.target.chart.bubbleZExtremes});d.prototype.beforePadding=function(){var b=this,f=this.len,h=this.chart,a=0,g=f,c=this.isXAxis,v=c?"xData":"yData",e=this.min,m=this.max-
+e,k=f/m,n;this.series.forEach(function(f){if(f.bubblePadding&&(f.visible||!h.options.chart.ignoreHiddenSeries)){n=b.allowZoomOutside=!0;var r=f[v];c&&f.getRadii(0,0,f);if(0<m)for(var u=r.length;u--;)if(K(r[u])&&b.dataMin<=r[u]&&r[u]<=b.max){var B=f.radii&&f.radii[u]||0;a=Math.min((r[u]-e)*k-B,a);g=Math.max((r[u]-e)*k+B,g)}}});n&&0<m&&!this.logarithmic&&(g-=f,k*=(f+Math.max(0,a)-Math.min(g,f))/f,[["min","userMin",a],["max","userMax",g]].forEach(function(h){"undefined"===typeof y(b.options[h[0]],b[h[1]])&&
+(b[h[0]]+=h[2]/k)}))};p.registerSeriesType("bubble",k);"";"";return k});A(d,"Series/ColumnRange/ColumnRangePoint.js",[d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e){var l=this&&this.__extends||function(){var a=function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var g in b)b.hasOwnProperty(g)&&(a[g]=b[g])};return a(c,e)};return function(c,e){function k(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):
+(k.prototype=e.prototype,new k)}}(),a=d.seriesTypes;d=a.column.prototype.pointClass;var c=e.extend,t=e.isNumber;e=function(a){function c(){var c=null!==a&&a.apply(this,arguments)||this;c.series=void 0;c.options=void 0;c.barX=void 0;c.pointWidth=void 0;c.shapeType=void 0;return c}l(c,a);c.prototype.isValid=function(){return t(this.low)};return c}(a.arearange.prototype.pointClass);c(e.prototype,{setState:d.prototype.setState});return e});A(d,"Series/ColumnRange/ColumnRangeSeries.js",[d["Series/ColumnRange/ColumnRangePoint.js"],
+d["Core/Globals.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l,a){var c=this&&this.__extends||function(){var b=function(a,g){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,a){b.__proto__=a}||function(b,a){for(var g in a)a.hasOwnProperty(g)&&(b[g]=a[g])};return b(a,g)};return function(a,g){function c(){this.constructor=a}b(a,g);a.prototype=null===g?Object.create(g):(c.prototype=g.prototype,new c)}}();e=e.noop;var t=l.seriesTypes,p=t.arearange,k=
+t.column,x=k.prototype,w=p.prototype,b=a.clamp,g=a.merge,m=a.pick;a=a.extend;var n={pointRange:null,marker:null,states:{hover:{halo:!1}}};t=function(a){function e(){var b=null!==a&&a.apply(this,arguments)||this;b.data=void 0;b.points=void 0;b.options=void 0;return b}c(e,a);e.prototype.setOptions=function(){g(!0,arguments[0],{stacking:void 0});return w.setOptions.apply(this,arguments)};e.prototype.translate=function(){var a=this,g=a.yAxis,c=a.xAxis,e=c.startAngleRad,f,h=a.chart,u=a.xAxis.isRadial,
+r=Math.max(h.chartWidth,h.chartHeight)+999,k;x.translate.apply(a);a.points.forEach(function(v){var n=v.shapeArgs||{},B=a.options.minPointLength;v.plotHigh=k=b(g.translate(v.high,0,1,0,1),-r,r);v.plotLow=b(v.plotY,-r,r);var l=k;var d=m(v.rectPlotY,v.plotY)-k;Math.abs(d)<B?(B-=d,d+=B,l-=B/2):0>d&&(d*=-1,l-=d);u?(f=v.barX+e,v.shapeType="arc",v.shapeArgs=a.polarArc(l+d,l,f,f+v.pointWidth)):(n.height=d,n.y=l,B=n.x,B=void 0===B?0:B,n=n.width,n=void 0===n?0:n,v.tooltipPos=h.inverted?[g.len+g.pos-h.plotLeft-
+l-d/2,c.len+c.pos-h.plotTop-B-n/2,d]:[c.left-h.plotLeft+B+n/2,g.pos-h.plotTop+l+d/2,d])})};e.prototype.crispCol=function(){return x.crispCol.apply(this,arguments)};e.prototype.drawPoints=function(){return x.drawPoints.apply(this,arguments)};e.prototype.drawTracker=function(){return x.drawTracker.apply(this,arguments)};e.prototype.getColumnMetrics=function(){return x.getColumnMetrics.apply(this,arguments)};e.prototype.pointAttribs=function(){return x.pointAttribs.apply(this,arguments)};e.prototype.adjustForMissingColumns=
+function(){return x.adjustForMissingColumns.apply(this,arguments)};e.prototype.animate=function(){return x.animate.apply(this,arguments)};e.prototype.translate3dPoints=function(){return x.translate3dPoints.apply(this,arguments)};e.prototype.translate3dShapes=function(){return x.translate3dShapes.apply(this,arguments)};e.defaultOptions=g(k.defaultOptions,p.defaultOptions,n);return e}(p);a(t.prototype,{directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:e,getSymbol:e,polarArc:function(){return x.polarArc.apply(this,
+arguments)},pointClass:d});l.registerSeriesType("columnrange",t);"";return t});A(d,"Series/ColumnPyramid/ColumnPyramidSeries.js",[d["Series/Column/ColumnSeries.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l){var a=this&&this.__extends||function(){var a=function(c,b){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,a){b.__proto__=a}||function(b,a){for(var g in a)a.hasOwnProperty(g)&&(b[g]=a[g])};return a(c,b)};return function(c,b){function g(){this.constructor=
+c}a(c,b);c.prototype=null===b?Object.create(b):(g.prototype=b.prototype,new g)}}(),c=d.prototype,t=l.clamp,p=l.merge,k=l.pick;l=function(e){function l(){var b=null!==e&&e.apply(this,arguments)||this;b.data=void 0;b.options=void 0;b.points=void 0;return b}a(l,e);l.prototype.translate=function(){var b=this,a=b.chart,e=b.options,n=b.dense=2>b.closestPointRange*b.xAxis.transA;n=b.borderWidth=k(e.borderWidth,n?0:1);var d=b.yAxis,l=e.threshold,p=b.translatedThreshold=d.getThreshold(l),x=k(e.minPointLength,
+5),w=b.getColumnMetrics(),z=w.width,f=b.barW=Math.max(z,1+2*n),h=b.pointXOffset=w.offset;a.inverted&&(p-=.5);e.pointPadding&&(f=Math.ceil(f));c.translate.apply(b);b.points.forEach(function(g){var c=k(g.yBottom,p),u=999+Math.abs(c),v=t(g.plotY,-u,d.len+u);u=g.plotX+h;var m=f/2,n=Math.min(v,c);c=Math.max(v,c)-n;var q;g.barX=u;g.pointWidth=z;g.tooltipPos=a.inverted?[d.len+d.pos-a.plotLeft-v,b.xAxis.len-u-m,c]:[u+m,v+d.pos-a.plotTop,c];v=l+(g.total||g.y);"percent"===e.stacking&&(v=l+(0>g.y)?-100:100);
+v=d.toPixels(v,!0);var w=(q=a.plotHeight-v-(a.plotHeight-p))?m*(n-v)/q:0;var y=q?m*(n+c-v)/q:0;q=u-w+m;w=u+w+m;var C=u+y+m;y=u-y+m;var H=n-x;var D=n+c;0>g.y&&(H=n,D=n+c+x);a.inverted&&(C=d.width-n,q=v-(d.width-p),w=m*(v-C)/q,y=m*(v-(C-c))/q,q=u+m+w,w=q-2*w,C=u-y+m,y=u+y+m,H=n,D=n+c-x,0>g.y&&(D=n+c+x));g.shapeType="path";g.shapeArgs={x:q,y:H,width:w-q,height:c,d:[["M",q,H],["L",w,H],["L",C,D],["L",y,D],["Z"]]}})};l.defaultOptions=p(d.defaultOptions,{});return l}(d);e.registerSeriesType("columnpyramid",
+l);"";return l});A(d,"Series/ErrorBar/ErrorBarSeries.js",[d["Series/BoxPlot/BoxPlotSeries.js"],d["Series/Column/ColumnSeries.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l,a){var c=this&&this.__extends||function(){var a=function(c,b){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,a){b.__proto__=a}||function(b,a){for(var g in a)a.hasOwnProperty(g)&&(b[g]=a[g])};return a(c,b)};return function(c,b){function g(){this.constructor=c}a(c,b);c.prototype=
+null===b?Object.create(b):(g.prototype=b.prototype,new g)}}(),t=l.seriesTypes.arearange,p=a.merge;a=a.extend;var k=function(a){function k(){var b=null!==a&&a.apply(this,arguments)||this;b.data=void 0;b.options=void 0;b.points=void 0;return b}c(k,a);k.prototype.getColumnMetrics=function(){return this.linkedParent&&this.linkedParent.columnMetrics||e.prototype.getColumnMetrics.call(this)};k.prototype.drawDataLabels=function(){var b=this.pointValKey;t&&(t.prototype.drawDataLabels.call(this),this.data.forEach(function(a){a.y=
+a[b]}))};k.prototype.toYData=function(b){return[b.low,b.high]};k.defaultOptions=p(d.defaultOptions,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},whiskerWidth:null});return k}(d);a(k.prototype,{pointArrayMap:["low","high"],pointValKey:"high",doQuartiles:!1});l.registerSeriesType("errorbar",k);"";return k});A(d,"Series/Gauge/GaugePoint.js",[d["Core/Series/SeriesRegistry.js"]],
+function(d){var e=this&&this.__extends||function(){var e=function(a,c){e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return e(a,c)};return function(a,c){function d(){this.constructor=a}e(a,c);a.prototype=null===c?Object.create(c):(d.prototype=c.prototype,new d)}}();return function(d){function a(){var a=null!==d&&d.apply(this,arguments)||this;a.options=void 0;a.series=void 0;a.shapeArgs=void 0;return a}
+e(a,d);a.prototype.setState=function(a){this.state=a};return a}(d.series.prototype.pointClass)});A(d,"Series/Gauge/GaugeSeries.js",[d["Series/Gauge/GaugePoint.js"],d["Core/Globals.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l,a){var c=this&&this.__extends||function(){var b=function(a,g){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,a){b.__proto__=a}||function(b,a){for(var g in a)a.hasOwnProperty(g)&&(b[g]=a[g])};return b(a,g)};return function(a,
+g){function c(){this.constructor=a}b(a,g);a.prototype=null===g?Object.create(g):(c.prototype=g.prototype,new c)}}();e=e.noop;var t=l.series,p=l.seriesTypes.column,k=a.clamp,x=a.isNumber,w=a.extend,b=a.merge,g=a.pick,m=a.pInt;a=function(a){function e(){var b=null!==a&&a.apply(this,arguments)||this;b.data=void 0;b.points=void 0;b.options=void 0;b.yAxis=void 0;return b}c(e,a);e.prototype.translate=function(){var a=this.yAxis,c=this.options,e=a.center;this.generatePoints();this.points.forEach(function(d){var n=
+b(c.dial,d.dial),f=m(g(n.radius,"80%"))*e[2]/200,h=m(g(n.baseLength,"70%"))*f/100,u=m(g(n.rearLength,"10%"))*f/100,r=n.baseWidth||3,l=n.topWidth||1,v=c.overshoot,p=a.startAngleRad+a.translate(d.y,null,null,null,!0);if(x(v)||!1===c.wrap)v=x(v)?v/180*Math.PI:0,p=k(p,a.startAngleRad-v,a.endAngleRad+v);p=180*p/Math.PI;d.shapeType="path";d.shapeArgs={d:n.path||[["M",-u,-r/2],["L",h,-r/2],["L",f,-l/2],["L",f,l/2],["L",h,r/2],["L",-u,r/2],["Z"]],translateX:e[0],translateY:e[1],rotation:p};d.plotX=e[0];d.plotY=
+e[1]})};e.prototype.drawPoints=function(){var a=this,c=a.chart,e=a.yAxis.center,d=a.pivot,m=a.options,f=m.pivot,h=c.renderer;a.points.forEach(function(f){var g=f.graphic,e=f.shapeArgs,u=e.d,d=b(m.dial,f.dial);g?(g.animate(e),e.d=u):f.graphic=h[f.shapeType](e).attr({rotation:e.rotation,zIndex:1}).addClass("highcharts-dial").add(a.group);if(!c.styledMode)f.graphic[g?"animate":"attr"]({stroke:d.borderColor||"none","stroke-width":d.borderWidth||0,fill:d.backgroundColor||"#000000"})});d?d.animate({translateX:e[0],
+translateY:e[1]}):(a.pivot=h.circle(0,0,g(f.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(e[0],e[1]).add(a.group),c.styledMode||a.pivot.attr({"stroke-width":f.borderWidth||0,stroke:f.borderColor||"#cccccc",fill:f.backgroundColor||"#000000"}))};e.prototype.animate=function(b){var a=this;b||a.points.forEach(function(b){var g=b.graphic;g&&(g.attr({rotation:180*a.yAxis.startAngleRad/Math.PI}),g.animate({rotation:b.shapeArgs.rotation},a.options.animation))})};e.prototype.render=function(){this.group=
+this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);t.prototype.render.call(this);this.group.clip(this.chart.clipRect)};e.prototype.setData=function(b,a){t.prototype.setData.call(this,b,!1);this.processData();this.generatePoints();g(a,!0)&&this.chart.redraw()};e.prototype.hasData=function(){return!!this.points.length};e.defaultOptions=b(t.defaultOptions,{dataLabels:{borderColor:"#cccccc",borderRadius:3,borderWidth:1,crop:!1,defer:!1,enabled:!0,
+verticalAlign:"top",y:15,zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});return e}(t);w(a.prototype,{angular:!0,directTouch:!0,drawGraph:e,drawTracker:p.prototype.drawTracker,fixedBox:!0,forceDL:!0,noSharedTooltip:!0,pointClass:d,trackerGroups:["group","dataLabelsGroup"]});l.registerSeriesType("gauge",a);"";return a});A(d,"Series/PackedBubble/PackedBubblePoint.js",[d["Core/Chart/Chart.js"],d["Core/Series/Point.js"],d["Core/Series/SeriesRegistry.js"]],function(d,e,l){var a=this&&
+this.__extends||function(){var a=function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var e in c)c.hasOwnProperty(e)&&(a[e]=c[e])};return a(c,e)};return function(c,e){function d(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(d.prototype=e.prototype,new d)}}();return function(c){function l(){var a=null!==c&&c.apply(this,arguments)||this;a.degree=NaN;a.mass=NaN;a.radius=NaN;a.options=void 0;a.series=void 0;a.value=
+null;return a}a(l,c);l.prototype.destroy=function(){this.series.layout&&this.series.layout.removeElementFromCollection(this,this.series.layout.nodes);return e.prototype.destroy.apply(this,arguments)};l.prototype.firePointEvent=function(){var a=this.series.options;if(this.isParentNode&&a.parentNode){var c=a.allowPointSelect;a.allowPointSelect=a.parentNode.allowPointSelect;e.prototype.firePointEvent.apply(this,arguments);a.allowPointSelect=c}else e.prototype.firePointEvent.apply(this,arguments)};l.prototype.select=
+function(){var a=this.series.chart;this.isParentNode?(a.getSelectedPoints=a.getSelectedParentNodes,e.prototype.select.apply(this,arguments),a.getSelectedPoints=d.prototype.getSelectedPoints):e.prototype.select.apply(this,arguments)};return l}(l.seriesTypes.bubble.prototype.pointClass)});A(d,"Series/Networkgraph/DraggableNodes.js",[d["Core/Chart/Chart.js"],d["Core/Globals.js"],d["Core/Utilities.js"]],function(d,e,l){var a=l.addEvent;e.dragNodesMixin={onMouseDown:function(a,e){e=this.chart.pointer.normalize(e);
+a.fixedPosition={chartX:e.chartX,chartY:e.chartY,plotX:a.plotX,plotY:a.plotY};a.inDragMode=!0},onMouseMove:function(a,e){if(a.fixedPosition&&a.inDragMode){var c=this.chart,d=c.pointer.normalize(e);e=a.fixedPosition.chartX-d.chartX;d=a.fixedPosition.chartY-d.chartY;var l=void 0,w=void 0,b=c.graphLayoutsLookup;if(5<Math.abs(e)||5<Math.abs(d))l=a.fixedPosition.plotX-e,w=a.fixedPosition.plotY-d,c.isInsidePlot(l,w)&&(a.plotX=l,a.plotY=w,a.hasDragged=!0,this.redrawHalo(a),b.forEach(function(b){b.restartSimulation()}))}},
+onMouseUp:function(a,e){a.fixedPosition&&(a.hasDragged&&(this.layout.enableSimulation?this.layout.start():this.chart.redraw()),a.inDragMode=a.hasDragged=!1,this.options.fixedDraggable||delete a.fixedPosition)},redrawHalo:function(a){a&&this.halo&&this.halo.attr({d:a.haloPath(this.options.states.hover.halo.size)})}};a(d,"load",function(){var c=this,e,d,l;c.container&&(e=a(c.container,"mousedown",function(e){var k=c.hoverPoint;k&&k.series&&k.series.hasDraggableNodes&&k.series.options.draggable&&(k.series.onMouseDown(k,
+e),d=a(c.container,"mousemove",function(b){return k&&k.series&&k.series.onMouseMove(k,b)}),l=a(c.container.ownerDocument,"mouseup",function(b){d();l();return k&&k.series&&k.series.onMouseUp(k,b)}))}));a(c,"destroy",function(){e()})})});A(d,"Series/Networkgraph/Integrations.js",[d["Core/Globals.js"]],function(d){d.networkgraphIntegrations={verlet:{attractiveForceFunction:function(e,d){return(d-e)/e},repulsiveForceFunction:function(e,d){return(d-e)/e*(d>e?1:0)},barycenter:function(){var e=this.options.gravitationalConstant,
+d=this.barycenter.xFactor,a=this.barycenter.yFactor;d=(d-(this.box.left+this.box.width)/2)*e;a=(a-(this.box.top+this.box.height)/2)*e;this.nodes.forEach(function(c){c.fixedPosition||(c.plotX-=d/c.mass/c.degree,c.plotY-=a/c.mass/c.degree)})},repulsive:function(e,d,a){d=d*this.diffTemperature/e.mass/e.degree;e.fixedPosition||(e.plotX+=a.x*d,e.plotY+=a.y*d)},attractive:function(e,d,a){var c=e.getMass(),l=-a.x*d*this.diffTemperature;d=-a.y*d*this.diffTemperature;e.fromNode.fixedPosition||(e.fromNode.plotX-=
+l*c.fromNode/e.fromNode.degree,e.fromNode.plotY-=d*c.fromNode/e.fromNode.degree);e.toNode.fixedPosition||(e.toNode.plotX+=l*c.toNode/e.toNode.degree,e.toNode.plotY+=d*c.toNode/e.toNode.degree)},integrate:function(e,d){var a=-e.options.friction,c=e.options.maxSpeed,l=(d.plotX+d.dispX-d.prevX)*a;a*=d.plotY+d.dispY-d.prevY;var p=Math.abs,k=p(l)/(l||1);p=p(a)/(a||1);l=k*Math.min(c,Math.abs(l));a=p*Math.min(c,Math.abs(a));d.prevX=d.plotX+d.dispX;d.prevY=d.plotY+d.dispY;d.plotX+=l;d.plotY+=a;d.temperature=
+e.vectorLength({x:l,y:a})},getK:function(e){return Math.pow(e.box.width*e.box.height/e.nodes.length,.5)}},euler:{attractiveForceFunction:function(e,d){return e*e/d},repulsiveForceFunction:function(e,d){return d*d/e},barycenter:function(){var e=this.options.gravitationalConstant,d=this.barycenter.xFactor,a=this.barycenter.yFactor;this.nodes.forEach(function(c){if(!c.fixedPosition){var l=c.getDegree();l*=1+l/2;c.dispX+=(d-c.plotX)*e*l/c.degree;c.dispY+=(a-c.plotY)*e*l/c.degree}})},repulsive:function(e,
+d,a,c){e.dispX+=a.x/c*d/e.degree;e.dispY+=a.y/c*d/e.degree},attractive:function(e,d,a,c){var l=e.getMass(),p=a.x/c*d;d*=a.y/c;e.fromNode.fixedPosition||(e.fromNode.dispX-=p*l.fromNode/e.fromNode.degree,e.fromNode.dispY-=d*l.fromNode/e.fromNode.degree);e.toNode.fixedPosition||(e.toNode.dispX+=p*l.toNode/e.toNode.degree,e.toNode.dispY+=d*l.toNode/e.toNode.degree)},integrate:function(e,d){d.dispX+=d.dispX*e.options.friction;d.dispY+=d.dispY*e.options.friction;var a=d.temperature=e.vectorLength({x:d.dispX,
+y:d.dispY});0!==a&&(d.plotX+=d.dispX/a*Math.min(Math.abs(d.dispX),e.temperature),d.plotY+=d.dispY/a*Math.min(Math.abs(d.dispY),e.temperature))},getK:function(e){return Math.pow(e.box.width*e.box.height/e.nodes.length,.3)}}}});A(d,"Series/Networkgraph/QuadTree.js",[d["Core/Globals.js"],d["Core/Utilities.js"]],function(d,e){e=e.extend;var l=d.QuadTreeNode=function(a){this.box=a;this.boxSize=Math.min(a.width,a.height);this.nodes=[];this.body=this.isInternal=!1;this.isEmpty=!0};e(l.prototype,{insert:function(a,
+c){this.isInternal?this.nodes[this.getBoxPosition(a)].insert(a,c-1):(this.isEmpty=!1,this.body?c?(this.isInternal=!0,this.divideBox(),!0!==this.body&&(this.nodes[this.getBoxPosition(this.body)].insert(this.body,c-1),this.body=!0),this.nodes[this.getBoxPosition(a)].insert(a,c-1)):(c=new l({top:a.plotX,left:a.plotY,width:.1,height:.1}),c.body=a,c.isInternal=!1,this.nodes.push(c)):(this.isInternal=!1,this.body=a))},updateMassAndCenter:function(){var a=0,c=0,e=0;this.isInternal?(this.nodes.forEach(function(d){d.isEmpty||
+(a+=d.mass,c+=d.plotX*d.mass,e+=d.plotY*d.mass)}),c/=a,e/=a):this.body&&(a=this.body.mass,c=this.body.plotX,e=this.body.plotY);this.mass=a;this.plotX=c;this.plotY=e},divideBox:function(){var a=this.box.width/2,c=this.box.height/2;this.nodes[0]=new l({left:this.box.left,top:this.box.top,width:a,height:c});this.nodes[1]=new l({left:this.box.left+a,top:this.box.top,width:a,height:c});this.nodes[2]=new l({left:this.box.left+a,top:this.box.top+c,width:a,height:c});this.nodes[3]=new l({left:this.box.left,
+top:this.box.top+c,width:a,height:c})},getBoxPosition:function(a){var c=a.plotY<this.box.top+this.box.height/2;return a.plotX<this.box.left+this.box.width/2?c?0:3:c?1:2}});d=d.QuadTree=function(a,c,e,d){this.box={left:a,top:c,width:e,height:d};this.maxDepth=25;this.root=new l(this.box,"0");this.root.isInternal=!0;this.root.isRoot=!0;this.root.divideBox()};e(d.prototype,{insertNodes:function(a){a.forEach(function(a){this.root.insert(a,this.maxDepth)},this)},visitNodeRecursive:function(a,c,e){var d;
+a||(a=this.root);a===this.root&&c&&(d=c(a));!1!==d&&(a.nodes.forEach(function(a){if(a.isInternal){c&&(d=c(a));if(!1===d)return;this.visitNodeRecursive(a,c,e)}else a.body&&c&&c(a.body);e&&e(a)},this),a===this.root&&e&&e(a))},calculateMassAndCenter:function(){this.visitNodeRecursive(null,null,function(a){a.updateMassAndCenter()})}})});A(d,"Series/Networkgraph/Layouts.js",[d["Core/Chart/Chart.js"],d["Core/Animation/AnimationUtilities.js"],d["Core/Globals.js"],d["Core/Utilities.js"]],function(d,e,l,a){var c=
+e.setAnimation;e=a.addEvent;var t=a.clamp,p=a.defined,k=a.extend,x=a.isFunction,w=a.pick;l.layouts={"reingold-fruchterman":function(){}};k(l.layouts["reingold-fruchterman"].prototype,{init:function(b){this.options=b;this.nodes=[];this.links=[];this.series=[];this.box={x:0,y:0,width:0,height:0};this.setInitialRendering(!0);this.integration=l.networkgraphIntegrations[b.integration];this.enableSimulation=b.enableSimulation;this.attractiveForce=w(b.attractiveForce,this.integration.attractiveForceFunction);
+this.repulsiveForce=w(b.repulsiveForce,this.integration.repulsiveForceFunction);this.approximation=b.approximation},updateSimulation:function(b){this.enableSimulation=w(b,this.options.enableSimulation)},start:function(){var b=this.series,a=this.options;this.currentStep=0;this.forces=b[0]&&b[0].forces||[];this.chart=b[0]&&b[0].chart;this.initialRendering&&(this.initPositions(),b.forEach(function(b){b.finishedAnimating=!0;b.render()}));this.setK();this.resetSimulation(a);this.enableSimulation&&this.step()},
+step:function(){var b=this,a=this.series;b.currentStep++;"barnes-hut"===b.approximation&&(b.createQuadTree(),b.quadTree.calculateMassAndCenter());b.forces.forEach(function(a){b[a+"Forces"](b.temperature)});b.applyLimits(b.temperature);b.temperature=b.coolDown(b.startTemperature,b.diffTemperature,b.currentStep);b.prevSystemTemperature=b.systemTemperature;b.systemTemperature=b.getSystemTemperature();b.enableSimulation&&(a.forEach(function(b){b.chart&&b.render()}),b.maxIterations--&&isFinite(b.temperature)&&
+!b.isStable()?(b.simulation&&l.win.cancelAnimationFrame(b.simulation),b.simulation=l.win.requestAnimationFrame(function(){b.step()})):b.simulation=!1)},stop:function(){this.simulation&&l.win.cancelAnimationFrame(this.simulation)},setArea:function(b,a,c,e){this.box={left:b,top:a,width:c,height:e}},setK:function(){this.k=this.options.linkLength||this.integration.getK(this)},addElementsToCollection:function(b,a){b.forEach(function(b){-1===a.indexOf(b)&&a.push(b)})},removeElementFromCollection:function(b,
+a){b=a.indexOf(b);-1!==b&&a.splice(b,1)},clear:function(){this.nodes.length=0;this.links.length=0;this.series.length=0;this.resetSimulation()},resetSimulation:function(){this.forcedStop=!1;this.systemTemperature=0;this.setMaxIterations();this.setTemperature();this.setDiffTemperature()},restartSimulation:function(){this.simulation?this.resetSimulation():(this.setInitialRendering(!1),this.enableSimulation?this.start():this.setMaxIterations(1),this.chart&&this.chart.redraw(),this.setInitialRendering(!0))},
+setMaxIterations:function(b){this.maxIterations=w(b,this.options.maxIterations)},setTemperature:function(){this.temperature=this.startTemperature=Math.sqrt(this.nodes.length)},setDiffTemperature:function(){this.diffTemperature=this.startTemperature/(this.options.maxIterations+1)},setInitialRendering:function(b){this.initialRendering=b},createQuadTree:function(){this.quadTree=new l.QuadTree(this.box.left,this.box.top,this.box.width,this.box.height);this.quadTree.insertNodes(this.nodes)},initPositions:function(){var b=
+this.options.initialPositions;x(b)?(b.call(this),this.nodes.forEach(function(b){p(b.prevX)||(b.prevX=b.plotX);p(b.prevY)||(b.prevY=b.plotY);b.dispX=0;b.dispY=0})):"circle"===b?this.setCircularPositions():this.setRandomPositions()},setCircularPositions:function(){function b(a){a.linksFrom.forEach(function(a){l[a.toNode.id]||(l[a.toNode.id]=!0,k.push(a.toNode),b(a.toNode))})}var a=this.box,c=this.nodes,e=2*Math.PI/(c.length+1),d=c.filter(function(b){return 0===b.linksTo.length}),k=[],l={},p=this.options.initialPositionRadius;
+d.forEach(function(a){k.push(a);b(a)});k.length?c.forEach(function(b){-1===k.indexOf(b)&&k.push(b)}):k=c;k.forEach(function(b,c){b.plotX=b.prevX=w(b.plotX,a.width/2+p*Math.cos(c*e));b.plotY=b.prevY=w(b.plotY,a.height/2+p*Math.sin(c*e));b.dispX=0;b.dispY=0})},setRandomPositions:function(){function b(b){b=b*b/Math.PI;return b-=Math.floor(b)}var a=this.box,c=this.nodes,e=c.length+1;c.forEach(function(c,g){c.plotX=c.prevX=w(c.plotX,a.width*b(g));c.plotY=c.prevY=w(c.plotY,a.height*b(e+g));c.dispX=0;c.dispY=
+0})},force:function(b){this.integration[b].apply(this,Array.prototype.slice.call(arguments,1))},barycenterForces:function(){this.getBarycenter();this.force("barycenter")},getBarycenter:function(){var b=0,a=0,c=0;this.nodes.forEach(function(g){a+=g.plotX*g.mass;c+=g.plotY*g.mass;b+=g.mass});return this.barycenter={x:a,y:c,xFactor:a/b,yFactor:c/b}},barnesHutApproximation:function(b,a){var c=this.getDistXY(b,a),g=this.vectorLength(c);if(b!==a&&0!==g)if(a.isInternal)if(a.boxSize/g<this.options.theta&&
+0!==g){var e=this.repulsiveForce(g,this.k);this.force("repulsive",b,e*a.mass,c,g);var d=!1}else d=!0;else e=this.repulsiveForce(g,this.k),this.force("repulsive",b,e*a.mass,c,g);return d},repulsiveForces:function(){var b=this;"barnes-hut"===b.approximation?b.nodes.forEach(function(a){b.quadTree.visitNodeRecursive(null,function(c){return b.barnesHutApproximation(a,c)})}):b.nodes.forEach(function(a){b.nodes.forEach(function(c){if(a!==c&&!a.fixedPosition){var g=b.getDistXY(a,c);var e=b.vectorLength(g);
+if(0!==e){var d=b.repulsiveForce(e,b.k);b.force("repulsive",a,d*c.mass,g,e)}}})})},attractiveForces:function(){var b=this,a,c,e;b.links.forEach(function(g){g.fromNode&&g.toNode&&(a=b.getDistXY(g.fromNode,g.toNode),c=b.vectorLength(a),0!==c&&(e=b.attractiveForce(c,b.k),b.force("attractive",g,e,a,c)))})},applyLimits:function(){var b=this;b.nodes.forEach(function(a){a.fixedPosition||(b.integration.integrate(b,a),b.applyLimitBox(a,b.box),a.dispX=0,a.dispY=0)})},applyLimitBox:function(b,a){var c=b.radius;
+b.plotX=t(b.plotX,a.left+c,a.width-c);b.plotY=t(b.plotY,a.top+c,a.height-c)},coolDown:function(b,a,c){return b-a*c},isStable:function(){return.00001>Math.abs(this.systemTemperature-this.prevSystemTemperature)||0>=this.temperature},getSystemTemperature:function(){return this.nodes.reduce(function(b,a){return b+a.temperature},0)},vectorLength:function(b){return Math.sqrt(b.x*b.x+b.y*b.y)},getDistR:function(b,a){b=this.getDistXY(b,a);return this.vectorLength(b)},getDistXY:function(b,a){var c=b.plotX-
+a.plotX;b=b.plotY-a.plotY;return{x:c,y:b,absX:Math.abs(c),absY:Math.abs(b)}}});e(d,"predraw",function(){this.graphLayoutsLookup&&this.graphLayoutsLookup.forEach(function(b){b.stop()})});e(d,"render",function(){function b(b){b.maxIterations--&&isFinite(b.temperature)&&!b.isStable()&&!b.enableSimulation&&(b.beforeStep&&b.beforeStep(),b.step(),e=!1,a=!0)}var a=!1;if(this.graphLayoutsLookup){c(!1,this);for(this.graphLayoutsLookup.forEach(function(b){b.start()});!e;){var e=!0;this.graphLayoutsLookup.forEach(b)}a&&
+this.series.forEach(function(b){b&&b.layout&&b.render()})}});e(d,"beforePrint",function(){this.graphLayoutsLookup&&(this.graphLayoutsLookup.forEach(function(b){b.updateSimulation(!1)}),this.redraw())});e(d,"afterPrint",function(){this.graphLayoutsLookup&&this.graphLayoutsLookup.forEach(function(b){b.updateSimulation()});this.redraw()})});A(d,"Series/PackedBubble/PackedBubbleComposition.js",[d["Core/Chart/Chart.js"],d["Core/Globals.js"],d["Core/Utilities.js"]],function(d,e,l){var a=e.layouts["reingold-fruchterman"],
+c=l.addEvent,t=l.extendClass,p=l.pick;d.prototype.getSelectedParentNodes=function(){var a=[];this.series.forEach(function(c){c.parentNode&&c.parentNode.selected&&a.push(c.parentNode)});return a};e.networkgraphIntegrations.packedbubble={repulsiveForceFunction:function(a,c,e,b){return Math.min(a,(e.marker.radius+b.marker.radius)/2)},barycenter:function(){var a=this,c=a.options.gravitationalConstant,e=a.box,b=a.nodes,d,m;b.forEach(function(g){a.options.splitSeries&&!g.isParentNode?(d=g.series.parentNode.plotX,
+m=g.series.parentNode.plotY):(d=e.width/2,m=e.height/2);g.fixedPosition||(g.plotX-=(g.plotX-d)*c/(g.mass*Math.sqrt(b.length)),g.plotY-=(g.plotY-m)*c/(g.mass*Math.sqrt(b.length)))})},repulsive:function(a,c,e,b){var g=c*this.diffTemperature/a.mass/a.degree;c=e.x*g;e=e.y*g;a.fixedPosition||(a.plotX+=c,a.plotY+=e);b.fixedPosition||(b.plotX-=c,b.plotY-=e)},integrate:e.networkgraphIntegrations.verlet.integrate,getK:e.noop};e.layouts.packedbubble=t(a,{beforeStep:function(){this.options.marker&&this.series.forEach(function(a){a&&
+a.calculateParentRadius()})},isStable:function(){var a=Math.abs(this.prevSystemTemperature-this.systemTemperature);return 1>Math.abs(10*this.systemTemperature/Math.sqrt(this.nodes.length))&&.00001>a||0>=this.temperature},setCircularPositions:function(){var a=this,c=a.box,e=a.nodes,b=2*Math.PI/(e.length+1),g,d,n=a.options.initialPositionRadius;e.forEach(function(e,k){a.options.splitSeries&&!e.isParentNode?(g=e.series.parentNode.plotX,d=e.series.parentNode.plotY):(g=c.width/2,d=c.height/2);e.plotX=
+e.prevX=p(e.plotX,g+n*Math.cos(e.index||k*b));e.plotY=e.prevY=p(e.plotY,d+n*Math.sin(e.index||k*b));e.dispX=0;e.dispY=0})},repulsiveForces:function(){var a=this,c,e,b,g=a.options.bubblePadding;a.nodes.forEach(function(d){d.degree=d.mass;d.neighbours=0;a.nodes.forEach(function(k){c=0;d===k||d.fixedPosition||!a.options.seriesInteraction&&d.series!==k.series||(b=a.getDistXY(d,k),e=a.vectorLength(b)-(d.marker.radius+k.marker.radius+g),0>e&&(d.degree+=.01,d.neighbours++,c=a.repulsiveForce(-e/Math.sqrt(d.neighbours),
+a.k,d,k)),a.force("repulsive",d,c*k.mass,b,k,e))})})},applyLimitBox:function(c){if(this.options.splitSeries&&!c.isParentNode&&this.options.parentNodeLimit){var e=this.getDistXY(c,c.series.parentNode);var d=c.series.parentNodeRadius-c.marker.radius-this.vectorLength(e);0>d&&d>-2*c.marker.radius&&(c.plotX-=.01*e.x,c.plotY-=.01*e.y)}a.prototype.applyLimitBox.apply(this,arguments)}});c(d,"beforeRedraw",function(){this.allDataPoints&&delete this.allDataPoints})});A(d,"Series/PackedBubble/PackedBubbleSeries.js",
+[d["Core/Color/Color.js"],d["Core/Globals.js"],d["Series/PackedBubble/PackedBubblePoint.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"]],function(d,e,l,a,c){var t=this&&this.__extends||function(){var a=function(b,h){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var h in b)b.hasOwnProperty(h)&&(a[h]=b[h])};return a(b,h)};return function(b,h){function f(){this.constructor=b}a(b,h);b.prototype=null===h?Object.create(h):(f.prototype=
+h.prototype,new f)}}(),p=d.parse,k=a.series,x=a.seriesTypes.bubble,w=c.addEvent,b=c.clamp,g=c.defined,m=c.extend,n=c.fireEvent,q=c.isArray,H=c.isNumber,A=c.merge,I=c.pick,y=e.dragNodesMixin;d=function(a){function f(){var b=null!==a&&a.apply(this,arguments)||this;b.chart=void 0;b.data=void 0;b.layout=void 0;b.options=void 0;b.points=void 0;b.xData=void 0;return b}t(f,a);f.prototype.accumulateAllPoints=function(a){var b=a.chart,h=[],f,c;for(f=0;f<b.series.length;f++)if(a=b.series[f],a.is("packedbubble")&&
+a.visible||!b.options.chart.ignoreHiddenSeries)for(c=0;c<a.yData.length;c++)h.push([null,null,a.yData[c],a.index,c,{id:c,marker:{radius:0}}]);return h};f.prototype.addLayout=function(){var a=this.options.layoutAlgorithm,b=this.chart.graphLayoutsStorage,f=this.chart.graphLayoutsLookup,c=this.chart.options.chart;b||(this.chart.graphLayoutsStorage=b={},this.chart.graphLayoutsLookup=f=[]);var d=b[a.type];d||(a.enableSimulation=g(c.forExport)?!c.forExport:a.enableSimulation,b[a.type]=d=new e.layouts[a.type],
+d.init(a),f.splice(d.index,0,d));this.layout=d;this.points.forEach(function(a){a.mass=2;a.degree=1;a.collisionNmb=1});d.setArea(0,0,this.chart.plotWidth,this.chart.plotHeight);d.addElementsToCollection([this],d.series);d.addElementsToCollection(this.points,d.nodes)};f.prototype.addSeriesLayout=function(){var a=this.options.layoutAlgorithm,b=this.chart.graphLayoutsStorage,f=this.chart.graphLayoutsLookup,c=A(a,a.parentNodeOptions,{enableSimulation:this.layout.options.enableSimulation});var d=b[a.type+
+"-series"];d||(b[a.type+"-series"]=d=new e.layouts[a.type],d.init(c),f.splice(d.index,0,d));this.parentNodeLayout=d;this.createParentNodes()};f.prototype.calculateParentRadius=function(){var a=this.seriesBox();this.parentNodeRadius=b(Math.sqrt(2*this.parentNodeMass/Math.PI)+20,20,a?Math.max(Math.sqrt(Math.pow(a.width,2)+Math.pow(a.height,2))/2+20,20):Math.sqrt(2*this.parentNodeMass/Math.PI)+20);this.parentNode&&(this.parentNode.marker.radius=this.parentNode.radius=this.parentNodeRadius)};f.prototype.calculateZExtremes=
+function(){var a=this.options.zMin,b=this.options.zMax,f=Infinity,c=-Infinity;if(a&&b)return[a,b];this.chart.series.forEach(function(a){a.yData.forEach(function(a){g(a)&&(a>c&&(c=a),a<f&&(f=a))})});a=I(a,f);b=I(b,c);return[a,b]};f.prototype.checkOverlap=function(a,b){var h=a[0]-b[0],f=a[1]-b[1];return-.001>Math.sqrt(h*h+f*f)-Math.abs(a[2]+b[2])};f.prototype.createParentNodes=function(){var a=this,b=a.chart,f=a.parentNodeLayout,c,e=a.parentNode,d=a.pointClass,g=a.layout.options,k={radius:a.parentNodeRadius,
+lineColor:a.color,fillColor:p(a.color).brighten(.4).get()};g.parentNodeOptions&&(k=A(g.parentNodeOptions.marker||{},k));a.parentNodeMass=0;a.points.forEach(function(b){a.parentNodeMass+=Math.PI*Math.pow(b.marker.radius,2)});a.calculateParentRadius();f.nodes.forEach(function(b){b.seriesIndex===a.index&&(c=!0)});f.setArea(0,0,b.plotWidth,b.plotHeight);c||(e||(e=(new d).init(this,{mass:a.parentNodeRadius/2,marker:k,dataLabels:{inside:!1},states:{normal:{marker:k},hover:{marker:k}},dataLabelOnNull:!0,
+degree:a.parentNodeRadius,isParentNode:!0,seriesIndex:a.index})),a.parentNode&&(e.plotX=a.parentNode.plotX,e.plotY=a.parentNode.plotY),a.parentNode=e,f.addElementsToCollection([a],f.series),f.addElementsToCollection([e],f.nodes))};f.prototype.deferLayout=function(){var a=this.options.layoutAlgorithm;this.visible&&(this.addLayout(),a.splitSeries&&this.addSeriesLayout())};f.prototype.destroy=function(){this.chart.graphLayoutsLookup&&this.chart.graphLayoutsLookup.forEach(function(a){a.removeElementFromCollection(this,
+a.series)},this);this.parentNode&&this.parentNodeLayout&&(this.parentNodeLayout.removeElementFromCollection(this.parentNode,this.parentNodeLayout.nodes),this.parentNode.dataLabel&&(this.parentNode.dataLabel=this.parentNode.dataLabel.destroy()));k.prototype.destroy.apply(this,arguments)};f.prototype.drawDataLabels=function(){var a=this.options.dataLabels.textPath,b=this.points;k.prototype.drawDataLabels.apply(this,arguments);this.parentNode&&(this.parentNode.formatPrefix="parentNode",this.points=[this.parentNode],
+this.options.dataLabels.textPath=this.options.dataLabels.parentNodeTextPath,k.prototype.drawDataLabels.apply(this,arguments),this.points=b,this.options.dataLabels.textPath=a)};f.prototype.drawGraph=function(){if(this.layout&&this.layout.options.splitSeries){var a=this.chart;var b=this.layout.options.parentNodeOptions.marker;var f={fill:b.fillColor||p(this.color).brighten(.4).get(),opacity:b.fillOpacity,stroke:b.lineColor||this.color,"stroke-width":I(b.lineWidth,this.options.lineWidth)};this.parentNodesGroup||
+(this.parentNodesGroup=this.plotGroup("parentNodesGroup","parentNode",this.visible?"inherit":"hidden",.1,a.seriesGroup),this.group.attr({zIndex:2}));this.calculateParentRadius();b=A({x:this.parentNode.plotX-this.parentNodeRadius,y:this.parentNode.plotY-this.parentNodeRadius,width:2*this.parentNodeRadius,height:2*this.parentNodeRadius},f);this.parentNode.graphic||(this.graph=this.parentNode.graphic=a.renderer.symbol(f.symbol).add(this.parentNodesGroup));this.parentNode.graphic.attr(b)}};f.prototype.drawTracker=
+function(){var b=this.parentNode;a.prototype.drawTracker.call(this);if(b){var f=q(b.dataLabels)?b.dataLabels:b.dataLabel?[b.dataLabel]:[];b.graphic&&(b.graphic.element.point=b);f.forEach(function(a){a.div?a.div.point=b:a.element.point=b})}};f.prototype.getPointRadius=function(){var a=this,f=a.chart,c=a.options,e=c.useSimulation,d=Math.min(f.plotWidth,f.plotHeight),g={},k=[],l=f.allDataPoints,n,m,p,z;["minSize","maxSize"].forEach(function(a){var b=parseInt(c[a],10),f=/%$/.test(c[a]);g[a]=f?d*b/100:
+b*Math.sqrt(l.length)});f.minRadius=n=g.minSize/Math.sqrt(l.length);f.maxRadius=m=g.maxSize/Math.sqrt(l.length);var q=e?a.calculateZExtremes():[n,m];(l||[]).forEach(function(f,h){p=e?b(f[2],q[0],q[1]):f[2];z=a.getRadius(q[0],q[1],n,m,p);0===z&&(z=null);l[h][2]=z;k.push(z)});a.radii=k};f.prototype.init=function(){k.prototype.init.apply(this,arguments);this.eventsToUnbind.push(w(this,"updatedData",function(){this.chart.series.forEach(function(a){a.type===this.type&&(a.isDirty=!0)},this)}));return this};
+f.prototype.onMouseUp=function(a){if(a.fixedPosition&&!a.removed){var b,f,h=this.layout,c=this.parentNodeLayout;c&&h.options.dragBetweenSeries&&c.nodes.forEach(function(c){a&&a.marker&&c!==a.series.parentNode&&(b=h.getDistXY(a,c),f=h.vectorLength(b)-c.marker.radius-a.marker.radius,0>f&&(c.series.addPoint(A(a.options,{plotX:a.plotX,plotY:a.plotY}),!1),h.removeElementFromCollection(a,h.nodes),a.remove()))});y.onMouseUp.apply(this,arguments)}};f.prototype.placeBubbles=function(a){var b=this.checkOverlap,
+f=this.positionBubble,c=[],h=1,e=0,d=0;var g=[];var k;a=a.sort(function(a,b){return b[2]-a[2]});if(a.length){c.push([[0,0,a[0][2],a[0][3],a[0][4]]]);if(1<a.length)for(c.push([[0,0-a[1][2]-a[0][2],a[1][2],a[1][3],a[1][4]]]),k=2;k<a.length;k++)a[k][2]=a[k][2]||1,g=f(c[h][e],c[h-1][d],a[k]),b(g,c[h][0])?(c.push([]),d=0,c[h+1].push(f(c[h][e],c[h][0],a[k])),h++,e=0):1<h&&c[h-1][d+1]&&b(g,c[h-1][d+1])?(d++,c[h].push(f(c[h][e],c[h-1][d],a[k])),e++):(e++,c[h].push(g));this.chart.stages=c;this.chart.rawPositions=
+[].concat.apply([],c);this.resizeRadius();g=this.chart.rawPositions}return g};f.prototype.pointAttribs=function(a,b){var f=this.options,c=f.marker;a&&a.isParentNode&&f.layoutAlgorithm&&f.layoutAlgorithm.parentNodeOptions&&(c=f.layoutAlgorithm.parentNodeOptions.marker);f=c.fillOpacity;a=k.prototype.pointAttribs.call(this,a,b);1!==f&&(a["fill-opacity"]=f);return a};f.prototype.positionBubble=function(a,b,f){var c=Math.sqrt,h=Math.asin,e=Math.acos,d=Math.pow,g=Math.abs;c=c(d(a[0]-b[0],2)+d(a[1]-b[1],
+2));e=e((d(c,2)+d(f[2]+b[2],2)-d(f[2]+a[2],2))/(2*(f[2]+b[2])*c));h=h(g(a[0]-b[0])/c);a=(0>a[1]-b[1]?0:Math.PI)+e+h*(0>(a[0]-b[0])*(a[1]-b[1])?1:-1);return[b[0]+(b[2]+f[2])*Math.sin(a),b[1]-(b[2]+f[2])*Math.cos(a),f[2],f[3],f[4]]};f.prototype.render=function(){var a=[];k.prototype.render.apply(this,arguments);this.options.dataLabels.allowOverlap||(this.data.forEach(function(b){q(b.dataLabels)&&b.dataLabels.forEach(function(b){a.push(b)})}),this.options.useSimulation&&this.chart.hideOverlappingLabels(a))};
+f.prototype.resizeRadius=function(){var a=this.chart,b=a.rawPositions,f=Math.min,c=Math.max,e=a.plotLeft,d=a.plotTop,g=a.plotHeight,k=a.plotWidth,l,n,m;var p=l=Number.POSITIVE_INFINITY;var z=n=Number.NEGATIVE_INFINITY;for(m=0;m<b.length;m++){var q=b[m][2];p=f(p,b[m][0]-q);z=c(z,b[m][0]+q);l=f(l,b[m][1]-q);n=c(n,b[m][1]+q)}m=[z-p,n-l];f=f.apply([],[(k-e)/m[0],(g-d)/m[1]]);if(1e-10<Math.abs(f-1)){for(m=0;m<b.length;m++)b[m][2]*=f;this.placeBubbles(b)}else a.diffY=g/2+d-l-(n-l)/2,a.diffX=k/2+e-p-(z-
+p)/2};f.prototype.seriesBox=function(){var a=this.chart,b=Math.max,f=Math.min,c,e=[a.plotLeft,a.plotLeft+a.plotWidth,a.plotTop,a.plotTop+a.plotHeight];this.data.forEach(function(a){g(a.plotX)&&g(a.plotY)&&a.marker.radius&&(c=a.marker.radius,e[0]=f(e[0],a.plotX-c),e[1]=b(e[1],a.plotX+c),e[2]=f(e[2],a.plotY-c),e[3]=b(e[3],a.plotY+c))});return H(e.width/e.height)?e:null};f.prototype.setVisible=function(){var a=this;k.prototype.setVisible.apply(a,arguments);a.parentNodeLayout&&a.graph?a.visible?(a.graph.show(),
+a.parentNode.dataLabel&&a.parentNode.dataLabel.show()):(a.graph.hide(),a.parentNodeLayout.removeElementFromCollection(a.parentNode,a.parentNodeLayout.nodes),a.parentNode.dataLabel&&a.parentNode.dataLabel.hide()):a.layout&&(a.visible?a.layout.addElementsToCollection(a.points,a.layout.nodes):a.points.forEach(function(b){a.layout.removeElementFromCollection(b,a.layout.nodes)}))};f.prototype.translate=function(){var a=this.chart,b=this.data,f=this.index,c,e=this.options.useSimulation;this.processedXData=
+this.xData;this.generatePoints();g(a.allDataPoints)||(a.allDataPoints=this.accumulateAllPoints(this),this.getPointRadius());if(e)var d=a.allDataPoints;else d=this.placeBubbles(a.allDataPoints),this.options.draggable=!1;for(c=0;c<d.length;c++)if(d[c][3]===f){var k=b[d[c][4]];var l=I(d[c][2],void 0);e||(k.plotX=d[c][0]-a.plotLeft+a.diffX,k.plotY=d[c][1]-a.plotTop+a.diffY);H(l)&&(k.marker=m(k.marker,{radius:l,width:2*l,height:2*l}),k.radius=l)}e&&this.deferLayout();n(this,"afterTranslate")};f.defaultOptions=
+A(x.defaultOptions,{minSize:"10%",maxSize:"50%",sizeBy:"area",zoneAxis:"y",crisp:!1,tooltip:{pointFormat:"Value: {point.value}"},draggable:!0,useSimulation:!0,parentNode:{allowPointSelect:!1},dataLabels:{formatter:function(){var a=this.series.chart.numberFormatter,b=this.point.value;return H(b)?a(b,-1):""},parentNodeFormatter:function(){return this.name},parentNodeTextPath:{enabled:!0},padding:0,style:{transition:"opacity 2000ms"}},layoutAlgorithm:{initialPositions:"circle",initialPositionRadius:20,
+bubblePadding:5,parentNodeLimit:!1,seriesInteraction:!0,dragBetweenSeries:!1,parentNodeOptions:{maxIterations:400,gravitationalConstant:.03,maxSpeed:50,initialPositionRadius:100,seriesInteraction:!0,marker:{fillColor:null,fillOpacity:1,lineWidth:null,lineColor:null,symbol:"circle"}},enableSimulation:!0,type:"packedbubble",integration:"packedbubble",maxIterations:1E3,splitSeries:!1,maxSpeed:5,gravitationalConstant:.01,friction:-.981}});return f}(x);m(d.prototype,{alignDataLabel:k.prototype.alignDataLabel,
+axisTypes:[],directTouch:!0,forces:["barycenter","repulsive"],hasDraggableNodes:!0,isCartesian:!1,noSharedTooltip:!0,onMouseDown:y.onMouseDown,onMouseMove:y.onMouseMove,pointArrayMap:["value"],pointClass:l,pointValKey:"value",redrawHalo:y.redrawHalo,requireSorting:!1,searchPoint:e.noop,trackerGroups:["group","dataLabelsGroup","parentNodesGroup"]});a.registerSeriesType("packedbubble",d);"";"";return d});A(d,"Series/Polygon/PolygonSeries.js",[d["Core/Globals.js"],d["Core/Legend/LegendSymbol.js"],d["Core/Series/SeriesRegistry.js"],
+d["Core/Utilities.js"]],function(d,e,l,a){var c=this&&this.__extends||function(){var a=function(b,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])};return a(b,c)};return function(b,c){function e(){this.constructor=b}a(b,c);b.prototype=null===c?Object.create(c):(e.prototype=c.prototype,new e)}}();d=d.noop;var t=l.series,p=l.seriesTypes,k=p.area,x=p.line,w=p.scatter;p=a.extend;var b=a.merge;a=function(a){function e(){var b=
+null!==a&&a.apply(this,arguments)||this;b.data=void 0;b.options=void 0;b.points=void 0;return b}c(e,a);e.prototype.getGraphPath=function(){for(var a=x.prototype.getGraphPath.call(this),b=a.length+1;b--;)(b===a.length||"M"===a[b][0])&&0<b&&a.splice(b,0,["Z"]);return this.areaPath=a};e.prototype.drawGraph=function(){this.options.fillColor=this.color;k.prototype.drawGraph.call(this)};e.defaultOptions=b(w.defaultOptions,{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,
+pointFormat:""},trackByArea:!0});return e}(w);p(a.prototype,{type:"polygon",drawLegendSymbol:e.drawRectangle,drawTracker:t.prototype.drawTracker,setStackedPoints:d});l.registerSeriesType("polygon",a);"";return a});A(d,"Core/Axis/WaterfallAxis.js",[d["Extensions/Stacking.js"],d["Core/Utilities.js"]],function(d,e){var l=e.addEvent,a=e.objectEach,c;(function(c){function e(){var a=this.waterfall.stacks;a&&(a.changed=!1,delete a.alreadyChanged)}function k(){var a=this.options.stackLabels;a&&a.enabled&&
+this.waterfall.stacks&&this.waterfall.renderStackTotals()}function x(){for(var a=this.axes,b=this.series,c=b.length;c--;)b[c].options.stacking&&(a.forEach(function(a){a.isXAxis||(a.waterfall.stacks.changed=!0)}),c=0)}function w(){this.waterfall||(this.waterfall=new b(this))}var b=function(){function b(a){this.axis=a;this.stacks={changed:!1}}b.prototype.renderStackTotals=function(){var b=this.axis,c=b.waterfall.stacks,e=b.stacking&&b.stacking.stackTotalGroup,g=new d(b,b.options.stackLabels,!1,0,void 0);
+this.dummyStackItem=g;a(c,function(b){a(b,function(a){g.total=a.stackTotal;a.label&&(g.label=a.label);d.prototype.render.call(g,e);a.label=g.label;delete g.label})});g.total=null};return b}();c.Composition=b;c.compose=function(a,b){l(a,"init",w);l(a,"afterBuildStacks",e);l(a,"afterRender",k);l(b,"beforeRedraw",x)}})(c||(c={}));return c});A(d,"Series/Waterfall/WaterfallPoint.js",[d["Series/Column/ColumnSeries.js"],d["Core/Series/Point.js"],d["Core/Utilities.js"]],function(d,e,l){var a=this&&this.__extends||
+function(){var a=function(c,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var b in c)c.hasOwnProperty(b)&&(a[b]=c[b])};return a(c,e)};return function(c,e){function d(){this.constructor=c}a(c,e);c.prototype=null===e?Object.create(e):(d.prototype=e.prototype,new d)}}(),c=l.isNumber;return function(d){function l(){var a=null!==d&&d.apply(this,arguments)||this;a.options=void 0;a.series=void 0;return a}a(l,d);l.prototype.getClassName=function(){var a=
+e.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum");return a};l.prototype.isValid=function(){return c(this.y)||this.isSum||!!this.isIntermediateSum};return l}(d.prototype.pointClass)});A(d,"Series/Waterfall/WaterfallSeries.js",[d["Core/Axis/Axis.js"],d["Core/Chart/Chart.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Utilities.js"],d["Core/Axis/WaterfallAxis.js"],d["Series/Waterfall/WaterfallPoint.js"]],function(d,e,l,a,c,
+t){var p=this&&this.__extends||function(){var a=function(b,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])};return a(b,c)};return function(b,c){function f(){this.constructor=b}a(b,c);b.prototype=null===c?Object.create(c):(f.prototype=c.prototype,new f)}}(),k=l.seriesTypes,x=k.column,w=k.line,b=a.arrayMax,g=a.arrayMin,m=a.correctFloat;k=a.extend;var n=a.isNumber,q=a.merge,A=a.objectEach,J=a.pick;
+a=function(a){function c(){var b=null!==a&&a.apply(this,arguments)||this;b.chart=void 0;b.data=void 0;b.options=void 0;b.points=void 0;b.stackedYNeg=void 0;b.stackedYPos=void 0;b.stackKey=void 0;b.xData=void 0;b.yAxis=void 0;b.yData=void 0;return b}p(c,a);c.prototype.generatePoints=function(){var a;x.prototype.generatePoints.apply(this);var b=0;for(a=this.points.length;b<a;b++){var c=this.points[b];var e=this.processedYData[b];if(c.isIntermediateSum||c.isSum)c.y=m(e)}};c.prototype.translate=function(){var a=
+this.options,b=this.yAxis,c=J(a.minPointLength,5),e=c/2,d=a.threshold||0,g=d,k=d;a=a.stacking;var l=b.waterfall.stacks[this.stackKey];x.prototype.translate.apply(this);for(var m=this.points,p=0;p<m.length;p++){var q=m[p];var w=this.processedYData[p];var C=q.shapeArgs;if(C&&n(w)){var t=[0,w];var D=q.y;if(a){if(l){t=l[p];if("overlap"===a){var y=t.stackState[t.stateIndex--];y=0<=D?y:y-D;Object.hasOwnProperty.call(t,"absolutePos")&&delete t.absolutePos;Object.hasOwnProperty.call(t,"absoluteNeg")&&delete t.absoluteNeg}else 0<=
+D?(y=t.threshold+t.posTotal,t.posTotal-=D):(y=t.threshold+t.negTotal,t.negTotal-=D,y-=D),!t.posTotal&&Object.hasOwnProperty.call(t,"absolutePos")&&(t.posTotal=t.absolutePos,delete t.absolutePos),!t.negTotal&&Object.hasOwnProperty.call(t,"absoluteNeg")&&(t.negTotal=t.absoluteNeg,delete t.absoluteNeg);q.isSum||(t.connectorThreshold=t.threshold+t.stackTotal);b.reversed?(w=0<=D?y-D:y+D,D=y):(w=y,D=y-D);q.below=w<=d;C.y=b.translate(w,!1,!0,!1,!0)||0;C.height=Math.abs(C.y-(b.translate(D,!1,!0,!1,!0)||0));
+if(D=b.waterfall.dummyStackItem)D.x=p,D.label=l[p].label,D.setOffset(this.pointXOffset||0,this.barW||0,this.stackedYNeg[p],this.stackedYPos[p])}}else y=Math.max(g,g+D)+t[0],C.y=b.translate(y,!1,!0,!1,!0)||0,q.isSum?(C.y=b.translate(t[1],!1,!0,!1,!0)||0,C.height=Math.min(b.translate(t[0],!1,!0,!1,!0)||0,b.len)-C.y,q.below=t[1]<=d):q.isIntermediateSum?(0<=D?(w=t[1]+k,D=k):(w=k,D=t[1]+k),b.reversed&&(w^=D,D^=w,w^=D),C.y=b.translate(w,!1,!0,!1,!0)||0,C.height=Math.abs(C.y-Math.min(b.translate(D,!1,!0,
+!1,!0)||0,b.len)),k+=t[1],q.below=w<=d):(C.height=0<w?(b.translate(g,!1,!0,!1,!0)||0)-C.y:(b.translate(g,!1,!0,!1,!0)||0)-(b.translate(g-w,!1,!0,!1,!0)||0),g+=w,q.below=g<d),0>C.height&&(C.y+=C.height,C.height*=-1);q.plotY=C.y=Math.round(C.y||0)-this.borderWidth%2/2;C.height=Math.max(Math.round(C.height||0),.001);q.yBottom=C.y+C.height;C.height<=c&&!q.isNull?(C.height=c,C.y-=e,q.plotY=C.y,q.minPointLengthOffset=0>q.y?-e:e):(q.isNull&&(C.width=0),q.minPointLengthOffset=0);D=q.plotY+(q.negative?C.height:
+0);q.below&&(q.plotY+=C.height);q.tooltipPos&&(this.chart.inverted?q.tooltipPos[0]=b.len-D:q.tooltipPos[1]=D);q.isInside=this.isPointInside(q)}}};c.prototype.processData=function(b){var c=this.options,e=this.yData,d=c.data,g=e.length,k=c.threshold||0,l,n,p,q,t;for(t=n=l=p=q=0;t<g;t++){var z=e[t];var w=d&&d[t]?d[t]:{};"sum"===z||w.isSum?e[t]=m(n):"intermediateSum"===z||w.isIntermediateSum?(e[t]=m(l),l=0):(n+=z,l+=z);p=Math.min(n,p);q=Math.max(n,q)}a.prototype.processData.call(this,b);c.stacking||(this.dataMin=
+p+k,this.dataMax=q)};c.prototype.toYData=function(a){return a.isSum?"sum":a.isIntermediateSum?"intermediateSum":a.y};c.prototype.updateParallelArrays=function(b,c){a.prototype.updateParallelArrays.call(this,b,c);if("sum"===this.yData[0]||"intermediateSum"===this.yData[0])this.yData[0]=null};c.prototype.pointAttribs=function(a,b){var c=this.options.upColor;c&&!a.options.color&&(a.color=0<a.y?c:null);a=x.prototype.pointAttribs.call(this,a,b);delete a.dashstyle;return a};c.prototype.getGraphPath=function(){return[["M",
+0,0]]};c.prototype.getCrispPath=function(){var a=this.data,b=this.yAxis,c=a.length,e=Math.round(this.graph.strokeWidth())%2/2,d=Math.round(this.borderWidth)%2/2,g=this.xAxis.reversed,k=this.yAxis.reversed,l=this.options.stacking,m=[],n;for(n=1;n<c;n++){var p=a[n].shapeArgs;var q=a[n-1];var t=a[n-1].shapeArgs;var w=b.waterfall.stacks[this.stackKey];var x=0<q.y?-t.height:0;w&&t&&p&&(w=w[n-1],l?(w=w.connectorThreshold,x=Math.round(b.translate(w,0,1,0,1)+(k?x:0))-e):x=t.y+q.minPointLengthOffset+d-e,m.push(["M",
+(t.x||0)+(g?0:t.width||0),x],["L",(p.x||0)+(g?p.width||0:0),x]));t&&m.length&&(!l&&0>q.y&&!k||0<q.y&&k)&&((q=m[m.length-2])&&"number"===typeof q[2]&&(q[2]+=t.height||0),(q=m[m.length-1])&&"number"===typeof q[2]&&(q[2]+=t.height||0))}return m};c.prototype.drawGraph=function(){w.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})};c.prototype.setStackedPoints=function(){function a(a,b,c,f){if(J)for(c;c<J;c++)A.stackState[c]+=f;else A.stackState[0]=a,J=A.stackState.length;A.stackState.push(A.stackState[J-
+1]+b)}var b=this.options,c=this.yAxis.waterfall.stacks,e=b.threshold,d=e||0,g=d,k=this.stackKey,l=this.xData,m=l.length,n,p,q;this.yAxis.stacking.usePercentage=!1;var t=p=q=d;if(this.visible||!this.chart.options.chart.ignoreHiddenSeries){var w=c.changed;(n=c.alreadyChanged)&&0>n.indexOf(k)&&(w=!0);c[k]||(c[k]={});n=c[k];for(var x=0;x<m;x++){var y=l[x];if(!n[y]||w)n[y]={negTotal:0,posTotal:0,stackTotal:0,threshold:0,stateIndex:0,stackState:[],label:w&&n[y]?n[y].label:void 0};var A=n[y];var G=this.yData[x];
+0<=G?A.posTotal+=G:A.negTotal+=G;var F=b.data[x];y=A.absolutePos=A.posTotal;var H=A.absoluteNeg=A.negTotal;A.stackTotal=y+H;var J=A.stackState.length;F&&F.isIntermediateSum?(a(q,p,0,q),q=p,p=e,d^=g,g^=d,d^=g):F&&F.isSum?(a(e,t,J),d=e):(a(d,G,0,t),F&&(t+=G,p+=G));A.stateIndex++;A.threshold=d;d+=A.stackTotal}c.changed=!1;c.alreadyChanged||(c.alreadyChanged=[]);c.alreadyChanged.push(k)}};c.prototype.getExtremes=function(){var a=this.options.stacking;if(a){var c=this.yAxis;c=c.waterfall.stacks;var e=
+this.stackedYNeg=[];var d=this.stackedYPos=[];"overlap"===a?A(c[this.stackKey],function(a){e.push(g(a.stackState));d.push(b(a.stackState))}):A(c[this.stackKey],function(a){e.push(a.negTotal+a.threshold);d.push(a.posTotal+a.threshold)});return{dataMin:g(e),dataMax:b(d)}}return{dataMin:this.dataMin,dataMax:this.dataMax}};c.defaultOptions=q(x.defaultOptions,{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"Dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}});return c}(x);k(a.prototype,
+{getZonesGraphs:w.prototype.getZonesGraphs,pointValKey:"y",showLine:!0,pointClass:t});l.registerSeriesType("waterfall",a);c.compose(d,e);"";return a});A(d,"Extensions/Polar.js",[d["Core/Animation/AnimationUtilities.js"],d["Core/Chart/Chart.js"],d["Core/Globals.js"],d["Extensions/Pane.js"],d["Core/Pointer.js"],d["Core/Series/Series.js"],d["Core/Series/SeriesRegistry.js"],d["Core/Renderer/SVG/SVGRenderer.js"],d["Core/Utilities.js"]],function(d,e,l,a,c,t,p,k,x){var w=d.animObject;p=p.seriesTypes;var b=
+x.addEvent,g=x.defined,m=x.find,n=x.isNumber,q=x.pick,A=x.splat,J=x.uniqueKey;d=x.wrap;var I=t.prototype;c=c.prototype;I.searchPointByAngle=function(a){var b=this.chart,c=this.xAxis.pane.center;return this.searchKDTree({clientX:180+-180/Math.PI*Math.atan2(a.chartX-c[0]-b.plotLeft,a.chartY-c[1]-b.plotTop)})};I.getConnectors=function(a,b,c,e){var f=e?1:0;var d=0<=b&&b<=a.length-1?b:0>b?a.length-1+b:0;b=0>d-1?a.length-(1+f):d-1;f=d+1>a.length-1?f:d+1;var g=a[b];f=a[f];var h=g.plotX;g=g.plotY;var k=f.plotX;
+var l=f.plotY;f=a[d].plotX;d=a[d].plotY;h=(1.5*f+h)/2.5;g=(1.5*d+g)/2.5;k=(1.5*f+k)/2.5;var r=(1.5*d+l)/2.5;l=Math.sqrt(Math.pow(h-f,2)+Math.pow(g-d,2));var n=Math.sqrt(Math.pow(k-f,2)+Math.pow(r-d,2));h=Math.atan2(g-d,h-f);r=Math.PI/2+(h+Math.atan2(r-d,k-f))/2;Math.abs(h-r)>Math.PI/2&&(r-=Math.PI);h=f+Math.cos(r)*l;g=d+Math.sin(r)*l;k=f+Math.cos(Math.PI+r)*n;r=d+Math.sin(Math.PI+r)*n;f={rightContX:k,rightContY:r,leftContX:h,leftContY:g,plotX:f,plotY:d};c&&(f.prevPointCont=this.getConnectors(a,b,
+!1,e));return f};I.toXY=function(a){var b=this.chart,c=this.xAxis,f=this.yAxis,d=a.plotX,e=a.plotY,g=a.series,k=b.inverted,l=a.y,m=k?d:f.len-e;k&&g&&!g.isRadialBar&&(a.plotY=e="number"===typeof l?f.translate(l)||0:0);a.rectPlotX=d;a.rectPlotY=e;f.center&&(m+=f.center[3]/2);n(e)&&(f=k?f.postTranslate(e,m):c.postTranslate(d,m),a.plotX=a.polarPlotX=f.x-b.plotLeft,a.plotY=a.polarPlotY=f.y-b.plotTop);this.kdByAngle?(b=(d/Math.PI*180+c.pane.options.startAngle)%360,0>b&&(b+=360),a.clientX=b):a.clientX=a.plotX};
+p.spline&&(d(p.spline.prototype,"getPointSpline",function(a,b,c,d){this.chart.polar?d?(a=this.getConnectors(b,d,!0,this.connectEnds),b=a.prevPointCont&&a.prevPointCont.rightContX,c=a.prevPointCont&&a.prevPointCont.rightContY,a=["C",n(b)?b:a.plotX,n(c)?c:a.plotY,n(a.leftContX)?a.leftContX:a.plotX,n(a.leftContY)?a.leftContY:a.plotY,a.plotX,a.plotY]):a=["M",c.plotX,c.plotY]:a=a.call(this,b,c,d);return a}),p.areasplinerange&&(p.areasplinerange.prototype.getPointSpline=p.spline.prototype.getPointSpline));
+b(t,"afterTranslate",function(){var a=this.chart;if(a.polar&&this.xAxis){(this.kdByAngle=a.tooltip&&a.tooltip.shared)?this.searchPoint=this.searchPointByAngle:this.options.findNearestPointBy="xy";if(!this.preventPostTranslate)for(var c=this.points,d=c.length;d--;)this.toXY(c[d]),!a.hasParallelCoordinates&&!this.yAxis.reversed&&c[d].y<this.yAxis.min&&(c[d].isNull=!0);this.hasClipCircleSetter||(this.hasClipCircleSetter=!!this.eventsToUnbind.push(b(this,"afterRender",function(){if(a.polar){var b=this.yAxis.pane.center;
+this.clipCircle?this.clipCircle.animate({x:b[0],y:b[1],r:b[2]/2,innerR:b[3]/2}):this.clipCircle=a.renderer.clipCircle(b[0],b[1],b[2]/2,b[3]/2);this.group.clip(this.clipCircle);this.setClip=l.noop}})))}},{order:2});d(p.line.prototype,"getGraphPath",function(a,b){var c=this,d;if(this.chart.polar){b=b||this.points;for(d=0;d<b.length;d++)if(!b[d].isNull){var e=d;break}if(!1!==this.options.connectEnds&&"undefined"!==typeof e){this.connectEnds=!0;b.splice(b.length,0,b[e]);var f=!0}b.forEach(function(a){"undefined"===
+typeof a.polarPlotY&&c.toXY(a)})}d=a.apply(this,[].slice.call(arguments,1));f&&b.pop();return d});var y=function(a,b){var c=this,d=this.chart,e=this.options.animation,f=this.group,g=this.markerGroup,h=this.xAxis&&this.xAxis.center,k=d.plotLeft,n=d.plotTop,m,p,t,x;if(d.polar)if(c.isRadialBar)b||(c.startAngleRad=q(c.translatedThreshold,c.xAxis.startAngleRad),l.seriesTypes.pie.prototype.animate.call(c,b));else{if(d.renderer.isSVG)if(e=w(e),c.is("column")){if(!b){var y=h[3]/2;c.points.forEach(function(a){m=
+a.graphic;t=(p=a.shapeArgs)&&p.r;x=p&&p.innerR;m&&p&&(m.attr({r:y,innerR:y}),m.animate({r:t,innerR:x},c.options.animation))})}}else b?(a={translateX:h[0]+k,translateY:h[1]+n,scaleX:.001,scaleY:.001},f.attr(a),g&&g.attr(a)):(a={translateX:k,translateY:n,scaleX:1,scaleY:1},f.animate(a,e),g&&g.animate(a,e))}else a.call(this,b)};d(I,"animate",y);if(p.column){var z=p.arearange.prototype;p=p.column.prototype;p.polarArc=function(a,b,c,d){var e=this.xAxis.center,f=this.yAxis.len,g=e[3]/2;b=f-b+g;a=f-q(a,
+f)+g;this.yAxis.reversed&&(0>b&&(b=g),0>a&&(a=g));return{x:e[0],y:e[1],r:b,innerR:a,start:c,end:d}};d(p,"animate",y);d(p,"translate",function(a){var b=this.options,c=b.stacking,d=this.chart,e=this.xAxis,f=this.yAxis,k=f.reversed,l=f.center,m=e.startAngleRad,p=e.endAngleRad-m;this.preventPostTranslate=!0;a.call(this);if(e.isRadial){a=this.points;e=a.length;var q=f.translate(f.min);var t=f.translate(f.max);b=b.threshold||0;if(d.inverted&&n(b)){var w=f.translate(b);g(w)&&(0>w?w=0:w>p&&(w=p),this.translatedThreshold=
+w+m)}for(;e--;){b=a[e];var y=b.barX;var z=b.x;var A=b.y;b.shapeType="arc";if(d.inverted){b.plotY=f.translate(A);if(c&&f.stacking){if(A=f.stacking.stacks[(0>A?"-":"")+this.stackKey],this.visible&&A&&A[z]&&!b.isNull){var G=A[z].points[this.getStackIndicator(void 0,z,this.index).key];var F=f.translate(G[0]);G=f.translate(G[1]);g(F)&&(F=x.clamp(F,0,p))}}else F=w,G=b.plotY;F>G&&(G=[F,F=G][0]);if(!k)if(F<q)F=q;else if(G>t)G=t;else{if(G<q||F>t)F=G=0}else if(G>q)G=q;else if(F<t)F=t;else if(F>q||G<t)F=G=p;
+f.min>f.max&&(F=G=k?p:0);F+=m;G+=m;l&&(b.barX=y+=l[3]/2);z=Math.max(y,0);A=Math.max(y+b.pointWidth,0);b.shapeArgs={x:l&&l[0],y:l&&l[1],r:A,innerR:z,start:F,end:G};b.opacity=F===G?0:void 0;b.plotY=(g(this.translatedThreshold)&&(F<this.translatedThreshold?F:G))-m}else F=y+m,b.shapeArgs=this.polarArc(b.yBottom,b.plotY,F,F+b.pointWidth);this.toXY(b);d.inverted?(y=f.postTranslate(b.rectPlotY,y+b.pointWidth/2),b.tooltipPos=[y.x-d.plotLeft,y.y-d.plotTop]):b.tooltipPos=[b.plotX,b.plotY];l&&(b.ttBelow=b.plotY>
+l[1])}}});p.findAlignments=function(a,b){null===b.align&&(b.align=20<a&&160>a?"left":200<a&&340>a?"right":"center");null===b.verticalAlign&&(b.verticalAlign=45>a||315<a?"bottom":135<a&&225>a?"top":"middle");return b};z&&(z.findAlignments=p.findAlignments);d(p,"alignDataLabel",function(a,b,c,d,e,g){var f=this.chart,h=q(d.inside,!!this.options.stacking);f.polar?(a=b.rectPlotX/Math.PI*180,f.inverted?(this.forceDL=f.isInsidePlot(b.plotX,Math.round(b.plotY)),h&&b.shapeArgs?(e=b.shapeArgs,e=this.yAxis.postTranslate(((e.start||
+0)+(e.end||0))/2-this.xAxis.startAngleRad,b.barX+b.pointWidth/2),e={x:e.x-f.plotLeft,y:e.y-f.plotTop}):b.tooltipPos&&(e={x:b.tooltipPos[0],y:b.tooltipPos[1]}),d.align=q(d.align,"center"),d.verticalAlign=q(d.verticalAlign,"middle")):this.findAlignments&&(d=this.findAlignments(a,d)),I.alignDataLabel.call(this,b,c,d,e,g),this.isRadialBar&&b.shapeArgs&&b.shapeArgs.start===b.shapeArgs.end&&c.hide(!0)):a.call(this,b,c,d,e,g)})}d(c,"getCoordinates",function(a,b){var c=this.chart,d={xAxis:[],yAxis:[]};c.polar?
+c.axes.forEach(function(a){var e=a.isXAxis,f=a.center;if("colorAxis"!==a.coll){var g=b.chartX-f[0]-c.plotLeft;f=b.chartY-f[1]-c.plotTop;d[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(g,f):Math.sqrt(Math.pow(g,2)+Math.pow(f,2)),!0)})}}):d=a.call(this,b);return d});k.prototype.clipCircle=function(a,b,c,d){var e=J(),f=this.createElement("clipPath").attr({id:e}).add(this.defs);a=d?this.arc(a,b,c,d,0,2*Math.PI).add(f):this.circle(a,b,c).add(f);a.id=e;a.clipPath=f;return a};b(e,
+"getAxes",function(){this.pane||(this.pane=[]);this.options.pane=A(this.options.pane);this.options.pane.forEach(function(b){new a(b,this)},this)});b(e,"afterDrawChartBox",function(){this.pane.forEach(function(a){a.render()})});b(t,"afterInit",function(){var a=this.chart;a.inverted&&a.polar&&(this.isRadialSeries=!0,this.is("column")&&(this.isRadialBar=!0))});d(e.prototype,"get",function(a,b){return m(this.pane||[],function(a){return a.options.id===b})||a.call(this,b)})});A(d,"masters/highcharts-more.src.js",
+[d["Core/Globals.js"],d["Core/Axis/RadialAxis.js"],d["Series/Bubble/BubbleSeries.js"]],function(d,e,l){e.compose(d.Axis,d.Tick);l.compose(d.Chart,d.Legend,d.Series)})});
+//# sourceMappingURL=highcharts-more.js.map
\ No newline at end of file
diff --git a/aa_chart_core/src/main/assets/AAHighcharts.js b/aa_chart_core/src/main/assets/AAHighcharts.js
new file mode 100644
index 0000000..35d669c
--- /dev/null
+++ b/aa_chart_core/src/main/assets/AAHighcharts.js
@@ -0,0 +1,598 @@
+/*
+ Highcharts JS v10.0.0 (2022-03-07)
+
+ (c) 2009-2021 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(Y,M){"object"===typeof module&&module.exports?(M["default"]=M,module.exports=Y.document?M(Y):M):"function"===typeof define&&define.amd?define("highcharts/highcharts",function(){return M(Y)}):(Y.Highcharts&&Y.Highcharts.error(16,!0),Y.Highcharts=M(Y))})("undefined"!==typeof window?window:this,function(Y){function M(a,F,f,G){a.hasOwnProperty(F)||(a[F]=G.apply(null,f),"function"===typeof CustomEvent&&Y.dispatchEvent(new CustomEvent("HighchartsModuleLoaded",{detail:{path:F,module:a[F]}})))}
+var f={};M(f,"Core/Globals.js",[],function(){var a;(function(a){a.SVG_NS="http://www.w3.org/2000/svg";a.product="Highcharts";a.version="10.0.0";a.win="undefined"!==typeof Y?Y:{};a.doc=a.win.document;a.svg=a.doc&&a.doc.createElementNS&&!!a.doc.createElementNS(a.SVG_NS,"svg").createSVGRect;a.userAgent=a.win.navigator&&a.win.navigator.userAgent||"";a.isChrome=-1!==a.userAgent.indexOf("Chrome");a.isFirefox=-1!==a.userAgent.indexOf("Firefox");a.isMS=/(edge|msie|trident)/i.test(a.userAgent)&&!a.win.opera;
+a.isSafari=!a.isChrome&&-1!==a.userAgent.indexOf("Safari");a.isTouchDevice=/(Mobile|Android|Windows Phone)/.test(a.userAgent);a.isWebKit=-1!==a.userAgent.indexOf("AppleWebKit");a.deg2rad=2*Math.PI/360;a.hasBidiBug=a.isFirefox&&4>parseInt(a.userAgent.split("Firefox/")[1],10);a.hasTouch=!!a.win.TouchEvent;a.marginNames=["plotTop","marginRight","marginBottom","plotLeft"];a.noop=function(){};a.supportsPassiveEvents=function(){var f=!1;if(!a.isMS){var F=Object.defineProperty({},"passive",{get:function(){f=
+!0}});a.win.addEventListener&&a.win.removeEventListener&&(a.win.addEventListener("testPassive",a.noop,F),a.win.removeEventListener("testPassive",a.noop,F))}return f}();a.charts=[];a.dateFormats={};a.seriesTypes={};a.symbolSizes={};a.chartCount=0})(a||(a={}));"";return a});M(f,"Core/Utilities.js",[f["Core/Globals.js"]],function(a){function f(r,b,c,g){var x=b?"Highcharts error":"Highcharts warning";32===r&&(r=x+": Deprecated member");var D=p(r),q=D?x+" #"+r+": www.highcharts.com/errors/"+r+"/":r.toString();
+if("undefined"!==typeof g){var d="";D&&(q+="?");v(g,function(b,r){d+="\n - "+r+": "+b;D&&(q+=encodeURI(r)+"="+encodeURI(b))});q+=d}y(a,"displayError",{chart:c,code:r,message:q,params:g},function(){if(b)throw Error(q);k.console&&-1===f.messages.indexOf(q)&&console.warn(q)});f.messages.push(q)}function C(b,c){var r={};v(b,function(x,g){if(I(b[g],!0)&&!b.nodeType&&c[g])x=C(b[g],c[g]),Object.keys(x).length&&(r[g]=x);else if(I(b[g])||b[g]!==c[g]||g in b&&!(g in c))r[g]=b[g]});return r}function G(b,c){return parseInt(b,
+c||10)}function u(b){return"string"===typeof b}function H(b){b=Object.prototype.toString.call(b);return"[object Array]"===b||"[object Array Iterator]"===b}function I(b,c){return!!b&&"object"===typeof b&&(!c||!H(b))}function B(b){return I(b)&&"number"===typeof b.nodeType}function z(b){var c=b&&b.constructor;return!(!I(b,!0)||B(b)||!c||!c.name||"Object"===c.name)}function p(b){return"number"===typeof b&&!isNaN(b)&&Infinity>b&&-Infinity<b}function m(b){return"undefined"!==typeof b&&null!==b}function e(b,
+c,g){var r=u(c)&&!m(g),x,D=function(c,g){m(c)?b.setAttribute(g,c):r?(x=b.getAttribute(g))||"class"!==g||(x=b.getAttribute(g+"Name")):b.removeAttribute(g)};u(c)?D(g,c):v(c,D);return x}function d(b,c){var r;b||(b={});for(r in c)b[r]=c[r];return b}function l(){for(var b=arguments,c=b.length,g=0;g<c;g++){var k=b[g];if("undefined"!==typeof k&&null!==k)return k}}function h(b,c){a.isMS&&!a.svg&&c&&m(c.opacity)&&(c.filter="alpha(opacity="+100*c.opacity+")");d(b.style,c)}function t(b,c){return 1E14<b?b:parseFloat(b.toPrecision(c||
+14))}function n(b,c,g){var r=a.getStyle||n;if("width"===c)return c=Math.min(b.offsetWidth,b.scrollWidth),g=b.getBoundingClientRect&&b.getBoundingClientRect().width,g<c&&g>=c-1&&(c=Math.floor(g)),Math.max(0,c-(r(b,"padding-left",!0)||0)-(r(b,"padding-right",!0)||0));if("height"===c)return Math.max(0,Math.min(b.offsetHeight,b.scrollHeight)-(r(b,"padding-top",!0)||0)-(r(b,"padding-bottom",!0)||0));k.getComputedStyle||f(27,!0);if(b=k.getComputedStyle(b,void 0)){var x=b.getPropertyValue(c);l(g,"opacity"!==
+c)&&(x=G(x))}return x}function v(b,c,g){for(var r in b)Object.hasOwnProperty.call(b,r)&&c.call(g||b[r],b[r],r,b)}function w(b,c,g){function r(c,r){var L=b.removeEventListener||a.removeEventListenerPolyfill;L&&L.call(b,c,r,!1)}function x(g){var x;if(b.nodeName){if(c){var L={};L[c]=!0}else L=g;v(L,function(b,c){if(g[c])for(x=g[c].length;x--;)r(c,g[c][x].fn)})}}var k="function"===typeof b&&b.prototype||b;if(Object.hasOwnProperty.call(k,"hcEvents")){var D=k.hcEvents;c?(k=D[c]||[],g?(D[c]=k.filter(function(b){return g!==
+b.fn}),r(c,g)):(x(D),D[c]=[])):(x(D),delete k.hcEvents)}}function y(b,c,g,k){g=g||{};if(q.createEvent&&(b.dispatchEvent||b.fireEvent&&b!==a)){var r=q.createEvent("Events");r.initEvent(c,!0,!0);g=d(r,g);b.dispatchEvent?b.dispatchEvent(g):b.fireEvent(c,g)}else if(b.hcEvents){g.target||d(g,{preventDefault:function(){g.defaultPrevented=!0},target:b,type:c});r=[];for(var x=b,D=!1;x.hcEvents;)Object.hasOwnProperty.call(x,"hcEvents")&&x.hcEvents[c]&&(r.length&&(D=!0),r.unshift.apply(r,x.hcEvents[c])),x=
+Object.getPrototypeOf(x);D&&r.sort(function(b,c){return b.order-c.order});r.forEach(function(c){!1===c.fn.call(b,g)&&g.preventDefault()})}k&&!g.defaultPrevented&&k.call(b,g)}var A=a.charts,q=a.doc,k=a.win;(f||(f={})).messages=[];Math.easeInOutSine=function(b){return-.5*(Math.cos(Math.PI*b)-1)};var c=Array.prototype.find?function(b,c){return b.find(c)}:function(b,c){var r,g=b.length;for(r=0;r<g;r++)if(c(b[r],r))return b[r]};v({map:"map",each:"forEach",grep:"filter",reduce:"reduce",some:"some"},function(b,
+c){a[c]=function(r){var g;f(32,!1,void 0,(g={},g["Highcharts."+c]="use Array."+b,g));return Array.prototype[b].apply(r,[].slice.call(arguments,1))}});var g,b=function(){var b=Math.random().toString(36).substring(2,9)+"-",c=0;return function(){return"highcharts-"+(g?"":b)+c++}}();k.jQuery&&(k.jQuery.fn.highcharts=function(){var b=[].slice.call(arguments);if(this[0])return b[0]?(new (a[u(b[0])?b.shift():"Chart"])(this[0],b[0],b[1]),this):A[e(this[0],"data-highcharts-chart")]});c={addEvent:function(b,
+c,g,k){void 0===k&&(k={});var r="function"===typeof b&&b.prototype||b;Object.hasOwnProperty.call(r,"hcEvents")||(r.hcEvents={});r=r.hcEvents;a.Point&&b instanceof a.Point&&b.series&&b.series.chart&&(b.series.chart.runTrackerClick=!0);var x=b.addEventListener||a.addEventListenerPolyfill;x&&x.call(b,c,g,a.supportsPassiveEvents?{passive:void 0===k.passive?-1!==c.indexOf("touch"):k.passive,capture:!1}:!1);r[c]||(r[c]=[]);r[c].push({fn:g,order:"number"===typeof k.order?k.order:Infinity});r[c].sort(function(b,
+c){return b.order-c.order});return function(){w(b,c,g)}},arrayMax:function(b){for(var c=b.length,g=b[0];c--;)b[c]>g&&(g=b[c]);return g},arrayMin:function(b){for(var c=b.length,g=b[0];c--;)b[c]<g&&(g=b[c]);return g},attr:e,clamp:function(b,c,g){return b>c?b<g?b:g:c},cleanRecursively:C,clearTimeout:function(b){m(b)&&clearTimeout(b)},correctFloat:t,createElement:function(b,c,g,k,n){b=q.createElement(b);c&&d(b,c);n&&h(b,{padding:"0",border:"none",margin:"0"});g&&h(b,g);k&&k.appendChild(b);return b},css:h,
+defined:m,destroyObjectProperties:function(b,c){v(b,function(g,r){g&&g!==c&&g.destroy&&g.destroy();delete b[r]})},discardElement:function(b){b&&b.parentElement&&b.parentElement.removeChild(b)},erase:function(b,c){for(var g=b.length;g--;)if(b[g]===c){b.splice(g,1);break}},error:f,extend:d,extendClass:function(b,c){var g=function(){};g.prototype=new b;d(g.prototype,c);return g},find:c,fireEvent:y,getMagnitude:function(b){return Math.pow(10,Math.floor(Math.log(b)/Math.LN10))},getNestedProperty:function(b,
+c){for(b=b.split(".");b.length&&m(c);){var g=b.shift();if("undefined"===typeof g||"__proto__"===g)return;c=c[g];if(!m(c)||"function"===typeof c||"number"===typeof c.nodeType||c===k)return}return c},getStyle:n,inArray:function(b,c,g){f(32,!1,void 0,{"Highcharts.inArray":"use Array.indexOf"});return c.indexOf(b,g)},isArray:H,isClass:z,isDOMElement:B,isFunction:function(b){return"function"===typeof b},isNumber:p,isObject:I,isString:u,keys:function(b){f(32,!1,void 0,{"Highcharts.keys":"use Object.keys"});
+return Object.keys(b)},merge:function(){var b,c=arguments,g={},k=function(b,c){"object"!==typeof b&&(b={});v(c,function(g,r){"__proto__"!==r&&"constructor"!==r&&(!I(g,!0)||z(g)||B(g)?b[r]=c[r]:b[r]=k(b[r]||{},g))});return b};!0===c[0]&&(g=c[1],c=Array.prototype.slice.call(c,2));var q=c.length;for(b=0;b<q;b++)g=k(g,c[b]);return g},normalizeTickInterval:function(b,c,g,k,q){var r=b;g=l(g,1);var d=b/g;c||(c=q?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===k&&(1===g?c=c.filter(function(b){return 0===
+b%1}):.1>=g&&(c=[1/g])));for(k=0;k<c.length&&!(r=c[k],q&&r*g>=b||!q&&d<=(c[k]+(c[k+1]||c[k]))/2);k++);return r=t(r*g,-Math.round(Math.log(.001)/Math.LN10))},objectEach:v,offset:function(b){var c=q.documentElement;b=b.parentElement||b.parentNode?b.getBoundingClientRect():{top:0,left:0,width:0,height:0};return{top:b.top+(k.pageYOffset||c.scrollTop)-(c.clientTop||0),left:b.left+(k.pageXOffset||c.scrollLeft)-(c.clientLeft||0),width:b.width,height:b.height}},pad:function(b,c,g){return Array((c||2)+1-String(b).replace("-",
+"").length).join(g||"0")+b},pick:l,pInt:G,relativeLength:function(b,c,g){return/%$/.test(b)?c*parseFloat(b)/100+(g||0):parseFloat(b)},removeEvent:w,splat:function(b){return H(b)?b:[b]},stableSort:function(b,c){var g=b.length,k,r;for(r=0;r<g;r++)b[r].safeI=r;b.sort(function(b,g){k=c(b,g);return 0===k?b.safeI-g.safeI:k});for(r=0;r<g;r++)delete b[r].safeI},syncTimeout:function(b,c,g){if(0<c)return setTimeout(b,c,g);b.call(0,g);return-1},timeUnits:{millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,
+week:6048E5,month:24192E5,year:314496E5},uniqueKey:b,useSerialIds:function(b){return g=l(b,g)},wrap:function(b,c,g){var k=b[c];b[c]=function(){var b=Array.prototype.slice.call(arguments),c=arguments,r=this;r.proceed=function(){k.apply(r,arguments.length?arguments:c)};b.unshift(k);b=g.apply(this,b);r.proceed=null;return b}}};"";return c});M(f,"Core/Chart/ChartDefaults.js",[],function(){return{alignThresholds:!1,panning:{enabled:!1,type:"x"},styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:"line",
+ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:"right",x:-10,y:10}},zoomBySingleTouch:!1,width:null,height:null,borderColor:"#335cad",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"}});M(f,"Core/Color/Color.js",[f["Core/Globals.js"],f["Core/Utilities.js"]],function(a,f){var F=f.isNumber,G=f.merge,u=f.pInt;f=function(){function f(F){this.rgba=[NaN,NaN,NaN,NaN];this.input=F;var B=a.Color;if(B&&B!==f)return new B(F);if(!(this instanceof f))return new f(F);
+this.init(F)}f.parse=function(a){return a?new f(a):f.None};f.prototype.init=function(a){var B;if("object"===typeof a&&"undefined"!==typeof a.stops)this.stops=a.stops.map(function(e){return new f(e[1])});else if("string"===typeof a){this.input=a=f.names[a.toLowerCase()]||a;if("#"===a.charAt(0)){var z=a.length;var p=parseInt(a.substr(1),16);7===z?B=[(p&16711680)>>16,(p&65280)>>8,p&255,1]:4===z&&(B=[(p&3840)>>4|(p&3840)>>8,(p&240)>>4|p&240,(p&15)<<4|p&15,1])}if(!B)for(p=f.parsers.length;p--&&!B;){var m=
+f.parsers[p];(z=m.regex.exec(a))&&(B=m.parse(z))}}B&&(this.rgba=B)};f.prototype.get=function(a){var B=this.input,z=this.rgba;if("object"===typeof B&&"undefined"!==typeof this.stops){var p=G(B);p.stops=[].slice.call(p.stops);this.stops.forEach(function(m,e){p.stops[e]=[p.stops[e][0],m.get(a)]});return p}return z&&F(z[0])?"rgb"===a||!a&&1===z[3]?"rgb("+z[0]+","+z[1]+","+z[2]+")":"a"===a?""+z[3]:"rgba("+z.join(",")+")":B};f.prototype.brighten=function(a){var B=this.rgba;if(this.stops)this.stops.forEach(function(p){p.brighten(a)});
+else if(F(a)&&0!==a)for(var z=0;3>z;z++)B[z]+=u(255*a),0>B[z]&&(B[z]=0),255<B[z]&&(B[z]=255);return this};f.prototype.setOpacity=function(a){this.rgba[3]=a;return this};f.prototype.tweenTo=function(a,B){var z=this.rgba,p=a.rgba;if(!F(z[0])||!F(p[0]))return a.input||"none";a=1!==p[3]||1!==z[3];return(a?"rgba(":"rgb(")+Math.round(p[0]+(z[0]-p[0])*(1-B))+","+Math.round(p[1]+(z[1]-p[1])*(1-B))+","+Math.round(p[2]+(z[2]-p[2])*(1-B))+(a?","+(p[3]+(z[3]-p[3])*(1-B)):"")+")"};f.names={white:"#ffffff",black:"#000000"};
+f.parsers=[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[u(a[1]),u(a[2]),u(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[u(a[1]),u(a[2]),u(a[3]),1]}}];f.None=new f("");return f}();"";return f});M(f,"Core/Color/Palettes.js",[],function(){return{colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" ")}});
+M(f,"Core/Time.js",[f["Core/Globals.js"],f["Core/Utilities.js"]],function(a,f){var F=a.win,G=f.defined,u=f.error,H=f.extend,I=f.isObject,B=f.merge,z=f.objectEach,p=f.pad,m=f.pick,e=f.splat,d=f.timeUnits,l=a.isSafari&&F.Intl&&F.Intl.DateTimeFormat.prototype.formatRange,h=a.isSafari&&F.Intl&&!F.Intl.DateTimeFormat.prototype.formatRange;f=function(){function t(d){this.options={};this.variableTimezone=this.useUTC=!1;this.Date=F.Date;this.getTimezoneOffset=this.timezoneOffsetFunction();this.update(d)}
+t.prototype.get=function(d,e){if(this.variableTimezone||this.timezoneOffset){var n=e.getTime(),l=n-this.getTimezoneOffset(e);e.setTime(l);d=e["getUTC"+d]();e.setTime(n);return d}return this.useUTC?e["getUTC"+d]():e["get"+d]()};t.prototype.set=function(d,e,h){if(this.variableTimezone||this.timezoneOffset){if("Milliseconds"===d||"Seconds"===d||"Minutes"===d&&0===this.getTimezoneOffset(e)%36E5)return e["setUTC"+d](h);var n=this.getTimezoneOffset(e);n=e.getTime()-n;e.setTime(n);e["setUTC"+d](h);d=this.getTimezoneOffset(e);
+n=e.getTime()+d;return e.setTime(n)}return this.useUTC||l&&"FullYear"===d?e["setUTC"+d](h):e["set"+d](h)};t.prototype.update=function(d){var e=m(d&&d.useUTC,!0);this.options=d=B(!0,this.options||{},d);this.Date=d.Date||F.Date||Date;this.timezoneOffset=(this.useUTC=e)&&d.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();this.variableTimezone=e&&!(!d.getTimezoneOffset&&!d.timezone)};t.prototype.makeTime=function(d,e,l,t,A,q){if(this.useUTC){var k=this.Date.UTC.apply(0,arguments);var c=
+this.getTimezoneOffset(k);k+=c;var g=this.getTimezoneOffset(k);c!==g?k+=g-c:c-36E5!==this.getTimezoneOffset(k-36E5)||h||(k-=36E5)}else k=(new this.Date(d,e,m(l,1),m(t,0),m(A,0),m(q,0))).getTime();return k};t.prototype.timezoneOffsetFunction=function(){var d=this,e=this.options,l=e.getTimezoneOffset,h=e.moment||F.moment;if(!this.useUTC)return function(d){return 6E4*(new Date(d.toString())).getTimezoneOffset()};if(e.timezone){if(h)return function(d){return 6E4*-h.tz(d,e.timezone).utcOffset()};u(25)}return this.useUTC&&
+l?function(d){return 6E4*l(d.valueOf())}:function(){return 6E4*(d.timezoneOffset||0)}};t.prototype.dateFormat=function(d,e,l){if(!G(e)||isNaN(e))return a.defaultOptions.lang&&a.defaultOptions.lang.invalidDate||"";d=m(d,"%Y-%m-%d %H:%M:%S");var h=this,n=new this.Date(e),q=this.get("Hours",n),k=this.get("Day",n),c=this.get("Date",n),g=this.get("Month",n),b=this.get("FullYear",n),r=a.defaultOptions.lang,x=r&&r.weekdays,D=r&&r.shortWeekdays;n=H({a:D?D[k]:x[k].substr(0,3),A:x[k],d:p(c),e:p(c,2," "),w:k,
+b:r.shortMonths[g],B:r.months[g],m:p(g+1),o:g+1,y:b.toString().substr(2,2),Y:b,H:p(q),k:q,I:p(q%12||12),l:q%12||12,M:p(this.get("Minutes",n)),p:12>q?"AM":"PM",P:12>q?"am":"pm",S:p(n.getSeconds()),L:p(Math.floor(e%1E3),3)},a.dateFormats);z(n,function(b,c){for(;-1!==d.indexOf("%"+c);)d=d.replace("%"+c,"function"===typeof b?b.call(h,e):b)});return l?d.substr(0,1).toUpperCase()+d.substr(1):d};t.prototype.resolveDTLFormat=function(d){return I(d,!0)?d:(d=e(d),{main:d[0],from:d[1],to:d[2]})};t.prototype.getTimeTicks=
+function(e,l,h,t){var n=this,q=[],k={},c=new n.Date(l),g=e.unitRange,b=e.count||1,r;t=m(t,1);if(G(l)){n.set("Milliseconds",c,g>=d.second?0:b*Math.floor(n.get("Milliseconds",c)/b));g>=d.second&&n.set("Seconds",c,g>=d.minute?0:b*Math.floor(n.get("Seconds",c)/b));g>=d.minute&&n.set("Minutes",c,g>=d.hour?0:b*Math.floor(n.get("Minutes",c)/b));g>=d.hour&&n.set("Hours",c,g>=d.day?0:b*Math.floor(n.get("Hours",c)/b));g>=d.day&&n.set("Date",c,g>=d.month?1:Math.max(1,b*Math.floor(n.get("Date",c)/b)));if(g>=
+d.month){n.set("Month",c,g>=d.year?0:b*Math.floor(n.get("Month",c)/b));var x=n.get("FullYear",c)}g>=d.year&&n.set("FullYear",c,x-x%b);g===d.week&&(x=n.get("Day",c),n.set("Date",c,n.get("Date",c)-x+t+(x<t?-7:0)));x=n.get("FullYear",c);t=n.get("Month",c);var D=n.get("Date",c),y=n.get("Hours",c);l=c.getTime();!n.variableTimezone&&n.useUTC||!G(h)||(r=h-l>4*d.month||n.getTimezoneOffset(l)!==n.getTimezoneOffset(h));l=c.getTime();for(c=1;l<h;)q.push(l),l=g===d.year?n.makeTime(x+c*b,0):g===d.month?n.makeTime(x,
+t+c*b):!r||g!==d.day&&g!==d.week?r&&g===d.hour&&1<b?n.makeTime(x,t,D,y+c*b):l+g*b:n.makeTime(x,t,D+c*b*(g===d.day?1:7)),c++;q.push(l);g<=d.hour&&1E4>q.length&&q.forEach(function(b){0===b%18E5&&"000000000"===n.dateFormat("%H%M%S%L",b)&&(k[b]="day")})}q.info=H(e,{higherRanks:k,totalRange:g*b});return q};t.prototype.getDateFormat=function(e,l,h,t){var n=this.dateFormat("%m-%d %H:%M:%S.%L",l),q={millisecond:15,second:12,minute:9,hour:6,day:3},k="millisecond";for(c in d){if(e===d.week&&+this.dateFormat("%w",
+l)===h&&"00:00:00.000"===n.substr(6)){var c="week";break}if(d[c]>e){c=k;break}if(q[c]&&n.substr(q[c])!=="01-01 00:00:00.000".substr(q[c]))break;"week"!==c&&(k=c)}if(c)var g=this.resolveDTLFormat(t[c]).main;return g};return t}();"";return f});M(f,"Core/DefaultOptions.js",[f["Core/Chart/ChartDefaults.js"],f["Core/Color/Color.js"],f["Core/Globals.js"],f["Core/Color/Palettes.js"],f["Core/Time.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H){f=f.parse;var F=H.merge,B={colors:G.colors,symbols:["circle",
+"diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{},time:{Date:void 0,getTimezoneOffset:void 0,
+timezone:void 0,timezoneOffset:0,useUTC:!0},chart:a,title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},caption:{margin:15,text:"",align:"left",verticalAlign:"bottom"},plotOptions:{},labels:{style:{position:"absolute",color:"#333333"}},legend:{enabled:!0,align:"center",alignColumns:!0,className:"highcharts-no-tooltip",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{activeColor:"#003399",
+inactiveColor:"#cccccc"},itemStyle:{color:"#333333",cursor:"pointer",fontSize:"12px",fontWeight:"bold",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#cccccc"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,
+textAlign:"center"}},tooltip:{enabled:!0,animation:C.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",headerShape:"callout",hideDelay:500,padding:8,shape:"callout",shared:!1,snap:C.isTouchDevice?25:10,headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>',
+backgroundColor:f("#f7f7f7").setOpacity(.85).get(),borderWidth:1,shadow:!0,stickOnContact:!1,style:{color:"#333333",cursor:"default",fontSize:"12px",whiteSpace:"nowrap"},useHTML:!1},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"9px"},text:"Highcharts.com"}};B.chart.styledMode=!1;"";var z=new u(F(B.global,B.time));a={defaultOptions:B,defaultTime:z,getOptions:function(){return B},
+setOptions:function(p){F(!0,B,p);if(p.time||p.global)C.time?C.time.update(F(B.global,B.time,p.global,p.time)):C.time=z;return B}};"";return a});M(f,"Core/Animation/Fx.js",[f["Core/Color/Color.js"],f["Core/Globals.js"],f["Core/Utilities.js"]],function(a,f,C){var F=a.parse,u=f.win,H=C.isNumber,I=C.objectEach;return function(){function a(a,p,m){this.pos=NaN;this.options=p;this.elem=a;this.prop=m}a.prototype.dSetter=function(){var a=this.paths,p=a&&a[0];a=a&&a[1];var m=this.now||0,e=[];if(1!==m&&p&&a)if(p.length===
+a.length&&1>m)for(var d=0;d<a.length;d++){for(var l=p[d],h=a[d],t=[],n=0;n<h.length;n++){var v=l[n],w=h[n];H(v)&&H(w)&&("A"!==h[0]||4!==n&&5!==n)?t[n]=v+m*(w-v):t[n]=w}e.push(t)}else e=a;else e=this.toD||[];this.elem.attr("d",e,void 0,!0)};a.prototype.update=function(){var a=this.elem,p=this.prop,m=this.now,e=this.options.step;if(this[p+"Setter"])this[p+"Setter"]();else a.attr?a.element&&a.attr(p,m,null,!0):a.style[p]=m+this.unit;e&&e.call(a,m,this)};a.prototype.run=function(z,p,m){var e=this,d=e.options,
+l=function(d){return l.stopped?!1:e.step(d)},h=u.requestAnimationFrame||function(d){setTimeout(d,13)},t=function(){for(var d=0;d<a.timers.length;d++)a.timers[d]()||a.timers.splice(d--,1);a.timers.length&&h(t)};z!==p||this.elem["forceAnimate:"+this.prop]?(this.startTime=+new Date,this.start=z,this.end=p,this.unit=m,this.now=this.start,this.pos=0,l.elem=this.elem,l.prop=this.prop,l()&&1===a.timers.push(l)&&h(t)):(delete d.curAnim[this.prop],d.complete&&0===Object.keys(d.curAnim).length&&d.complete.call(this.elem))};
+a.prototype.step=function(a){var p=+new Date,m=this.options,e=this.elem,d=m.complete,l=m.duration,h=m.curAnim;if(e.attr&&!e.element)a=!1;else if(a||p>=l+this.startTime){this.now=this.end;this.pos=1;this.update();var t=h[this.prop]=!0;I(h,function(d){!0!==d&&(t=!1)});t&&d&&d.call(e);a=!1}else this.pos=m.easing((p-this.startTime)/l),this.now=this.start+(this.end-this.start)*this.pos,this.update(),a=!0;return a};a.prototype.initPath=function(a,p,m){function e(d,q){for(;d.length<y;){var k=d[0],c=q[y-
+d.length];c&&"M"===k[0]&&(d[0]="C"===c[0]?["C",k[1],k[2],k[1],k[2],k[1],k[2]]:["L",k[1],k[2]]);d.unshift(k);t&&(k=d.pop(),d.push(d[d.length-1],k))}}function d(d,q){for(;d.length<y;)if(q=d[Math.floor(d.length/n)-1].slice(),"C"===q[0]&&(q[1]=q[5],q[2]=q[6]),t){var k=d[Math.floor(d.length/n)].slice();d.splice(d.length/2,0,q,k)}else d.push(q)}var l=a.startX,h=a.endX;m=m.slice();var t=a.isArea,n=t?2:1;p=p&&p.slice();if(!p)return[m,m];if(l&&h&&h.length){for(a=0;a<l.length;a++)if(l[a]===h[0]){var v=a;break}else if(l[0]===
+h[h.length-l.length+a]){v=a;var w=!0;break}else if(l[l.length-1]===h[h.length-l.length+a]){v=l.length-a;break}"undefined"===typeof v&&(p=[])}if(p.length&&H(v)){var y=m.length+v*n;w?(e(p,m),d(m,p)):(e(m,p),d(p,m))}return[p,m]};a.prototype.fillSetter=function(){a.prototype.strokeSetter.apply(this,arguments)};a.prototype.strokeSetter=function(){this.elem.attr(this.prop,F(this.start).tweenTo(F(this.end),this.pos),void 0,!0)};a.timers=[];return a}()});M(f,"Core/Animation/AnimationUtilities.js",[f["Core/Animation/Fx.js"],
+f["Core/Utilities.js"]],function(a,f){function F(d){return z(d)?p({duration:500,defer:0},d):{duration:d?500:0,defer:0}}function G(d,e){for(var l=a.timers.length;l--;)a.timers[l].elem!==d||e&&e!==a.timers[l].prop||(a.timers[l].stopped=!0)}var u=f.defined,H=f.getStyle,I=f.isArray,B=f.isNumber,z=f.isObject,p=f.merge,m=f.objectEach,e=f.pick;return{animate:function(d,e,h){var l,n="",v,w;if(!z(h)){var y=arguments;h={duration:y[2],easing:y[3],complete:y[4]}}B(h.duration)||(h.duration=400);h.easing="function"===
+typeof h.easing?h.easing:Math[h.easing]||Math.easeInOutSine;h.curAnim=p(e);m(e,function(t,q){G(d,q);w=new a(d,h,q);v=void 0;"d"===q&&I(e.d)?(w.paths=w.initPath(d,d.pathArray,e.d),w.toD=e.d,l=0,v=1):d.attr?l=d.attr(q):(l=parseFloat(H(d,q))||0,"opacity"!==q&&(n="px"));v||(v=t);"string"===typeof v&&v.match("px")&&(v=v.replace(/px/g,""));w.run(l,v,n)})},animObject:F,getDeferredAnimation:function(d,e,h){var l=F(e),n=0,a=0;(h?[h]:d.series).forEach(function(d){d=F(d.options.animation);n=e&&u(e.defer)?l.defer:
+Math.max(n,d.duration+d.defer);a=Math.min(l.duration,d.duration)});d.renderer.forExport&&(n=0);return{defer:Math.max(0,n-a),duration:Math.min(n,a)}},setAnimation:function(d,l){l.renderer.globalAnimation=e(d,l.options.chart.animation,!0)},stop:G}});M(f,"Core/Renderer/HTML/AST.js",[f["Core/Globals.js"],f["Core/Utilities.js"]],function(a,f){var F=a.SVG_NS,G=f.attr,u=f.createElement,H=f.css,I=f.error,B=f.isFunction,z=f.isString,p=f.objectEach,m=f.splat,e=(f=a.win.trustedTypes)&&B(f.createPolicy)&&f.createPolicy("highcharts",
+{createHTML:function(d){return d}}),d=e?e.createHTML(""):"";try{var l=!!(new DOMParser).parseFromString(d,"text/html")}catch(h){l=!1}B=function(){function h(d){this.nodes="string"===typeof d?this.parseMarkup(d):d}h.filterUserAttributes=function(d){p(d,function(e,l){var n=!0;-1===h.allowedAttributes.indexOf(l)&&(n=!1);-1!==["background","dynsrc","href","lowsrc","src"].indexOf(l)&&(n=z(e)&&h.allowedReferences.some(function(d){return 0===e.indexOf(d)}));n||(I("Highcharts warning: Invalid attribute '"+
+l+"' in config"),delete d[l])});return d};h.parseStyle=function(d){return d.split(";").reduce(function(d,e){e=e.split(":").map(function(d){return d.trim()});var l=e[0].replace(/-([a-z])/g,function(d){return d[1].toUpperCase()});e[1]&&(d[l]=e[1]);return d},{})};h.setElementHTML=function(d,e){d.innerHTML=h.emptyHTML;e&&(new h(e)).addToDOM(d)};h.prototype.addToDOM=function(d){function e(d,l){var n;m(d).forEach(function(d){var q=d.tagName,k=d.textContent?a.doc.createTextNode(d.textContent):void 0,c=h.bypassHTMLFiltering;
+if(q)if("#text"===q)var g=k;else if(-1!==h.allowedTags.indexOf(q)||c){q=a.doc.createElementNS("svg"===q?F:l.namespaceURI||F,q);var b=d.attributes||{};p(d,function(c,g){"tagName"!==g&&"attributes"!==g&&"children"!==g&&"style"!==g&&"textContent"!==g&&(b[g]=c)});G(q,c?b:h.filterUserAttributes(b));d.style&&H(q,d.style);k&&q.appendChild(k);e(d.children||[],q);g=q}else I("Highcharts warning: Invalid tagName "+q+" in config");g&&l.appendChild(g);n=g});return n}return e(this.nodes,d)};h.prototype.parseMarkup=
+function(d){var n=[];d=d.trim().replace(/ style="/g,' data-style="');if(l)d=(new DOMParser).parseFromString(e?e.createHTML(d):d,"text/html");else{var a=u("div");a.innerHTML=d;d={body:a}}var t=function(d,e){var q=d.nodeName.toLowerCase(),k={tagName:q};"#text"===q&&(k.textContent=d.textContent||"");if(q=d.attributes){var c={};[].forEach.call(q,function(b){"data-style"===b.name?k.style=h.parseStyle(b.value):c[b.name]=b.value});k.attributes=c}if(d.childNodes.length){var g=[];[].forEach.call(d.childNodes,
+function(b){t(b,g)});g.length&&(k.children=g)}e.push(k)};[].forEach.call(d.body.childNodes,function(d){return t(d,n)});return n};h.allowedAttributes="aria-controls aria-describedby aria-expanded aria-haspopup aria-hidden aria-label aria-labelledby aria-live aria-pressed aria-readonly aria-roledescription aria-selected class clip-path color colspan cx cy d dx dy disabled fill height href id in markerHeight markerWidth offset opacity orient padding paddingLeft paddingRight patternUnits r refX refY role scope slope src startOffset stdDeviation stroke stroke-linecap stroke-width style tableValues result rowspan summary target tabindex text-align textAnchor textLength title type valign width x x1 x2 y y1 y2 zIndex".split(" ");
+h.allowedReferences="https:// http:// mailto: / ../ ./ #".split(" ");h.allowedTags="a abbr b br button caption circle clipPath code dd defs div dl dt em feComponentTransfer feFuncA feFuncB feFuncG feFuncR feGaussianBlur feOffset feMerge feMergeNode filter h1 h2 h3 h4 h5 h6 hr i img li linearGradient marker ol p path pattern pre rect small span stop strong style sub sup svg table text thead tbody tspan td th tr u ul #text".split(" ");h.emptyHTML=d;h.bypassHTMLFiltering=!1;return h}();"";return B});
+M(f,"Core/FormatUtilities.js",[f["Core/DefaultOptions.js"],f["Core/Utilities.js"]],function(a,f){function F(a,m,e,d){a=+a||0;m=+m;var l=G.lang,h=(a.toString().split(".")[1]||"").split("e")[0].length,t=a.toString().split("e"),n=m;if(-1===m)m=Math.min(h,20);else if(!I(m))m=2;else if(m&&t[1]&&0>t[1]){var v=m+ +t[1];0<=v?(t[0]=(+t[0]).toExponential(v).split("e")[0],m=v):(t[0]=t[0].split(".")[0]||0,a=20>m?(t[0]*Math.pow(10,t[1])).toFixed(m):0,t[1]=0)}v=(Math.abs(t[1]?t[0]:a)+Math.pow(10,-Math.max(m,h)-
+1)).toFixed(m);h=String(z(v));var w=3<h.length?h.length%3:0;e=B(e,l.decimalPoint);d=B(d,l.thousandsSep);a=(0>a?"-":"")+(w?h.substr(0,w)+d:"");a=0>+t[1]&&!n?"0":a+h.substr(w).replace(/(\d{3})(?=\d)/g,"$1"+d);m&&(a+=e+v.slice(-m));t[1]&&0!==+a&&(a+="e"+t[1]);return a}var G=a.defaultOptions,u=a.defaultTime,H=f.getNestedProperty,I=f.isNumber,B=f.pick,z=f.pInt;return{dateFormat:function(a,m,e){return u.dateFormat(a,m,e)},format:function(a,m,e){var d="{",l=!1,h=/f$/,t=/\.([0-9])/,n=G.lang,v=e&&e.time||
+u;e=e&&e.numberFormatter||F;for(var w=[];a;){var y=a.indexOf(d);if(-1===y)break;var A=a.slice(0,y);if(l){A=A.split(":");d=H(A.shift()||"",m);if(A.length&&"number"===typeof d)if(A=A.join(":"),h.test(A)){var q=parseInt((A.match(t)||["","-1"])[1],10);null!==d&&(d=e(d,q,n.decimalPoint,-1<A.indexOf(",")?n.thousandsSep:""))}else d=v.dateFormat(A,d);w.push(d)}else w.push(A);a=a.slice(y+1);d=(l=!l)?"}":"{"}w.push(a);return w.join("")},numberFormat:F}});M(f,"Core/Renderer/RendererUtilities.js",[f["Core/Utilities.js"]],
+function(a){var f=a.clamp,C=a.pick,G=a.stableSort,u;(function(a){function F(a,z,p){var m=a,e=m.reducedLen||z,d=function(d,e){return(e.rank||0)-(d.rank||0)},l=function(d,e){return d.target-e.target},h,t=!0,n=[],v=0;for(h=a.length;h--;)v+=a[h].size;if(v>e){G(a,d);for(v=h=0;v<=e;)v+=a[h].size,h++;n=a.splice(h-1,a.length)}G(a,l);for(a=a.map(function(d){return{size:d.size,targets:[d.target],align:C(d.align,.5)}});t;){for(h=a.length;h--;)e=a[h],d=(Math.min.apply(0,e.targets)+Math.max.apply(0,e.targets))/
+2,e.pos=f(d-e.size*e.align,0,z-e.size);h=a.length;for(t=!1;h--;)0<h&&a[h-1].pos+a[h-1].size>a[h].pos&&(a[h-1].size+=a[h].size,a[h-1].targets=a[h-1].targets.concat(a[h].targets),a[h-1].align=.5,a[h-1].pos+a[h-1].size>z&&(a[h-1].pos=z-a[h-1].size),a.splice(h,1),t=!0)}m.push.apply(m,n);h=0;a.some(function(d){var e=0;return(d.targets||[]).some(function(){m[h].pos=d.pos+e;if("undefined"!==typeof p&&Math.abs(m[h].pos-m[h].target)>p)return m.slice(0,h+1).forEach(function(d){return delete d.pos}),m.reducedLen=
+(m.reducedLen||z)-.1*z,m.reducedLen>.1*z&&F(m,z,p),!0;e+=m[h].size;h++;return!1})});G(m,l);return m}a.distribute=F})(u||(u={}));return u});M(f,"Core/Renderer/SVG/SVGElement.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/Renderer/HTML/AST.js"],f["Core/Color/Color.js"],f["Core/Globals.js"],f["Core/Utilities.js"]],function(a,f,C,G,u){var F=a.animate,I=a.animObject,B=a.stop,z=G.deg2rad,p=G.doc,m=G.noop,e=G.svg,d=G.SVG_NS,l=G.win,h=u.addEvent,t=u.attr,n=u.createElement,v=u.css,w=u.defined,y=u.erase,
+A=u.extend,q=u.fireEvent,k=u.isArray,c=u.isFunction,g=u.isNumber,b=u.isString,r=u.merge,x=u.objectEach,D=u.pick,K=u.pInt,P=u.syncTimeout,Q=u.uniqueKey;a=function(){function a(){this.element=void 0;this.onEvents={};this.opacity=1;this.renderer=void 0;this.SVG_NS=d;this.symbolCustomAttribs="x y width height r start end innerR anchorX anchorY rounded".split(" ")}a.prototype._defaultGetter=function(b){b=D(this[b+"Value"],this[b],this.element?this.element.getAttribute(b):null,0);/^[\-0-9\.]+$/.test(b)&&
+(b=parseFloat(b));return b};a.prototype._defaultSetter=function(b,c,g){g.setAttribute(c,b)};a.prototype.add=function(b){var c=this.renderer,g=this.element;b&&(this.parentGroup=b);this.parentInverted=b&&b.inverted;"undefined"!==typeof this.textStr&&"text"===this.element.nodeName&&c.buildText(this);this.added=!0;if(!b||b.handleZ||this.zIndex)var d=this.zIndexSetter();d||(b?b.element:c.box).appendChild(g);if(this.onAdd)this.onAdd();return this};a.prototype.addClass=function(b,c){var g=c?"":this.attr("class")||
+"";b=(b||"").split(/ /g).reduce(function(b,c){-1===g.indexOf(c)&&b.push(c);return b},g?[g]:[]).join(" ");b!==g&&this.attr("class",b);return this};a.prototype.afterSetters=function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)};a.prototype.align=function(c,g,d){var L={},k=this.renderer,r=k.alignedObjects,e,q,E;if(c){if(this.alignOptions=c,this.alignByTranslate=g,!d||b(d))this.alignTo=e=d||"renderer",y(r,this),r.push(this),d=void 0}else c=this.alignOptions,g=this.alignByTranslate,
+e=this.alignTo;d=D(d,k[e],"scrollablePlotBox"===e?k.plotBox:void 0,k);e=c.align;var a=c.verticalAlign;k=(d.x||0)+(c.x||0);r=(d.y||0)+(c.y||0);"right"===e?q=1:"center"===e&&(q=2);q&&(k+=(d.width-(c.width||0))/q);L[g?"translateX":"x"]=Math.round(k);"bottom"===a?E=1:"middle"===a&&(E=2);E&&(r+=(d.height-(c.height||0))/E);L[g?"translateY":"y"]=Math.round(r);this[this.placed?"animate":"attr"](L);this.placed=!0;this.alignAttr=L;return this};a.prototype.alignSetter=function(b){var c={left:"start",center:"middle",
+right:"end"};c[b]&&(this.alignValue=b,this.element.setAttribute("text-anchor",c[b]))};a.prototype.animate=function(b,c,g){var d=this,L=I(D(c,this.renderer.globalAnimation,!0));c=L.defer;D(p.hidden,p.msHidden,p.webkitHidden,!1)&&(L.duration=0);0!==L.duration?(g&&(L.complete=g),P(function(){d.element&&F(d,b,L)},c)):(this.attr(b,void 0,g||L.complete),x(b,function(b,c){L.step&&L.step.call(this,b,{prop:c,pos:1,elem:this})},this));return this};a.prototype.applyTextOutline=function(b){var c=this.element;
+-1!==b.indexOf("contrast")&&(b=b.replace(/contrast/g,this.renderer.getContrast(c.style.fill)));var g=b.split(" ");b=g[g.length-1];if((g=g[0])&&"none"!==g&&G.svg){this.fakeTS=!0;this.ySetter=this.xSetter;g=g.replace(/(^[\d\.]+)(.*?)$/g,function(b,c,g){return 2*Number(c)+g});this.removeTextOutline();var k=p.createElementNS(d,"tspan");t(k,{"class":"highcharts-text-outline",fill:b,stroke:b,"stroke-width":g,"stroke-linejoin":"round"});[].forEach.call(c.childNodes,function(b){var c=b.cloneNode(!0);c.removeAttribute&&
+["fill","stroke","stroke-width","stroke"].forEach(function(b){return c.removeAttribute(b)});k.appendChild(c)});var r=p.createElementNS(d,"tspan");r.textContent="\u200b";["x","y"].forEach(function(b){var g=c.getAttribute(b);g&&r.setAttribute(b,g)});k.appendChild(r);c.insertBefore(k,c.firstChild)}};a.prototype.attr=function(b,c,g,d){var L=this.element,k=this.symbolCustomAttribs,r,J=this,E,e;if("string"===typeof b&&"undefined"!==typeof c){var q=b;b={};b[q]=c}"string"===typeof b?J=(this[b+"Getter"]||
+this._defaultGetter).call(this,b,L):(x(b,function(c,g){E=!1;d||B(this,g);this.symbolName&&-1!==k.indexOf(g)&&(r||(this.symbolAttr(b),r=!0),E=!0);!this.rotation||"x"!==g&&"y"!==g||(this.doTransform=!0);E||(e=this[g+"Setter"]||this._defaultSetter,e.call(this,c,g,L),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(g)&&this.updateShadows(g,c,e))},this),this.afterSetters());g&&g.call(this);return J};a.prototype.clip=function(b){return this.attr("clip-path",b?"url("+
+this.renderer.url+"#"+b.id+")":"none")};a.prototype.crisp=function(b,c){c=c||b.strokeWidth||0;var g=Math.round(c)%2/2;b.x=Math.floor(b.x||this.x||0)+g;b.y=Math.floor(b.y||this.y||0)+g;b.width=Math.floor((b.width||this.width||0)-2*g);b.height=Math.floor((b.height||this.height||0)-2*g);w(b.strokeWidth)&&(b.strokeWidth=c);return b};a.prototype.complexColor=function(b,c,g){var d=this.renderer,L,e,a,l,E,n,h,D,t,m,y=[],A;q(this.renderer,"complexColor",{args:arguments},function(){b.radialGradient?e="radialGradient":
+b.linearGradient&&(e="linearGradient");if(e){a=b[e];E=d.gradients;n=b.stops;t=g.radialReference;k(a)&&(b[e]=a={x1:a[0],y1:a[1],x2:a[2],y2:a[3],gradientUnits:"userSpaceOnUse"});"radialGradient"===e&&t&&!w(a.gradientUnits)&&(l=a,a=r(a,d.getRadialAttr(t,l),{gradientUnits:"userSpaceOnUse"}));x(a,function(b,c){"id"!==c&&y.push(c,b)});x(n,function(b){y.push(b)});y=y.join(",");if(E[y])m=E[y].attr("id");else{a.id=m=Q();var J=E[y]=d.createElement(e).attr(a).add(d.defs);J.radAttr=l;J.stops=[];n.forEach(function(b){0===
+b[1].indexOf("rgba")?(L=C.parse(b[1]),h=L.get("rgb"),D=L.get("a")):(h=b[1],D=1);b=d.createElement("stop").attr({offset:b[0],"stop-color":h,"stop-opacity":D}).add(J);J.stops.push(b)})}A="url("+d.url+"#"+m+")";g.setAttribute(c,A);g.gradient=y;b.toString=function(){return A}}})};a.prototype.css=function(b){var c=this.styles,g={},d=this.element,k=!c;b.color&&(b.fill=b.color);c&&x(b,function(b,d){c&&c[d]!==b&&(g[d]=b,k=!0)});if(k){c&&(b=A(c,g));if(null===b.width||"auto"===b.width)delete this.textWidth;
+else if("text"===d.nodeName.toLowerCase()&&b.width)var a=this.textWidth=K(b.width);this.styles=b;a&&!e&&this.renderer.forExport&&delete b.width;var q=r(b);d.namespaceURI===this.SVG_NS&&["textOutline","textOverflow","width"].forEach(function(b){return q&&delete q[b]});v(d,q);this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),b.textOutline&&this.applyTextOutline(b.textOutline))}return this};a.prototype.dashstyleSetter=function(b){var c=this["stroke-width"];"inherit"===c&&(c=
+1);if(b=b&&b.toLowerCase()){var g=b.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(b=g.length;b--;)g[b]=""+K(g[b])*D(c,NaN);b=g.join(",").replace(/NaN/g,"none");this.element.setAttribute("stroke-dasharray",b)}};a.prototype.destroy=function(){var b=this,c=b.element||{},g=b.renderer,d=c.ownerSVGElement,k=g.isSVG&&
+"SPAN"===c.nodeName&&b.parentGroup||void 0;c.onclick=c.onmouseout=c.onmouseover=c.onmousemove=c.point=null;B(b);if(b.clipPath&&d){var r=b.clipPath;[].forEach.call(d.querySelectorAll("[clip-path],[CLIP-PATH]"),function(b){-1<b.getAttribute("clip-path").indexOf(r.element.id)&&b.removeAttribute("clip-path")});b.clipPath=r.destroy()}if(b.stops){for(d=0;d<b.stops.length;d++)b.stops[d].destroy();b.stops.length=0;b.stops=void 0}b.safeRemoveChild(c);for(g.styledMode||b.destroyShadows();k&&k.div&&0===k.div.childNodes.length;)c=
+k.parentGroup,b.safeRemoveChild(k.div),delete k.div,k=c;b.alignTo&&y(g.alignedObjects,b);x(b,function(c,g){b[g]&&b[g].parentGroup===b&&b[g].destroy&&b[g].destroy();delete b[g]})};a.prototype.destroyShadows=function(){(this.shadows||[]).forEach(function(b){this.safeRemoveChild(b)},this);this.shadows=void 0};a.prototype.destroyTextPath=function(b,c){var g=b.getElementsByTagName("text")[0];if(g){if(g.removeAttribute("dx"),g.removeAttribute("dy"),c.element.setAttribute("id",""),this.textPathWrapper&&
+g.getElementsByTagName("textPath").length){for(b=this.textPathWrapper.element.childNodes;b.length;)g.appendChild(b[0]);g.removeChild(this.textPathWrapper.element)}}else if(b.getAttribute("dx")||b.getAttribute("dy"))b.removeAttribute("dx"),b.removeAttribute("dy");this.textPathWrapper&&(this.textPathWrapper=this.textPathWrapper.destroy())};a.prototype.dSetter=function(b,c,g){k(b)&&("string"===typeof b[0]&&(b=this.renderer.pathToSegments(b)),this.pathArray=b,b=b.reduce(function(b,c,g){return c&&c.join?
+(g?b+" ":"")+c.join(" "):(c||"").toString()},""));/(NaN| {2}|^$)/.test(b)&&(b="M 0 0");this[c]!==b&&(g.setAttribute(c,b),this[c]=b)};a.prototype.fadeOut=function(b){var c=this;c.animate({opacity:0},{duration:D(b,150),complete:function(){c.attr({y:-9999}).hide()}})};a.prototype.fillSetter=function(b,c,g){"string"===typeof b?g.setAttribute(c,b):b&&this.complexColor(b,c,g)};a.prototype.getBBox=function(b,g){var d=this.renderer,k=this.element,r=this.styles,e=this.textStr,q=d.cache,l=d.cacheKeys,E=k.namespaceURI===
+this.SVG_NS;g=D(g,this.rotation,0);var n=d.styledMode?k&&a.prototype.getStyle.call(k,"font-size"):r&&r.fontSize,x;if(w(e)){var h=e.toString();-1===h.indexOf("<")&&(h=h.replace(/[0-9]/g,"0"));h+=["",g,n,this.textWidth,r&&r.textOverflow,r&&r.fontWeight].join()}h&&!b&&(x=q[h]);if(!x){if(E||d.forExport){try{var t=this.fakeTS&&function(b){var c=k.querySelector(".highcharts-text-outline");c&&v(c,{display:b})};c(t)&&t("none");x=k.getBBox?A({},k.getBBox()):{width:k.offsetWidth,height:k.offsetHeight};c(t)&&
+t("")}catch(X){""}if(!x||0>x.width)x={width:0,height:0}}else x=this.htmlGetBBox();d.isSVG&&(b=x.width,d=x.height,E&&(x.height=d={"11px,17":14,"13px,20":16}[(n||"")+","+Math.round(d)]||d),g&&(E=g*z,x.width=Math.abs(d*Math.sin(E))+Math.abs(b*Math.cos(E)),x.height=Math.abs(d*Math.cos(E))+Math.abs(b*Math.sin(E))));if(h&&(""===e||0<x.height)){for(;250<l.length;)delete q[l.shift()];q[h]||l.push(h);q[h]=x}}return x};a.prototype.getStyle=function(b){return l.getComputedStyle(this.element||this,"").getPropertyValue(b)};
+a.prototype.hasClass=function(b){return-1!==(""+this.attr("class")).split(" ").indexOf(b)};a.prototype.hide=function(b){b?this.attr({y:-9999}):this.attr({visibility:"hidden"});return this};a.prototype.htmlGetBBox=function(){return{height:0,width:0,x:0,y:0}};a.prototype.init=function(b,c){this.element="span"===c?n(c):p.createElementNS(this.SVG_NS,c);this.renderer=b;q(this,"afterInit")};a.prototype.invert=function(b){this.inverted=b;this.updateTransform();return this};a.prototype.on=function(b,c){var g=
+this.onEvents;if(g[b])g[b]();g[b]=h(this.element,b,c);return this};a.prototype.opacitySetter=function(b,c,g){this.opacity=b=Number(Number(b).toFixed(3));g.setAttribute(c,b)};a.prototype.removeClass=function(c){return this.attr("class",(""+this.attr("class")).replace(b(c)?new RegExp("(^| )"+c+"( |$)"):c," ").replace(/ +/g," ").trim())};a.prototype.removeTextOutline=function(){var b=this.element.querySelector("tspan.highcharts-text-outline");b&&this.safeRemoveChild(b)};a.prototype.safeRemoveChild=function(b){var c=
+b.parentNode;c&&c.removeChild(b)};a.prototype.setRadialReference=function(b){var c=this.element.gradient&&this.renderer.gradients[this.element.gradient];this.element.radialReference=b;c&&c.radAttr&&c.animate(this.renderer.getRadialAttr(b,c.radAttr));return this};a.prototype.setTextPath=function(b,c){var d=this.element,k=this.text?this.text.element:d,e={textAnchor:"text-anchor"},q=!1,a=this.textPathWrapper,n=!a;c=r(!0,{enabled:!0,attributes:{dy:-5,startOffset:"50%",textAnchor:"middle"}},c);var E=f.filterUserAttributes(c.attributes);
+if(b&&c&&c.enabled){a&&null===a.element.parentNode?(n=!0,a=a.destroy()):a&&this.removeTextOutline.call(a.parentGroup);this.options&&this.options.padding&&(E.dx=-this.options.padding);a||(this.textPathWrapper=a=this.renderer.createElement("textPath"),q=!0);var h=a.element;(c=b.element.getAttribute("id"))||b.element.setAttribute("id",c=Q());if(n)for(k.setAttribute("y",0),g(E.dx)&&k.setAttribute("x",-E.dx),b=[].slice.call(k.childNodes),n=0;n<b.length;n++){var D=b[n];D.nodeType!==l.Node.TEXT_NODE&&"tspan"!==
+D.nodeName||h.appendChild(D)}q&&a&&a.add({element:k});h.setAttributeNS("http://www.w3.org/1999/xlink","href",this.renderer.url+"#"+c);w(E.dy)&&(h.parentNode.setAttribute("dy",E.dy),delete E.dy);w(E.dx)&&(h.parentNode.setAttribute("dx",E.dx),delete E.dx);x(E,function(b,c){h.setAttribute(e[c]||c,b)});d.removeAttribute("transform");this.removeTextOutline.call(a);this.text&&!this.renderer.styledMode&&this.attr({fill:"none","stroke-width":0});this.applyTextOutline=this.updateTransform=m}else a&&(delete this.updateTransform,
+delete this.applyTextOutline,this.destroyTextPath(d,b),this.updateTransform(),this.options&&this.options.rotation&&this.applyTextOutline(this.options.style.textOutline));return this};a.prototype.shadow=function(b,c,g){var d=[],k=this.element,L=this.oldShadowOptions,r={color:"#000000",offsetX:this.parentInverted?-1:1,offsetY:this.parentInverted?-1:1,opacity:.15,width:3},e=!1,E;!0===b?E=r:"object"===typeof b&&(E=A(r,b));E&&(E&&L&&x(E,function(b,c){b!==L[c]&&(e=!0)}),e&&this.destroyShadows(),this.oldShadowOptions=
+E);if(!E)this.destroyShadows();else if(!this.shadows){var a=E.opacity/E.width;var q=this.parentInverted?"translate("+E.offsetY+", "+E.offsetX+")":"translate("+E.offsetX+", "+E.offsetY+")";for(r=1;r<=E.width;r++){var l=k.cloneNode(!1);var n=2*E.width+1-2*r;t(l,{stroke:b.color||"#000000","stroke-opacity":a*r,"stroke-width":n,transform:q,fill:"none"});l.setAttribute("class",(l.getAttribute("class")||"")+" highcharts-shadow");g&&(t(l,"height",Math.max(t(l,"height")-n,0)),l.cutHeight=n);c?c.element.appendChild(l):
+k.parentNode&&k.parentNode.insertBefore(l,k);d.push(l)}this.shadows=d}return this};a.prototype.show=function(b){return this.attr({visibility:b?"inherit":"visible"})};a.prototype.strokeSetter=function(b,c,g){this[c]=b;this.stroke&&this["stroke-width"]?(a.prototype.fillSetter.call(this,this.stroke,"stroke",g),g.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0):"stroke-width"===c&&0===b&&this.hasStroke?(g.removeAttribute("stroke"),this.hasStroke=!1):this.renderer.styledMode&&this["stroke-width"]&&
+(g.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0)};a.prototype.strokeWidth=function(){if(!this.renderer.styledMode)return this["stroke-width"]||0;var b=this.getStyle("stroke-width"),c=0;if(b.indexOf("px")===b.length-2)c=K(b);else if(""!==b){var g=p.createElementNS(d,"rect");t(g,{width:b,"stroke-width":0});this.element.parentNode.appendChild(g);c=g.getBBox().width;g.parentNode.removeChild(g)}return c};a.prototype.symbolAttr=function(b){var c=this;"x y r start end width height innerR anchorX anchorY clockwise".split(" ").forEach(function(g){c[g]=
+D(b[g],c[g])});c.attr({d:c.renderer.symbols[c.symbolName](c.x,c.y,c.width,c.height,c)})};a.prototype.textSetter=function(b){b!==this.textStr&&(delete this.textPxLength,this.textStr=b,this.added&&this.renderer.buildText(this))};a.prototype.titleSetter=function(b){var c=this.element,g=c.getElementsByTagName("title")[0]||p.createElementNS(this.SVG_NS,"title");c.insertBefore?c.insertBefore(g,c.firstChild):c.appendChild(g);g.textContent=String(D(b,"")).replace(/<[^>]*>/g,"").replace(/&lt;/g,"<").replace(/&gt;/g,
+">")};a.prototype.toFront=function(){var b=this.element;b.parentNode.appendChild(b);return this};a.prototype.translate=function(b,c){return this.attr({translateX:b,translateY:c})};a.prototype.updateShadows=function(b,c,g){var d=this.shadows;if(d)for(var k=d.length;k--;)g.call(d[k],"height"===b?Math.max(c-(d[k].cutHeight||0),0):"d"===b?this.d:c,b,d[k])};a.prototype.updateTransform=function(){var b=this.scaleX,c=this.scaleY,g=this.inverted,d=this.rotation,k=this.matrix,r=this.element,e=this.translateX||
+0,a=this.translateY||0;g&&(e+=this.width,a+=this.height);e=["translate("+e+","+a+")"];w(k)&&e.push("matrix("+k.join(",")+")");g?e.push("rotate(90) scale(-1,1)"):d&&e.push("rotate("+d+" "+D(this.rotationOriginX,r.getAttribute("x"),0)+" "+D(this.rotationOriginY,r.getAttribute("y")||0)+")");(w(b)||w(c))&&e.push("scale("+D(b,1)+" "+D(c,1)+")");e.length&&r.setAttribute("transform",e.join(" "))};a.prototype.visibilitySetter=function(b,c,g){"inherit"===b?g.removeAttribute(c):this[c]!==b&&g.setAttribute(c,
+b);this[c]=b};a.prototype.xGetter=function(b){"circle"===this.element.nodeName&&("x"===b?b="cx":"y"===b&&(b="cy"));return this._defaultGetter(b)};a.prototype.zIndexSetter=function(b,c){var g=this.renderer,d=this.parentGroup,k=(d||g).element||g.box,r=this.element;g=k===g.box;var e=!1;var a=this.added;var E;w(b)?(r.setAttribute("data-z-index",b),b=+b,this[c]===b&&(a=!1)):w(this[c])&&r.removeAttribute("data-z-index");this[c]=b;if(a){(b=this.zIndex)&&d&&(d.handleZ=!0);c=k.childNodes;for(E=c.length-1;0<=
+E&&!e;E--){d=c[E];a=d.getAttribute("data-z-index");var q=!w(a);if(d!==r)if(0>b&&q&&!g&&!E)k.insertBefore(r,c[E]),e=!0;else if(K(a)<=b||q&&(!w(b)||0<=b))k.insertBefore(r,c[E+1]||null),e=!0}e||(k.insertBefore(r,c[g?3:0]||null),e=!0)}return e};return a}();a.prototype["stroke-widthSetter"]=a.prototype.strokeSetter;a.prototype.yGetter=a.prototype.xGetter;a.prototype.matrixSetter=a.prototype.rotationOriginXSetter=a.prototype.rotationOriginYSetter=a.prototype.rotationSetter=a.prototype.scaleXSetter=a.prototype.scaleYSetter=
+a.prototype.translateXSetter=a.prototype.translateYSetter=a.prototype.verticalAlignSetter=function(b,c){this[c]=b;this.doTransform=!0};"";return a});M(f,"Core/Renderer/RendererRegistry.js",[f["Core/Globals.js"]],function(a){var f;(function(f){f.rendererTypes={};var F;f.getRendererType=function(a){void 0===a&&(a=F);return f.rendererTypes[a]||f.rendererTypes[F]};f.registerRendererType=function(u,C,I){f.rendererTypes[u]=C;if(!F||I)F=u,a.Renderer=C}})(f||(f={}));return f});M(f,"Core/Renderer/SVG/SVGLabel.js",
+[f["Core/Renderer/SVG/SVGElement.js"],f["Core/Utilities.js"]],function(a,f){var F=this&&this.__extends||function(){var a=function(m,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,e){d.__proto__=e}||function(d,e){for(var a in e)e.hasOwnProperty(a)&&(d[a]=e[a])};return a(m,e)};return function(m,e){function d(){this.constructor=m}a(m,e);m.prototype=null===e?Object.create(e):(d.prototype=e.prototype,new d)}}(),G=f.defined,u=f.extend,H=f.isNumber,I=f.merge,B=f.pick,z=f.removeEvent;
+return function(p){function m(e,d,a,h,t,n,v,w,y,A){var q=p.call(this)||this;q.paddingLeftSetter=q.paddingSetter;q.paddingRightSetter=q.paddingSetter;q.init(e,"g");q.textStr=d;q.x=a;q.y=h;q.anchorX=n;q.anchorY=v;q.baseline=y;q.className=A;q.addClass("button"===A?"highcharts-no-tooltip":"highcharts-label");A&&q.addClass("highcharts-"+A);q.text=e.text(void 0,0,0,w).attr({zIndex:1});var k;"string"===typeof t&&((k=/^url\((.*?)\)$/.test(t))||q.renderer.symbols[t])&&(q.symbolKey=t);q.bBox=m.emptyBBox;q.padding=
+3;q.baselineOffset=0;q.needsBox=e.styledMode||k;q.deferredAttr={};q.alignFactor=0;return q}F(m,p);m.prototype.alignSetter=function(e){e={left:0,center:.5,right:1}[e];e!==this.alignFactor&&(this.alignFactor=e,this.bBox&&H(this.xSetting)&&this.attr({x:this.xSetting}))};m.prototype.anchorXSetter=function(e,d){this.anchorX=e;this.boxAttr(d,Math.round(e)-this.getCrispAdjust()-this.xSetting)};m.prototype.anchorYSetter=function(e,d){this.anchorY=e;this.boxAttr(d,e-this.ySetting)};m.prototype.boxAttr=function(e,
+d){this.box?this.box.attr(e,d):this.deferredAttr[e]=d};m.prototype.css=function(e){if(e){var d={};e=I(e);m.textProps.forEach(function(a){"undefined"!==typeof e[a]&&(d[a]=e[a],delete e[a])});this.text.css(d);var l="width"in d;"fontSize"in d||"fontWeight"in d?this.updateTextPadding():l&&this.updateBoxSize()}return a.prototype.css.call(this,e)};m.prototype.destroy=function(){z(this.element,"mouseenter");z(this.element,"mouseleave");this.text&&this.text.destroy();this.box&&(this.box=this.box.destroy());
+a.prototype.destroy.call(this)};m.prototype.fillSetter=function(e,d){e&&(this.needsBox=!0);this.fill=e;this.boxAttr(d,e)};m.prototype.getBBox=function(){this.textStr&&0===this.bBox.width&&0===this.bBox.height&&this.updateBoxSize();var e=this.padding,d=B(this.paddingLeft,e);return{width:this.width,height:this.height,x:this.bBox.x-d,y:this.bBox.y-e}};m.prototype.getCrispAdjust=function(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this["stroke-width"]?parseInt(this["stroke-width"],
+10):0)%2/2};m.prototype.heightSetter=function(e){this.heightSetting=e};m.prototype.onAdd=function(){var e=this.textStr;this.text.add(this);this.attr({text:G(e)?e:"",x:this.x,y:this.y});this.box&&G(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})};m.prototype.paddingSetter=function(e,d){H(e)?e!==this[d]&&(this[d]=e,this.updateTextPadding()):this[d]=void 0};m.prototype.rSetter=function(e,d){this.boxAttr(d,e)};m.prototype.shadow=function(e){e&&!this.renderer.styledMode&&(this.updateBoxSize(),
+this.box&&this.box.shadow(e));return this};m.prototype.strokeSetter=function(e,d){this.stroke=e;this.boxAttr(d,e)};m.prototype["stroke-widthSetter"]=function(e,d){e&&(this.needsBox=!0);this["stroke-width"]=e;this.boxAttr(d,e)};m.prototype["text-alignSetter"]=function(e){this.textAlign=e};m.prototype.textSetter=function(e){"undefined"!==typeof e&&this.text.attr({text:e});this.updateTextPadding()};m.prototype.updateBoxSize=function(){var e=this.text.element.style,d={},a=this.padding,h=this.bBox=H(this.widthSetting)&&
+H(this.heightSetting)&&!this.textAlign||!G(this.text.textStr)?m.emptyBBox:this.text.getBBox();this.width=this.getPaddedWidth();this.height=(this.heightSetting||h.height||0)+2*a;e=this.renderer.fontMetrics(e&&e.fontSize,this.text);this.baselineOffset=a+Math.min((this.text.firstLineMetrics||e).b,h.height||Infinity);this.heightSetting&&(this.baselineOffset+=(this.heightSetting-e.h)/2);this.needsBox&&(this.box||(a=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect(),a.addClass(("button"===
+this.className?"":"highcharts-label-box")+(this.className?" highcharts-"+this.className+"-box":"")),a.add(this)),a=this.getCrispAdjust(),d.x=a,d.y=(this.baseline?-this.baselineOffset:0)+a,d.width=Math.round(this.width),d.height=Math.round(this.height),this.box.attr(u(d,this.deferredAttr)),this.deferredAttr={})};m.prototype.updateTextPadding=function(){var a=this.text;this.updateBoxSize();var d=this.baseline?0:this.baselineOffset,l=B(this.paddingLeft,this.padding);G(this.widthSetting)&&this.bBox&&
+("center"===this.textAlign||"right"===this.textAlign)&&(l+={center:.5,right:1}[this.textAlign]*(this.widthSetting-this.bBox.width));if(l!==a.x||d!==a.y)a.attr("x",l),a.hasBoxWidthChanged&&(this.bBox=a.getBBox(!0)),"undefined"!==typeof d&&a.attr("y",d);a.x=l;a.y=d};m.prototype.widthSetter=function(a){this.widthSetting=H(a)?a:void 0};m.prototype.getPaddedWidth=function(){var a=this.padding,d=B(this.paddingLeft,a);a=B(this.paddingRight,a);return(this.widthSetting||this.bBox.width||0)+d+a};m.prototype.xSetter=
+function(a){this.x=a;this.alignFactor&&(a-=this.alignFactor*this.getPaddedWidth(),this["forceAnimate:x"]=!0);this.xSetting=Math.round(a);this.attr("translateX",this.xSetting)};m.prototype.ySetter=function(a){this.ySetting=this.y=Math.round(a);this.attr("translateY",this.ySetting)};m.emptyBBox={width:0,height:0,x:0,y:0};m.textProps="color direction fontFamily fontSize fontStyle fontWeight lineHeight textAlign textDecoration textOutline textOverflow width".split(" ");return m}(a)});M(f,"Core/Renderer/SVG/Symbols.js",
+[f["Core/Utilities.js"]],function(a){function f(a,f,p,m,e){var d=[];if(e){var l=e.start||0,h=I(e.r,p);p=I(e.r,m||p);var t=(e.end||0)-.001;m=e.innerR;var n=I(e.open,.001>Math.abs((e.end||0)-l-2*Math.PI)),v=Math.cos(l),w=Math.sin(l),y=Math.cos(t),A=Math.sin(t);l=I(e.longArc,.001>t-l-Math.PI?0:1);d.push(["M",a+h*v,f+p*w],["A",h,p,0,l,I(e.clockwise,1),a+h*y,f+p*A]);u(m)&&d.push(n?["M",a+m*y,f+m*A]:["L",a+m*y,f+m*A],["A",m,m,0,l,u(e.clockwise)?1-e.clockwise:0,a+m*v,f+m*w]);n||d.push(["Z"])}return d}function C(a,
+f,p,m,e){return e&&e.r?G(a,f,p,m,e):[["M",a,f],["L",a+p,f],["L",a+p,f+m],["L",a,f+m],["Z"]]}function G(a,f,p,m,e){e=e&&e.r||0;return[["M",a+e,f],["L",a+p-e,f],["C",a+p,f,a+p,f,a+p,f+e],["L",a+p,f+m-e],["C",a+p,f+m,a+p,f+m,a+p-e,f+m],["L",a+e,f+m],["C",a,f+m,a,f+m,a,f+m-e],["L",a,f+e],["C",a,f,a,f,a+e,f]]}var u=a.defined,H=a.isNumber,I=a.pick;return{arc:f,callout:function(a,f,p,m,e){var d=Math.min(e&&e.r||0,p,m),l=d+6,h=e&&e.anchorX;e=e&&e.anchorY||0;var t=G(a,f,p,m,{r:d});if(!H(h))return t;a+h>=p?
+e>f+l&&e<f+m-l?t.splice(3,1,["L",a+p,e-6],["L",a+p+6,e],["L",a+p,e+6],["L",a+p,f+m-d]):t.splice(3,1,["L",a+p,m/2],["L",h,e],["L",a+p,m/2],["L",a+p,f+m-d]):0>=a+h?e>f+l&&e<f+m-l?t.splice(7,1,["L",a,e+6],["L",a-6,e],["L",a,e-6],["L",a,f+d]):t.splice(7,1,["L",a,m/2],["L",h,e],["L",a,m/2],["L",a,f+d]):e&&e>m&&h>a+l&&h<a+p-l?t.splice(5,1,["L",h+6,f+m],["L",h,f+m+6],["L",h-6,f+m],["L",a+d,f+m]):e&&0>e&&h>a+l&&h<a+p-l&&t.splice(1,1,["L",h-6,f],["L",h,f-6],["L",h+6,f],["L",p-d,f]);return t},circle:function(a,
+z,p,m){return f(a+p/2,z+m/2,p/2,m/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},diamond:function(a,f,p,m){return[["M",a+p/2,f],["L",a+p,f+m/2],["L",a+p/2,f+m],["L",a,f+m/2],["Z"]]},rect:C,roundedRect:G,square:C,triangle:function(a,f,p,m){return[["M",a+p/2,f],["L",a+p,f+m],["L",a,f+m],["Z"]]},"triangle-down":function(a,f,p,m){return[["M",a,f],["L",a+p,f],["L",a+p/2,f+m],["Z"]]}}});M(f,"Core/Renderer/SVG/TextBuilder.js",[f["Core/Renderer/HTML/AST.js"],f["Core/Globals.js"],f["Core/Utilities.js"]],function(a,
+f,C){var F=f.doc,u=f.SVG_NS,H=f.win,I=C.attr,B=C.extend,z=C.isString,p=C.objectEach,m=C.pick;return function(){function e(d){var a=d.styles;this.renderer=d.renderer;this.svgElement=d;this.width=d.textWidth;this.textLineHeight=a&&a.lineHeight;this.textOutline=a&&a.textOutline;this.ellipsis=!(!a||"ellipsis"!==a.textOverflow);this.noWrap=!(!a||"nowrap"!==a.whiteSpace);this.fontSize=a&&a.fontSize}e.prototype.buildSVG=function(){var d=this.svgElement,e=d.element,h=d.renderer,t=m(d.textStr,"").toString(),
+n=-1!==t.indexOf("<"),f=e.childNodes;h=this.width&&!d.added&&h.box;var w=/<br.*?>/g,y=[t,this.ellipsis,this.noWrap,this.textLineHeight,this.textOutline,this.fontSize,this.width].join();if(y!==d.textCache){d.textCache=y;delete d.actualWidth;for(y=f.length;y--;)e.removeChild(f[y]);n||this.ellipsis||this.width||-1!==t.indexOf(" ")&&(!this.noWrap||w.test(t))?""!==t&&(h&&h.appendChild(e),t=new a(t),this.modifyTree(t.nodes),t.addToDOM(d.element),this.modifyDOM(),this.ellipsis&&-1!==(e.textContent||"").indexOf("\u2026")&&
+d.attr("title",this.unescapeEntities(d.textStr||"",["&lt;","&gt;"])),h&&h.removeChild(e)):e.appendChild(F.createTextNode(this.unescapeEntities(t)));z(this.textOutline)&&d.applyTextOutline&&d.applyTextOutline(this.textOutline)}};e.prototype.modifyDOM=function(){var d=this,a=this.svgElement,e=I(a.element,"x");a.firstLineMetrics=void 0;for(var t;t=a.element.firstChild;)if(/^[\s\u200B]*$/.test(t.textContent||" "))a.element.removeChild(t);else break;[].forEach.call(a.element.querySelectorAll("tspan.highcharts-br"),
+function(n,h){n.nextSibling&&n.previousSibling&&(0===h&&1===n.previousSibling.nodeType&&(a.firstLineMetrics=a.renderer.fontMetrics(void 0,n.previousSibling)),I(n,{dy:d.getLineHeight(n.nextSibling),x:e}))});var n=this.width||0;if(n){var f=function(h,l){var q=h.textContent||"",k=q.replace(/([^\^])-/g,"$1- ").split(" "),c=!d.noWrap&&(1<k.length||1<a.element.childNodes.length),g=d.getLineHeight(l),b=0,r=a.actualWidth;if(d.ellipsis)q&&d.truncate(h,q,void 0,0,Math.max(0,n-parseInt(d.fontSize||12,10)),function(b,
+c){return b.substring(0,c)+"\u2026"});else if(c){q=[];for(c=[];l.firstChild&&l.firstChild!==h;)c.push(l.firstChild),l.removeChild(l.firstChild);for(;k.length;)k.length&&!d.noWrap&&0<b&&(q.push(h.textContent||""),h.textContent=k.join(" ").replace(/- /g,"-")),d.truncate(h,void 0,k,0===b?r||0:0,n,function(b,c){return k.slice(0,c).join(" ").replace(/- /g,"-")}),r=a.actualWidth,b++;c.forEach(function(b){l.insertBefore(b,h)});q.forEach(function(b){l.insertBefore(F.createTextNode(b),h);b=F.createElementNS(u,
+"tspan");b.textContent="\u200b";I(b,{dy:g,x:e});l.insertBefore(b,h)})}},m=function(d){[].slice.call(d.childNodes).forEach(function(e){e.nodeType===H.Node.TEXT_NODE?f(e,d):(-1!==e.className.baseVal.indexOf("highcharts-br")&&(a.actualWidth=0),m(e))})};m(a.element)}};e.prototype.getLineHeight=function(d){var a;d=d.nodeType===H.Node.TEXT_NODE?d.parentElement:d;this.renderer.styledMode||(a=d&&/(px|em)$/.test(d.style.fontSize)?d.style.fontSize:this.fontSize||this.renderer.style.fontSize||12);return this.textLineHeight?
+parseInt(this.textLineHeight.toString(),10):this.renderer.fontMetrics(a,d||this.svgElement.element).h};e.prototype.modifyTree=function(d){var a=this,e=function(h,n){var l=h.attributes;l=void 0===l?{}:l;var f=h.children,t=h.style;t=void 0===t?{}:t;var m=h.tagName,q=a.renderer.styledMode;if("b"===m||"strong"===m)q?l["class"]="highcharts-strong":t.fontWeight="bold";else if("i"===m||"em"===m)q?l["class"]="highcharts-emphasized":t.fontStyle="italic";t&&t.color&&(t.fill=t.color);"br"===m?(l["class"]="highcharts-br",
+h.textContent="\u200b",(n=d[n+1])&&n.textContent&&(n.textContent=n.textContent.replace(/^ +/gm,""))):"a"===m&&f&&f.some(function(d){return"#text"===d.tagName})&&(h.children=[{children:f,tagName:"tspan"}]);"#text"!==m&&"a"!==m&&(h.tagName="tspan");B(h,{attributes:l,style:t});f&&f.filter(function(d){return"#text"!==d.tagName}).forEach(e)};d.forEach(e)};e.prototype.truncate=function(d,a,e,t,n,f){var h=this.svgElement,l=h.renderer,m=h.rotation,q=[],k=e?1:0,c=(a||e||"").length,g=c,b,r=function(b,c){c=
+c||b;var g=d.parentNode;if(g&&"undefined"===typeof q[c])if(g.getSubStringLength)try{q[c]=t+g.getSubStringLength(0,e?c+1:c)}catch(Q){""}else l.getSpanWidth&&(d.textContent=f(a||e,b),q[c]=t+l.getSpanWidth(h,d));return q[c]};h.rotation=0;var x=r(d.textContent.length);if(t+x>n){for(;k<=c;)g=Math.ceil((k+c)/2),e&&(b=f(e,g)),x=r(g,b&&b.length-1),k===c?k=c+1:x>n?c=g-1:k=g;0===c?d.textContent="":a&&c===a.length-1||(d.textContent=b||f(a||e,g))}e&&e.splice(0,g);h.actualWidth=x;h.rotation=m};e.prototype.unescapeEntities=
+function(d,a){p(this.renderer.escapes,function(e,l){a&&-1!==a.indexOf(e)||(d=d.toString().replace(new RegExp(e,"g"),l))});return d};return e}()});M(f,"Core/Renderer/SVG/SVGRenderer.js",[f["Core/Renderer/HTML/AST.js"],f["Core/Color/Color.js"],f["Core/Globals.js"],f["Core/Renderer/RendererRegistry.js"],f["Core/Renderer/SVG/SVGElement.js"],f["Core/Renderer/SVG/SVGLabel.js"],f["Core/Renderer/SVG/Symbols.js"],f["Core/Renderer/SVG/TextBuilder.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H,I,B,z){var p=
+C.charts,m=C.deg2rad,e=C.doc,d=C.isFirefox,l=C.isMS,h=C.isWebKit,t=C.noop,n=C.SVG_NS,v=C.symbolSizes,w=C.win,y=z.addEvent,A=z.attr,q=z.createElement,k=z.css,c=z.defined,g=z.destroyObjectProperties,b=z.extend,r=z.isArray,x=z.isNumber,D=z.isObject,K=z.isString,P=z.merge,Q=z.pick,O=z.pInt,F=z.uniqueKey,Z;C=function(){function L(b,c,g,d,a,k,e){this.width=this.url=this.style=this.isSVG=this.imgCount=this.height=this.gradients=this.globalAnimation=this.defs=this.chartIndex=this.cacheKeys=this.cache=this.boxWrapper=
+this.box=this.alignedObjects=void 0;this.init(b,c,g,d,a,k,e)}L.prototype.init=function(b,c,g,a,r,E,L){var q=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}),J=q.element;L||q.css(this.getStyle(a));b.appendChild(J);A(b,"dir","ltr");-1===b.innerHTML.indexOf("xmlns")&&A(J,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=J;this.boxWrapper=q;this.alignedObjects=[];this.url=this.getReferenceURL();this.createElement("desc").add().element.appendChild(e.createTextNode("Created with Highcharts 10.0.0"));
+this.defs=this.createElement("defs").add();this.allowHTML=E;this.forExport=r;this.styledMode=L;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,g,!1);var n;d&&b.getBoundingClientRect&&(c=function(){k(b,{left:0,top:0});n=b.getBoundingClientRect();k(b,{left:Math.ceil(n.left)-n.left+"px",top:Math.ceil(n.top)-n.top+"px"})},c(),this.unSubPixelFix=y(w,"resize",c))};L.prototype.definition=function(b){return(new a([b])).addToDOM(this.defs.element)};L.prototype.getReferenceURL=
+function(){if((d||h)&&e.getElementsByTagName("base").length){if(!c(Z)){var b=F();b=(new a([{tagName:"svg",attributes:{width:8,height:8},children:[{tagName:"defs",children:[{tagName:"clipPath",attributes:{id:b},children:[{tagName:"rect",attributes:{width:4,height:4}}]}]},{tagName:"rect",attributes:{id:"hitme",width:8,height:8,"clip-path":"url(#"+b+")",fill:"rgba(0,0,0,0.001)"}}]}])).addToDOM(e.body);k(b,{position:"fixed",top:0,left:0,zIndex:9E5});var g=e.elementFromPoint(6,6);Z="hitme"===(g&&g.id);
+e.body.removeChild(b)}if(Z)return w.location.href.split("#")[0].replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20")}return""};L.prototype.getStyle=function(c){return this.style=b({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},c)};L.prototype.setStyle=function(b){this.boxWrapper.css(this.getStyle(b))};L.prototype.isHidden=function(){return!this.boxWrapper.getBBox().width};L.prototype.destroy=function(){var b=this.defs;this.box=
+null;this.boxWrapper=this.boxWrapper.destroy();g(this.gradients||{});this.gradients=null;b&&(this.defs=b.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null};L.prototype.createElement=function(b){var c=new this.Element;c.init(this,b);return c};L.prototype.getRadialAttr=function(b,c){return{cx:b[0]-b[2]/2+(c.cx||0)*b[2],cy:b[1]-b[2]/2+(c.cy||0)*b[2],r:(c.r||0)*b[2]}};L.prototype.buildText=function(b){(new B(b)).buildSVG()};L.prototype.getContrast=function(b){b=f.parse(b).rgba;
+b[0]*=1;b[1]*=1.2;b[2]*=.5;return 459<b[0]+b[1]+b[2]?"#000000":"#FFFFFF"};L.prototype.button=function(c,g,d,k,e,r,L,q,n,h){var E=this.label(c,g,d,n,void 0,void 0,h,void 0,"button"),x=this.styledMode,J=0,f=e?P(e):{},t=P({color:"#333333",cursor:"pointer",fontWeight:"normal"},f.style);delete f.style;f=a.filterUserAttributes(f);E.attr(P({padding:8,r:2},f));if(!x){f=P({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1},f);r=P(f,{fill:"#e6e6e6"},a.filterUserAttributes(r||{}));var N=r.style;delete r.style;
+L=P(f,{fill:"#e6ebf5",style:{color:"#000000",fontWeight:"bold"}},a.filterUserAttributes(L||{}));var m=L.style;delete L.style;q=P(f,{style:{color:"#cccccc"}},a.filterUserAttributes(q||{}));var w=q.style;delete q.style}y(E.element,l?"mouseover":"mouseenter",function(){3!==J&&E.setState(1)});y(E.element,l?"mouseout":"mouseleave",function(){3!==J&&E.setState(J)});E.setState=function(b){1!==b&&(E.state=J=b);E.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+
+["normal","hover","pressed","disabled"][b||0]);x||(E.attr([f,r,L,q][b||0]),b=[t,N,m,w][b||0],D(b)&&E.css(b))};x||E.attr(f).css(b({cursor:"default"},t));return E.on("touchstart",function(b){return b.stopPropagation()}).on("click",function(b){3!==J&&k.call(E,b)})};L.prototype.crispLine=function(b,g,d){void 0===d&&(d="round");var a=b[0],k=b[1];c(a[1])&&a[1]===k[1]&&(a[1]=k[1]=Math[d](a[1])-g%2/2);c(a[2])&&a[2]===k[2]&&(a[2]=k[2]=Math[d](a[2])+g%2/2);return b};L.prototype.path=function(c){var g=this.styledMode?
+{}:{fill:"none"};r(c)?g.d=c:D(c)&&b(g,c);return this.createElement("path").attr(g)};L.prototype.circle=function(b,c,g){b=D(b)?b:"undefined"===typeof b?{}:{x:b,y:c,r:g};c=this.createElement("circle");c.xSetter=c.ySetter=function(b,c,g){g.setAttribute("c"+c,b)};return c.attr(b)};L.prototype.arc=function(b,c,g,d,a,k){D(b)?(d=b,c=d.y,g=d.r,b=d.x):d={innerR:d,start:a,end:k};b=this.symbol("arc",b,c,g,g,d);b.r=g;return b};L.prototype.rect=function(b,c,g,d,a,k){a=D(b)?b.r:a;var e=this.createElement("rect");
+b=D(b)?b:"undefined"===typeof b?{}:{x:b,y:c,width:Math.max(g,0),height:Math.max(d,0)};this.styledMode||("undefined"!==typeof k&&(b["stroke-width"]=k,b=e.crisp(b)),b.fill="none");a&&(b.r=a);e.rSetter=function(b,c,g){e.r=b;A(g,{rx:b,ry:b})};e.rGetter=function(){return e.r||0};return e.attr(b)};L.prototype.setSize=function(b,c,g){this.width=b;this.height=c;this.boxWrapper.animate({width:b,height:c},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:Q(g,
+!0)?void 0:0});this.alignElements()};L.prototype.g=function(b){var c=this.createElement("g");return b?c.attr({"class":"highcharts-"+b}):c};L.prototype.image=function(b,c,g,d,a,k){var e={preserveAspectRatio:"none"},r=function(b,c){b.setAttributeNS?b.setAttributeNS("http://www.w3.org/1999/xlink","href",c):b.setAttribute("hc-svg-href",c)};x(c)&&(e.x=c);x(g)&&(e.y=g);x(d)&&(e.width=d);x(a)&&(e.height=a);var E=this.createElement("image").attr(e);c=function(c){r(E.element,b);k.call(E,c)};k?(r(E.element,
+"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="),g=new w.Image,y(g,"load",c),g.src=b,g.complete&&c({})):r(E.element,b);return E};L.prototype.symbol=function(g,d,a,r,L,E){var n=this,h=/^url\((.*?)\)$/,x=h.test(g),l=!x&&(this.symbols[g]?g:"circle"),D=l&&this.symbols[l],f;if(D){"number"===typeof d&&(f=D.call(this.symbols,Math.round(d||0),Math.round(a||0),r||0,L||0,E));var t=this.path(f);n.styledMode||t.attr("fill","none");b(t,{symbolName:l||void 0,x:d,y:a,width:r,height:L});
+E&&b(t,E)}else if(x){var m=g.match(h)[1];var J=t=this.image(m);J.imgwidth=Q(v[m]&&v[m].width,E&&E.width);J.imgheight=Q(v[m]&&v[m].height,E&&E.height);var y=function(b){return b.attr({width:b.width,height:b.height})};["width","height"].forEach(function(b){J[b+"Setter"]=function(b,g){var d=this["img"+g];this[g]=b;c(d)&&(E&&"within"===E.backgroundSize&&this.width&&this.height&&(d=Math.round(d*Math.min(this.width/this.imgwidth,this.height/this.imgheight))),this.element&&this.element.setAttribute(g,d),
+this.alignByTranslate||(b=((this[g]||0)-d)/2,this.attr("width"===g?{translateX:b}:{translateY:b})))}});c(d)&&J.attr({x:d,y:a});J.isImg=!0;c(J.imgwidth)&&c(J.imgheight)?y(J):(J.attr({width:0,height:0}),q("img",{onload:function(){var b=p[n.chartIndex];0===this.width&&(k(this,{position:"absolute",top:"-999em"}),e.body.appendChild(this));v[m]={width:this.width,height:this.height};J.imgwidth=this.width;J.imgheight=this.height;J.element&&y(J);this.parentNode&&this.parentNode.removeChild(this);n.imgCount--;
+if(!n.imgCount&&b&&!b.hasLoaded)b.onload()},src:m}),this.imgCount++)}return t};L.prototype.clipRect=function(b,c,g,d){var a=F()+"-",k=this.createElement("clipPath").attr({id:a}).add(this.defs);b=this.rect(b,c,g,d,0).add(k);b.id=a;b.clipPath=k;b.count=0;return b};L.prototype.text=function(b,g,d,a){var k={};if(a&&(this.allowHTML||!this.forExport))return this.html(b,g,d);k.x=Math.round(g||0);d&&(k.y=Math.round(d));c(b)&&(k.text=b);b=this.createElement("text").attr(k);if(!a||this.forExport&&!this.allowHTML)b.xSetter=
+function(b,c,g){for(var d=g.getElementsByTagName("tspan"),a=g.getAttribute(c),k=0,e;k<d.length;k++)e=d[k],e.getAttribute(c)===a&&e.setAttribute(c,b);g.setAttribute(c,b)};return b};L.prototype.fontMetrics=function(b,c){b=!this.styledMode&&/px/.test(b)||!w.getComputedStyle?b||c&&c.style&&c.style.fontSize||this.style&&this.style.fontSize:c&&u.prototype.getStyle.call(c,"font-size");b=/px/.test(b)?O(b):12;c=24>b?b+3:Math.round(1.2*b);return{h:c,b:Math.round(.8*c),f:b}};L.prototype.rotCorr=function(b,c,
+g){var d=b;c&&g&&(d=Math.max(d*Math.cos(c*m),4));return{x:-b/3*Math.sin(c*m),y:d}};L.prototype.pathToSegments=function(b){for(var c=[],g=[],d={A:8,C:7,H:2,L:3,M:3,Q:5,S:5,T:3,V:2},a=0;a<b.length;a++)K(g[0])&&x(b[a])&&g.length===d[g[0].toUpperCase()]&&b.splice(a,0,g[0].replace("M","L").replace("m","l")),"string"===typeof b[a]&&(g.length&&c.push(g.slice(0)),g.length=0),g.push(b[a]);c.push(g.slice(0));return c};L.prototype.label=function(b,c,g,d,a,k,e,r,L){return new H(this,b,c,g,d,a,k,e,r,L)};L.prototype.alignElements=
+function(){this.alignedObjects.forEach(function(b){return b.align()})};return L}();b(C.prototype,{Element:u,SVG_NS:n,escapes:{"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"},symbols:I,draw:t});G.registerRendererType("svg",C,!0);"";return C});M(f,"Core/Renderer/HTML/HTMLElement.js",[f["Core/Globals.js"],f["Core/Renderer/SVG/SVGElement.js"],f["Core/Utilities.js"]],function(a,f,C){var F=this&&this.__extends||function(){var d=function(a,e){d=Object.setPrototypeOf||{__proto__:[]}instanceof
+Array&&function(d,a){d.__proto__=a}||function(d,a){for(var e in a)a.hasOwnProperty(e)&&(d[e]=a[e])};return d(a,e)};return function(a,e){function n(){this.constructor=a}d(a,e);a.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}}(),u=a.isFirefox,H=a.isMS,I=a.isWebKit,B=a.win,z=C.css,p=C.defined,m=C.extend,e=C.pick,d=C.pInt;return function(a){function h(){return null!==a&&a.apply(this,arguments)||this}F(h,a);h.compose=function(d){if(-1===h.composedClasses.indexOf(d)){h.composedClasses.push(d);
+var a=h.prototype,e=d.prototype;e.getSpanCorrection=a.getSpanCorrection;e.htmlCss=a.htmlCss;e.htmlGetBBox=a.htmlGetBBox;e.htmlUpdateTransform=a.htmlUpdateTransform;e.setSpanRotation=a.setSpanRotation}return d};h.prototype.getSpanCorrection=function(d,a,e){this.xCorr=-d*e;this.yCorr=-a};h.prototype.htmlCss=function(d){var a="SPAN"===this.element.tagName&&d&&"width"in d,h=e(a&&d.width,void 0);if(a){delete d.width;this.textWidth=h;var l=!0}d&&"ellipsis"===d.textOverflow&&(d.whiteSpace="nowrap",d.overflow=
+"hidden");this.styles=m(this.styles,d);z(this.element,d);l&&this.htmlUpdateTransform();return this};h.prototype.htmlGetBBox=function(){var d=this.element;return{x:d.offsetLeft,y:d.offsetTop,width:d.offsetWidth,height:d.offsetHeight}};h.prototype.htmlUpdateTransform=function(){if(this.added){var a=this.renderer,e=this.element,h=this.translateX||0,l=this.translateY||0,f=this.x||0,m=this.y||0,q=this.textAlign||"left",k={left:0,center:.5,right:1}[q],c=this.styles;c=c&&c.whiteSpace;z(e,{marginLeft:h,marginTop:l});
+!a.styledMode&&this.shadows&&this.shadows.forEach(function(b){z(b,{marginLeft:h+1,marginTop:l+1})});this.inverted&&[].forEach.call(e.childNodes,function(b){a.invertChild(b,e)});if("SPAN"===e.tagName){var g=this.rotation,b=this.textWidth&&d(this.textWidth),r=[g,q,e.innerHTML,this.textWidth,this.textAlign].join(),x=void 0;x=!1;if(b!==this.oldTextWidth){if(this.textPxLength)var D=this.textPxLength;else z(e,{width:"",whiteSpace:c||"nowrap"}),D=e.offsetWidth;(b>this.oldTextWidth||D>b)&&(/[ \-]/.test(e.textContent||
+e.innerText)||"ellipsis"===e.style.textOverflow)&&(z(e,{width:D>b||g?b+"px":"auto",display:"block",whiteSpace:c||"normal"}),this.oldTextWidth=b,x=!0)}this.hasBoxWidthChanged=x;r!==this.cTT&&(x=a.fontMetrics(e.style.fontSize,e).b,!p(g)||g===(this.oldRotation||0)&&q===this.oldAlign||this.setSpanRotation(g,k,x),this.getSpanCorrection(!p(g)&&this.textPxLength||e.offsetWidth,x,k,g,q));z(e,{left:f+(this.xCorr||0)+"px",top:m+(this.yCorr||0)+"px"});this.cTT=r;this.oldRotation=g;this.oldAlign=q}}else this.alignOnAdd=
+!0};h.prototype.setSpanRotation=function(d,a,e){var h={},n=H&&!/Edge/.test(B.navigator.userAgent)?"-ms-transform":I?"-webkit-transform":u?"MozTransform":B.opera?"-o-transform":void 0;n&&(h[n]=h.transform="rotate("+d+"deg)",h[n+(u?"Origin":"-origin")]=h.transformOrigin=100*a+"% "+e+"px",z(this.element,h))};h.composedClasses=[];return h}(f)});M(f,"Core/Renderer/HTML/HTMLRenderer.js",[f["Core/Renderer/HTML/AST.js"],f["Core/Renderer/SVG/SVGElement.js"],f["Core/Renderer/SVG/SVGRenderer.js"],f["Core/Utilities.js"]],
+function(a,f,C,G){var F=this&&this.__extends||function(){var a=function(f,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,a){d.__proto__=a}||function(d,a){for(var e in a)a.hasOwnProperty(e)&&(d[e]=a[e])};return a(f,e)};return function(f,e){function d(){this.constructor=f}a(f,e);f.prototype=null===e?Object.create(e):(d.prototype=e.prototype,new d)}}(),H=G.attr,I=G.createElement,B=G.extend,z=G.pick;return function(p){function m(){return null!==p&&p.apply(this,arguments)||this}
+F(m,p);m.compose=function(a){-1===m.composedClasses.indexOf(a)&&(m.composedClasses.push(a),a.prototype.html=m.prototype.html);return a};m.prototype.html=function(e,d,l){var h=this.createElement("span"),m=h.element,n=h.renderer,p=n.isSVG,w=function(d,a){["opacity","visibility"].forEach(function(e){d[e+"Setter"]=function(k,c,g){var b=d.div?d.div.style:a;f.prototype[e+"Setter"].call(this,k,c,g);b&&(b[c]=k)}});d.addedSetters=!0};h.textSetter=function(d){d!==this.textStr&&(delete this.bBox,delete this.oldTextWidth,
+a.setElementHTML(this.element,z(d,"")),this.textStr=d,h.doTransform=!0)};p&&w(h,h.element.style);h.xSetter=h.ySetter=h.alignSetter=h.rotationSetter=function(d,a){"align"===a?h.alignValue=h.textAlign=d:h[a]=d;h.doTransform=!0};h.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};h.attr({text:e,x:Math.round(d),y:Math.round(l)}).css({position:"absolute"});n.styledMode||h.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});m.style.whiteSpace="nowrap";
+h.css=h.htmlCss;p&&(h.add=function(d){var a=n.box.parentNode,e=[];if(this.parentGroup=d){var k=d.div;if(!k){for(;d;)e.push(d),d=d.parentGroup;e.reverse().forEach(function(c){function g(b,g){c[g]=b;"translateX"===g?q.left=b+"px":q.top=b+"px";c.doTransform=!0}var b=H(c.element,"class"),d=c.styles||{};k=c.div=c.div||I("div",b?{className:b}:void 0,{position:"absolute",left:(c.translateX||0)+"px",top:(c.translateY||0)+"px",display:c.display,opacity:c.opacity,cursor:d.cursor,pointerEvents:d.pointerEvents,
+visibility:c.visibility},k||a);var q=k.style;B(c,{classSetter:function(b){return function(c){this.element.setAttribute("class",c);b.className=c}}(k),on:function(){e[0].div&&h.on.apply({element:e[0].div,onEvents:c.onEvents},arguments);return c},translateXSetter:g,translateYSetter:g});c.addedSetters||w(c)})}}else k=a;k.appendChild(m);h.added=!0;h.alignOnAdd&&h.htmlUpdateTransform();return h});return h};m.composedClasses=[];return m}(C)});M(f,"Core/Axis/AxisDefaults.js",[],function(){var a;(function(a){a.defaultXAxisOptions=
+{alignTicks:!0,allowDecimals:void 0,panningEnabled:!0,zIndex:2,zoomEnabled:!0,dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e. %b"},week:{main:"%e. %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,gridLineDashStyle:"Solid",gridZIndex:1,labels:{autoRotation:void 0,autoRotationLimit:80,distance:void 0,enabled:!0,indentation:10,overflow:"justify",padding:5,reserveSpace:void 0,
+rotation:void 0,staggerLines:0,step:0,useHTML:!1,x:0,zIndex:7,style:{color:"#666666",cursor:"default",fontSize:"11px"}},maxPadding:.01,minorGridLineDashStyle:"Solid",minorTickLength:2,minorTickPosition:"outside",minPadding:.01,offset:void 0,opposite:!1,reversed:void 0,reversedStacks:!1,showEmpty:!0,showFirstLabel:!0,showLastLabel:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside",title:{align:"middle",rotation:0,useHTML:!1,x:0,y:0,
+style:{color:"#666666"}},type:"linear",uniqueNames:!0,visible:!0,minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb",lineWidth:1,gridLineColor:"#e6e6e6",gridLineWidth:void 0,tickColor:"#ccd6eb"};a.defaultYAxisOptions={reversedStacks:!0,endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{animation:{},allowOverlap:!1,enabled:!1,crop:!0,overflow:"justify",
+formatter:function(){var a=this.axis.chart.numberFormatter;return a(this.total,-1)},style:{color:"#000000",fontSize:"11px",fontWeight:"bold",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0};a.defaultLeftAxisOptions={labels:{x:-15},title:{rotation:270}};a.defaultRightAxisOptions={labels:{x:15},title:{rotation:90}};a.defaultBottomAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};a.defaultTopAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}}})(a||
+(a={}));return a});M(f,"Core/Foundation.js",[f["Core/Utilities.js"]],function(a){var f=a.addEvent,C=a.isFunction,G=a.objectEach,u=a.removeEvent,H;(function(a){a.registerEventOptions=function(a,z){a.eventOptions=a.eventOptions||{};G(z.events,function(p,m){a.eventOptions[m]!==p&&(a.eventOptions[m]&&(u(a,m,a.eventOptions[m]),delete a.eventOptions[m]),C(p)&&(a.eventOptions[m]=p,f(a,m,p)))})}})(H||(H={}));return H});M(f,"Core/Axis/Tick.js",[f["Core/FormatUtilities.js"],f["Core/Globals.js"],f["Core/Utilities.js"]],
+function(a,f,C){var F=f.deg2rad,u=C.clamp,H=C.correctFloat,I=C.defined,B=C.destroyObjectProperties,z=C.extend,p=C.fireEvent,m=C.isNumber,e=C.merge,d=C.objectEach,l=C.pick;f=function(){function h(d,a,e,h,f){this.isNewLabel=this.isNew=!0;this.axis=d;this.pos=a;this.type=e||"";this.parameters=f||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=this.parameters.options;p(this,"init");e||h||this.addLabel()}h.prototype.addLabel=function(){var d=this,e=d.axis,h=e.options,f=e.chart,y=e.categories,
+A=e.logarithmic,q=e.names,k=d.pos,c=l(d.options&&d.options.labels,h.labels),g=e.tickPositions,b=k===g[0],r=k===g[g.length-1],x=(!c.step||1===c.step)&&1===e.tickInterval;g=g.info;var D=d.label,K;y=this.parameters.category||(y?l(y[k],q[k],k):k);A&&m(y)&&(y=H(A.lin2log(y)));if(e.dateTime)if(g){var P=f.time.resolveDTLFormat(h.dateTimeLabelFormats[!h.grid&&g.higherRanks[k]||g.unitName]);var Q=P.main}else m(y)&&(Q=e.dateTime.getXDateFormat(y,h.dateTimeLabelFormats||{}));d.isFirst=b;d.isLast=r;var O={axis:e,
+chart:f,dateTimeLabelFormat:Q,isFirst:b,isLast:r,pos:k,tick:d,tickPositionInfo:g,value:y};p(this,"labelFormat",O);var B=function(b){return c.formatter?c.formatter.call(b,b):c.format?(b.text=e.defaultLabelFormatter.call(b),a.format(c.format,b,f)):e.defaultLabelFormatter.call(b,b)};h=B.call(O,O);var F=P&&P.list;d.shortenLabel=F?function(){for(K=0;K<F.length;K++)if(z(O,{dateTimeLabelFormat:F[K]}),D.attr({text:B.call(O,O)}),D.getBBox().width<e.getSlotWidth(d)-2*c.padding)return;D.attr({text:""})}:void 0;
+x&&e._addedPlotLB&&d.moveLabel(h,c);I(D)||d.movedLabel?D&&D.textStr!==h&&!x&&(!D.textWidth||c.style.width||D.styles.width||D.css({width:null}),D.attr({text:h}),D.textPxLength=D.getBBox().width):(d.label=D=d.createLabel({x:0,y:0},h,c),d.rotation=0)};h.prototype.createLabel=function(d,a,h){var f=this.axis,n=f.chart;if(d=I(a)&&h.enabled?n.renderer.text(a,d.x,d.y,h.useHTML).add(f.labelGroup):null)n.styledMode||d.css(e(h.style)),d.textPxLength=d.getBBox().width;return d};h.prototype.destroy=function(){B(this,
+this.axis)};h.prototype.getPosition=function(d,a,e,h){var f=this.axis,n=f.chart,q=h&&n.oldChartHeight||n.chartHeight;d={x:d?H(f.translate(a+e,null,null,h)+f.transB):f.left+f.offset+(f.opposite?(h&&n.oldChartWidth||n.chartWidth)-f.right-f.left:0),y:d?q-f.bottom+f.offset-(f.opposite?f.height:0):H(q-f.translate(a+e,null,null,h)-f.transB)};d.y=u(d.y,-1E5,1E5);p(this,"afterGetPosition",{pos:d});return d};h.prototype.getLabelPosition=function(d,a,e,h,f,l,q,k){var c=this.axis,g=c.transA,b=c.isLinked&&c.linkedParent?
+c.linkedParent.reversed:c.reversed,r=c.staggerLines,x=c.tickRotCorr||{x:0,y:0},n=h||c.reserveSpaceDefault?0:-c.labelOffset*("center"===c.labelAlign?.5:1),m={},t=f.y;I(t)||(t=0===c.side?e.rotation?-8:-e.getBBox().height:2===c.side?x.y+8:Math.cos(e.rotation*F)*(x.y-e.getBBox(!1,0).height/2));d=d+f.x+n+x.x-(l&&h?l*g*(b?-1:1):0);a=a+t-(l&&!h?l*g*(b?1:-1):0);r&&(e=q/(k||1)%r,c.opposite&&(e=r-e-1),a+=c.labelOffset/r*e);m.x=d;m.y=Math.round(a);p(this,"afterGetLabelPosition",{pos:m,tickmarkOffset:l,index:q});
+return m};h.prototype.getLabelSize=function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0};h.prototype.getMarkPath=function(d,a,e,h,f,l){return l.crispLine([["M",d,a],["L",d+(f?0:-e),a+(f?e:0)]],h)};h.prototype.handleOverflow=function(d){var a=this.axis,e=a.options.labels,h=d.x,f=a.chart.chartWidth,m=a.chart.spacing,q=l(a.labelLeft,Math.min(a.pos,m[3]));m=l(a.labelRight,Math.max(a.isRadial?0:a.pos+a.len,f-m[1]));var k=this.label,c=this.rotation,g={left:0,center:.5,right:1}[a.labelAlign||
+k.attr("align")],b=k.getBBox().width,r=a.getSlotWidth(this),x={},D=r,p=1,t;if(c||"justify"!==e.overflow)0>c&&h-g*b<q?t=Math.round(h/Math.cos(c*F)-q):0<c&&h+g*b>m&&(t=Math.round((f-h)/Math.cos(c*F)));else if(f=h+(1-g)*b,h-g*b<q?D=d.x+D*(1-g)-q:f>m&&(D=m-d.x+D*g,p=-1),D=Math.min(r,D),D<r&&"center"===a.labelAlign&&(d.x+=p*(r-D-g*(r-Math.min(b,D)))),b>D||a.autoRotation&&(k.styles||{}).width)t=D;t&&(this.shortenLabel?this.shortenLabel():(x.width=Math.floor(t)+"px",(e.style||{}).textOverflow||(x.textOverflow=
+"ellipsis"),k.css(x)))};h.prototype.moveLabel=function(a,e){var h=this,f=h.label,l=h.axis,n=l.reversed,q=!1;f&&f.textStr===a?(h.movedLabel=f,q=!0,delete h.label):d(l.ticks,function(c){q||c.isNew||c===h||!c.label||c.label.textStr!==a||(h.movedLabel=c.label,q=!0,c.labelPos=h.movedLabel.xy,delete c.label)});if(!q&&(h.labelPos||f)){var k=h.labelPos||f.xy;f=l.horiz?n?0:l.width+l.left:k.x;l=l.horiz?k.y:n?l.width+l.left:0;h.movedLabel=h.createLabel({x:f,y:l},a,e);h.movedLabel&&h.movedLabel.attr({opacity:0})}};
+h.prototype.render=function(d,a,e){var h=this.axis,f=h.horiz,n=this.pos,q=l(this.tickmarkOffset,h.tickmarkOffset);n=this.getPosition(f,n,q,a);q=n.x;var k=n.y;h=f&&q===h.pos+h.len||!f&&k===h.pos?-1:1;f=l(e,this.label&&this.label.newOpacity,1);e=l(e,1);this.isActive=!0;this.renderGridLine(a,e,h);this.renderMark(n,e,h);this.renderLabel(n,a,f,d);this.isNew=!1;p(this,"afterRender")};h.prototype.renderGridLine=function(d,a,e){var h=this.axis,f=h.options,n={},q=this.pos,k=this.type,c=l(this.tickmarkOffset,
+h.tickmarkOffset),g=h.chart.renderer,b=this.gridLine,r=f.gridLineWidth,x=f.gridLineColor,D=f.gridLineDashStyle;"minor"===this.type&&(r=f.minorGridLineWidth,x=f.minorGridLineColor,D=f.minorGridLineDashStyle);b||(h.chart.styledMode||(n.stroke=x,n["stroke-width"]=r||0,n.dashstyle=D),k||(n.zIndex=1),d&&(a=0),this.gridLine=b=g.path().attr(n).addClass("highcharts-"+(k?k+"-":"")+"grid-line").add(h.gridGroup));if(b&&(e=h.getPlotLinePath({value:q+c,lineWidth:b.strokeWidth()*e,force:"pass",old:d})))b[d||this.isNew?
+"attr":"animate"]({d:e,opacity:a})};h.prototype.renderMark=function(d,a,e){var h=this.axis,f=h.options,n=h.chart.renderer,q=this.type,k=h.tickSize(q?q+"Tick":"tick"),c=d.x;d=d.y;var g=l(f["minor"!==q?"tickWidth":"minorTickWidth"],!q&&h.isXAxis?1:0);f=f["minor"!==q?"tickColor":"minorTickColor"];var b=this.mark,r=!b;k&&(h.opposite&&(k[0]=-k[0]),b||(this.mark=b=n.path().addClass("highcharts-"+(q?q+"-":"")+"tick").add(h.axisGroup),h.chart.styledMode||b.attr({stroke:f,"stroke-width":g})),b[r?"attr":"animate"]({d:this.getMarkPath(c,
+d,k[0],b.strokeWidth()*e,h.horiz,n),opacity:a}))};h.prototype.renderLabel=function(d,a,e,h){var f=this.axis,n=f.horiz,q=f.options,k=this.label,c=q.labels,g=c.step;f=l(this.tickmarkOffset,f.tickmarkOffset);var b=d.x;d=d.y;var r=!0;k&&m(b)&&(k.xy=d=this.getLabelPosition(b,d,k,n,c,f,h,g),this.isFirst&&!this.isLast&&!q.showFirstLabel||this.isLast&&!this.isFirst&&!q.showLastLabel?r=!1:!n||c.step||c.rotation||a||0===e||this.handleOverflow(d),g&&h%g&&(r=!1),r&&m(d.y)?(d.opacity=e,k[this.isNewLabel?"attr":
+"animate"](d),this.isNewLabel=!1):(k.attr("y",-9999),this.isNewLabel=!0))};h.prototype.replaceMovedLabel=function(){var d=this.label,a=this.axis,e=a.reversed;if(d&&!this.isNew){var h=a.horiz?e?a.left:a.width+a.left:d.xy.x;e=a.horiz?d.xy.y:e?a.width+a.top:a.top;d.animate({x:h,y:e,opacity:0},void 0,d.destroy);delete this.label}a.isDirty=!0;this.label=this.movedLabel;delete this.movedLabel};return h}();"";return f});M(f,"Core/Axis/Axis.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/Axis/AxisDefaults.js"],
+f["Core/Color/Color.js"],f["Core/DefaultOptions.js"],f["Core/Foundation.js"],f["Core/Globals.js"],f["Core/Axis/Tick.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H,I,B){var z=a.animObject,p=G.defaultOptions,m=u.registerEventOptions,e=H.deg2rad,d=B.arrayMax,l=B.arrayMin,h=B.clamp,t=B.correctFloat,n=B.defined,v=B.destroyObjectProperties,w=B.erase,y=B.error,A=B.extend,q=B.fireEvent,k=B.getMagnitude,c=B.isArray,g=B.isNumber,b=B.isString,r=B.merge,x=B.normalizeTickInterval,D=B.objectEach,K=B.pick,P=
+B.relativeLength,Q=B.removeEvent,O=B.splat,W=B.syncTimeout;a=function(){function a(b,c){this.zoomEnabled=this.width=this.visible=this.userOptions=this.translationSlope=this.transB=this.transA=this.top=this.ticks=this.tickRotCorr=this.tickPositions=this.tickmarkOffset=this.tickInterval=this.tickAmount=this.side=this.series=this.right=this.positiveValuesOnly=this.pos=this.pointRangePadding=this.pointRange=this.plotLinesAndBandsGroups=this.plotLinesAndBands=this.paddedTicks=this.overlap=this.options=
+this.offset=this.names=this.minPixelPadding=this.minorTicks=this.minorTickInterval=this.min=this.maxLabelLength=this.max=this.len=this.left=this.labelFormatter=this.labelEdge=this.isLinked=this.height=this.hasVisibleSeries=this.hasNames=this.eventOptions=this.coll=this.closestPointRange=this.chart=this.bottom=this.alternateBands=void 0;this.init(b,c)}a.prototype.init=function(b,c){var a=c.isX;this.chart=b;this.horiz=b.inverted&&!this.isZAxis?!a:a;this.isXAxis=a;this.coll=this.coll||(a?"xAxis":"yAxis");
+q(this,"init",{userOptions:c});this.opposite=K(c.opposite,this.opposite);this.side=K(c.side,this.side,this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);var d=this.options,e=d.labels,k=d.type;this.userOptions=c;this.minPixelPadding=0;this.reversed=K(d.reversed,this.reversed);this.visible=d.visible;this.zoomEnabled=d.zoomEnabled;this.hasNames="category"===k||!0===d.categories;this.categories=d.categories||(this.hasNames?[]:void 0);this.names||(this.names=[],this.names.keys={});this.plotLinesAndBandsGroups=
+{};this.positiveValuesOnly=!!this.logarithmic;this.isLinked=n(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.min=this.max=null;c=K(d.crosshair,O(b.options.tooltip.crosshairs)[a?0:1]);this.crosshair=!0===c?{}:c;-1===b.axes.indexOf(this)&&(a?b.axes.splice(b.xAxis.length,0,this):b.axes.push(this),b[this.coll].push(this));this.series=
+this.series||[];b.inverted&&!this.isZAxis&&a&&"undefined"===typeof this.reversed&&(this.reversed=!0);this.labelRotation=g(e.rotation)?e.rotation:void 0;m(this,d);q(this,"afterInit")};a.prototype.setOptions=function(b){this.options=r(f.defaultXAxisOptions,"yAxis"===this.coll&&f.defaultYAxisOptions,[f.defaultTopAxisOptions,f.defaultRightAxisOptions,f.defaultBottomAxisOptions,f.defaultLeftAxisOptions][this.side],r(p[this.coll],b));q(this,"afterSetOptions",{userOptions:b})};a.prototype.defaultLabelFormatter=
+function(b){var c=this.axis;b=this.chart.numberFormatter;var a=g(this.value)?this.value:NaN,d=c.chart.time,e=this.dateTimeLabelFormat,k=p.lang,r=k.numericSymbols;k=k.numericSymbolMagnitude||1E3;var h=c.logarithmic?Math.abs(a):c.tickInterval,q=r&&r.length;if(c.categories)var L=""+this.value;else if(e)L=d.dateFormat(e,a);else if(q&&1E3<=h)for(;q--&&"undefined"===typeof L;)c=Math.pow(k,q+1),h>=c&&0===10*a%c&&null!==r[q]&&0!==a&&(L=b(a/c,-1)+r[q]);"undefined"===typeof L&&(L=1E4<=Math.abs(a)?b(a,-1):b(a,
+-1,void 0,""));return L};a.prototype.getSeriesExtremes=function(){var b=this,c=b.chart,a;q(this,"getSeriesExtremes",null,function(){b.hasVisibleSeries=!1;b.dataMin=b.dataMax=b.threshold=null;b.softThreshold=!b.isXAxis;b.stacking&&b.stacking.buildStacks();b.series.forEach(function(d){if(d.visible||!c.options.chart.ignoreHiddenSeries){var e=d.options,k=e.threshold;b.hasVisibleSeries=!0;b.positiveValuesOnly&&0>=k&&(k=null);if(b.isXAxis){if(e=d.xData,e.length){e=b.logarithmic?e.filter(b.validatePositiveValue):
+e;a=d.getXExtremes(e);var r=a.min;var h=a.max;g(r)||r instanceof Date||(e=e.filter(g),a=d.getXExtremes(e),r=a.min,h=a.max);e.length&&(b.dataMin=Math.min(K(b.dataMin,r),r),b.dataMax=Math.max(K(b.dataMax,h),h))}}else if(d=d.applyExtremes(),g(d.dataMin)&&(r=d.dataMin,b.dataMin=Math.min(K(b.dataMin,r),r)),g(d.dataMax)&&(h=d.dataMax,b.dataMax=Math.max(K(b.dataMax,h),h)),n(k)&&(b.threshold=k),!e.softThreshold||b.positiveValuesOnly)b.softThreshold=!1}})});q(this,"afterGetSeriesExtremes")};a.prototype.translate=
+function(b,c,a,d,e,k){var r=this.linkedParent||this,h=d&&r.old?r.old.min:r.min,q=r.minPixelPadding;e=(r.isOrdinal||r.brokenAxis&&r.brokenAxis.hasBreaks||r.logarithmic&&e)&&r.lin2val;var f=1,L=0;d=d&&r.old?r.old.transA:r.transA;d||(d=r.transA);a&&(f*=-1,L=r.len);r.reversed&&(f*=-1,L-=f*(r.sector||r.len));c?(k=(b*f+L-q)/d+h,e&&(k=r.lin2val(k))):(e&&(b=r.val2lin(b)),b=f*(b-h)*d,k=g(h)?(r.isRadial?b:t(b))+L+f*q+(g(k)?d*k:0):void 0);return k};a.prototype.toPixels=function(b,c){return this.translate(b,
+!1,!this.horiz,null,!0)+(c?0:this.pos)};a.prototype.toValue=function(b,c){return this.translate(b-(c?0:this.pos),!0,!this.horiz,null,!0)};a.prototype.getPlotLinePath=function(b){function c(b,c,a){if("pass"!==m&&b<c||b>a)m?b=h(b,c,a):w=!0;return b}var a=this,d=a.chart,e=a.left,k=a.top,r=b.old,f=b.value,L=b.lineWidth,l=r&&d.oldChartHeight||d.chartHeight,x=r&&d.oldChartWidth||d.chartWidth,D=a.transB,n=b.translatedValue,m=b.force,p,t,A,P,w;b={value:f,lineWidth:L,old:r,force:m,acrossPanes:b.acrossPanes,
+translatedValue:n};q(this,"getPlotLinePath",b,function(b){n=K(n,a.translate(f,null,null,r));n=h(n,-1E5,1E5);p=A=Math.round(n+D);t=P=Math.round(l-n-D);g(n)?a.horiz?(t=k,P=l-a.bottom,p=A=c(p,e,e+a.width)):(p=e,A=x-a.right,t=P=c(t,k,k+a.height)):(w=!0,m=!1);b.path=w&&!m?null:d.renderer.crispLine([["M",p,t],["L",A,P]],L||1)});return b.path};a.prototype.getLinearTickPositions=function(b,c,a){var d=t(Math.floor(c/b)*b);a=t(Math.ceil(a/b)*b);var g=[],e;t(d+b)===d&&(e=20);if(this.single)return[c];for(c=d;c<=
+a;){g.push(c);c=t(c+b,e);if(c===k)break;var k=c}return g};a.prototype.getMinorTickInterval=function(){var b=this.options;return!0===b.minorTicks?K(b.minorTickInterval,"auto"):!1===b.minorTicks?null:b.minorTickInterval};a.prototype.getMinorTickPositions=function(){var b=this.options,c=this.tickPositions,a=this.minorTickInterval,d=this.pointRangePadding||0,g=this.min-d;d=this.max+d;var e=d-g,k=[];if(e&&e/a<this.len/3){var r=this.logarithmic;if(r)this.paddedTicks.forEach(function(b,c,d){c&&k.push.apply(k,
+r.getLogTickPositions(a,d[c-1],d[c],!0))});else if(this.dateTime&&"auto"===this.getMinorTickInterval())k=k.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(a),g,d,b.startOfWeek));else for(b=g+(c[0]-g)%a;b<=d&&b!==k[0];b+=a)k.push(b)}0!==k.length&&this.trimTicks(k);return k};a.prototype.adjustForMinRange=function(){var b=this.options,c=this.logarithmic,a=this.min,g=this.max,e=0,k,r,h,q;this.isXAxis&&"undefined"===typeof this.minRange&&!c&&(n(b.min)||n(b.max)||n(b.floor)||n(b.ceiling)?
+this.minRange=null:(this.series.forEach(function(b){h=b.xData;q=b.xIncrement?1:h.length-1;if(1<h.length)for(k=q;0<k;k--)if(r=h[k]-h[k-1],!e||r<e)e=r}),this.minRange=Math.min(5*e,this.dataMax-this.dataMin)));if(g-a<this.minRange){var f=this.dataMax-this.dataMin>=this.minRange;var x=this.minRange;var D=(x-g+a)/2;D=[a-D,K(b.min,a-D)];f&&(D[2]=this.logarithmic?this.logarithmic.log2lin(this.dataMin):this.dataMin);a=d(D);g=[a+x,K(b.max,a+x)];f&&(g[2]=c?c.log2lin(this.dataMax):this.dataMax);g=l(g);g-a<x&&
+(D[0]=g-x,D[1]=K(b.min,g-x),a=d(D))}this.min=a;this.max=g};a.prototype.getClosest=function(){var b;this.categories?b=1:this.series.forEach(function(c){var a=c.closestPointRange,d=c.visible||!c.chart.options.chart.ignoreHiddenSeries;!c.noSharedTooltip&&n(a)&&d&&(b=n(b)?Math.min(b,a):a)});return b};a.prototype.nameToX=function(b){var a=c(this.options.categories),d=a?this.categories:this.names,g=b.options.x;b.series.requireSorting=!1;n(g)||(g=this.options.uniqueNames&&d?a?d.indexOf(b.name):K(d.keys[b.name],
+-1):b.series.autoIncrement());if(-1===g){if(!a&&d)var e=d.length}else e=g;"undefined"!==typeof e&&(this.names[e]=b.name,this.names.keys[b.name]=e);return e};a.prototype.updateNames=function(){var b=this,c=this.names;0<c.length&&(Object.keys(c.keys).forEach(function(b){delete c.keys[b]}),c.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(c){c.xIncrement=null;if(!c.points||c.isDirtyData)b.max=Math.max(b.max,c.xData.length-1),c.processData(),c.generatePoints();c.data.forEach(function(a,
+d){if(a&&a.options&&"undefined"!==typeof a.name){var g=b.nameToX(a);"undefined"!==typeof g&&g!==a.x&&(a.x=g,c.xData[d]=g)}})}))};a.prototype.setAxisTranslation=function(){var c=this,a=c.max-c.min,d=c.linkedParent,g=!!c.categories,e=c.isXAxis,k=c.axisPointRange||0,r=0,h=0,f=c.transA;if(e||g||k){var x=c.getClosest();d?(r=d.minPointOffset,h=d.pointRangePadding):c.series.forEach(function(a){var d=g?1:e?K(a.options.pointRange,x,0):c.axisPointRange||0,q=a.options.pointPlacement;k=Math.max(k,d);if(!c.single||
+g)a=a.is("xrange")?!e:e,r=Math.max(r,a&&b(q)?0:d/2),h=Math.max(h,a&&"on"===q?0:d)});d=c.ordinal&&c.ordinal.slope&&x?c.ordinal.slope/x:1;c.minPointOffset=r*=d;c.pointRangePadding=h*=d;c.pointRange=Math.min(k,c.single&&g?1:a);e&&(c.closestPointRange=x)}c.translationSlope=c.transA=f=c.staticScale||c.len/(a+h||1);c.transB=c.horiz?c.left:c.bottom;c.minPixelPadding=f*r;q(this,"afterSetAxisTranslation")};a.prototype.minFromRange=function(){return this.max-this.range};a.prototype.setTickInterval=function(b){var c=
+this.chart,a=this.logarithmic,d=this.options,e=this.isXAxis,r=this.isLinked,h=d.tickPixelInterval,f=this.categories,l=this.softThreshold,D=d.maxPadding,m=d.minPadding,L=g(d.tickInterval)&&0<=d.tickInterval?d.tickInterval:void 0,p=g(this.threshold)?this.threshold:null;this.dateTime||f||r||this.getTickAmount();var A=K(this.userMin,d.min);var P=K(this.userMax,d.max);if(r){this.linkedParent=c[this.coll][d.linkedTo];var w=this.linkedParent.getExtremes();this.min=K(w.min,w.dataMin);this.max=K(w.max,w.dataMax);
+d.type!==this.linkedParent.options.type&&y(11,1,c)}else{if(l&&n(p))if(this.dataMin>=p)w=p,m=0;else if(this.dataMax<=p){var v=p;D=0}this.min=K(A,w,this.dataMin);this.max=K(P,v,this.dataMax)}a&&(this.positiveValuesOnly&&!b&&0>=Math.min(this.min,K(this.dataMin,this.min))&&y(10,1,c),this.min=t(a.log2lin(this.min),16),this.max=t(a.log2lin(this.max),16));this.range&&n(this.max)&&(this.userMin=this.min=A=Math.max(this.dataMin,this.minFromRange()),this.userMax=P=this.max,this.range=null);q(this,"foundExtremes");
+this.beforePadding&&this.beforePadding();this.adjustForMinRange();!(f||this.axisPointRange||this.stacking&&this.stacking.usePercentage||r)&&n(this.min)&&n(this.max)&&(c=this.max-this.min)&&(!n(A)&&m&&(this.min-=c*m),!n(P)&&D&&(this.max+=c*D));g(this.userMin)||(g(d.softMin)&&d.softMin<this.min&&(this.min=A=d.softMin),g(d.floor)&&(this.min=Math.max(this.min,d.floor)));g(this.userMax)||(g(d.softMax)&&d.softMax>this.max&&(this.max=P=d.softMax),g(d.ceiling)&&(this.max=Math.min(this.max,d.ceiling)));l&&
+n(this.dataMin)&&(p=p||0,!n(A)&&this.min<p&&this.dataMin>=p?this.min=this.options.minRange?Math.min(p,this.max-this.minRange):p:!n(P)&&this.max>p&&this.dataMax<=p&&(this.max=this.options.minRange?Math.max(p,this.min+this.minRange):p));g(this.min)&&g(this.max)&&!this.chart.polar&&this.min>this.max&&(n(this.options.min)?this.max=this.min:n(this.options.max)&&(this.min=this.max));this.tickInterval=this.min===this.max||"undefined"===typeof this.min||"undefined"===typeof this.max?1:r&&this.linkedParent&&
+!L&&h===this.linkedParent.options.tickPixelInterval?L=this.linkedParent.tickInterval:K(L,this.tickAmount?(this.max-this.min)/Math.max(this.tickAmount-1,1):void 0,f?1:(this.max-this.min)*h/Math.max(this.len,h));if(e&&!b){var Q=this.min!==(this.old&&this.old.min)||this.max!==(this.old&&this.old.max);this.series.forEach(function(b){b.forceCrop=b.forceCropping&&b.forceCropping();b.processData(Q)});q(this,"postProcessData",{hasExtemesChanged:Q})}this.setAxisTranslation();q(this,"initialAxisTranslation");
+this.pointRange&&!L&&(this.tickInterval=Math.max(this.pointRange,this.tickInterval));b=K(d.minTickInterval,this.dateTime&&!this.series.some(function(b){return b.noSharedTooltip})?this.closestPointRange:0);!L&&this.tickInterval<b&&(this.tickInterval=b);this.dateTime||this.logarithmic||L||(this.tickInterval=x(this.tickInterval,void 0,k(this.tickInterval),K(d.allowDecimals,.5>this.tickInterval||void 0!==this.tickAmount),!!this.tickAmount));this.tickAmount||(this.tickInterval=this.unsquish());this.setTickPositions()};
+a.prototype.setTickPositions=function(){var b=this.options,c=b.tickPositions,a=this.getMinorTickInterval(),d=this.hasVerticalPanning(),g="colorAxis"===this.coll,e=(g||!d)&&b.startOnTick;d=(g||!d)&&b.endOnTick;g=b.tickPositioner;this.tickmarkOffset=this.categories&&"between"===b.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a&&this.tickInterval?this.tickInterval/5:a;this.single=this.min===this.max&&n(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==
+b.allowDecimals);this.tickPositions=a=c&&c.slice();!a&&(this.ordinal&&this.ordinal.positions||!((this.max-this.min)/this.tickInterval>Math.max(2*this.len,200))?a=this.dateTime?this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,b.units),this.min,this.max,b.startOfWeek,this.ordinal&&this.ordinal.positions,this.closestPointRange,!0):this.logarithmic?this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,
+this.max):(a=[this.min,this.max],y(19,!1,this.chart)),a.length>this.len&&(a=[a[0],a.pop()],a[0]===a[1]&&(a.length=1)),this.tickPositions=a,g&&(g=g.apply(this,[this.min,this.max])))&&(this.tickPositions=a=g);this.paddedTicks=a.slice(0);this.trimTicks(a,e,d);this.isLinked||(this.single&&2>a.length&&!this.categories&&!this.series.some(function(b){return b.is("heatmap")&&"between"===b.options.pointPlacement})&&(this.min-=.5,this.max+=.5),c||g||this.adjustTickAmount());q(this,"afterSetTickPositions")};
+a.prototype.trimTicks=function(b,c,a){var d=b[0],g=b[b.length-1],e=!this.isOrdinal&&this.minPointOffset||0;q(this,"trimTicks");if(!this.isLinked){if(c&&-Infinity!==d)this.min=d;else for(;this.min-e>b[0];)b.shift();if(a)this.max=g;else for(;this.max+e<b[b.length-1];)b.pop();0===b.length&&n(d)&&!this.options.tickPositions&&b.push((g+d)/2)}};a.prototype.alignToOthers=function(){var b=this,c=[this],a=b.options,d="yAxis"===this.coll&&this.chart.options.chart.alignThresholds,e=[],k;b.thresholdAlignment=
+void 0;if((!1!==this.chart.options.chart.alignTicks&&a.alignTicks||d)&&!1!==a.startOnTick&&!1!==a.endOnTick&&!b.logarithmic){var r=function(b){var c=b.options;return[b.horiz?c.left:c.top,c.width,c.height,c.pane].join()},h=r(this);this.chart[this.coll].forEach(function(a){var d=a.series;d.length&&d.some(function(b){return b.visible})&&a!==b&&r(a)===h&&(k=!0,c.push(a))})}if(k&&d){c.forEach(function(c){c=c.getThresholdAlignment(b);g(c)&&e.push(c)});var q=1<e.length?e.reduce(function(b,c){return b+c},
+0)/e.length:void 0;c.forEach(function(b){b.thresholdAlignment=q})}return k};a.prototype.getThresholdAlignment=function(b){(!g(this.dataMin)||this!==b&&this.series.some(function(b){return b.isDirty||b.isDirtyData}))&&this.getSeriesExtremes();if(g(this.threshold))return b=h((this.threshold-(this.dataMin||0))/((this.dataMax||0)-(this.dataMin||0)),0,1),this.options.reversed&&(b=1-b),b};a.prototype.getTickAmount=function(){var b=this.options,c=b.tickPixelInterval,a=b.tickAmount;!n(b.tickInterval)&&!a&&
+this.len<c&&!this.isRadial&&!this.logarithmic&&b.startOnTick&&b.endOnTick&&(a=2);!a&&this.alignToOthers()&&(a=Math.ceil(this.len/c)+1);4>a&&(this.finalTickAmt=a,a=5);this.tickAmount=a};a.prototype.adjustTickAmount=function(){var b=this,c=b.finalTickAmt,a=b.max,d=b.min,e=b.options,k=b.tickPositions,r=b.tickAmount,h=b.thresholdAlignment,q=k&&k.length,f=K(b.threshold,b.softThreshold?0:null);var x=b.tickInterval;if(g(h)){var l=.5>h?Math.ceil(h*(r-1)):Math.floor(h*(r-1));e.reversed&&(l=r-1-l)}if(b.hasData()&&
+g(d)&&g(a)){h=function(){b.transA*=(q-1)/(r-1);b.min=e.startOnTick?k[0]:Math.min(d,k[0]);b.max=e.endOnTick?k[k.length-1]:Math.max(a,k[k.length-1])};if(g(l)&&g(b.threshold)){for(;k[l]!==f||k.length!==r||k[0]>d||k[k.length-1]<a;){k.length=0;for(k.push(b.threshold);k.length<r;)void 0===k[l]||k[l]>b.threshold?k.unshift(t(k[0]-x)):k.push(t(k[k.length-1]+x));if(x>8*b.tickInterval)break;x*=2}h()}else if(q<r){for(;k.length<r;)k.length%2||d===f?k.push(t(k[k.length-1]+x)):k.unshift(t(k[0]-x));h()}else q>r&&
+(b.tickInterval*=2,b.setTickPositions());if(n(c)){for(x=f=k.length;x--;)(3===c&&1===x%2||2>=c&&0<x&&x<f-1)&&k.splice(x,1);b.finalTickAmt=void 0}}};a.prototype.setScale=function(){var b=!1,c=!1;this.series.forEach(function(a){b=b||a.isDirtyData||a.isDirty;c=c||a.xAxis&&a.xAxis.isDirty||!1});this.setAxisSize();var a=this.len!==(this.old&&this.old.len);a||b||c||this.isLinked||this.forceRedraw||this.userMin!==(this.old&&this.old.userMin)||this.userMax!==(this.old&&this.old.userMax)||this.alignToOthers()?
+(this.stacking&&this.stacking.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.isDirty||(this.isDirty=a||this.min!==(this.old&&this.old.min)||this.max!==(this.old&&this.old.max))):this.stacking&&this.stacking.cleanStacks();b&&this.panningState&&(this.panningState.isDirty=!0);q(this,"afterSetScale")};a.prototype.setExtremes=function(b,c,a,d,g){var e=this,k=e.chart;a=K(a,!0);e.series.forEach(function(b){delete b.kdTree});g=A(g,{min:b,max:c});q(e,"setExtremes",g,
+function(){e.userMin=b;e.userMax=c;e.eventArgs=g;a&&k.redraw(d)})};a.prototype.zoom=function(b,c){var a=this,d=this.dataMin,g=this.dataMax,e=this.options,k=Math.min(d,K(e.min,d)),r=Math.max(g,K(e.max,g));b={newMin:b,newMax:c};q(this,"zoom",b,function(b){var c=b.newMin,e=b.newMax;if(c!==a.min||e!==a.max)a.allowZoomOutside||(n(d)&&(c<k&&(c=k),c>r&&(c=r)),n(g)&&(e<k&&(e=k),e>r&&(e=r))),a.displayBtn="undefined"!==typeof c||"undefined"!==typeof e,a.setExtremes(c,e,!1,void 0,{trigger:"zoom"});b.zoomed=
+!0});return b.zoomed};a.prototype.setAxisSize=function(){var b=this.chart,c=this.options,a=c.offsets||[0,0,0,0],d=this.horiz,g=this.width=Math.round(P(K(c.width,b.plotWidth-a[3]+a[1]),b.plotWidth)),e=this.height=Math.round(P(K(c.height,b.plotHeight-a[0]+a[2]),b.plotHeight)),k=this.top=Math.round(P(K(c.top,b.plotTop+a[0]),b.plotHeight,b.plotTop));c=this.left=Math.round(P(K(c.left,b.plotLeft+a[3]),b.plotWidth,b.plotLeft));this.bottom=b.chartHeight-e-k;this.right=b.chartWidth-g-c;this.len=Math.max(d?
+g:e,0);this.pos=d?c:k};a.prototype.getExtremes=function(){var b=this.logarithmic;return{min:b?t(b.lin2log(this.min)):this.min,max:b?t(b.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}};a.prototype.getThreshold=function(b){var c=this.logarithmic,a=c?c.lin2log(this.min):this.min;c=c?c.lin2log(this.max):this.max;null===b||-Infinity===b?b=a:Infinity===b?b=c:a>b?b=a:c<b&&(b=c);return this.translate(b,0,1,0,1)};a.prototype.autoLabelAlign=
+function(b){var c=(K(b,0)-90*this.side+720)%360;b={align:"center"};q(this,"autoLabelAlign",b,function(b){15<c&&165>c?b.align="right":195<c&&345>c&&(b.align="left")});return b.align};a.prototype.tickSize=function(b){var c=this.options,a=K(c["tick"===b?"tickWidth":"minorTickWidth"],"tick"===b&&this.isXAxis&&!this.categories?1:0),d=c["tick"===b?"tickLength":"minorTickLength"];if(a&&d){"inside"===c[b+"Position"]&&(d=-d);var g=[d,a]}b={tickSize:g};q(this,"afterTickSize",b);return b.tickSize};a.prototype.labelMetrics=
+function(){var b=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style.fontSize,this.ticks[b]&&this.ticks[b].label)};a.prototype.unsquish=function(){var b=this.options.labels,c=this.horiz,a=this.tickInterval,d=this.len/(((this.categories?1:0)+this.max-this.min)/a),k=b.rotation,r=this.labelMetrics(),h=Math.max(this.max-this.min,0),q=function(b){var c=b/(d||1);c=1<c?Math.ceil(c):1;c*a>h&&Infinity!==b&&Infinity!==d&&h&&(c=Math.ceil(h/a));return t(c*
+a)},f=a,x,l,D=Number.MAX_VALUE;if(c){if(!b.staggerLines&&!b.step)if(g(k))var n=[k];else d<b.autoRotationLimit&&(n=b.autoRotation);n&&n.forEach(function(b){if(b===k||b&&-90<=b&&90>=b){l=q(Math.abs(r.h/Math.sin(e*b)));var c=l+Math.abs(b/360);c<D&&(D=c,x=b,f=l)}})}else b.step||(f=q(r.h));this.autoRotation=n;this.labelRotation=K(x,g(k)?k:0);return f};a.prototype.getSlotWidth=function(b){var c=this.chart,a=this.horiz,d=this.options.labels,e=Math.max(this.tickPositions.length-(this.categories?0:1),1),k=
+c.margin[3];if(b&&g(b.slotWidth))return b.slotWidth;if(a&&2>d.step)return d.rotation?0:(this.staggerLines||1)*this.len/e;if(!a){b=d.style.width;if(void 0!==b)return parseInt(String(b),10);if(k)return k-c.spacing[3]}return.33*c.chartWidth};a.prototype.renderUnsquish=function(){var c=this.chart,a=c.renderer,d=this.tickPositions,g=this.ticks,e=this.options.labels,k=e.style,r=this.horiz,h=this.getSlotWidth(),q=Math.max(1,Math.round(h-2*e.padding)),f={},x=this.labelMetrics(),l=k.textOverflow,D=0;b(e.rotation)||
+(f.rotation=e.rotation||0);d.forEach(function(b){b=g[b];b.movedLabel&&b.replaceMovedLabel();b&&b.label&&b.label.textPxLength>D&&(D=b.label.textPxLength)});this.maxLabelLength=D;if(this.autoRotation)D>q&&D>x.h?f.rotation=this.labelRotation:this.labelRotation=0;else if(h){var n=q;if(!l){var m="clip";for(q=d.length;!r&&q--;){var p=d[q];if(p=g[p].label)p.styles&&"ellipsis"===p.styles.textOverflow?p.css({textOverflow:"clip"}):p.textPxLength>h&&p.css({width:h+"px"}),p.getBBox().height>this.len/d.length-
+(x.h-x.f)&&(p.specificTextOverflow="ellipsis")}}}f.rotation&&(n=D>.5*c.chartHeight?.33*c.chartHeight:D,l||(m="ellipsis"));if(this.labelAlign=e.align||this.autoLabelAlign(this.labelRotation))f.align=this.labelAlign;d.forEach(function(b){var c=(b=g[b])&&b.label,a=k.width,d={};c&&(c.attr(f),b.shortenLabel?b.shortenLabel():n&&!a&&"nowrap"!==k.whiteSpace&&(n<c.textPxLength||"SPAN"===c.element.tagName)?(d.width=n+"px",l||(d.textOverflow=c.specificTextOverflow||m),c.css(d)):c.styles&&c.styles.width&&!d.width&&
+!a&&c.css({width:null}),delete c.specificTextOverflow,b.rotation=f.rotation)},this);this.tickRotCorr=a.rotCorr(x.b,this.labelRotation||0,0!==this.side)};a.prototype.hasData=function(){return this.series.some(function(b){return b.hasData()})||this.options.showEmpty&&n(this.min)&&n(this.max)};a.prototype.addTitle=function(b){var c=this.chart.renderer,a=this.horiz,d=this.opposite,g=this.options.title,e=this.chart.styledMode,k;this.axisTitle||((k=g.textAlign)||(k=(a?{low:"left",middle:"center",high:"right"}:
+{low:d?"right":"left",middle:"center",high:d?"left":"right"})[g.align]),this.axisTitle=c.text(g.text||"",0,0,g.useHTML).attr({zIndex:7,rotation:g.rotation,align:k}).addClass("highcharts-axis-title"),e||this.axisTitle.css(r(g.style)),this.axisTitle.add(this.axisGroup),this.axisTitle.isNew=!0);e||g.style.width||this.isRadial||this.axisTitle.css({width:this.len+"px"});this.axisTitle[b?"show":"hide"](b)};a.prototype.generateTick=function(b){var c=this.ticks;c[b]?c[b].addLabel():c[b]=new I(this,b)};a.prototype.getOffset=
+function(){var b=this,c=this,a=c.chart,d=c.horiz,g=c.options,e=c.side,k=c.ticks,r=c.tickPositions,h=c.coll,f=c.axisParent,x=a.renderer,l=a.inverted&&!c.isZAxis?[1,0,3,2][e]:e,m=c.hasData(),p=g.title,t=g.labels,A=a.axisOffset;a=a.clipOffset;var P=[-1,1,1,-1][e],w=g.className,y,v=0,ja=0,ca=0;c.showAxis=y=m||g.showEmpty;c.staggerLines=c.horiz&&t.staggerLines||void 0;if(!c.axisGroup){var Q=function(c,a,d){return x.g(c).attr({zIndex:d}).addClass("highcharts-"+h.toLowerCase()+a+" "+(b.isRadial?"highcharts-radial-axis"+
+a+" ":"")+(w||"")).add(f)};c.gridGroup=Q("grid","-grid",g.gridZIndex);c.axisGroup=Q("axis","",g.zIndex);c.labelGroup=Q("axis-labels","-labels",t.zIndex)}m||c.isLinked?(r.forEach(function(b){c.generateTick(b)}),c.renderUnsquish(),c.reserveSpaceDefault=0===e||2===e||{1:"left",3:"right"}[e]===c.labelAlign,K(t.reserveSpace,"center"===c.labelAlign?!0:null,c.reserveSpaceDefault)&&r.forEach(function(b){ca=Math.max(k[b].getLabelSize(),ca)}),c.staggerLines&&(ca*=c.staggerLines),c.labelOffset=ca*(c.opposite?
+-1:1)):D(k,function(b,c){b.destroy();delete k[c]});if(p&&p.text&&!1!==p.enabled&&(c.addTitle(y),y&&!1!==p.reserveSpace)){c.titleOffset=v=c.axisTitle.getBBox()[d?"height":"width"];var O=p.offset;ja=n(O)?0:K(p.margin,d?5:10)}c.renderLine();c.offset=P*K(g.offset,A[e]?A[e]+(g.margin||0):0);c.tickRotCorr=c.tickRotCorr||{x:0,y:0};p=0===e?-c.labelMetrics().h:2===e?c.tickRotCorr.y:0;m=Math.abs(ca)+ja;ca&&(m=m-p+P*(d?K(t.y,c.tickRotCorr.y+8*P):t.x));c.axisTitleMargin=K(O,m);c.getMaxLabelDimensions&&(c.maxLabelDimensions=
+c.getMaxLabelDimensions(k,r));"colorAxis"!==h&&(d=this.tickSize("tick"),A[e]=Math.max(A[e],(c.axisTitleMargin||0)+v+P*c.offset,m,r&&r.length&&d?d[0]+P*c.offset:0),g=!c.axisLine||g.offset?0:2*Math.floor(c.axisLine.strokeWidth()/2),a[l]=Math.max(a[l],g));q(this,"afterGetOffset")};a.prototype.getLinePath=function(b){var c=this.chart,a=this.opposite,d=this.offset,g=this.horiz,e=this.left+(a?this.width:0)+d;d=c.chartHeight-this.bottom-(a?this.height:0)+d;a&&(b*=-1);return c.renderer.crispLine([["M",g?
+this.left:e,g?d:this.top],["L",g?c.chartWidth-this.right:e,g?d:c.chartHeight-this.bottom]],b)};a.prototype.renderLine=function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,zIndex:7}))};a.prototype.getTitlePosition=function(){var b=this.horiz,c=this.left,a=this.top,d=this.len,g=this.options.title,e=b?c:a,k=this.opposite,r=
+this.offset,h=g.x,f=g.y,x=this.axisTitle,l=this.chart.renderer.fontMetrics(g.style.fontSize,x);x=Math.max(x.getBBox(null,0).height-l.h-1,0);d={low:e+(b?0:d),middle:e+d/2,high:e+(b?d:0)}[g.align];c=(b?a+this.height:c)+(b?1:-1)*(k?-1:1)*this.axisTitleMargin+[-x,x,l.f,-x][this.side];b={x:b?d+h:c+(k?this.width:0)+r+h,y:b?c+f-(k?this.height:0)+r:d+f};q(this,"afterGetTitlePosition",{titlePosition:b});return b};a.prototype.renderMinorTick=function(b,c){var a=this.minorTicks;a[b]||(a[b]=new I(this,b,"minor"));
+c&&a[b].isNew&&a[b].render(null,!0);a[b].render(null,!1,1)};a.prototype.renderTick=function(b,c,a){var d=this.ticks;if(!this.isLinked||b>=this.min&&b<=this.max||this.grid&&this.grid.isColumn)d[b]||(d[b]=new I(this,b)),a&&d[b].isNew&&d[b].render(c,!0,-1),d[b].render(c)};a.prototype.render=function(){var b=this,c=b.chart,a=b.logarithmic,d=b.options,e=b.isLinked,k=b.tickPositions,r=b.axisTitle,h=b.ticks,f=b.minorTicks,x=b.alternateBands,l=d.stackLabels,n=d.alternateGridColor,m=b.tickmarkOffset,p=b.axisLine,
+t=b.showAxis,K=z(c.renderer.globalAnimation),A,P;b.labelEdge.length=0;b.overlap=!1;[h,f,x].forEach(function(b){D(b,function(b){b.isActive=!1})});if(b.hasData()||e){var w=b.chart.hasRendered&&b.old&&g(b.old.min);b.minorTickInterval&&!b.categories&&b.getMinorTickPositions().forEach(function(c){b.renderMinorTick(c,w)});k.length&&(k.forEach(function(c,a){b.renderTick(c,a,w)}),m&&(0===b.min||b.single)&&(h[-1]||(h[-1]=new I(b,-1,null,!0)),h[-1].render(-1)));n&&k.forEach(function(d,g){P="undefined"!==typeof k[g+
+1]?k[g+1]+m:b.max-m;0===g%2&&d<b.max&&P<=b.max+(c.polar?-m:m)&&(x[d]||(x[d]=new H.PlotLineOrBand(b)),A=d+m,x[d].options={from:a?a.lin2log(A):A,to:a?a.lin2log(P):P,color:n,className:"highcharts-alternate-grid"},x[d].render(),x[d].isActive=!0)});b._addedPlotLB||(b._addedPlotLB=!0,(d.plotLines||[]).concat(d.plotBands||[]).forEach(function(c){b.addPlotBandOrLine(c)}))}[h,f,x].forEach(function(b){var a=[],d=K.duration;D(b,function(b,c){b.isActive||(b.render(c,!1,0),b.isActive=!1,a.push(c))});W(function(){for(var c=
+a.length;c--;)b[a[c]]&&!b[a[c]].isActive&&(b[a[c]].destroy(),delete b[a[c]])},b!==x&&c.hasRendered&&d?d:0)});p&&(p[p.isPlaced?"animate":"attr"]({d:this.getLinePath(p.strokeWidth())}),p.isPlaced=!0,p[t?"show":"hide"](t));r&&t&&(d=b.getTitlePosition(),g(d.y)?(r[r.isNew?"attr":"animate"](d),r.isNew=!1):(r.attr("y",-9999),r.isNew=!0));l&&l.enabled&&b.stacking&&b.stacking.renderStackTotals();b.old={len:b.len,max:b.max,min:b.min,transA:b.transA,userMax:b.userMax,userMin:b.userMin};b.isDirty=!1;q(this,"afterRender")};
+a.prototype.redraw=function(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(b){b.render()}));this.series.forEach(function(b){b.isDirty=!0})};a.prototype.getKeepProps=function(){return this.keepProps||a.keepProps};a.prototype.destroy=function(b){var c=this,a=c.plotLinesAndBands,d=this.eventOptions;q(this,"destroy",{keepEvents:b});b||Q(c);[c.ticks,c.minorTicks,c.alternateBands].forEach(function(b){v(b)});if(a)for(b=a.length;b--;)a[b].destroy();"axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar".split(" ").forEach(function(b){c[b]&&
+(c[b]=c[b].destroy())});for(var g in c.plotLinesAndBandsGroups)c.plotLinesAndBandsGroups[g]=c.plotLinesAndBandsGroups[g].destroy();D(c,function(b,a){-1===c.getKeepProps().indexOf(a)&&delete c[a]});this.eventOptions=d};a.prototype.drawCrosshair=function(b,c){var a=this.crosshair,d=K(a&&a.snap,!0),g=this.chart,e,k=this.cross;q(this,"drawCrosshair",{e:b,point:c});b||(b=this.cross&&this.cross.e);if(a&&!1!==(n(c)||!d)){d?n(c)&&(e=K("colorAxis"!==this.coll?c.crosshairPos:null,this.isXAxis?c.plotX:this.len-
+c.plotY)):e=b&&(this.horiz?b.chartX-this.pos:this.len-b.chartY+this.pos);if(n(e)){var r={value:c&&(this.isXAxis?c.x:K(c.stackY,c.y)),translatedValue:e};g.polar&&A(r,{isCrosshair:!0,chartX:b&&b.chartX,chartY:b&&b.chartY,point:c});r=this.getPlotLinePath(r)||null}if(!n(r)){this.hideCrosshair();return}d=this.categories&&!this.isRadial;k||(this.cross=k=g.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(d?"category ":"thin ")+(a.className||"")).attr({zIndex:K(a.zIndex,2)}).add(),g.styledMode||
+(k.attr({stroke:a.color||(d?C.parse("#ccd6eb").setOpacity(.25).get():"#cccccc"),"stroke-width":K(a.width,1)}).css({"pointer-events":"none"}),a.dashStyle&&k.attr({dashstyle:a.dashStyle})));k.show().attr({d:r});d&&!a.width&&k.attr({"stroke-width":this.transA});this.cross.e=b}else this.hideCrosshair();q(this,"afterDrawCrosshair",{e:b,point:c})};a.prototype.hideCrosshair=function(){this.cross&&this.cross.hide();q(this,"afterHideCrosshair")};a.prototype.hasVerticalPanning=function(){var b=this.chart.options.chart.panning;
+return!!(b&&b.enabled&&/y/.test(b.type))};a.prototype.validatePositiveValue=function(b){return g(b)&&0<b};a.prototype.update=function(b,c){var a=this.chart;b=r(this.userOptions,b);this.destroy(!0);this.init(a,b);a.isDirtyBox=!0;K(c,!0)&&a.redraw()};a.prototype.remove=function(b){for(var c=this.chart,a=this.coll,d=this.series,g=d.length;g--;)d[g]&&d[g].remove(!1);w(c.axes,this);w(c[a],this);c[a].forEach(function(b,c){b.options.index=b.userOptions.index=c});this.destroy();c.isDirtyBox=!0;K(b,!0)&&c.redraw()};
+a.prototype.setTitle=function(b,c){this.update({title:b},c)};a.prototype.setCategories=function(b,c){this.update({categories:b},c)};a.defaultOptions=f.defaultXAxisOptions;a.keepProps="extKey hcEvents names series userMax userMin".split(" ");return a}();"";return a});M(f,"Core/Axis/DateTimeAxis.js",[f["Core/Utilities.js"]],function(a){var f=a.addEvent,C=a.getMagnitude,G=a.normalizeTickInterval,u=a.timeUnits,H;(function(a){function B(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)}
+function z(a){"datetime"!==a.userOptions.type?this.dateTime=void 0:this.dateTime||(this.dateTime=new m(this))}var p=[];a.compose=function(a){-1===p.indexOf(a)&&(p.push(a),a.keepProps.push("dateTime"),a.prototype.getTimeTicks=B,f(a,"init",z));return a};var m=function(){function a(a){this.axis=a}a.prototype.normalizeTimeTickInterval=function(a,e){var d=e||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],
+["week",[1,2]],["month",[1,2,3,4,6]],["year",null]];e=d[d.length-1];var f=u[e[0]],l=e[1],m;for(m=0;m<d.length&&!(e=d[m],f=u[e[0]],l=e[1],d[m+1]&&a<=(f*l[l.length-1]+u[d[m+1][0]])/2);m++);f===u.year&&a<5*f&&(l=[1,2,5]);a=G(a/f,l,"year"===e[0]?Math.max(C(a/f),1):1);return{unitRange:f,count:a,unitName:e[0]}};a.prototype.getXDateFormat=function(a,e){var d=this.axis;return d.closestPointRange?d.chart.time.getDateFormat(d.closestPointRange,a,d.options.startOfWeek,e)||e.year:e.day};return a}();a.Additions=
+m})(H||(H={}));return H});M(f,"Core/Axis/LogarithmicAxis.js",[f["Core/Utilities.js"]],function(a){var f=a.addEvent,C=a.getMagnitude,G=a.normalizeTickInterval,u=a.pick,H;(function(a){function B(a){var d=this.logarithmic;"logarithmic"!==a.userOptions.type?this.logarithmic=void 0:d||(this.logarithmic=new m(this))}function z(){var a=this.logarithmic;a&&(this.lin2val=function(d){return a.lin2log(d)},this.val2lin=function(d){return a.log2lin(d)})}var p=[];a.compose=function(a){-1===p.indexOf(a)&&(p.push(a),
+a.keepProps.push("logarithmic"),f(a,"init",B),f(a,"afterInit",z));return a};var m=function(){function a(a){this.axis=a}a.prototype.getLogTickPositions=function(a,e,h,f){var d=this.axis,l=d.len,m=d.options,p=[];f||(this.minorAutoInterval=void 0);if(.5<=a)a=Math.round(a),p=d.getLinearTickPositions(a,e,h);else if(.08<=a){var t=Math.floor(e),q,k=m=void 0;for(l=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];t<h+1&&!k;t++){var c=l.length;for(q=0;q<c&&!k;q++){var g=this.log2lin(this.lin2log(t)*l[q]);
+g>e&&(!f||m<=h)&&"undefined"!==typeof m&&p.push(m);m>h&&(k=!0);m=g}}}else e=this.lin2log(e),h=this.lin2log(h),a=f?d.getMinorTickInterval():m.tickInterval,a=u("auto"===a?null:a,this.minorAutoInterval,m.tickPixelInterval/(f?5:1)*(h-e)/((f?l/d.tickPositions.length:l)||1)),a=G(a,void 0,C(a)),p=d.getLinearTickPositions(a,e,h).map(this.log2lin),f||(this.minorAutoInterval=a/5);f||(d.tickInterval=a);return p};a.prototype.lin2log=function(a){return Math.pow(10,a)};a.prototype.log2lin=function(a){return Math.log(a)/
+Math.LN10};return a}();a.Additions=m})(H||(H={}));return H});M(f,"Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js",[f["Core/Utilities.js"]],function(a){var f=a.erase,C=a.extend,G=a.isNumber,u;(function(a){var u=[],B;a.compose=function(a,f){B||(B=a);-1===u.indexOf(f)&&(u.push(f),C(f.prototype,z.prototype));return f};var z=function(){function a(){}a.prototype.getPlotBandPath=function(a,e,d){void 0===d&&(d=this.options);var f=this.getPlotLinePath({value:e,force:!0,acrossPanes:d.acrossPanes}),h=[],m=this.horiz;
+e=!G(this.min)||!G(this.max)||a<this.min&&e<this.min||a>this.max&&e>this.max;a=this.getPlotLinePath({value:a,force:!0,acrossPanes:d.acrossPanes});d=1;if(a&&f){if(e){var n=a.toString()===f.toString();d=0}for(e=0;e<a.length;e+=2){var p=a[e],w=a[e+1],y=f[e],A=f[e+1];"M"!==p[0]&&"L"!==p[0]||"M"!==w[0]&&"L"!==w[0]||"M"!==y[0]&&"L"!==y[0]||"M"!==A[0]&&"L"!==A[0]||(m&&y[1]===p[1]?(y[1]+=d,A[1]+=d):m||y[2]!==p[2]||(y[2]+=d,A[2]+=d),h.push(["M",p[1],p[2]],["L",w[1],w[2]],["L",A[1],A[2]],["L",y[1],y[2]],["Z"]));
+h.isFlat=n}}return h};a.prototype.addPlotBand=function(a){return this.addPlotBandOrLine(a,"plotBands")};a.prototype.addPlotLine=function(a){return this.addPlotBandOrLine(a,"plotLines")};a.prototype.addPlotBandOrLine=function(a,e){var d=this,f=this.userOptions,h=new B(this,a);this.visible&&(h=h.render());if(h){this._addedPlotLB||(this._addedPlotLB=!0,(f.plotLines||[]).concat(f.plotBands||[]).forEach(function(a){d.addPlotBandOrLine(a)}));if(e){var m=f[e]||[];m.push(a);f[e]=m}this.plotLinesAndBands.push(h)}return h};
+a.prototype.removePlotBandOrLine=function(a){var e=this.plotLinesAndBands,d=this.options,l=this.userOptions;if(e){for(var h=e.length;h--;)e[h].id===a&&e[h].destroy();[d.plotLines||[],l.plotLines||[],d.plotBands||[],l.plotBands||[]].forEach(function(d){for(h=d.length;h--;)(d[h]||{}).id===a&&f(d,d[h])})}};a.prototype.removePlotBand=function(a){this.removePlotBandOrLine(a)};a.prototype.removePlotLine=function(a){this.removePlotBandOrLine(a)};return a}()})(u||(u={}));return u});M(f,"Core/Axis/PlotLineOrBand/PlotLineOrBand.js",
+[f["Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js"],f["Core/Utilities.js"]],function(a,f){var F=f.arrayMax,G=f.arrayMin,u=f.defined,H=f.destroyObjectProperties,I=f.erase,B=f.fireEvent,z=f.merge,p=f.objectEach,m=f.pick;f=function(){function e(a,e){this.axis=a;e&&(this.options=e,this.id=e.id)}e.compose=function(d){return a.compose(e,d)};e.prototype.render=function(){B(this,"render");var a=this,e=a.axis,f=e.horiz,t=e.logarithmic,n=a.options,v=n.color,w=m(n.zIndex,0),y=n.events,A={},q=e.chart.renderer,
+k=n.label,c=a.label,g=n.to,b=n.from,r=n.value,x=a.svgElem,D=[],K=u(b)&&u(g);D=u(r);var P=!x,Q={"class":"highcharts-plot-"+(K?"band ":"line ")+(n.className||"")},O=K?"bands":"lines";t&&(b=t.log2lin(b),g=t.log2lin(g),r=t.log2lin(r));e.chart.styledMode||(D?(Q.stroke=v||"#999999",Q["stroke-width"]=m(n.width,1),n.dashStyle&&(Q.dashstyle=n.dashStyle)):K&&(Q.fill=v||"#e6ebf5",n.borderWidth&&(Q.stroke=n.borderColor,Q["stroke-width"]=n.borderWidth)));A.zIndex=w;O+="-"+w;(t=e.plotLinesAndBandsGroups[O])||(e.plotLinesAndBandsGroups[O]=
+t=q.g("plot-"+O).attr(A).add());P&&(a.svgElem=x=q.path().attr(Q).add(t));if(D)D=e.getPlotLinePath({value:r,lineWidth:x.strokeWidth(),acrossPanes:n.acrossPanes});else if(K)D=e.getPlotBandPath(b,g,n);else return;!a.eventsAdded&&y&&(p(y,function(b,c){x.on(c,function(b){y[c].apply(a,[b])})}),a.eventsAdded=!0);(P||!x.d)&&D&&D.length?x.attr({d:D}):x&&(D?(x.show(!0),x.animate({d:D})):x.d&&(x.hide(),c&&(a.label=c=c.destroy())));k&&(u(k.text)||u(k.formatter))&&D&&D.length&&0<e.width&&0<e.height&&!D.isFlat?
+(k=z({align:f&&K&&"center",x:f?!K&&4:10,verticalAlign:!f&&K&&"middle",y:f?K?16:10:K?6:-4,rotation:f&&!K&&90},k),this.renderLabel(k,D,K,w)):c&&c.hide();return a};e.prototype.renderLabel=function(a,e,f,m){var d=this.axis,h=d.chart.renderer,l=this.label;l||(this.label=l=h.text(this.getLabelText(a),0,0,a.useHTML).attr({align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(f?"band":"line")+"-label "+(a.className||""),zIndex:m}).add(),d.chart.styledMode||l.css(z({textOverflow:"ellipsis"},
+a.style)));m=e.xBounds||[e[0][1],e[1][1],f?e[2][1]:e[0][1]];e=e.yBounds||[e[0][2],e[1][2],f?e[2][2]:e[0][2]];f=G(m);h=G(e);l.align(a,!1,{x:f,y:h,width:F(m)-f,height:F(e)-h});l.alignValue&&"left"!==l.alignValue||l.css({width:(90===l.rotation?d.height-(l.alignAttr.y-d.top):d.width-(l.alignAttr.x-d.left))+"px"});l.show(!0)};e.prototype.getLabelText=function(a){return u(a.formatter)?a.formatter.call(this):a.text};e.prototype.destroy=function(){I(this.axis.plotLinesAndBands,this);delete this.axis;H(this)};
+return e}();"";"";return f});M(f,"Core/Tooltip.js",[f["Core/FormatUtilities.js"],f["Core/Globals.js"],f["Core/Renderer/RendererUtilities.js"],f["Core/Renderer/RendererRegistry.js"],f["Core/Utilities.js"]],function(a,f,C,G,u){var F=a.format,I=f.doc,B=C.distribute,z=u.addEvent,p=u.clamp,m=u.css,e=u.defined,d=u.discardElement,l=u.extend,h=u.fireEvent,t=u.isArray,n=u.isNumber,v=u.isString,w=u.merge,y=u.pick,A=u.splat,q=u.syncTimeout;a=function(){function a(c,a){this.allowShared=!0;this.container=void 0;
+this.crosshairs=[];this.distance=0;this.isHidden=!0;this.isSticky=!1;this.now={};this.options={};this.outside=!1;this.chart=c;this.init(c,a)}a.prototype.applyFilter=function(){var c=this.chart;c.renderer.definition({tagName:"filter",attributes:{id:"drop-shadow-"+c.index,opacity:.5},children:[{tagName:"feGaussianBlur",attributes:{"in":"SourceAlpha",stdDeviation:1}},{tagName:"feOffset",attributes:{dx:1,dy:1}},{tagName:"feComponentTransfer",children:[{tagName:"feFuncA",attributes:{type:"linear",slope:.3}}]},
+{tagName:"feMerge",children:[{tagName:"feMergeNode"},{tagName:"feMergeNode",attributes:{"in":"SourceGraphic"}}]}]})};a.prototype.bodyFormatter=function(c){return c.map(function(c){var b=c.series.tooltipOptions;return(b[(c.point.formatPrefix||"point")+"Formatter"]||c.point.tooltipFormatter).call(c.point,b[(c.point.formatPrefix||"point")+"Format"]||"")})};a.prototype.cleanSplit=function(c){this.chart.series.forEach(function(a){var b=a&&a.tt;b&&(!b.isActive||c?a.tt=b.destroy():b.isActive=!1)})};a.prototype.defaultFormatter=
+function(c){var a=this.points||A(this);var b=[c.tooltipFooterHeaderFormatter(a[0])];b=b.concat(c.bodyFormatter(a));b.push(c.tooltipFooterHeaderFormatter(a[0],!0));return b};a.prototype.destroy=function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),d(this.container));u.clearTimeout(this.hideTimer);u.clearTimeout(this.tooltipTimeout)};a.prototype.getAnchor=function(c,a){var b=
+this.chart,d=b.pointer,g=b.inverted,e=b.plotTop,k=b.plotLeft,f,h,q=0,l=0;c=A(c);this.followPointer&&a?("undefined"===typeof a.chartX&&(a=d.normalize(a)),d=[a.chartX-k,a.chartY-e]):c[0].tooltipPos?d=c[0].tooltipPos:(c.forEach(function(c){f=c.series.yAxis;h=c.series.xAxis;q+=c.plotX||0;l+=c.plotLow?(c.plotLow+(c.plotHigh||0))/2:c.plotY||0;h&&f&&(g?(q+=e+b.plotHeight-h.len-h.pos,l+=k+b.plotWidth-f.len-f.pos):(q+=h.pos-k,l+=f.pos-e))}),q/=c.length,l/=c.length,d=[g?b.plotWidth-l:q,g?b.plotHeight-q:l],
+this.shared&&1<c.length&&a&&(g?d[0]=a.chartX-k:d[1]=a.chartY-e));return d.map(Math.round)};a.prototype.getLabel=function(){var c=this,a=this.chart.styledMode,b=this.options,d=this.split&&this.allowShared,k="tooltip"+(e(b.className)?" "+b.className:""),h=b.style.pointerEvents||(!this.followPointer&&b.stickOnContact?"auto":"none"),q=function(){c.inContact=!0},l=function(b){var a=c.chart.hoverSeries;c.inContact=c.shouldStickOnContact()&&c.chart.pointer.inClass(b.relatedTarget,"highcharts-tooltip");if(!c.inContact&&
+a&&a.onMouseOut)a.onMouseOut()},n,p=this.chart.renderer;if(c.label){var t=!c.label.hasClass("highcharts-label");(d&&!t||!d&&t)&&c.destroy()}if(!this.label){if(this.outside){t=this.chart.options.chart.style;var A=G.getRendererType();this.container=n=f.doc.createElement("div");n.className="highcharts-tooltip-container";m(n,{position:"absolute",top:"1px",pointerEvents:h,zIndex:Math.max(this.options.style.zIndex||0,(t&&t.zIndex||0)+3)});z(n,"mouseenter",q);z(n,"mouseleave",l);f.doc.body.appendChild(n);
+this.renderer=p=new A(n,0,0,t,void 0,void 0,p.styledMode)}d?this.label=p.g(k):(this.label=p.label("",0,0,b.shape,void 0,void 0,b.useHTML,void 0,k).attr({padding:b.padding,r:b.borderRadius}),a||this.label.attr({fill:b.backgroundColor,"stroke-width":b.borderWidth}).css(b.style).css({pointerEvents:h}).shadow(b.shadow));a&&b.shadow&&(this.applyFilter(),this.label.attr({filter:"url(#drop-shadow-"+this.chart.index+")"}));if(c.outside&&!c.split){var w=this.label,y=w.xSetter,v=w.ySetter;w.xSetter=function(b){y.call(w,
+c.distance);n.style.left=b+"px"};w.ySetter=function(b){v.call(w,c.distance);n.style.top=b+"px"}}this.label.on("mouseenter",q).on("mouseleave",l).attr({zIndex:8}).add()}return this.label};a.prototype.getPosition=function(c,a,b){var d=this.chart,g=this.distance,e={},k=d.inverted&&b.h||0,f=this.outside,h=f?I.documentElement.clientWidth-2*g:d.chartWidth,q=f?Math.max(I.body.scrollHeight,I.documentElement.scrollHeight,I.body.offsetHeight,I.documentElement.offsetHeight,I.documentElement.clientHeight):d.chartHeight,
+l=d.pointer.getChartPosition(),m=function(e){var k="x"===e;return[e,k?h:q,k?c:a].concat(f?[k?c*l.scaleX:a*l.scaleY,k?l.left-g+(b.plotX+d.plotLeft)*l.scaleX:l.top-g+(b.plotY+d.plotTop)*l.scaleY,0,k?h:q]:[k?c:a,k?b.plotX+d.plotLeft:b.plotY+d.plotTop,k?d.plotLeft:d.plotTop,k?d.plotLeft+d.plotWidth:d.plotTop+d.plotHeight])},n=m("y"),p=m("x"),t;m=!!b.negative;!d.polar&&d.hoverSeries&&d.hoverSeries.yAxis&&d.hoverSeries.yAxis.reversed&&(m=!m);var A=!this.followPointer&&y(b.ttBelow,!d.inverted===m),w=function(b,
+c,a,d,r,h,q){var x=f?"y"===b?g*l.scaleY:g*l.scaleX:g,m=(a-d)/2,E=d<r-g,n=r+g+d<c,D=r-x-a+m;r=r+x-m;if(A&&n)e[b]=r;else if(!A&&E)e[b]=D;else if(E)e[b]=Math.min(q-d,0>D-k?D:D-k);else if(n)e[b]=Math.max(h,r+k+a>c?r:r+k);else return!1},v=function(b,c,a,d,k){var r;k<g||k>c-g?r=!1:e[b]=k<a/2?1:k>c-d/2?c-d-2:k-a/2;return r},E=function(b){var c=n;n=p;p=c;t=b},T=function(){!1!==w.apply(0,n)?!1!==v.apply(0,p)||t||(E(!0),T()):t?e.x=e.y=0:(E(!0),T())};(d.inverted||1<this.len)&&E();T();return e};a.prototype.hide=
+function(c){var a=this;u.clearTimeout(this.hideTimer);c=y(c,this.options.hideDelay);this.isHidden||(this.hideTimer=q(function(){a.getLabel().fadeOut(c?void 0:c);a.isHidden=!0},c))};a.prototype.init=function(c,a){this.chart=c;this.options=a;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=a.split&&!c.inverted&&!c.polar;this.shared=a.shared||this.split;this.outside=y(a.outside,!(!c.scrollablePixelsX&&!c.scrollablePixelsY))};a.prototype.shouldStickOnContact=function(){return!(this.followPointer||
+!this.options.stickOnContact)};a.prototype.isStickyOnContact=function(){return!(!this.shouldStickOnContact()||!this.inContact)};a.prototype.move=function(c,a,b,d){var g=this,e=g.now,k=!1!==g.options.animation&&!g.isHidden&&(1<Math.abs(c-e.x)||1<Math.abs(a-e.y)),r=g.followPointer||1<g.len;l(e,{x:k?(2*e.x+c)/3:c,y:k?(e.y+a)/2:a,anchorX:r?void 0:k?(2*e.anchorX+b)/3:b,anchorY:r?void 0:k?(e.anchorY+d)/2:d});g.getLabel().attr(e);g.drawTracker();k&&(u.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=
+setTimeout(function(){g&&g.move(c,a,b,d)},32))};a.prototype.refresh=function(c,a){var b=this.chart,d=this.options,g=A(c),e=g[0],k=[],f=d.formatter||this.defaultFormatter,q=this.shared,l=b.styledMode,m={};if(d.enabled&&e.series){u.clearTimeout(this.hideTimer);this.allowShared=!(!t(c)&&c.series&&c.series.noSharedTooltip);this.followPointer=!this.split&&e.series.tooltipOptions.followPointer;c=this.getAnchor(c,a);var n=c[0],p=c[1];q&&this.allowShared?(b.pointer.applyInactiveState(g),g.forEach(function(b){b.setState("hover");
+k.push(b.getLabelConfig())}),m={x:e.category,y:e.y},m.points=k):m=e.getLabelConfig();this.len=k.length;f=f.call(m,this);q=e.series;this.distance=y(q.tooltipOptions.distance,16);if(!1===f)this.hide();else{if(this.split&&this.allowShared)this.renderSplit(f,g);else{var w=n,v=p;a&&b.pointer.isDirectTouch&&(w=a.chartX-b.plotLeft,v=a.chartY-b.plotTop);if(b.polar||!1===q.options.clip||g.some(function(b){return b.series.shouldShowTooltip(w,v)}))a=this.getLabel(),d.style.width&&!l||a.css({width:this.chart.spacingBox.width+
+"px"}),a.attr({text:f&&f.join?f.join(""):f}),a.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+y(e.colorIndex,q.colorIndex)),l||a.attr({stroke:d.borderColor||e.color||q.color||"#666666"}),this.updatePosition({plotX:n,plotY:p,negative:e.negative,ttBelow:e.ttBelow,h:c[2]||0});else{this.hide();return}}this.isHidden&&this.label&&this.label.attr({opacity:1}).show();this.isHidden=!1}h(this,"refresh")}};a.prototype.renderSplit=function(c,a){function b(b,c,a,g,e){void 0===e&&(e=!0);a?
+(c=X?0:H,b=p(b-g/2,N.left,N.right-g-(d.outside?S:0))):(c-=C,b=e?b-g-F:b+F,b=p(b,e?b:N.left,N.right));return{x:b,y:c}}var d=this,g=d.chart,e=d.chart,k=e.chartWidth,f=e.chartHeight,h=e.plotHeight,q=e.plotLeft,m=e.plotTop,n=e.pointer,t=e.scrollablePixelsY;t=void 0===t?0:t;var A=e.scrollablePixelsX,w=e.scrollingContainer;w=void 0===w?{scrollLeft:0,scrollTop:0}:w;var z=w.scrollLeft;w=w.scrollTop;var u=e.styledMode,F=d.distance,E=d.options,T=d.options.positioner,N=d.outside&&"number"!==typeof A?I.documentElement.getBoundingClientRect():
+{left:z,right:z+k,top:w,bottom:w+f},U=d.getLabel(),V=this.renderer||g.renderer,X=!(!g.xAxis[0]||!g.xAxis[0].opposite);g=n.getChartPosition();var S=g.left;g=g.top;var C=m+w,aa=0,H=h-t;v(c)&&(c=[!1,c]);c=c.slice(0,a.length+1).reduce(function(c,g,e){if(!1!==g&&""!==g){e=a[e-1]||{isHeader:!0,plotX:a[0].plotX,plotY:h,series:{}};var k=e.isHeader,f=k?d:e.series;g=g.toString();var r=f.tt,l=e.isHeader;var x=e.series;var n="highcharts-color-"+y(e.colorIndex,x.colorIndex,"none");r||(r={padding:E.padding,r:E.borderRadius},
+u||(r.fill=E.backgroundColor,r["stroke-width"]=E.borderWidth),r=V.label("",0,0,E[l?"headerShape":"shape"],void 0,void 0,E.useHTML).addClass((l?"highcharts-tooltip-header ":"")+"highcharts-tooltip-box "+n).attr(r).add(U));r.isActive=!0;r.attr({text:g});u||r.css(E.style).shadow(E.shadow).attr({stroke:E.borderColor||e.color||x.color||"#333333"});f=f.tt=r;l=f.getBBox();g=l.width+f.strokeWidth();k&&(aa=l.height,H+=aa,X&&(C-=aa));x=e.plotX;x=void 0===x?0:x;n=e.plotY;n=void 0===n?0:n;r=e.series;if(e.isHeader){x=
+q+x;var D=m+h/2}else{var t=r.xAxis,A=r.yAxis;x=t.pos+p(x,-F,t.len+F);r.shouldShowTooltip(0,A.pos-m+n,{ignoreX:!0})&&(D=A.pos+n)}x=p(x,N.left-F,N.right+F);"number"===typeof D?(l=l.height+1,n=T?T.call(d,g,l,e):b(x,D,k,g),c.push({align:T?0:void 0,anchorX:x,anchorY:D,boxWidth:g,point:e,rank:y(n.rank,k?1:0),size:l,target:n.y,tt:f,x:n.x})):f.isActive=!1}return c},[]);!T&&c.some(function(b){var c=(d.outside?S:0)+b.anchorX;return c<N.left&&c+b.boxWidth<N.right?!0:c<S-N.left+b.boxWidth&&N.right-c>c})&&(c=
+c.map(function(c){var a=b(c.anchorX,c.anchorY,c.point.isHeader,c.boxWidth,!1);return l(c,{target:a.y,x:a.x})}));d.cleanSplit();B(c,H);var G=S,ba=S;c.forEach(function(b){var c=b.x,a=b.boxWidth;b=b.isHeader;b||(d.outside&&S+c<G&&(G=S+c),!b&&d.outside&&G+a>ba&&(ba=S+c))});c.forEach(function(b){var c=b.x,a=b.anchorX,g=b.pos,e=b.point.isHeader;g={visibility:"undefined"===typeof g?"hidden":"inherit",x:c,y:g+C,anchorX:a,anchorY:b.anchorY};if(d.outside&&c<a){var k=S-G;0<k&&(e||(g.x=c+k,g.anchorX=a+k),e&&
+(g.x=(ba-G)/2,g.anchorX=a+k))}b.tt.attr(g)});c=d.container;t=d.renderer;d.outside&&c&&t&&(e=U.getBBox(),t.setSize(e.width+e.x,e.height+e.y,!1),c.style.left=G+"px",c.style.top=g+"px")};a.prototype.drawTracker=function(){if(this.followPointer||!this.options.stickOnContact)this.tracker&&this.tracker.destroy();else{var c=this.chart,a=this.label,b=this.shared?c.hoverPoints:c.hoverPoint;if(a&&b){var d={x:0,y:0,width:0,height:0};b=this.getAnchor(b);var e=a.getBBox();b[0]+=c.plotLeft-a.translateX;b[1]+=c.plotTop-
+a.translateY;d.x=Math.min(0,b[0]);d.y=Math.min(0,b[1]);d.width=0>b[0]?Math.max(Math.abs(b[0]),e.width-b[0]):Math.max(Math.abs(b[0]),e.width);d.height=0>b[1]?Math.max(Math.abs(b[1]),e.height-Math.abs(b[1])):Math.max(Math.abs(b[1]),e.height);this.tracker?this.tracker.attr(d):(this.tracker=a.renderer.rect(d).addClass("highcharts-tracker").add(a),c.styledMode||this.tracker.attr({fill:"rgba(0,0,0,0)"}))}}};a.prototype.styledModeFormat=function(c){return c.replace('style="font-size: 10px"','class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,
+'class="highcharts-color-{$1.colorIndex}"')};a.prototype.tooltipFooterHeaderFormatter=function(c,a){var b=c.series,d=b.tooltipOptions,g=b.xAxis,e=g&&g.dateTime;g={isFooter:a,labelConfig:c};var k=d.xDateFormat,f=d[a?"footerFormat":"headerFormat"];h(this,"headerFormatter",g,function(a){e&&!k&&n(c.key)&&(k=e.getXDateFormat(c.key,d.dateTimeLabelFormats));e&&k&&(c.point&&c.point.tooltipDateKeys||["key"]).forEach(function(b){f=f.replace("{point."+b+"}","{point."+b+":"+k+"}")});b.chart.styledMode&&(f=this.styledModeFormat(f));
+a.text=F(f,{point:c,series:b},this.chart)});return g.text};a.prototype.update=function(c){this.destroy();w(!0,this.chart.options.tooltip.userOptions,c);this.init(this.chart,w(!0,this.options,c))};a.prototype.updatePosition=function(c){var a=this.chart,b=this.options,d=a.pointer,e=this.getLabel();d=d.getChartPosition();var k=(b.positioner||this.getPosition).call(this,e.width,e.height,c),f=c.plotX+a.plotLeft;c=c.plotY+a.plotTop;if(this.outside){b=b.borderWidth+2*this.distance;this.renderer.setSize(e.width+
+b,e.height+b,!1);if(1!==d.scaleX||1!==d.scaleY)m(this.container,{transform:"scale("+d.scaleX+", "+d.scaleY+")"}),f*=d.scaleX,c*=d.scaleY;f+=d.left-k.x;c+=d.top-k.y}this.move(Math.round(k.x),Math.round(k.y||0),f,c)};return a}();"";return a});M(f,"Core/Series/Point.js",[f["Core/Renderer/HTML/AST.js"],f["Core/Animation/AnimationUtilities.js"],f["Core/DefaultOptions.js"],f["Core/FormatUtilities.js"],f["Core/Utilities.js"]],function(a,f,C,G,u){var F=f.animObject,I=C.defaultOptions,B=G.format,z=u.addEvent,
+p=u.defined,m=u.erase,e=u.extend,d=u.fireEvent,l=u.getNestedProperty,h=u.isArray,t=u.isFunction,n=u.isNumber,v=u.isObject,w=u.merge,y=u.objectEach,A=u.pick,q=u.syncTimeout,k=u.removeEvent,c=u.uniqueKey;f=function(){function g(){this.colorIndex=this.category=void 0;this.formatPrefix="point";this.id=void 0;this.isNull=!1;this.percentage=this.options=this.name=void 0;this.selected=!1;this.total=this.series=void 0;this.visible=!0;this.x=void 0}g.prototype.animateBeforeDestroy=function(){var b=this,c=
+{x:b.startXPos,opacity:0},a=b.getGraphicalProps();a.singular.forEach(function(a){b[a]=b[a].animate("dataLabel"===a?{x:b[a].startXPos,y:b[a].startYPos,opacity:0}:c)});a.plural.forEach(function(c){b[c].forEach(function(c){c.element&&c.animate(e({x:b.startXPos},c.startYPos?{x:c.startXPos,y:c.startYPos}:{}))})})};g.prototype.applyOptions=function(b,c){var a=this.series,d=a.options.pointValKey||a.pointValKey;b=g.prototype.optionsToObject.call(this,b);e(this,b);this.options=this.options?e(this.options,
+b):b;b.group&&delete this.group;b.dataLabels&&delete this.dataLabels;d&&(this.y=g.prototype.getNestedProperty.call(this,d));this.formatPrefix=(this.isNull=A(this.isValid&&!this.isValid(),null===this.x||!n(this.y)))?"null":"point";this.selected&&(this.state="select");"name"in this&&"undefined"===typeof c&&a.xAxis&&a.xAxis.hasNames&&(this.x=a.xAxis.nameToX(this));"undefined"===typeof this.x&&a?this.x="undefined"===typeof c?a.autoIncrement():c:n(b.x)&&a.options.relativeXValue&&(this.x=a.autoIncrement(b.x));
+return this};g.prototype.destroy=function(){function b(){if(c.graphic||c.dataLabel||c.dataLabels)k(c),c.destroyElements();for(f in c)c[f]=null}var c=this,a=c.series,d=a.chart;a=a.options.dataSorting;var g=d.hoverPoints,e=F(c.series.chart.renderer.globalAnimation),f;c.legendItem&&d.legend.destroyItem(c);g&&(c.setState(),m(g,c),g.length||(d.hoverPoints=null));if(c===d.hoverPoint)c.onMouseOut();a&&a.enabled?(this.animateBeforeDestroy(),q(b,e.duration)):b();d.pointCount--};g.prototype.destroyElements=
+function(b){var c=this;b=c.getGraphicalProps(b);b.singular.forEach(function(b){c[b]=c[b].destroy()});b.plural.forEach(function(b){c[b].forEach(function(b){b.element&&b.destroy()});delete c[b]})};g.prototype.firePointEvent=function(b,c,a){var g=this,e=this.series.options;(e.point.events[b]||g.options&&g.options.events&&g.options.events[b])&&g.importEvents();"click"===b&&e.allowPointSelect&&(a=function(b){g.select&&g.select(null,b.ctrlKey||b.metaKey||b.shiftKey)});d(g,b,c,a)};g.prototype.getClassName=
+function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+("undefined"!==typeof this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")};g.prototype.getGraphicalProps=function(b){var c=this,a=[],d={singular:[],plural:[]},g;b=b||{graphic:1,dataLabel:1};
+b.graphic&&a.push("graphic","upperGraphic","shadowGroup");b.dataLabel&&a.push("dataLabel","dataLabelUpper","connector");for(g=a.length;g--;){var e=a[g];c[e]&&d.singular.push(e)}["dataLabel","connector"].forEach(function(a){var g=a+"s";b[a]&&c[g]&&d.plural.push(g)});return d};g.prototype.getLabelConfig=function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}};
+g.prototype.getNestedProperty=function(b){if(b)return 0===b.indexOf("custom.")?l(b,this.options):this[b]};g.prototype.getZone=function(){var b=this.series,c=b.zones;b=b.zoneAxis||"y";var a,d=0;for(a=c[d];this[b]>=a.value;)a=c[++d];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=a&&a.color&&!this.options.color?a.color:this.nonZonedColor;return a};g.prototype.hasNewShapeType=function(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType};g.prototype.init=
+function(b,a,g){this.series=b;this.applyOptions(a,g);this.id=p(this.id)?this.id:c();this.resolveColor();b.chart.pointCount++;d(this,"afterInit");return this};g.prototype.optionsToObject=function(b){var c=this.series,a=c.options.keys,d=a||c.pointArrayMap||["y"],e=d.length,k={},f=0,q=0;if(n(b)||null===b)k[d[0]]=b;else if(h(b))for(!a&&b.length>e&&(c=typeof b[0],"string"===c?k.name=b[0]:"number"===c&&(k.x=b[0]),f++);q<e;)a&&"undefined"===typeof b[f]||(0<d[q].indexOf(".")?g.prototype.setNestedProperty(k,
+b[f],d[q]):k[d[q]]=b[f]),f++,q++;else"object"===typeof b&&(k=b,b.dataLabels&&(c._hasPointLabels=!0),b.marker&&(c._hasPointMarkers=!0));return k};g.prototype.resolveColor=function(){var b=this.series,c=b.chart.styledMode;var a=b.chart.options.chart.colorCount;delete this.nonZonedColor;if(b.options.colorByPoint){if(!c){a=b.options.colors||b.chart.options.colors;var d=a[b.colorCounter];a=a.length}c=b.colorCounter;b.colorCounter++;b.colorCounter===a&&(b.colorCounter=0)}else c||(d=b.color),c=b.colorIndex;
+this.colorIndex=A(this.options.colorIndex,c);this.color=A(this.options.color,d)};g.prototype.setNestedProperty=function(b,c,a){a.split(".").reduce(function(b,a,d,g){b[a]=g.length-1===d?c:v(b[a],!0)?b[a]:{};return b[a]},b);return b};g.prototype.tooltipFormatter=function(b){var c=this.series,a=c.tooltipOptions,d=A(a.valueDecimals,""),g=a.valuePrefix||"",e=a.valueSuffix||"";c.chart.styledMode&&(b=c.chart.tooltip.styledModeFormat(b));(c.pointArrayMap||["y"]).forEach(function(c){c="{point."+c;if(g||e)b=
+b.replace(RegExp(c+"}","g"),g+c+"}"+e);b=b.replace(RegExp(c+"}","g"),c+":,."+d+"f}")});return B(b,{point:this,series:this.series},c.chart)};g.prototype.update=function(b,c,a,d){function g(){e.applyOptions(b);var d=f&&e.hasDummyGraphic;d=null===e.y?!d:d;f&&d&&(e.graphic=f.destroy(),delete e.hasDummyGraphic);v(b,!0)&&(f&&f.element&&b&&b.marker&&"undefined"!==typeof b.marker.symbol&&(e.graphic=f.destroy()),b&&b.dataLabels&&e.dataLabel&&(e.dataLabel=e.dataLabel.destroy()),e.connector&&(e.connector=e.connector.destroy()));
+r=e.index;k.updateParallelArrays(e,r);q.data[r]=v(q.data[r],!0)||v(b,!0)?e.options:A(b,q.data[r]);k.isDirty=k.isDirtyData=!0;!k.fixedBox&&k.hasCartesianSeries&&(h.isDirtyBox=!0);"point"===q.legendType&&(h.isDirtyLegend=!0);c&&h.redraw(a)}var e=this,k=e.series,f=e.graphic,h=k.chart,q=k.options,r;c=A(c,!0);!1===d?g():e.firePointEvent("update",{options:b},g)};g.prototype.remove=function(b,c){this.series.removePoint(this.series.data.indexOf(this),b,c)};g.prototype.select=function(b,c){var a=this,d=a.series,
+g=d.chart;this.selectedStaging=b=A(b,!a.selected);a.firePointEvent(b?"select":"unselect",{accumulate:c},function(){a.selected=a.options.selected=b;d.options.data[d.data.indexOf(a)]=a.options;a.setState(b&&"select");c||g.getSelectedPoints().forEach(function(b){var c=b.series;b.selected&&b!==a&&(b.selected=b.options.selected=!1,c.options.data[c.data.indexOf(b)]=b.options,b.setState(g.hoverPoints&&c.options.inactiveOtherPoints?"inactive":""),b.firePointEvent("unselect"))})});delete this.selectedStaging};
+g.prototype.onMouseOver=function(b){var c=this.series.chart,a=c.pointer;b=b?a.normalize(b):a.getChartCoordinatesFromPoint(this,c.inverted);a.runPointActions(b,this)};g.prototype.onMouseOut=function(){var b=this.series.chart;this.firePointEvent("mouseOut");this.series.options.inactiveOtherPoints||(b.hoverPoints||[]).forEach(function(b){b.setState()});b.hoverPoints=b.hoverPoint=null};g.prototype.importEvents=function(){if(!this.hasImportedEvents){var b=this,c=w(b.series.options.point,b.options).events;
+b.events=c;y(c,function(c,a){t(c)&&z(b,a,c)});this.hasImportedEvents=!0}};g.prototype.setState=function(b,c){var g=this.series,k=this.state,f=g.options.states[b||"normal"]||{},h=I.plotOptions[g.type].marker&&g.options.marker,q=h&&!1===h.enabled,r=h&&h.states&&h.states[b||"normal"]||{},l=!1===r.enabled,m=this.marker||{},p=g.chart,t=h&&g.markerAttribs,w=g.halo,y,v=g.stateMarkerGraphic;b=b||"";if(!(b===this.state&&!c||this.selected&&"select"!==b||!1===f.enabled||b&&(l||q&&!1===r.enabled)||b&&m.states&&
+m.states[b]&&!1===m.states[b].enabled)){this.state=b;t&&(y=g.markerAttribs(this,b));if(this.graphic&&!this.hasDummyGraphic){k&&this.graphic.removeClass("highcharts-point-"+k);b&&this.graphic.addClass("highcharts-point-"+b);if(!p.styledMode){var z=g.pointAttribs(this,b);var E=A(p.options.chart.animation,f.animation);g.options.inactiveOtherPoints&&n(z.opacity)&&((this.dataLabels||[]).forEach(function(b){b&&b.animate({opacity:z.opacity},E)}),this.connector&&this.connector.animate({opacity:z.opacity},
+E));this.graphic.animate(z,E)}y&&this.graphic.animate(y,A(p.options.chart.animation,r.animation,h.animation));v&&v.hide()}else{if(b&&r){k=m.symbol||g.symbol;v&&v.currentSymbol!==k&&(v=v.destroy());if(y)if(v)v[c?"animate":"attr"]({x:y.x,y:y.y});else k&&(g.stateMarkerGraphic=v=p.renderer.symbol(k,y.x,y.y,y.width,y.height).add(g.markerGroup),v.currentSymbol=k);!p.styledMode&&v&&"inactive"!==this.state&&v.attr(g.pointAttribs(this,b))}v&&(v[b&&this.isInside?"show":"hide"](),v.element.point=this,v.addClass(this.getClassName(),
+!0))}f=f.halo;y=(v=this.graphic||v)&&v.visibility||"inherit";f&&f.size&&v&&"hidden"!==y&&!this.isCluster?(w||(g.halo=w=p.renderer.path().add(v.parentGroup)),w.show()[c?"animate":"attr"]({d:this.haloPath(f.size)}),w.attr({"class":"highcharts-halo highcharts-color-"+A(this.colorIndex,g.colorIndex)+(this.className?" "+this.className:""),visibility:y,zIndex:-1}),w.point=this,p.styledMode||w.attr(e({fill:this.color||g.color,"fill-opacity":f.opacity},a.filterUserAttributes(f.attributes||{})))):w&&w.point&&
+w.point.haloPath&&w.animate({d:w.point.haloPath(0)},null,w.hide);d(this,"afterSetState",{state:b})}};g.prototype.haloPath=function(b){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-b,this.plotY-b,2*b,2*b)};return g}();"";return f});M(f,"Core/Pointer.js",[f["Core/Color/Color.js"],f["Core/Globals.js"],f["Core/Tooltip.js"],f["Core/Utilities.js"]],function(a,f,C,G){var u=a.parse,F=f.charts,I=f.noop,B=G.addEvent,z=G.attr,p=G.css,m=G.defined,e=G.extend,d=G.find,l=G.fireEvent,h=
+G.isNumber,t=G.isObject,n=G.objectEach,v=G.offset,w=G.pick,y=G.splat;a=function(){function a(a,d){this.lastValidTouch={};this.pinchDown=[];this.runChartClick=!1;this.eventsToUnbind=[];this.chart=a;this.hasDragged=!1;this.options=d;this.init(a,d)}a.prototype.applyInactiveState=function(a){var d=[],c;(a||[]).forEach(function(a){c=a.series;d.push(c);c.linkedParent&&d.push(c.linkedParent);c.linkedSeries&&(d=d.concat(c.linkedSeries));c.navigatorSeries&&d.push(c.navigatorSeries)});this.chart.series.forEach(function(c){-1===
+d.indexOf(c)?c.setState("inactive",!0):c.options.inactiveOtherPoints&&c.setAllPointsToState("inactive")})};a.prototype.destroy=function(){var d=this;this.eventsToUnbind.forEach(function(a){return a()});this.eventsToUnbind=[];f.chartCount||(a.unbindDocumentMouseUp&&(a.unbindDocumentMouseUp=a.unbindDocumentMouseUp()),a.unbindDocumentTouchEnd&&(a.unbindDocumentTouchEnd=a.unbindDocumentTouchEnd()));clearInterval(d.tooltipTimeout);n(d,function(a,c){d[c]=void 0})};a.prototype.drag=function(a){var d=this.chart,
+c=d.options.chart,g=this.zoomHor,b=this.zoomVert,e=d.plotLeft,f=d.plotTop,h=d.plotWidth,q=d.plotHeight,l=this.mouseDownX||0,m=this.mouseDownY||0,n=t(c.panning)?c.panning&&c.panning.enabled:c.panning,p=c.panKey&&a[c.panKey+"Key"],w=a.chartX,y=a.chartY,v=this.selectionMarker;if(!v||!v.touch)if(w<e?w=e:w>e+h&&(w=e+h),y<f?y=f:y>f+q&&(y=f+q),this.hasDragged=Math.sqrt(Math.pow(l-w,2)+Math.pow(m-y,2)),10<this.hasDragged){var A=d.isInsidePlot(l-e,m-f,{visiblePlotOnly:!0});!d.hasCartesianSeries&&!d.mapView||
+!this.zoomX&&!this.zoomY||!A||p||v||(this.selectionMarker=v=d.renderer.rect(e,f,g?1:h,b?1:q,0).attr({"class":"highcharts-selection-marker",zIndex:7}).add(),d.styledMode||v.attr({fill:c.selectionMarkerFill||u("#335cad").setOpacity(.25).get()}));v&&g&&(g=w-l,v.attr({width:Math.abs(g),x:(0<g?0:g)+l}));v&&b&&(g=y-m,v.attr({height:Math.abs(g),y:(0<g?0:g)+m}));A&&!v&&n&&d.pan(a,c.panning)}};a.prototype.dragStart=function(a){var d=this.chart;d.mouseIsDown=a.type;d.cancelClick=!1;d.mouseDownX=this.mouseDownX=
+a.chartX;d.mouseDownY=this.mouseDownY=a.chartY};a.prototype.drop=function(a){var d=this,c=this.chart,g=this.hasPinched;if(this.selectionMarker){var b=this.selectionMarker,f=b.attr?b.attr("x"):b.x,q=b.attr?b.attr("y"):b.y,n=b.attr?b.attr("width"):b.width,t=b.attr?b.attr("height"):b.height,w={originalEvent:a,xAxis:[],yAxis:[],x:f,y:q,width:n,height:t},y=!!c.mapView;if(this.hasDragged||g)c.axes.forEach(function(b){if(b.zoomEnabled&&m(b.min)&&(g||d[{xAxis:"zoomX",yAxis:"zoomY"}[b.coll]])&&h(f)&&h(q)){var c=
+b.horiz,e="touchend"===a.type?b.minPixelPadding:0,k=b.toValue((c?f:q)+e);c=b.toValue((c?f+n:q+t)-e);w[b.coll].push({axis:b,min:Math.min(k,c),max:Math.max(k,c)});y=!0}}),y&&l(c,"selection",w,function(b){c.zoom(e(b,g?{animation:!1}:null))});h(c.index)&&(this.selectionMarker=this.selectionMarker.destroy());g&&this.scaleGroups()}c&&h(c.index)&&(p(c.container,{cursor:c._cursor}),c.cancelClick=10<this.hasDragged,c.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])};a.prototype.findNearestKDPoint=
+function(a,d,c){var g=this.chart,b=g.hoverPoint;g=g.tooltip;if(b&&g&&g.isStickyOnContact())return b;var e;a.forEach(function(b){var a=!(b.noSharedTooltip&&d)&&0>b.options.findNearestPointBy.indexOf("y");b=b.searchPoint(c,a);if((a=t(b,!0)&&b.series)&&!(a=!t(e,!0))){a=e.distX-b.distX;var g=e.dist-b.dist,k=(b.series.group&&b.series.group.zIndex)-(e.series.group&&e.series.group.zIndex);a=0<(0!==a&&d?a:0!==g?g:0!==k?k:e.series.index>b.series.index?-1:1)}a&&(e=b)});return e};a.prototype.getChartCoordinatesFromPoint=
+function(a,d){var c=a.series,g=c.xAxis;c=c.yAxis;var b=a.shapeArgs;if(g&&c){var e=w(a.clientX,a.plotX),k=a.plotY||0;a.isNode&&b&&h(b.x)&&h(b.y)&&(e=b.x,k=b.y);return d?{chartX:c.len+c.pos-k,chartY:g.len+g.pos-e}:{chartX:e+g.pos,chartY:k+c.pos}}if(b&&b.x&&b.y)return{chartX:b.x,chartY:b.y}};a.prototype.getChartPosition=function(){if(this.chartPosition)return this.chartPosition;var a=this.chart.container,d=v(a);this.chartPosition={left:d.left,top:d.top,scaleX:1,scaleY:1};var c=a.offsetWidth;a=a.offsetHeight;
+2<c&&2<a&&(this.chartPosition.scaleX=d.width/c,this.chartPosition.scaleY=d.height/a);return this.chartPosition};a.prototype.getCoordinates=function(a){var d={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(c){d[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return d};a.prototype.getHoverData=function(a,e,c,g,b,f){var k=[];g=!(!g||!a);var h={chartX:f?f.chartX:void 0,chartY:f?f.chartY:void 0,shared:b};l(this,"beforeGetHoverData",h);var q=e&&!e.stickyTracking?
+[e]:c.filter(function(a){return h.filter?h.filter(a):a.visible&&!(!b&&a.directTouch)&&w(a.options.enableMouseTracking,!0)&&a.stickyTracking});var r=g||!f?a:this.findNearestKDPoint(q,b,f);e=r&&r.series;r&&(b&&!e.noSharedTooltip?(q=c.filter(function(a){return h.filter?h.filter(a):a.visible&&!(!b&&a.directTouch)&&w(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),q.forEach(function(b){var a=d(b.points,function(b){return b.x===r.x&&!b.isNull});t(a)&&(b.chart.isBoosting&&(a=b.getPoint(a)),k.push(a))})):
+k.push(r));h={hoverPoint:r};l(this,"afterGetHoverData",h);return{hoverPoint:h.hoverPoint,hoverSeries:e,hoverPoints:k}};a.prototype.getPointFromEvent=function(a){a=a.target;for(var d;a&&!d;)d=a.point,a=a.parentNode;return d};a.prototype.onTrackerMouseOut=function(a){a=a.relatedTarget||a.toElement;var d=this.chart.hoverSeries;this.isDirectTouch=!1;if(!(!d||!a||d.stickyTracking||this.inClass(a,"highcharts-tooltip")||this.inClass(a,"highcharts-series-"+d.index)&&this.inClass(a,"highcharts-tracker")))d.onMouseOut()};
+a.prototype.inClass=function(a,d){for(var c;a;){if(c=z(a,"class")){if(-1!==c.indexOf(d))return!0;if(-1!==c.indexOf("highcharts-container"))return!1}a=a.parentElement}};a.prototype.init=function(a,d){this.options=d;this.chart=a;this.runChartClick=!(!d.chart.events||!d.chart.events.click);this.pinchDown=[];this.lastValidTouch={};C&&(a.tooltip=new C(a,d.tooltip),this.followTouchMove=w(d.tooltip.followTouchMove,!0));this.setDOMEvents()};a.prototype.normalize=function(a,d){var c=a.touches,g=c?c.length?
+c.item(0):w(c.changedTouches,a.changedTouches)[0]:a;d||(d=this.getChartPosition());c=g.pageX-d.left;g=g.pageY-d.top;c/=d.scaleX;g/=d.scaleY;return e(a,{chartX:Math.round(c),chartY:Math.round(g)})};a.prototype.onContainerClick=function(a){var d=this.chart,c=d.hoverPoint;a=this.normalize(a);var g=d.plotLeft,b=d.plotTop;d.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(l(c.series,"click",e(a,{point:c})),d.hoverPoint&&c.firePointEvent("click",a)):(e(a,this.getCoordinates(a)),d.isInsidePlot(a.chartX-
+g,a.chartY-b,{visiblePlotOnly:!0})&&l(d,"click",a)))};a.prototype.onContainerMouseDown=function(a){var d=1===((a.buttons||a.button)&1);a=this.normalize(a);if(f.isFirefox&&0!==a.button)this.onContainerMouseMove(a);if("undefined"===typeof a.button||d)this.zoomOption(a),d&&a.preventDefault&&a.preventDefault(),this.dragStart(a)};a.prototype.onContainerMouseLeave=function(d){var e=F[w(a.hoverChartIndex,-1)],c=this.chart.tooltip;c&&c.shouldStickOnContact()&&this.inClass(d.relatedTarget,"highcharts-tooltip-container")||
+(d=this.normalize(d),e&&(d.relatedTarget||d.toElement)&&(e.pointer.reset(),e.pointer.chartPosition=void 0),c&&!c.isHidden&&this.reset())};a.prototype.onContainerMouseEnter=function(a){delete this.chartPosition};a.prototype.onContainerMouseMove=function(a){var d=this.chart;a=this.normalize(a);this.setHoverChartIndex();a.preventDefault||(a.returnValue=!1);("mousedown"===d.mouseIsDown||this.touchSelect(a))&&this.drag(a);d.openMenu||!this.inClass(a.target,"highcharts-tracker")&&!d.isInsidePlot(a.chartX-
+d.plotLeft,a.chartY-d.plotTop,{visiblePlotOnly:!0})||(this.inClass(a.target,"highcharts-no-tooltip")?this.reset(!1,0):this.runPointActions(a))};a.prototype.onDocumentTouchEnd=function(d){var e=F[w(a.hoverChartIndex,-1)];e&&e.pointer.drop(d)};a.prototype.onContainerTouchMove=function(a){if(this.touchSelect(a))this.onContainerMouseMove(a);else this.touch(a)};a.prototype.onContainerTouchStart=function(a){if(this.touchSelect(a))this.onContainerMouseDown(a);else this.zoomOption(a),this.touch(a,!0)};a.prototype.onDocumentMouseMove=
+function(a){var d=this.chart,c=this.chartPosition;a=this.normalize(a,c);var g=d.tooltip;!c||g&&g.isStickyOnContact()||d.isInsidePlot(a.chartX-d.plotLeft,a.chartY-d.plotTop,{visiblePlotOnly:!0})||this.inClass(a.target,"highcharts-tracker")||this.reset()};a.prototype.onDocumentMouseUp=function(d){var e=F[w(a.hoverChartIndex,-1)];e&&e.pointer.drop(d)};a.prototype.pinch=function(a){var d=this,c=d.chart,g=d.pinchDown,b=a.touches||[],f=b.length,h=d.lastValidTouch,q=d.hasZoom,m={},n=1===f&&(d.inClass(a.target,
+"highcharts-tracker")&&c.runTrackerClick||d.runChartClick),p={},t=d.selectionMarker;1<f?d.initiated=!0:1===f&&this.followTouchMove&&(d.initiated=!1);q&&d.initiated&&!n&&!1!==a.cancelable&&a.preventDefault();[].map.call(b,function(b){return d.normalize(b)});"touchstart"===a.type?([].forEach.call(b,function(b,a){g[a]={chartX:b.chartX,chartY:b.chartY}}),h.x=[g[0].chartX,g[1]&&g[1].chartX],h.y=[g[0].chartY,g[1]&&g[1].chartY],c.axes.forEach(function(b){if(b.zoomEnabled){var a=c.bounds[b.horiz?"h":"v"],
+d=b.minPixelPadding,g=b.toPixels(Math.min(w(b.options.min,b.dataMin),b.dataMin)),e=b.toPixels(Math.max(w(b.options.max,b.dataMax),b.dataMax)),f=Math.max(g,e);a.min=Math.min(b.pos,Math.min(g,e)-d);a.max=Math.max(b.pos+b.len,f+d)}}),d.res=!0):d.followTouchMove&&1===f?this.runPointActions(d.normalize(a)):g.length&&(l(c,"touchpan",{originalEvent:a},function(){t||(d.selectionMarker=t=e({destroy:I,touch:!0},c.plotBox));d.pinchTranslate(g,b,m,t,p,h);d.hasPinched=q;d.scaleGroups(m,p)}),d.res&&(d.res=!1,this.reset(!1,
+0)))};a.prototype.pinchTranslate=function(a,d,c,g,b,e){this.zoomHor&&this.pinchTranslateDirection(!0,a,d,c,g,b,e);this.zoomVert&&this.pinchTranslateDirection(!1,a,d,c,g,b,e)};a.prototype.pinchTranslateDirection=function(a,d,c,g,b,e,f,h){var k=this.chart,r=a?"x":"y",l=a?"X":"Y",m="chart"+l,q=a?"width":"height",n=k["plot"+(a?"Left":"Top")],p=k.inverted,x=k.bounds[a?"h":"v"],t=1===d.length,D=d[0][m],w=!t&&d[1][m];d=function(){"number"===typeof A&&20<Math.abs(D-w)&&(v=h||Math.abs(N-A)/Math.abs(D-w));
+E=(n-N)/v+D;y=k["plot"+(a?"Width":"Height")]/v};var y,E,v=h||1,N=c[0][m],A=!t&&c[1][m];d();c=E;if(c<x.min){c=x.min;var z=!0}else c+y>x.max&&(c=x.max-y,z=!0);z?(N-=.8*(N-f[r][0]),"number"===typeof A&&(A-=.8*(A-f[r][1])),d()):f[r]=[N,A];p||(e[r]=E-n,e[q]=y);e=p?1/v:v;b[q]=y;b[r]=c;g[p?a?"scaleY":"scaleX":"scale"+l]=v;g["translate"+l]=e*n+(N-e*D)};a.prototype.reset=function(a,d){var c=this.chart,g=c.hoverSeries,b=c.hoverPoint,e=c.hoverPoints,f=c.tooltip,k=f&&f.shared?e:b;a&&k&&y(k).forEach(function(b){b.series.isCartesian&&
+"undefined"===typeof b.plotX&&(a=!1)});if(a)f&&k&&y(k).length&&(f.refresh(k),f.shared&&e?e.forEach(function(b){b.setState(b.state,!0);b.series.isCartesian&&(b.series.xAxis.crosshair&&b.series.xAxis.drawCrosshair(null,b),b.series.yAxis.crosshair&&b.series.yAxis.drawCrosshair(null,b))}):b&&(b.setState(b.state,!0),c.axes.forEach(function(a){a.crosshair&&b.series[a.coll]===a&&a.drawCrosshair(null,b)})));else{if(b)b.onMouseOut();e&&e.forEach(function(b){b.setState()});if(g)g.onMouseOut();f&&f.hide(d);
+this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());c.axes.forEach(function(b){b.hideCrosshair()});this.hoverX=c.hoverPoints=c.hoverPoint=null}};a.prototype.runPointActions=function(e,f){var c=this.chart,g=c.tooltip&&c.tooltip.options.enabled?c.tooltip:void 0,b=g?g.shared:!1,k=f||c.hoverPoint,h=k&&k.series||c.hoverSeries;f=this.getHoverData(k,h,c.series,(!e||"touchmove"!==e.type)&&(!!f||h&&h.directTouch&&this.isDirectTouch),b,e);k=f.hoverPoint;h=f.hoverSeries;var l=f.hoverPoints;f=h&&
+h.tooltipOptions.followPointer&&!h.tooltipOptions.split;var m=b&&h&&!h.noSharedTooltip;if(k&&(k!==c.hoverPoint||g&&g.isHidden)){(c.hoverPoints||[]).forEach(function(b){-1===l.indexOf(b)&&b.setState()});if(c.hoverSeries!==h)h.onMouseOver();this.applyInactiveState(l);(l||[]).forEach(function(b){b.setState("hover")});c.hoverPoint&&c.hoverPoint.firePointEvent("mouseOut");if(!k.series)return;c.hoverPoints=l;c.hoverPoint=k;k.firePointEvent("mouseOver",void 0,function(){g&&k&&g.refresh(m?l:k,e)})}else f&&
+g&&!g.isHidden&&(b=g.getAnchor([{}],e),c.isInsidePlot(b[0],b[1],{visiblePlotOnly:!0})&&g.updatePosition({plotX:b[0],plotY:b[1]}));this.unDocMouseMove||(this.unDocMouseMove=B(c.container.ownerDocument,"mousemove",function(b){var c=F[a.hoverChartIndex];if(c)c.pointer.onDocumentMouseMove(b)}),this.eventsToUnbind.push(this.unDocMouseMove));c.axes.forEach(function(b){var a=w((b.crosshair||{}).snap,!0),g;a&&((g=c.hoverPoint)&&g.series[b.coll]===b||(g=d(l,function(a){return a.series&&a.series[b.coll]===
+b})));g||!a?b.drawCrosshair(e,g):b.hideCrosshair()})};a.prototype.scaleGroups=function(a,d){var c=this.chart;c.series.forEach(function(g){var b=a||g.getPlotBox();g.group&&(g.xAxis&&g.xAxis.zoomEnabled||c.mapView)&&(g.group.attr(b),g.markerGroup&&(g.markerGroup.attr(b),g.markerGroup.clip(d?c.clipRect:null)),g.dataLabelsGroup&&g.dataLabelsGroup.attr(b))});c.clipRect.attr(d||c.clipBox)};a.prototype.setDOMEvents=function(){var d=this,e=this.chart.container,c=e.ownerDocument;e.onmousedown=this.onContainerMouseDown.bind(this);
+e.onmousemove=this.onContainerMouseMove.bind(this);e.onclick=this.onContainerClick.bind(this);this.eventsToUnbind.push(B(e,"mouseenter",this.onContainerMouseEnter.bind(this)));this.eventsToUnbind.push(B(e,"mouseleave",this.onContainerMouseLeave.bind(this)));a.unbindDocumentMouseUp||(a.unbindDocumentMouseUp=B(c,"mouseup",this.onDocumentMouseUp.bind(this)));for(var g=this.chart.renderTo.parentElement;g&&"BODY"!==g.tagName;)this.eventsToUnbind.push(B(g,"scroll",function(){delete d.chartPosition})),g=
+g.parentElement;f.hasTouch&&(this.eventsToUnbind.push(B(e,"touchstart",this.onContainerTouchStart.bind(this),{passive:!1})),this.eventsToUnbind.push(B(e,"touchmove",this.onContainerTouchMove.bind(this),{passive:!1})),a.unbindDocumentTouchEnd||(a.unbindDocumentTouchEnd=B(c,"touchend",this.onDocumentTouchEnd.bind(this),{passive:!1})))};a.prototype.setHoverChartIndex=function(){var d=this.chart,e=f.charts[w(a.hoverChartIndex,-1)];if(e&&e!==d)e.pointer.onContainerMouseLeave({relatedTarget:d.container});
+e&&e.mouseIsDown||(a.hoverChartIndex=d.index)};a.prototype.touch=function(a,d){var c=this.chart,e;this.setHoverChartIndex();if(1===a.touches.length)if(a=this.normalize(a),(e=c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop,{visiblePlotOnly:!0}))&&!c.openMenu){d&&this.runPointActions(a);if("touchmove"===a.type){d=this.pinchDown;var b=d[0]?4<=Math.sqrt(Math.pow(d[0].chartX-a.chartX,2)+Math.pow(d[0].chartY-a.chartY,2)):!1}w(b,!0)&&this.pinch(a)}else d&&this.reset();else 2===a.touches.length&&this.pinch(a)};
+a.prototype.touchSelect=function(a){return!(!this.chart.options.chart.zoomBySingleTouch||!a.touches||1!==a.touches.length)};a.prototype.zoomOption=function(a){var d=this.chart,c=d.options.chart;d=d.inverted;var e=c.zoomType||"";/touch/.test(a.type)&&(e=w(c.pinchType,e));this.zoomX=a=/x/.test(e);this.zoomY=c=/y/.test(e);this.zoomHor=a&&!d||c&&d;this.zoomVert=c&&!d||a&&d;this.hasZoom=a||c};return a}();"";return a});M(f,"Core/MSPointer.js",[f["Core/Globals.js"],f["Core/Pointer.js"],f["Core/Utilities.js"]],
+function(a,f,C){function F(){var a=[];a.item=function(a){return this[a]};d(h,function(d){a.push({pageX:d.pageX,pageY:d.pageY,target:d.target})});return a}function u(a,d,e,h){var l=I[f.hoverChartIndex||NaN];"touch"!==a.pointerType&&a.pointerType!==a.MSPOINTER_TYPE_TOUCH||!l||(l=l.pointer,h(a),l[d]({type:e,target:a.currentTarget,preventDefault:z,touches:F()}))}var H=this&&this.__extends||function(){var a=function(d,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,d){a.__proto__=
+d}||function(a,d){for(var e in d)d.hasOwnProperty(e)&&(a[e]=d[e])};return a(d,e)};return function(d,e){function f(){this.constructor=d}a(d,e);d.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),I=a.charts,B=a.doc,z=a.noop,p=a.win,m=C.addEvent,e=C.css,d=C.objectEach,l=C.removeEvent,h={},t=!!p.PointerEvent;return function(d){function f(){return null!==d&&d.apply(this,arguments)||this}H(f,d);f.isRequired=function(){return!(a.hasTouch||!p.PointerEvent&&!p.MSPointerEvent)};f.prototype.batchMSEvents=
+function(a){a(this.chart.container,t?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,t?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(B,t?"pointerup":"MSPointerUp",this.onDocumentPointerUp)};f.prototype.destroy=function(){this.batchMSEvents(l);d.prototype.destroy.call(this)};f.prototype.init=function(a,f){d.prototype.init.call(this,a,f);this.hasZoom&&e(a.container,{"-ms-touch-action":"none","touch-action":"none"})};f.prototype.onContainerPointerDown=
+function(a){u(a,"onContainerTouchStart","touchstart",function(a){h[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})};f.prototype.onContainerPointerMove=function(a){u(a,"onContainerTouchMove","touchmove",function(a){h[a.pointerId]={pageX:a.pageX,pageY:a.pageY};h[a.pointerId].target||(h[a.pointerId].target=a.currentTarget)})};f.prototype.onDocumentPointerUp=function(a){u(a,"onDocumentTouchEnd","touchend",function(a){delete h[a.pointerId]})};f.prototype.setDOMEvents=function(){d.prototype.setDOMEvents.call(this);
+(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(m)};return f}(f)});M(f,"Core/Legend/Legend.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/FormatUtilities.js"],f["Core/Globals.js"],f["Core/Series/Point.js"],f["Core/Renderer/RendererUtilities.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H){var F=a.animObject,B=a.setAnimation,z=f.format;a=C.isFirefox;var p=C.marginNames;C=C.win;var m=u.distribute,e=H.addEvent,d=H.createElement,l=H.css,h=H.defined,t=H.discardElement,n=H.find,v=H.fireEvent,
+w=H.isNumber,y=H.merge,A=H.pick,q=H.relativeLength,k=H.stableSort,c=H.syncTimeout;u=H.wrap;H=function(){function a(b,a){this.allItems=[];this.contentGroup=this.box=void 0;this.display=!1;this.group=void 0;this.offsetWidth=this.maxLegendWidth=this.maxItemWidth=this.legendWidth=this.legendHeight=this.lastLineHeight=this.lastItemY=this.itemY=this.itemX=this.itemMarginTop=this.itemMarginBottom=this.itemHeight=this.initialItemY=0;this.options=void 0;this.padding=0;this.pages=[];this.proximate=!1;this.scrollGroup=
+void 0;this.widthOption=this.totalItemWidth=this.titleHeight=this.symbolWidth=this.symbolHeight=0;this.chart=b;this.init(b,a)}a.prototype.init=function(b,a){this.chart=b;this.setOptions(a);a.enabled&&(this.render(),e(this.chart,"endResize",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=e(this.chart,"render",function(){this.legend.proximatePositions();this.legend.positionItems()}):this.unchartrender&&this.unchartrender())};a.prototype.setOptions=function(b){var a=A(b.padding,
+8);this.options=b;this.chart.styledMode||(this.itemStyle=b.itemStyle,this.itemHiddenStyle=y(this.itemStyle,b.itemHiddenStyle));this.itemMarginTop=b.itemMarginTop||0;this.itemMarginBottom=b.itemMarginBottom||0;this.padding=a;this.initialItemY=a-5;this.symbolWidth=A(b.symbolWidth,16);this.pages=[];this.proximate="proximate"===b.layout&&!this.chart.inverted;this.baseline=void 0};a.prototype.update=function(b,a){var c=this.chart;this.setOptions(y(!0,this.options,b));this.destroy();c.isDirtyLegend=c.isDirtyBox=
+!0;A(a,!0)&&c.redraw();v(this,"afterUpdate")};a.prototype.colorizeItem=function(b,a){b.legendGroup[a?"removeClass":"addClass"]("highcharts-legend-item-hidden");if(!this.chart.styledMode){var c=this.options,d=b.legendItem,e=b.legendLine,g=b.legendSymbol,f=this.itemHiddenStyle.color;c=a?c.itemStyle.color:f;var k=a?b.color||f:f,h=b.options&&b.options.marker,l={fill:k};d&&d.css({fill:c,color:c});e&&e.attr({stroke:k});g&&(h&&g.isMarker&&(l=b.pointAttribs(),a||(l.stroke=l.fill=f)),g.attr(l))}v(this,"afterColorizeItem",
+{item:b,visible:a})};a.prototype.positionItems=function(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()};a.prototype.positionItem=function(b){var a=this,c=this.options,d=c.symbolPadding,e=!c.rtl,g=b._legendItemPos;c=g[0];g=g[1];var f=b.checkbox,k=b.legendGroup;k&&k.element&&(d={translateX:e?c:this.legendWidth-c-2*d-4,translateY:g},e=function(){v(a,"afterPositionItem",{item:b})},h(k.translateY)?k.animate(d,void 0,e):(k.attr(d),e()));f&&(f.x=c,f.y=g)};
+a.prototype.destroyItem=function(b){var a=b.checkbox;["legendItem","legendLine","legendSymbol","legendGroup"].forEach(function(a){b[a]&&(b[a]=b[a].destroy())});a&&t(b.checkbox)};a.prototype.destroy=function(){function b(b){this[b]&&(this[b]=this[b].destroy())}this.getAllItems().forEach(function(a){["legendItem","legendGroup"].forEach(b,a)});"clipRect up down pager nav box title group".split(" ").forEach(b,this);this.display=null};a.prototype.positionCheckboxes=function(){var b=this.group&&this.group.alignAttr,
+a=this.clipHeight||this.legendHeight,c=this.titleHeight;if(b){var d=b.translateY;this.allItems.forEach(function(e){var g=e.checkbox;if(g){var f=d+c+g.y+(this.scrollOffset||0)+3;l(g,{left:b.translateX+e.checkboxOffset+g.x-20+"px",top:f+"px",display:this.proximate||f>d-6&&f<d+a-6?"":"none"})}},this)}};a.prototype.renderTitle=function(){var b=this.options,a=this.padding,c=b.title,d=0;c.text&&(this.title||(this.title=this.chart.renderer.label(c.text,a-3,a-4,void 0,void 0,void 0,b.useHTML,void 0,"legend-title").attr({zIndex:1}),
+this.chart.styledMode||this.title.css(c.style),this.title.add(this.group)),c.width||this.title.css({width:this.maxLegendWidth+"px"}),b=this.title.getBBox(),d=b.height,this.offsetWidth=b.width,this.contentGroup.attr({translateY:d}));this.titleHeight=d};a.prototype.setText=function(b){var a=this.options;b.legendItem.attr({text:a.labelFormat?z(a.labelFormat,b,this.chart):a.labelFormatter.call(b)})};a.prototype.renderItem=function(b){var a=this.chart,c=a.renderer,d=this.options,e=this.symbolWidth,g=d.symbolPadding||
+0,f=this.itemStyle,k=this.itemHiddenStyle,h="horizontal"===d.layout?A(d.itemDistance,20):0,l=!d.rtl,m=!b.series,n=!m&&b.series.drawLegendSymbol?b.series:b,q=n.options,p=this.createCheckboxForItem&&q&&q.showCheckbox,t=d.useHTML,w=b.options.className,E=b.legendItem;q=e+g+h+(p?20:0);E||(b.legendGroup=c.g("legend-item").addClass("highcharts-"+n.type+"-series highcharts-color-"+b.colorIndex+(w?" "+w:"")+(m?" highcharts-series-"+b.index:"")).attr({zIndex:1}).add(this.scrollGroup),b.legendItem=E=c.text("",
+l?e+g:-g,this.baseline||0,t),a.styledMode||E.css(y(b.visible?f:k)),E.attr({align:l?"left":"right",zIndex:2}).add(b.legendGroup),this.baseline||(this.fontMetrics=c.fontMetrics(a.styledMode?12:f.fontSize,E),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,E.attr("y",this.baseline),this.symbolHeight=d.symbolHeight||this.fontMetrics.f,d.squareSymbol&&(this.symbolWidth=A(d.symbolWidth,Math.max(this.symbolHeight,16)),q=this.symbolWidth+g+h+(p?20:0),l&&E.attr("x",this.symbolWidth+g))),n.drawLegendSymbol(this,
+b),this.setItemEvents&&this.setItemEvents(b,E,t));p&&!b.checkbox&&this.createCheckboxForItem&&this.createCheckboxForItem(b);this.colorizeItem(b,b.visible);!a.styledMode&&f.width||E.css({width:(d.itemWidth||this.widthOption||a.spacingBox.width)-q+"px"});this.setText(b);a=E.getBBox();c=this.fontMetrics&&this.fontMetrics.h||0;b.itemWidth=b.checkboxOffset=d.itemWidth||b.legendItemWidth||a.width+q;this.maxItemWidth=Math.max(this.maxItemWidth,b.itemWidth);this.totalItemWidth+=b.itemWidth;this.itemHeight=
+b.itemHeight=Math.round(b.legendItemHeight||(a.height>1.5*c?a.height:c))};a.prototype.layoutItem=function(b){var a=this.options,c=this.padding,d="horizontal"===a.layout,e=b.itemHeight,g=this.itemMarginBottom,f=this.itemMarginTop,k=d?A(a.itemDistance,20):0,h=this.maxLegendWidth;a=a.alignColumns&&this.totalItemWidth>h?this.maxItemWidth:b.itemWidth;d&&this.itemX-c+a>h&&(this.itemX=c,this.lastLineHeight&&(this.itemY+=f+this.lastLineHeight+g),this.lastLineHeight=0);this.lastItemY=f+this.itemY+g;this.lastLineHeight=
+Math.max(e,this.lastLineHeight);b._legendItemPos=[this.itemX,this.itemY];d?this.itemX+=a:(this.itemY+=f+e+g,this.lastLineHeight=e);this.offsetWidth=this.widthOption||Math.max((d?this.itemX-c-(b.checkbox?0:k):a)+c,this.offsetWidth)};a.prototype.getAllItems=function(){var b=[];this.chart.series.forEach(function(a){var c=a&&a.options;a&&A(c.showInLegend,h(c.linkedTo)?!1:void 0,!0)&&(b=b.concat(a.legendItems||("point"===c.legendType?a.data:a)))});v(this,"afterGetAllItems",{allItems:b});return b};a.prototype.getAlignment=
+function(){var b=this.options;return this.proximate?b.align.charAt(0)+"tv":b.floating?"":b.align.charAt(0)+b.verticalAlign.charAt(0)+b.layout.charAt(0)};a.prototype.adjustMargins=function(b,a){var c=this.chart,d=this.options,e=this.getAlignment();e&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(g,f){g.test(e)&&!h(b[f])&&(c[p[f]]=Math.max(c[p[f]],c.legend[(f+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][f]*d[f%2?"x":"y"]+A(d.margin,12)+a[f]+(c.titleOffset[f]||0)))})};
+a.prototype.proximatePositions=function(){var b=this.chart,a=[],c="left"===this.options.align;this.allItems.forEach(function(d){var e;var g=c;if(d.yAxis){d.xAxis.options.reversed&&(g=!g);d.points&&(e=n(g?d.points:d.points.slice(0).reverse(),function(b){return w(b.plotY)}));g=this.itemMarginTop+d.legendItem.getBBox().height+this.itemMarginBottom;var f=d.yAxis.top-b.plotTop;d.visible?(e=e?e.plotY:d.yAxis.height,e+=f-.3*g):e=f+d.yAxis.height;a.push({target:e,size:g,item:d})}},this);m(a,b.plotHeight).forEach(function(a){a.item._legendItemPos&&
+(a.item._legendItemPos[1]=b.plotTop-b.spacing[0]+a.pos)})};a.prototype.render=function(){var b=this.chart,a=b.renderer,c=this.options,d=this.padding,e=this.getAllItems(),g=this.group,f=this.box;this.itemX=d;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;this.widthOption=q(c.width,b.spacingBox.width-d);var h=b.spacingBox.width-2*d-c.x;-1<["rm","lm"].indexOf(this.getAlignment().substring(0,2))&&(h/=2);this.maxLegendWidth=this.widthOption||h;g||(this.group=g=a.g("legend").addClass(c.className||
+"").attr({zIndex:7}).add(),this.contentGroup=a.g().attr({zIndex:1}).add(g),this.scrollGroup=a.g().add(this.contentGroup));this.renderTitle();k(e,function(b,a){return(b.options&&b.options.legendIndex||0)-(a.options&&a.options.legendIndex||0)});c.reversed&&e.reverse();this.allItems=e;this.display=h=!!e.length;this.itemHeight=this.totalItemWidth=this.maxItemWidth=this.lastLineHeight=0;e.forEach(this.renderItem,this);e.forEach(this.layoutItem,this);e=(this.widthOption||this.offsetWidth)+d;var l=this.lastItemY+
+this.lastLineHeight+this.titleHeight;l=this.handleOverflow(l);l+=d;f||(this.box=f=a.rect().addClass("highcharts-legend-box").attr({r:c.borderRadius}).add(g));b.styledMode||f.attr({stroke:c.borderColor,"stroke-width":c.borderWidth||0,fill:c.backgroundColor||"none"}).shadow(c.shadow);if(0<e&&0<l)f[f.placed?"animate":"attr"](f.crisp.call({},{x:0,y:0,width:e,height:l},f.strokeWidth()));f[h?"show":"hide"]();b.styledMode&&"none"===g.getStyle("display")&&(e=l=0);this.legendWidth=e;this.legendHeight=l;h&&
+this.align();this.proximate||this.positionItems();v(this,"afterRender")};a.prototype.align=function(b){void 0===b&&(b=this.chart.spacingBox);var a=this.chart,c=this.options,d=b.y;/(lth|ct|rth)/.test(this.getAlignment())&&0<a.titleOffset[0]?d+=a.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&0<a.titleOffset[2]&&(d-=a.titleOffset[2]);d!==b.y&&(b=y(b,{y:d}));a.hasRendered||(this.group.placed=!1);this.group.align(y(c,{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?
+"top":c.verticalAlign}),!0,b)};a.prototype.handleOverflow=function(b){var a=this,c=this.chart,d=c.renderer,e=this.options,g=e.y,f="top"===e.verticalAlign,k=this.padding,h=e.maxHeight,l=e.navigation,m=A(l.animation,!0),n=l.arrowSize||12,q=this.pages,p=this.allItems,t=function(b){"number"===typeof b?v.attr({height:b}):v&&(a.clipRect=v.destroy(),a.contentGroup.clip());a.contentGroup.div&&(a.contentGroup.div.style.clip=b?"rect("+k+"px,9999px,"+(k+b)+"px,0)":"auto")},w=function(b){a[b]=d.circle(0,0,1.3*
+n).translate(n/2,n/2).add(N);c.styledMode||a[b].attr("fill","rgba(0,0,0,0.0001)");return a[b]},E,y;g=c.spacingBox.height+(f?-g:g)-k;var N=this.nav,v=this.clipRect;"horizontal"!==e.layout||"middle"===e.verticalAlign||e.floating||(g/=2);h&&(g=Math.min(g,h));q.length=0;b&&0<g&&b>g&&!1!==l.enabled?(this.clipHeight=E=Math.max(g-20-this.titleHeight-k,0),this.currentPage=A(this.currentPage,1),this.fullHeight=b,p.forEach(function(b,a){var c=b._legendItemPos[1],d=Math.round(b.legendItem.getBBox().height),
+e=q.length;if(!e||c-q[e-1]>E&&(y||c)!==q[e-1])q.push(y||c),e++;b.pageIx=e-1;y&&(p[a-1].pageIx=e-1);a===p.length-1&&c+d-q[e-1]>E&&d<=E&&(q.push(c),b.pageIx=e);c!==y&&(y=c)}),v||(v=a.clipRect=d.clipRect(0,k,9999,0),a.contentGroup.clip(v)),t(E),N||(this.nav=N=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,n,n).add(N),w("upTracker").on("click",function(){a.scroll(-1,m)}),this.pager=d.text("",15,10).addClass("highcharts-legend-navigation"),!c.styledMode&&l.style&&this.pager.css(l.style),
+this.pager.add(N),this.down=d.symbol("triangle-down",0,0,n,n).add(N),w("downTracker").on("click",function(){a.scroll(1,m)})),a.scroll(0),b=g):N&&(t(),this.nav=N.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return b};a.prototype.scroll=function(b,a){var d=this,e=this.chart,g=this.pages,f=g.length,k=this.clipHeight,h=this.options.navigation,l=this.pager,m=this.padding,n=this.currentPage+b;n>f&&(n=f);0<n&&("undefined"!==typeof a&&B(a,e),this.nav.attr({translateX:m,translateY:k+
+this.padding+7+this.titleHeight,visibility:"visible"}),[this.up,this.upTracker].forEach(function(b){b.attr({"class":1===n?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})}),l.attr({text:n+"/"+f}),[this.down,this.downTracker].forEach(function(b){b.attr({x:18+this.pager.getBBox().width,"class":n===f?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})},this),e.styledMode||(this.up.attr({fill:1===n?h.inactiveColor:h.activeColor}),this.upTracker.css({cursor:1===n?"default":
+"pointer"}),this.down.attr({fill:n===f?h.inactiveColor:h.activeColor}),this.downTracker.css({cursor:n===f?"default":"pointer"})),this.scrollOffset=-g[n-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=n,this.positionCheckboxes(),b=F(A(a,e.renderer.globalAnimation,!0)),c(function(){v(d,"afterScroll",{currentPage:n})},b.duration))};a.prototype.setItemEvents=function(b,a,c){var d=this,e=d.chart.renderer.boxWrapper,g=b instanceof G,f="highcharts-legend-"+
+(g?"point":"series")+"-active",k=d.chart.styledMode,h=function(a){d.allItems.forEach(function(c){b!==c&&[c].concat(c.linkedSeries||[]).forEach(function(b){b.setState(a,!g)})})};(c?[a,b.legendSymbol]:[b.legendGroup]).forEach(function(c){if(c)c.on("mouseover",function(){b.visible&&h("inactive");b.setState("hover");b.visible&&e.addClass(f);k||a.css(d.options.itemHoverStyle)}).on("mouseout",function(){d.chart.styledMode||a.css(y(b.visible?d.itemStyle:d.itemHiddenStyle));h("");e.removeClass(f);b.setState()}).on("click",
+function(a){var c=function(){b.setVisible&&b.setVisible();h(b.visible?"inactive":"")};e.removeClass(f);a={browserEvent:a};b.firePointEvent?b.firePointEvent("legendItemClick",a,c):v(b,"legendItemClick",a,c)})})};a.prototype.createCheckboxForItem=function(b){b.checkbox=d("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:b.selected,defaultChecked:b.selected},this.options.itemCheckboxStyle,this.chart.container);e(b.checkbox,"click",function(a){v(b.series||b,"checkboxClick",{checked:a.target.checked,
+item:b},function(){b.select()})})};return a}();(/Trident\/7\.0/.test(C.navigator&&C.navigator.userAgent)||a)&&u(H.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();c.bubbleLegend||setTimeout(d)});"";return H});M(f,"Core/Series/SeriesRegistry.js",[f["Core/Globals.js"],f["Core/DefaultOptions.js"],f["Core/Series/Point.js"],f["Core/Utilities.js"]],function(a,f,C,G){var u=f.defaultOptions,F=G.error,I=G.extendClass,B=G.merge,z;(function(f){function m(a,d){var e=
+u.plotOptions||{},h=d.defaultOptions;d.prototype.pointClass||(d.prototype.pointClass=C);d.prototype.type=a;h&&(e[a]=h);f.seriesTypes[a]=d}f.seriesTypes=a.seriesTypes;f.getSeries=function(a,d){void 0===d&&(d={});var e=a.options.chart;e=d.type||e.type||e.defaultSeriesType||"";var h=f.seriesTypes[e];f||F(17,!0,a,{missingModuleFor:e});e=new h;"function"===typeof e.init&&e.init(a,d);return e};f.registerSeriesType=m;f.seriesType=function(a,d,l,h,p){var e=u.plotOptions||{};d=d||"";e[a]=B(e[d],l);m(a,I(f.seriesTypes[d]||
+function(){},h));f.seriesTypes[a].prototype.type=a;p&&(f.seriesTypes[a].prototype.pointClass=I(C,p));return f.seriesTypes[a]}})(z||(z={}));return z});M(f,"Core/Chart/Chart.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/Axis/Axis.js"],f["Core/FormatUtilities.js"],f["Core/Foundation.js"],f["Core/Globals.js"],f["Core/Legend/Legend.js"],f["Core/MSPointer.js"],f["Core/DefaultOptions.js"],f["Core/Pointer.js"],f["Core/Renderer/RendererRegistry.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Renderer/SVG/SVGRenderer.js"],
+f["Core/Time.js"],f["Core/Utilities.js"],f["Core/Renderer/HTML/AST.js"]],function(a,f,C,G,u,H,I,B,z,p,m,e,d,l,h){var t=a.animate,n=a.animObject,v=a.setAnimation,w=C.numberFormat,y=G.registerEventOptions,A=u.charts,q=u.doc,k=u.marginNames,c=u.svg,g=u.win,b=B.defaultOptions,r=B.defaultTime,x=m.seriesTypes,D=l.addEvent,K=l.attr,F=l.cleanRecursively,Q=l.createElement,O=l.css,W=l.defined,Z=l.discardElement,L=l.erase,J=l.error,M=l.extend,da=l.find,R=l.fireEvent,ea=l.getStyle,E=l.isArray,T=l.isNumber,N=
+l.isObject,U=l.isString,V=l.merge,X=l.objectEach,S=l.pick,fa=l.pInt,aa=l.relativeLength,ia=l.removeEvent,ha=l.splat,ba=l.syncTimeout,ka=l.uniqueKey;a=function(){function a(b,a,c){this.series=this.renderTo=this.renderer=this.pointer=this.pointCount=this.plotWidth=this.plotTop=this.plotLeft=this.plotHeight=this.plotBox=this.options=this.numberFormatter=this.margin=this.legend=this.labelCollectors=this.isResizing=this.index=this.eventOptions=this.container=this.colorCounter=this.clipBox=this.chartWidth=
+this.chartHeight=this.bounds=this.axisOffset=this.axes=void 0;this.sharedClips={};this.yAxis=this.xAxis=this.userOptions=this.titleOffset=this.time=this.symbolCounter=this.spacingBox=this.spacing=void 0;this.getArgs(b,a,c)}a.chart=function(b,c,d){return new a(b,c,d)};a.prototype.getArgs=function(b,a,c){U(b)||b.nodeName?(this.renderTo=b,this.init(a,c)):this.init(b,a)};a.prototype.init=function(a,c){var e=a.plotOptions||{};R(this,"init",{args:arguments},function(){var g=V(b,a),f=g.chart;X(g.plotOptions,
+function(b,a){N(b)&&(b.tooltip=e[a]&&V(e[a].tooltip)||void 0)});g.tooltip.userOptions=a.chart&&a.chart.forExport&&a.tooltip.userOptions||a.tooltip;this.userOptions=a;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=c;this.isResizing=0;this.options=g;this.axes=[];this.series=[];this.time=a.time&&Object.keys(a.time).length?new d(a.time):u.time;this.numberFormatter=f.numberFormatter||w;this.styledMode=f.styledMode;this.hasCartesianSeries=f.showAxes;this.index=
+A.length;A.push(this);u.chartCount++;y(this,f);this.xAxis=[];this.yAxis=[];this.pointCount=this.colorCounter=this.symbolCounter=0;R(this,"afterInit");this.firstRender()})};a.prototype.initSeries=function(b){var a=this.options.chart;a=b.type||a.type||a.defaultSeriesType;var c=x[a];c||J(17,!0,this,{missingModuleFor:a});a=new c;"function"===typeof a.init&&a.init(this,b);return a};a.prototype.setSeriesData=function(){this.getSeriesOrderByLinks().forEach(function(b){b.points||b.data||!b.enabledDataSorting||
+b.setData(b.options.data,!1)})};a.prototype.getSeriesOrderByLinks=function(){return this.series.concat().sort(function(b,a){return b.linkedSeries.length||a.linkedSeries.length?a.linkedSeries.length-b.linkedSeries.length:0})};a.prototype.orderSeries=function(b){var a=this.series;b=b||0;for(var c=a.length;b<c;++b)a[b]&&(a[b].index=b,a[b].name=a[b].getName())};a.prototype.isInsidePlot=function(b,a,c){void 0===c&&(c={});var d=this.inverted,e=this.plotBox,g=this.plotLeft,f=this.plotTop,k=this.scrollablePlotBox,
+h=0;var l=0;c.visiblePlotOnly&&this.scrollingContainer&&(l=this.scrollingContainer,h=l.scrollLeft,l=l.scrollTop);var m=c.series;e=c.visiblePlotOnly&&k||e;k=c.inverted?a:b;a=c.inverted?b:a;b={x:k,y:a,isInsidePlot:!0};if(!c.ignoreX){var n=m&&(d?m.yAxis:m.xAxis)||{pos:g,len:Infinity};k=c.paneCoordinates?n.pos+k:g+k;k>=Math.max(h+g,n.pos)&&k<=Math.min(h+g+e.width,n.pos+n.len)||(b.isInsidePlot=!1)}!c.ignoreY&&b.isInsidePlot&&(d=m&&(d?m.xAxis:m.yAxis)||{pos:f,len:Infinity},c=c.paneCoordinates?d.pos+a:f+
+a,c>=Math.max(l+f,d.pos)&&c<=Math.min(l+f+e.height,d.pos+d.len)||(b.isInsidePlot=!1));R(this,"afterIsInsidePlot",b);return b.isInsidePlot};a.prototype.redraw=function(b){R(this,"beforeRedraw");var a=this.hasCartesianSeries?this.axes:this.colorAxis||[],c=this.series,d=this.pointer,e=this.legend,g=this.userOptions.legend,f=this.renderer,k=f.isHidden(),h=[],l=this.isDirtyBox,m=this.isDirtyLegend;this.setResponsive&&this.setResponsive(!1);v(this.hasRendered?b:!1,this);k&&this.temporaryDisplay();this.layOutTitles();
+for(b=c.length;b--;){var n=c[b];if(n.options.stacking||n.options.centerInCategory){var q=!0;if(n.isDirty){var E=!0;break}}}if(E)for(b=c.length;b--;)n=c[b],n.options.stacking&&(n.isDirty=!0);c.forEach(function(b){b.isDirty&&("point"===b.options.legendType?("function"===typeof b.updateTotals&&b.updateTotals(),m=!0):g&&(g.labelFormatter||g.labelFormat)&&(m=!0));b.isDirtyData&&R(b,"updatedData")});m&&e&&e.options.enabled&&(e.render(),this.isDirtyLegend=!1);q&&this.getStacks();a.forEach(function(b){b.updateNames();
+b.setScale()});this.getMargins();a.forEach(function(b){b.isDirty&&(l=!0)});a.forEach(function(b){var a=b.min+","+b.max;b.extKey!==a&&(b.extKey=a,h.push(function(){R(b,"afterSetExtremes",M(b.eventArgs,b.getExtremes()));delete b.eventArgs}));(l||q)&&b.redraw()});l&&this.drawChartBox();R(this,"predraw");c.forEach(function(b){(l||b.isDirty)&&b.visible&&b.redraw();b.isDirtyData=!1});d&&d.reset(!0);f.draw();R(this,"redraw");R(this,"render");k&&this.temporaryDisplay(!0);h.forEach(function(b){b.call()})};
+a.prototype.get=function(b){function a(a){return a.id===b||a.options&&a.options.id===b}for(var c=this.series,d=da(this.axes,a)||da(this.series,a),e=0;!d&&e<c.length;e++)d=da(c[e].points||[],a);return d};a.prototype.getAxes=function(){var b=this,a=this.options,c=a.xAxis=ha(a.xAxis||{});a=a.yAxis=ha(a.yAxis||{});R(this,"getAxes");c.forEach(function(b,a){b.index=a;b.isX=!0});a.forEach(function(b,a){b.index=a});c.concat(a).forEach(function(a){new f(b,a)});R(this,"afterGetAxes")};a.prototype.getSelectedPoints=
+function(){return this.series.reduce(function(b,a){a.getPointsCollection().forEach(function(a){S(a.selectedStaging,a.selected)&&b.push(a)});return b},[])};a.prototype.getSelectedSeries=function(){return this.series.filter(function(b){return b.selected})};a.prototype.setTitle=function(b,a,c){this.applyDescription("title",b);this.applyDescription("subtitle",a);this.applyDescription("caption",void 0);this.layOutTitles(c)};a.prototype.applyDescription=function(b,a){var c=this,d="title"===b?{color:"#333333",
+fontSize:this.options.isStock?"16px":"18px"}:{color:"#666666"};d=this.options[b]=V(!this.styledMode&&{style:d},this.options[b],a);var e=this[b];e&&a&&(this[b]=e=e.destroy());d&&!e&&(e=this.renderer.text(d.text,0,0,d.useHTML).attr({align:d.align,"class":"highcharts-"+b,zIndex:d.zIndex||4}).add(),e.update=function(a){c[{title:"setTitle",subtitle:"setSubtitle",caption:"setCaption"}[b]](a)},this.styledMode||e.css(d.style),this[b]=e)};a.prototype.layOutTitles=function(b){var a=[0,0,0],c=this.renderer,
+d=this.spacingBox;["title","subtitle","caption"].forEach(function(b){var e=this[b],g=this.options[b],f=g.verticalAlign||"top";b="title"===b?"top"===f?-3:0:"top"===f?a[0]+2:0;var k;if(e){this.styledMode||(k=g.style&&g.style.fontSize);k=c.fontMetrics(k,e).b;e.css({width:(g.width||d.width+(g.widthAdjust||0))+"px"});var h=Math.round(e.getBBox(g.useHTML).height);e.align(M({y:"bottom"===f?k:b+k,height:h},g),!1,"spacingBox");g.floating||("top"===f?a[0]=Math.ceil(a[0]+h):"bottom"===f&&(a[2]=Math.ceil(a[2]+
+h)))}},this);a[0]&&"top"===(this.options.title.verticalAlign||"top")&&(a[0]+=this.options.title.margin);a[2]&&"bottom"===this.options.caption.verticalAlign&&(a[2]+=this.options.caption.margin);var e=!this.titleOffset||this.titleOffset.join(",")!==a.join(",");this.titleOffset=a;R(this,"afterLayOutTitles");!this.isDirtyBox&&e&&(this.isDirtyBox=this.isDirtyLegend=e,this.hasRendered&&S(b,!0)&&this.isDirtyBox&&this.redraw())};a.prototype.getChartSize=function(){var b=this.options.chart,a=b.width;b=b.height;
+var c=this.renderTo;W(a)||(this.containerWidth=ea(c,"width"));W(b)||(this.containerHeight=ea(c,"height"));this.chartWidth=Math.max(0,a||this.containerWidth||600);this.chartHeight=Math.max(0,aa(b,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))};a.prototype.temporaryDisplay=function(b){var a=this.renderTo;if(b)for(;a&&a.style;)a.hcOrigStyle&&(O(a,a.hcOrigStyle),delete a.hcOrigStyle),a.hcOrigDetached&&(q.body.removeChild(a),a.hcOrigDetached=!1),a=a.parentNode;else for(;a&&a.style;){q.body.contains(a)||
+a.parentNode||(a.hcOrigDetached=!0,q.body.appendChild(a));if("none"===ea(a,"display",!1)||a.hcOricDetached)a.hcOrigStyle={display:a.style.display,height:a.style.height,overflow:a.style.overflow},b={display:"block",overflow:"hidden"},a!==this.renderTo&&(b.height=0),O(a,b),a.offsetWidth||a.style.setProperty("display","block","important");a=a.parentNode;if(a===q.body)break}};a.prototype.setClassName=function(b){this.container.className="highcharts-container "+(b||"")};a.prototype.getContainer=function(){var b=
+this.options,a=b.chart,d=ka(),g,f=this.renderTo;f||(this.renderTo=f=a.renderTo);U(f)&&(this.renderTo=f=q.getElementById(f));f||J(13,!0,this);var k=fa(K(f,"data-highcharts-chart"));T(k)&&A[k]&&A[k].hasRendered&&A[k].destroy();K(f,"data-highcharts-chart",this.index);f.innerHTML=h.emptyHTML;a.skipClone||f.offsetWidth||this.temporaryDisplay();this.getChartSize();k=this.chartWidth;var l=this.chartHeight;O(f,{overflow:"hidden"});this.styledMode||(g=M({position:"relative",overflow:"hidden",width:k+"px",
+height:l+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)",userSelect:"none","touch-action":"manipulation",outline:"none"},a.style||{}));this.container=d=Q("div",{id:d},g,f);this._cursor=d.style.cursor;this.renderer=new (a.renderer||!c?p.getRendererType(a.renderer):e)(d,k,l,void 0,a.forExport,b.exporting&&b.exporting.allowHTML,this.styledMode);v(void 0,this);this.setClassName(a.className);if(this.styledMode)for(var m in b.defs)this.renderer.definition(b.defs[m]);
+else this.renderer.setStyle(a.style);this.renderer.chartIndex=this.index;R(this,"afterGetContainer")};a.prototype.getMargins=function(b){var a=this.spacing,c=this.margin,d=this.titleOffset;this.resetMargins();d[0]&&!W(c[0])&&(this.plotTop=Math.max(this.plotTop,d[0]+a[0]));d[2]&&!W(c[2])&&(this.marginBottom=Math.max(this.marginBottom,d[2]+a[2]));this.legend&&this.legend.display&&this.legend.adjustMargins(c,a);R(this,"getMargins");b||this.getAxisMargins()};a.prototype.getAxisMargins=function(){var b=
+this,a=b.axisOffset=[0,0,0,0],c=b.colorAxis,d=b.margin,e=function(b){b.forEach(function(b){b.visible&&b.getOffset()})};b.hasCartesianSeries?e(b.axes):c&&c.length&&e(c);k.forEach(function(c,e){W(d[e])||(b[c]+=a[e])});b.setChartSize()};a.prototype.reflow=function(b){var a=this,c=a.options.chart,d=a.renderTo,e=W(c.width)&&W(c.height),f=c.width||ea(d,"width");c=c.height||ea(d,"height");d=b?b.target:g;delete a.pointer.chartPosition;if(!e&&!a.isPrinting&&f&&c&&(d===g||d===q)){if(f!==a.containerWidth||c!==
+a.containerHeight)l.clearTimeout(a.reflowTimeout),a.reflowTimeout=ba(function(){a.container&&a.setSize(void 0,void 0,!1)},b?100:0);a.containerWidth=f;a.containerHeight=c}};a.prototype.setReflow=function(b){var a=this;!1===b||this.unbindReflow?!1===b&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):(this.unbindReflow=D(g,"resize",function(b){a.options&&a.reflow(b)}),D(this,"destroy",this.unbindReflow))};a.prototype.setSize=function(b,a,c){var d=this,e=d.renderer;d.isResizing+=1;v(c,d);c=
+e.globalAnimation;d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;"undefined"!==typeof b&&(d.options.chart.width=b);"undefined"!==typeof a&&(d.options.chart.height=a);d.getChartSize();d.styledMode||(c?t:O)(d.container,{width:d.chartWidth+"px",height:d.chartHeight+"px"},c);d.setChartSize(!0);e.setSize(d.chartWidth,d.chartHeight,c);d.axes.forEach(function(b){b.isDirty=!0;b.setScale()});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(c);d.oldChartHeight=null;R(d,
+"resize");ba(function(){d&&R(d,"endResize",null,function(){--d.isResizing})},n(c).duration)};a.prototype.setChartSize=function(b){var a=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,g=this.options.chart,f=this.spacing,k=this.clipOffset,h,l,m,n;this.plotLeft=h=Math.round(this.plotLeft);this.plotTop=l=Math.round(this.plotTop);this.plotWidth=m=Math.max(0,Math.round(d-h-this.marginRight));this.plotHeight=n=Math.max(0,Math.round(e-l-this.marginBottom));this.plotSizeX=a?n:m;this.plotSizeY=
+a?m:n;this.plotBorderWidth=g.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:f[3],y:f[0],width:d-f[3]-f[1],height:e-f[0]-f[2]};this.plotBox=c.plotBox={x:h,y:l,width:m,height:n};a=2*Math.floor(this.plotBorderWidth/2);d=Math.ceil(Math.max(a,k[3])/2);e=Math.ceil(Math.max(a,k[0])/2);this.clipBox={x:d,y:e,width:Math.floor(this.plotSizeX-Math.max(a,k[1])/2-d),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(a,k[2])/2-e))};b||(this.axes.forEach(function(b){b.setAxisSize();b.setAxisTranslation()}),
+c.alignElements());R(this,"afterSetChartSize",{skipAxes:b})};a.prototype.resetMargins=function(){R(this,"resetMargins");var b=this,a=b.options.chart;["margin","spacing"].forEach(function(c){var d=a[c],e=N(d)?d:[d,d,d,d];["Top","Right","Bottom","Left"].forEach(function(d,g){b[c][g]=S(a[c+d],e[g])})});k.forEach(function(a,c){b[a]=S(b.margin[c],b.spacing[c])});b.axisOffset=[0,0,0,0];b.clipOffset=[0,0,0,0]};a.prototype.drawChartBox=function(){var b=this.options.chart,a=this.renderer,c=this.chartWidth,
+d=this.chartHeight,e=this.styledMode,g=this.plotBGImage,f=b.backgroundColor,k=b.plotBackgroundColor,h=b.plotBackgroundImage,l=this.plotLeft,m=this.plotTop,n=this.plotWidth,q=this.plotHeight,E=this.plotBox,r=this.clipRect,p=this.clipBox,t=this.chartBackground,N=this.plotBackground,w=this.plotBorder,y,v="animate";t||(this.chartBackground=t=a.rect().addClass("highcharts-background").add(),v="attr");if(e)var A=y=t.strokeWidth();else{A=b.borderWidth||0;y=A+(b.shadow?8:0);f={fill:f||"none"};if(A||t["stroke-width"])f.stroke=
+b.borderColor,f["stroke-width"]=A;t.attr(f).shadow(b.shadow)}t[v]({x:y/2,y:y/2,width:c-y-A%2,height:d-y-A%2,r:b.borderRadius});v="animate";N||(v="attr",this.plotBackground=N=a.rect().addClass("highcharts-plot-background").add());N[v](E);e||(N.attr({fill:k||"none"}).shadow(b.plotShadow),h&&(g?(h!==g.attr("href")&&g.attr("href",h),g.animate(E)):this.plotBGImage=a.image(h,l,m,n,q).add()));r?r.animate({width:p.width,height:p.height}):this.clipRect=a.clipRect(p);v="animate";w||(v="attr",this.plotBorder=
+w=a.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());e||w.attr({stroke:b.plotBorderColor,"stroke-width":b.plotBorderWidth||0,fill:"none"});w[v](w.crisp({x:l,y:m,width:n,height:q},-w.strokeWidth()));this.isDirtyBox=!1;R(this,"afterDrawChartBox")};a.prototype.propFromSeries=function(){var b=this,a=b.options.chart,c=b.options.series,d,e,g;["inverted","angular","polar"].forEach(function(f){e=x[a.type||a.defaultSeriesType];g=a[f]||e&&e.prototype[f];for(d=c&&c.length;!g&&d--;)(e=x[c[d].type])&&
+e.prototype[f]&&(g=!0);b[f]=g})};a.prototype.linkSeries=function(){var b=this,a=b.series;a.forEach(function(b){b.linkedSeries.length=0});a.forEach(function(a){var c=a.options.linkedTo;U(c)&&(c=":previous"===c?b.series[a.index-1]:b.get(c))&&c.linkedParent!==a&&(c.linkedSeries.push(a),a.linkedParent=c,c.enabledDataSorting&&a.setDataSortingOptions(),a.visible=S(a.options.visible,c.options.visible,a.visible))});R(this,"afterLinkSeries")};a.prototype.renderSeries=function(){this.series.forEach(function(b){b.translate();
+b.render()})};a.prototype.renderLabels=function(){var b=this,a=b.options.labels;a.items&&a.items.forEach(function(c){var d=M(a.style,c.style),e=fa(d.left)+b.plotLeft,g=fa(d.top)+b.plotTop+12;delete d.left;delete d.top;b.renderer.text(c.html,e,g).attr({zIndex:2}).css(d).add()})};a.prototype.render=function(){var b=this.axes,a=this.colorAxis,c=this.renderer,d=this.options,e=function(b){b.forEach(function(b){b.visible&&b.render()})},g=0;this.setTitle();this.legend=new H(this,d.legend);this.getStacks&&
+this.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;b.some(function(b){if(b.horiz&&b.visible&&b.options.labels.enabled&&b.series.length)return g=21,!0});var f=this.plotHeight=Math.max(this.plotHeight-g,0);b.forEach(function(b){b.setScale()});this.getAxisMargins();var k=1.1<d/this.plotWidth,h=1.05<f/this.plotHeight;if(k||h)b.forEach(function(b){(b.horiz&&k||!b.horiz&&h)&&b.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries?e(b):a&&a.length&&e(a);
+this.seriesGroup||(this.seriesGroup=c.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0};a.prototype.addCredits=function(b){var a=this,c=V(!0,this.options.credits,b);c.enabled&&!this.credits&&(this.credits=this.renderer.text(c.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){c.href&&(g.location.href=c.href)}).attr({align:c.position.align,zIndex:8}),a.styledMode||
+this.credits.css(c.style),this.credits.add().align(c.position),this.credits.update=function(b){a.credits=a.credits.destroy();a.addCredits(b)})};a.prototype.destroy=function(){var b=this,a=b.axes,c=b.series,d=b.container,e=d&&d.parentNode,g;R(b,"destroy");b.renderer.forExport?L(A,b):A[b.index]=void 0;u.chartCount--;b.renderTo.removeAttribute("data-highcharts-chart");ia(b);for(g=a.length;g--;)a[g]=a[g].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(g=c.length;g--;)c[g]=
+c[g].destroy();"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" ").forEach(function(a){var c=b[a];c&&c.destroy&&(b[a]=c.destroy())});d&&(d.innerHTML=h.emptyHTML,ia(d),e&&Z(d));X(b,function(a,c){delete b[c]})};a.prototype.firstRender=function(){var b=this,a=b.options;if(!b.isReadyToRender||b.isReadyToRender()){b.getContainer();b.resetMargins();b.setChartSize();b.propFromSeries();
+b.getAxes();(E(a.series)?a.series:[]).forEach(function(a){b.initSeries(a)});b.linkSeries();b.setSeriesData();R(b,"beforeRender");z&&(I.isRequired()?b.pointer=new I(b,a):b.pointer=new z(b,a));b.render();b.pointer.getChartPosition();if(!b.renderer.imgCount&&!b.hasLoaded)b.onload();b.temporaryDisplay(!0)}};a.prototype.onload=function(){this.callbacks.concat([this.callback]).forEach(function(b){b&&"undefined"!==typeof this.index&&b.apply(this,[this])},this);R(this,"load");R(this,"render");W(this.index)&&
+this.setReflow(this.options.chart.reflow);this.hasLoaded=!0};a.prototype.addSeries=function(b,a,c){var d=this,e;b&&(a=S(a,!0),R(d,"addSeries",{options:b},function(){e=d.initSeries(b);d.isDirtyLegend=!0;d.linkSeries();e.enabledDataSorting&&e.setData(b.data,!1);R(d,"afterAddSeries",{series:e});a&&d.redraw(c)}));return e};a.prototype.addAxis=function(b,a,c,d){return this.createAxis(a?"xAxis":"yAxis",{axis:b,redraw:c,animation:d})};a.prototype.addColorAxis=function(b,a,c){return this.createAxis("colorAxis",
+{axis:b,redraw:a,animation:c})};a.prototype.createAxis=function(b,a){b=new f(this,V(a.axis,{index:this[b].length,isX:"xAxis"===b}));S(a.redraw,!0)&&this.redraw(a.animation);return b};a.prototype.showLoading=function(b){var a=this,c=a.options,d=c.loading,e=function(){g&&O(g,{left:a.plotLeft+"px",top:a.plotTop+"px",width:a.plotWidth+"px",height:a.plotHeight+"px"})},g=a.loadingDiv,f=a.loadingSpan;g||(a.loadingDiv=g=Q("div",{className:"highcharts-loading highcharts-loading-hidden"},null,a.container));
+f||(a.loadingSpan=f=Q("span",{className:"highcharts-loading-inner"},null,g),D(a,"redraw",e));g.className="highcharts-loading";h.setElementHTML(f,S(b,c.lang.loading,""));a.styledMode||(O(g,M(d.style,{zIndex:10})),O(f,d.labelStyle),a.loadingShown||(O(g,{opacity:0,display:""}),t(g,{opacity:d.style.opacity||.5},{duration:d.showDuration||0})));a.loadingShown=!0;e()};a.prototype.hideLoading=function(){var b=this.options,a=this.loadingDiv;a&&(a.className="highcharts-loading highcharts-loading-hidden",this.styledMode||
+t(a,{opacity:0},{duration:b.loading.hideDuration||100,complete:function(){O(a,{display:"none"})}}));this.loadingShown=!1};a.prototype.update=function(b,a,c,e){var g=this,f={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle",caption:"setCaption"},k=b.isResponsiveOptions,h=[],l,m;R(g,"update",{options:b});k||g.setResponsive(!1,!0);b=F(b,g.options);g.userOptions=V(g.userOptions,b);var n=b.chart;if(n){V(!0,g.options.chart,n);"className"in n&&g.setClassName(n.className);"reflow"in n&&g.setReflow(n.reflow);
+if("inverted"in n||"polar"in n||"type"in n){g.propFromSeries();var q=!0}"alignTicks"in n&&(q=!0);"events"in n&&y(this,n);X(n,function(b,a){-1!==g.propsRequireUpdateSeries.indexOf("chart."+a)&&(l=!0);-1!==g.propsRequireDirtyBox.indexOf(a)&&(g.isDirtyBox=!0);-1!==g.propsRequireReflow.indexOf(a)&&(k?g.isDirtyBox=!0:m=!0)});!g.styledMode&&n.style&&g.renderer.setStyle(g.options.chart.style||{})}!g.styledMode&&b.colors&&(this.options.colors=b.colors);b.time&&(this.time===r&&(this.time=new d(b.time)),V(!0,
+g.options.time,b.time));X(b,function(a,c){if(g[c]&&"function"===typeof g[c].update)g[c].update(a,!1);else if("function"===typeof g[f[c]])g[f[c]](a);else"colors"!==c&&-1===g.collectionsWithUpdate.indexOf(c)&&V(!0,g.options[c],b[c]);"chart"!==c&&-1!==g.propsRequireUpdateSeries.indexOf(c)&&(l=!0)});this.collectionsWithUpdate.forEach(function(a){if(b[a]){var d=[];g[a].forEach(function(b,a){b.options.isInternal||d.push(S(b.options.index,a))});ha(b[a]).forEach(function(b,e){var f=W(b.id),k;f&&(k=g.get(b.id));
+!k&&g[a]&&(k=g[a][d?d[e]:e])&&f&&W(k.options.id)&&(k=void 0);k&&k.coll===a&&(k.update(b,!1),c&&(k.touched=!0));!k&&c&&g.collectionsWithInit[a]&&(g.collectionsWithInit[a][0].apply(g,[b].concat(g.collectionsWithInit[a][1]||[]).concat([!1])).touched=!0)});c&&g[a].forEach(function(b){b.touched||b.options.isInternal?delete b.touched:h.push(b)})}});h.forEach(function(b){b.chart&&b.remove&&b.remove(!1)});q&&g.axes.forEach(function(b){b.update({},!1)});l&&g.getSeriesOrderByLinks().forEach(function(b){b.chart&&
+b.update({},!1)},this);q=n&&n.width;n=n&&(U(n.height)?aa(n.height,q||g.chartWidth):n.height);m||T(q)&&q!==g.chartWidth||T(n)&&n!==g.chartHeight?g.setSize(q,n,e):S(a,!0)&&g.redraw(e);R(g,"afterUpdate",{options:b,redraw:a,animation:e})};a.prototype.setSubtitle=function(b,a){this.applyDescription("subtitle",b);this.layOutTitles(a)};a.prototype.setCaption=function(b,a){this.applyDescription("caption",b);this.layOutTitles(a)};a.prototype.showResetZoom=function(){function a(){c.zoomOut()}var c=this,d=b.lang,
+e=c.options.chart.resetZoomButton,g=e.theme,f=g.states,k="chart"===e.relativeTo||"spacingBox"===e.relativeTo?null:"scrollablePlotBox";R(this,"beforeShowResetZoom",null,function(){c.resetZoomButton=c.renderer.button(d.resetZoom,null,null,a,g,f&&f.hover).attr({align:e.position.align,title:d.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(e.position,!1,k)});R(this,"afterShowResetZoom")};a.prototype.zoomOut=function(){R(this,"selection",{resetSelection:!0},this.zoom)};a.prototype.zoom=
+function(b){var a=this,c=a.pointer,d=a.inverted?c.mouseDownX:c.mouseDownY,e=!1,g;!b||b.resetSelection?(a.axes.forEach(function(b){g=b.zoom()}),c.initiated=!1):b.xAxis.concat(b.yAxis).forEach(function(b){var f=b.axis,k=a.inverted?f.left:f.top,h=a.inverted?k+f.width:k+f.height,l=f.isXAxis,n=!1;if(!l&&d>=k&&d<=h||l||!W(d))n=!0;c[l?"zoomX":"zoomY"]&&n&&(g=f.zoom(b.min,b.max),f.displayBtn&&(e=!0))});var f=a.resetZoomButton;e&&!f?a.showResetZoom():!e&&N(f)&&(a.resetZoomButton=f.destroy());g&&a.redraw(S(a.options.chart.animation,
+b&&b.animation,100>a.pointCount))};a.prototype.pan=function(b,a){var c=this,d=c.hoverPoints;a="object"===typeof a?a:{enabled:a,type:"x"};var e=c.options.chart,g=c.options.mapNavigation&&c.options.mapNavigation.enabled;e&&e.panning&&(e.panning=a);var f=a.type,k;R(this,"pan",{originalEvent:b},function(){d&&d.forEach(function(b){b.setState()});var a=c.xAxis;"xy"===f?a=a.concat(c.yAxis):"y"===f&&(a=c.yAxis);var e={};a.forEach(function(a){if(a.options.panningEnabled&&!a.options.isInternal){var d=a.horiz,
+h=b[d?"chartX":"chartY"];d=d?"mouseDownX":"mouseDownY";var l=c[d],n=a.minPointOffset||0,m=a.reversed&&!c.inverted||!a.reversed&&c.inverted?-1:1,q=a.getExtremes(),E=a.toValue(l-h,!0)+n*m,r=a.toValue(l+a.len-h,!0)-(n*m||a.isXAxis&&a.pointRangePadding||0),p=r<E;m=a.hasVerticalPanning();l=p?r:E;E=p?E:r;var t=a.panningState;!m||a.isXAxis||t&&!t.isDirty||a.series.forEach(function(b){var a=b.getProcessedData(!0);a=b.getExtremes(a.yData,!0);t||(t={startMin:Number.MAX_VALUE,startMax:-Number.MAX_VALUE});T(a.dataMin)&&
+T(a.dataMax)&&(t.startMin=Math.min(S(b.options.threshold,Infinity),a.dataMin,t.startMin),t.startMax=Math.max(S(b.options.threshold,-Infinity),a.dataMax,t.startMax))});m=Math.min(S(t&&t.startMin,q.dataMin),n?q.min:a.toValue(a.toPixels(q.min)-a.minPixelPadding));r=Math.max(S(t&&t.startMax,q.dataMax),n?q.max:a.toValue(a.toPixels(q.max)+a.minPixelPadding));a.panningState=t;a.isOrdinal||(n=m-l,0<n&&(E+=n,l=m),n=E-r,0<n&&(E=r,l-=n),a.series.length&&l!==q.min&&E!==q.max&&l>=m&&E<=r&&(a.setExtremes(l,E,!1,
+!1,{trigger:"pan"}),c.resetZoomButton||g||l===m||E===r||!f.match("y")||(c.showResetZoom(),a.displayBtn=!1),k=!0),e[d]=h)}});X(e,function(b,a){c[a]=b});k&&c.redraw(!1);O(c.container,{cursor:"move"})})};return a}();M(a.prototype,{callbacks:[],collectionsWithInit:{xAxis:[a.prototype.addAxis,[!0]],yAxis:[a.prototype.addAxis,[!1]],series:[a.prototype.addSeries]},collectionsWithUpdate:["xAxis","yAxis","series"],propsRequireDirtyBox:"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
+propsRequireReflow:"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft".split(" "),propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip".split(" ")});"";return a});M(f,"Core/Legend/LegendSymbol.js",[f["Core/Utilities.js"]],function(a){var f=a.merge,C=a.pick,G;(function(a){a.drawLineMarker=function(a){var u=this.options,B=a.symbolWidth,z=a.symbolHeight,p=z/2,m=this.chart.renderer,
+e=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var d={},l=u.marker;this.chart.styledMode||(d={"stroke-width":u.lineWidth||0},u.dashStyle&&(d.dashstyle=u.dashStyle));this.legendLine=m.path([["M",0,a],["L",B,a]]).addClass("highcharts-graph").attr(d).add(e);l&&!1!==l.enabled&&B&&(u=Math.min(C(l.radius,p),p),0===this.symbol.indexOf("url")&&(l=f(l,{width:z,height:z}),u=0),this.legendSymbol=B=m.symbol(this.symbol,B/2-u,a-u,2*u,2*u,l).addClass("highcharts-point").add(e),B.isMarker=!0)};a.drawRectangle=
+function(a,f){var u=a.symbolHeight,z=a.options.squareSymbol;f.legendSymbol=this.chart.renderer.rect(z?(a.symbolWidth-u)/2:0,a.baseline-u+1,z?u:a.symbolWidth,u,C(a.options.symbolRadius,u/2)).addClass("highcharts-point").attr({zIndex:3}).add(f.legendGroup)}})(G||(G={}));return G});M(f,"Core/Series/SeriesDefaults.js",[],function(){return{lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{enabledThreshold:2,lineColor:"#ffffff",lineWidth:0,radius:4,states:{normal:{animation:!0},
+hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{animation:{},align:"center",defer:!0,formatter:function(){var a=this.series.chart.numberFormatter;return"number"!==typeof this.y?"":a(this.y,-1)},padding:5,style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0},cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},
+hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:50},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:"x"}});M(f,"Core/Series/Series.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/DefaultOptions.js"],f["Core/Foundation.js"],f["Core/Globals.js"],f["Core/Legend/LegendSymbol.js"],f["Core/Series/Point.js"],f["Core/Series/SeriesDefaults.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Renderer/SVG/SVGElement.js"],
+f["Core/Utilities.js"]],function(a,f,C,G,u,H,I,B,z,p){var m=a.animObject,e=a.setAnimation,d=f.defaultOptions,l=C.registerEventOptions,h=G.hasTouch,t=G.svg,n=G.win,v=B.seriesTypes,w=p.addEvent,y=p.arrayMax,A=p.arrayMin,q=p.clamp,k=p.cleanRecursively,c=p.correctFloat,g=p.defined,b=p.erase,r=p.error,x=p.extend,D=p.find,K=p.fireEvent,F=p.getNestedProperty,Q=p.isArray,O=p.isNumber,W=p.isString,Z=p.merge,L=p.objectEach,J=p.pick,M=p.removeEvent,da=p.splat,R=p.syncTimeout;a=function(){function a(){this.zones=
+this.yAxis=this.xAxis=this.userOptions=this.tooltipOptions=this.processedYData=this.processedXData=this.points=this.options=this.linkedSeries=this.index=this.eventsToUnbind=this.eventOptions=this.data=this.chart=this._i=void 0}a.prototype.init=function(a,b){K(this,"init",{options:b});var c=this,d=a.series;this.eventsToUnbind=[];c.chart=a;c.options=c.setOptions(b);b=c.options;c.linkedSeries=[];c.bindAxes();x(c,{name:b.name,state:"",visible:!1!==b.visible,selected:!0===b.selected});l(this,b);var e=
+b.events;if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();c.parallelArrays.forEach(function(a){c[a+"Data"]||(c[a+"Data"]=[])});c.isCartesian&&(a.hasCartesianSeries=!0);var g;d.length&&(g=d[d.length-1]);c._i=J(g&&g._i,-1)+1;c.opacity=c.options.opacity;a.orderSeries(this.insert(d));b.dataSorting&&b.dataSorting.enabled?c.setDataSortingOptions():c.points||c.data||c.setData(b.data,!1);K(this,"afterInit")};a.prototype.is=function(a){return v[a]&&
+this instanceof v[a]};a.prototype.insert=function(a){var b=this.options.index,c;if(O(b)){for(c=a.length;c--;)if(b>=J(a[c].options.index,a[c]._i)){a.splice(c+1,0,this);break}-1===c&&a.unshift(this);c+=1}else a.push(this);return J(c,a.length-1)};a.prototype.bindAxes=function(){var a=this,b=a.options,c=a.chart,d;K(this,"bindAxes",null,function(){(a.axisTypes||[]).forEach(function(e){var g=0;c[e].forEach(function(c){d=c.options;if(b[e]===g&&!d.isInternal||"undefined"!==typeof b[e]&&b[e]===d.id||"undefined"===
+typeof b[e]&&0===d.index)a.insert(c.series),a[e]=c,c.isDirty=!0;d.isInternal||g++});a[e]||a.optionalAxis===e||r(18,!0,c)})});K(this,"afterBindAxes")};a.prototype.updateParallelArrays=function(a,b){var c=a.series,d=arguments,e=O(b)?function(d){var e="y"===d&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=e}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))};c.parallelArrays.forEach(e)};a.prototype.hasData=function(){return this.visible&&"undefined"!==typeof this.dataMax&&
+"undefined"!==typeof this.dataMin||this.visible&&this.yData&&0<this.yData.length};a.prototype.autoIncrement=function(a){var b=this.options,c=b.pointIntervalUnit,d=b.relativeXValue,e=this.chart.time,g=this.xIncrement,f;g=J(g,b.pointStart,0);this.pointInterval=f=J(this.pointInterval,b.pointInterval,1);d&&O(a)&&(f*=a);c&&(b=new e.Date(g),"day"===c?e.set("Date",b,e.get("Date",b)+f):"month"===c?e.set("Month",b,e.get("Month",b)+f):"year"===c&&e.set("FullYear",b,e.get("FullYear",b)+f),f=b.getTime()-g);if(d&&
+O(a))return g+f;this.xIncrement=g+f;return g};a.prototype.setDataSortingOptions=function(){var a=this.options;x(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1});g(a.pointRange)||(a.pointRange=1)};a.prototype.setOptions=function(a){var b=this.chart,c=b.options,e=c.plotOptions,f=b.userOptions||{};a=Z(a);b=b.styledMode;var k={plotOptions:e,userOptions:a};K(this,"setOptions",k);var h=k.plotOptions[this.type],l=f.plotOptions||{};this.userOptions=k.userOptions;f=Z(h,e.series,f.plotOptions&&
+f.plotOptions[this.type],a);this.tooltipOptions=Z(d.tooltip,d.plotOptions.series&&d.plotOptions.series.tooltip,d.plotOptions[this.type].tooltip,c.tooltip.userOptions,e.series&&e.series.tooltip,e[this.type].tooltip,a.tooltip);this.stickyTracking=J(a.stickyTracking,l[this.type]&&l[this.type].stickyTracking,l.series&&l.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:f.stickyTracking);null===h.marker&&delete f.marker;this.zoneAxis=f.zoneAxis;e=this.zones=(f.zones||[]).slice();
+!f.negativeColor&&!f.negativeFillColor||f.zones||(c={value:f[this.zoneAxis+"Threshold"]||f.threshold||0,className:"highcharts-negative"},b||(c.color=f.negativeColor,c.fillColor=f.negativeFillColor),e.push(c));e.length&&g(e[e.length-1].value)&&e.push(b?{}:{color:this.color,fillColor:this.fillColor});K(this,"afterSetOptions",{options:f});return f};a.prototype.getName=function(){return J(this.options.name,"Series "+(this.index+1))};a.prototype.getCyclic=function(a,b,c){var d=this.chart,e=this.userOptions,
+f=a+"Index",k=a+"Counter",h=c?c.length:J(d.options.chart[a+"Count"],d[a+"Count"]);if(!b){var l=J(e[f],e["_"+f]);g(l)||(d.series.length||(d[k]=0),e["_"+f]=l=d[k]%h,d[k]+=1);c&&(b=c[l])}"undefined"!==typeof l&&(this[f]=l);this[a]=b};a.prototype.getColor=function(){this.chart.styledMode?this.getCyclic("color"):this.options.colorByPoint?this.color="#cccccc":this.getCyclic("color",this.options.color||d.plotOptions[this.type].color,this.chart.options.colors)};a.prototype.getPointsCollection=function(){return(this.hasGroupedData?
+this.points:this.data)||[]};a.prototype.getSymbol=function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)};a.prototype.findPointIndex=function(a,b){var c=a.id,d=a.x,e=this.points,g=this.options.dataSorting,f,k;if(c)g=this.chart.get(c),g instanceof H&&(f=g);else if(this.linkedParent||this.enabledDataSorting||this.options.relativeXValue)if(f=function(b){return!b.touched&&b.index===a.index},g&&g.matchByName?f=function(b){return!b.touched&&b.name===a.name}:this.options.relativeXValue&&
+(f=function(b){return!b.touched&&b.options.x===a.x}),f=D(e,f),!f)return;if(f){var h=f&&f.index;"undefined"!==typeof h&&(k=!0)}"undefined"===typeof h&&O(d)&&(h=this.xData.indexOf(d,b));-1!==h&&"undefined"!==typeof h&&this.cropped&&(h=h>=this.cropStart?h-this.cropStart:h);!k&&O(h)&&e[h]&&e[h].touched&&(h=void 0);return h};a.prototype.updateData=function(a,b){var c=this.options,d=c.dataSorting,e=this.points,f=[],k=this.requireSorting,h=a.length===e.length,l,n,m,q=!0;this.xIncrement=null;a.forEach(function(a,
+b){var n=g(a)&&this.pointClass.prototype.optionsToObject.call({series:this},a)||{},q=n.x;if(n.id||O(q)){if(n=this.findPointIndex(n,m),-1===n||"undefined"===typeof n?f.push(a):e[n]&&a!==c.data[n]?(e[n].update(a,!1,null,!1),e[n].touched=!0,k&&(m=n+1)):e[n]&&(e[n].touched=!0),!h||b!==n||d&&d.enabled||this.hasDerivedData)l=!0}else f.push(a)},this);if(l)for(a=e.length;a--;)(n=e[a])&&!n.touched&&n.remove&&n.remove(!1,b);else!h||d&&d.enabled?q=!1:(a.forEach(function(a,b){a!==e[b].y&&e[b].update&&e[b].update(a,
+!1,null,!1)}),f.length=0);e.forEach(function(a){a&&(a.touched=!1)});if(!q)return!1;f.forEach(function(a){this.addPoint(a,!1,null,null,!1)},this);null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=y(this.xData),this.autoIncrement());return!0};a.prototype.setData=function(a,b,c,d){var e=this,g=e.points,f=g&&g.length||0,k=e.options,h=e.chart,l=k.dataSorting,n=e.xAxis,m=k.turboThreshold,q=this.xData,p=this.yData,E=e.pointArrayMap;E=E&&E.length;var t=k.keys,w,y=0,v=1,A=null;a=a||[];
+var x=a.length;b=J(b,!0);l&&l.enabled&&(a=this.sortData(a));!1!==d&&x&&f&&!e.cropped&&!e.hasGroupedData&&e.visible&&!e.isSeriesBoosting&&(w=this.updateData(a,c));if(!w){e.xIncrement=null;e.colorCounter=0;this.parallelArrays.forEach(function(a){e[a+"Data"].length=0});if(m&&x>m)if(A=e.getFirstValidPoint(a),O(A))for(c=0;c<x;c++)q[c]=this.autoIncrement(),p[c]=a[c];else if(Q(A))if(E)if(A.length===E)for(c=0;c<x;c++)q[c]=this.autoIncrement(),p[c]=a[c];else for(c=0;c<x;c++)d=a[c],q[c]=d[0],p[c]=d.slice(1,
+E+1);else if(t&&(y=t.indexOf("x"),v=t.indexOf("y"),y=0<=y?y:0,v=0<=v?v:1),1===A.length&&(v=0),y===v)for(c=0;c<x;c++)q[c]=this.autoIncrement(),p[c]=a[c][v];else for(c=0;c<x;c++)d=a[c],q[c]=d[y],p[c]=d[v];else r(12,!1,h);else for(c=0;c<x;c++)"undefined"!==typeof a[c]&&(d={series:e},e.pointClass.prototype.applyOptions.apply(d,[a[c]]),e.updateParallelArrays(d,c));p&&W(p[0])&&r(14,!0,h);e.data=[];e.options.data=e.userOptions.data=a;for(c=f;c--;)g[c]&&g[c].destroy&&g[c].destroy();n&&(n.minRange=n.userMinRange);
+e.isDirty=h.isDirtyBox=!0;e.isDirtyData=!!g;c=!1}"point"===k.legendType&&(this.processData(),this.generatePoints());b&&h.redraw(c)};a.prototype.sortData=function(a){var b=this,c=b.options.dataSorting.sortKey||"y",d=function(a,b){return g(b)&&a.pointClass.prototype.optionsToObject.call({series:a},b)||{}};a.forEach(function(c,e){a[e]=d(b,c);a[e].index=e},this);a.concat().sort(function(a,b){a=F(c,a);b=F(c,b);return b<a?-1:b>a?1:0}).forEach(function(a,b){a.x=b},this);b.linkedSeries&&b.linkedSeries.forEach(function(b){var c=
+b.options,e=c.data;c.dataSorting&&c.dataSorting.enabled||!e||(e.forEach(function(c,g){e[g]=d(b,c);a[g]&&(e[g].x=a[g].x,e[g].index=g)}),b.setData(e,!1))});return a};a.prototype.getProcessedData=function(a){var b=this.xAxis,c=this.options,d=c.cropThreshold,e=a||this.getExtremesFromAll||c.getExtremesFromAll,g=this.isCartesian;a=b&&b.val2lin;c=!(!b||!b.logarithmic);var f=0,k=this.xData,h=this.yData,l=this.requireSorting;var n=!1;var m=k.length;if(b){n=b.getExtremes();var q=n.min;var p=n.max;n=!(!b.categories||
+b.names.length)}if(g&&this.sorted&&!e&&(!d||m>d||this.forceCrop))if(k[m-1]<q||k[0]>p)k=[],h=[];else if(this.yData&&(k[0]<q||k[m-1]>p)){var E=this.cropData(this.xData,this.yData,q,p);k=E.xData;h=E.yData;f=E.start;E=!0}for(d=k.length||1;--d;)if(b=c?a(k[d])-a(k[d-1]):k[d]-k[d-1],0<b&&("undefined"===typeof t||b<t))var t=b;else 0>b&&l&&!n&&(r(15,!1,this.chart),l=!1);return{xData:k,yData:h,cropped:E,cropStart:f,closestPointRange:t}};a.prototype.processData=function(a){var b=this.xAxis;if(this.isCartesian&&
+!this.isDirty&&!b.isDirty&&!this.yAxis.isDirty&&!a)return!1;a=this.getProcessedData();this.cropped=a.cropped;this.cropStart=a.cropStart;this.processedXData=a.xData;this.processedYData=a.yData;this.closestPointRange=this.basePointRange=a.closestPointRange;K(this,"afterProcessData")};a.prototype.cropData=function(a,b,c,d,e){var g=a.length,f,k=0,h=g;e=J(e,this.cropShoulder);for(f=0;f<g;f++)if(a[f]>=c){k=Math.max(0,f-e);break}for(c=f;c<g;c++)if(a[c]>d){h=c+e;break}return{xData:a.slice(k,h),yData:b.slice(k,
+h),start:k,end:h}};a.prototype.generatePoints=function(){var a=this.options,b=this.processedData||a.data,c=this.processedXData,d=this.processedYData,e=this.pointClass,g=c.length,f=this.cropStart||0,k=this.hasGroupedData,h=a.keys,l=[];a=a.dataGrouping&&a.dataGrouping.groupAll?f:0;var n,m,q=this.data;if(!q&&!k){var p=[];p.length=b.length;q=this.data=p}h&&k&&(this.options.keys=!1);for(m=0;m<g;m++){p=f+m;if(k){var r=(new e).init(this,[c[m]].concat(da(d[m])));r.dataGroup=this.groupMap[a+m];r.dataGroup.options&&
+(r.options=r.dataGroup.options,x(r,r.dataGroup.options),delete r.dataLabels)}else(r=q[p])||"undefined"===typeof b[p]||(q[p]=r=(new e).init(this,b[p],c[m]));r&&(r.index=k?a+m:p,l[m]=r)}this.options.keys=h;if(q&&(g!==(n=q.length)||k))for(m=0;m<n;m++)m!==f||k||(m+=g),q[m]&&(q[m].destroyElements(),q[m].plotX=void 0);this.data=q;this.points=l;K(this,"afterGeneratePoints")};a.prototype.getXExtremes=function(a){return{min:A(a),max:y(a)}};a.prototype.getExtremes=function(a,b){var c=this.xAxis,d=this.yAxis,
+e=this.processedXData||this.xData,g=[],f=this.requireSorting?this.cropShoulder:0;d=d?d.positiveValuesOnly:!1;var k,h=0,l=0,n=0;a=a||this.stackedYData||this.processedYData||[];var m=a.length;if(c){var q=c.getExtremes();h=q.min;l=q.max}for(k=0;k<m;k++){var r=e[k];q=a[k];var p=(O(q)||Q(q))&&(q.length||0<q||!d);r=b||this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||!c||(e[k+f]||r)>=h&&(e[k-f]||r)<=l;if(p&&r)if(p=q.length)for(;p--;)O(q[p])&&(g[n++]=q[p]);else g[n++]=q}a={activeYData:g,
+dataMin:A(g),dataMax:y(g)};K(this,"afterGetExtremes",{dataExtremes:a});return a};a.prototype.applyExtremes=function(){var a=this.getExtremes();this.dataMin=a.dataMin;this.dataMax=a.dataMax;return a};a.prototype.getFirstValidPoint=function(a){for(var b=a.length,c=0,d=null;null===d&&c<b;)d=a[c],c++;return d};a.prototype.translate=function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,d=this.xAxis,e=d.categories,f=this.enabledDataSorting,k=this.yAxis,
+h=this.points,l=h.length,n=this.pointPlacementToXValue(),m=!!n,r=a.threshold,p=a.startFromThreshold?r:0,t=this.zoneAxis||"y",w,y,v=Number.MAX_VALUE;for(w=0;w<l;w++){var A=h[w],x=A.x,D=void 0,z=void 0,u=A.y,B=A.low,F=b&&k.stacking&&k.stacking.stacks[(this.negStacks&&u<(p?0:r)?"-":"")+this.stackKey];if(k.positiveValuesOnly&&!k.validatePositiveValue(u)||d.positiveValuesOnly&&!d.validatePositiveValue(x))A.isNull=!0;A.plotX=y=c(q(d.translate(x,0,0,0,1,n,"flags"===this.type),-1E5,1E5));if(b&&this.visible&&
+F&&F[x]){var C=this.getStackIndicator(C,x,this.index);A.isNull||(D=F[x],z=D.points[C.key])}Q(z)&&(B=z[0],u=z[1],B===p&&C.key===F[x].base&&(B=J(O(r)&&r,k.min)),k.positiveValuesOnly&&0>=B&&(B=null),A.total=A.stackTotal=D.total,A.percentage=D.total&&A.y/D.total*100,A.stackY=u,this.irregularWidths||D.setOffset(this.pointXOffset||0,this.barW||0));A.yBottom=g(B)?q(k.translate(B,0,1,0,1),-1E5,1E5):null;this.dataModify&&(u=this.dataModify.modifyValue(u,w));A.plotY=void 0;O(u)&&(D=k.translate(u,!1,!0,!1,!0),
+"undefined"!==typeof D&&(A.plotY=q(D,-1E5,1E5)));A.isInside=this.isPointInside(A);A.clientX=m?c(d.translate(x,0,0,0,1,n)):y;A.negative=A[t]<(a[t+"Threshold"]||r||0);A.category=J(e&&e[A.x],A.x);if(!A.isNull&&!1!==A.visible){"undefined"!==typeof G&&(v=Math.min(v,Math.abs(y-G)));var G=y}A.zone=this.zones.length?A.getZone():void 0;!A.graphic&&this.group&&f&&(A.isNew=!0)}this.closestPointRangePx=v;K(this,"afterTranslate")};a.prototype.getValidPoints=function(a,b,c){var d=this.chart;return(a||this.points||
+[]).filter(function(a){return b&&!d.isInsidePlot(a.plotX,a.plotY,{inverted:d.inverted})?!1:!1!==a.visible&&(c||!a.isNull)})};a.prototype.getClipBox=function(){var a=this.chart,b=this.xAxis,c=this.yAxis,d=Z(a.clipBox);b&&b.len!==a.plotSizeX&&(d.width=b.len);c&&c.len!==a.plotSizeY&&(d.height=c.len);return d};a.prototype.getSharedClipKey=function(){return this.sharedClipKey=(this.options.xAxis||0)+","+(this.options.yAxis||0)};a.prototype.setClip=function(){var a=this.chart,b=this.group,c=this.markerGroup,
+d=a.sharedClips;a=a.renderer;var e=this.getClipBox(),g=this.getSharedClipKey(),f=d[g];f?f.animate(e):d[g]=f=a.clipRect(e);b&&b.clip(!1===this.options.clip?void 0:f);c&&c.clip()};a.prototype.animate=function(a){var b=this.chart,c=this.group,d=this.markerGroup,e=b.inverted,g=m(this.options.animation),f=[this.getSharedClipKey(),g.duration,g.easing,g.defer].join(),k=b.sharedClips[f],h=b.sharedClips[f+"m"];if(a&&c)g=this.getClipBox(),k?k.attr("height",g.height):(g.width=0,e&&(g.x=b.plotHeight),k=b.renderer.clipRect(g),
+b.sharedClips[f]=k,h=b.renderer.clipRect({x:e?(b.plotSizeX||0)+99:-99,y:e?-b.plotLeft:-b.plotTop,width:99,height:e?b.chartWidth:b.chartHeight}),b.sharedClips[f+"m"]=h),c.clip(k),d&&d.clip(h);else if(k&&!k.hasClass("highcharts-animating")){b=this.getClipBox();var l=g.step;d&&d.element.childNodes.length&&(g.step=function(a,b){l&&l.apply(b,arguments);h&&h.element&&h.attr(b.prop,"width"===b.prop?a+99:a)});k.addClass("highcharts-animating").animate(b,g)}};a.prototype.afterAnimate=function(){var a=this;
+this.setClip();L(this.chart.sharedClips,function(b,c,d){b&&!a.chart.container.querySelector('[clip-path="url(#'+b.id+')"]')&&(b.destroy(),delete d[c])});this.finishedAnimating=!0;K(this,"afterAnimate")};a.prototype.drawPoints=function(){var a=this.points,b=this.chart,c=this.options.marker,d=this[this.specialGroup]||this.markerGroup,e=this.xAxis,g=J(c.enabled,!e||e.isRadial?!0:null,this.closestPointRangePx>=c.enabledThreshold*c.radius),f,k;if(!1!==c.enabled||this._hasPointMarkers)for(f=0;f<a.length;f++){var h=
+a[f];var l=(k=h.graphic)?"animate":"attr";var n=h.marker||{};var m=!!h.marker;if((g&&"undefined"===typeof n.enabled||n.enabled)&&!h.isNull&&!1!==h.visible){var q=J(n.symbol,this.symbol,"rect");var r=this.markerAttribs(h,h.selected&&"select");this.enabledDataSorting&&(h.startXPos=e.reversed?-(r.width||0):e.width);var p=!1!==h.isInside;k?k[p?"show":"hide"](p).animate(r):p&&(0<(r.width||0)||h.hasImage)&&(h.graphic=k=b.renderer.symbol(q,r.x,r.y,r.width,r.height,m?n:c).add(d),this.enabledDataSorting&&
+b.hasRendered&&(k.attr({x:h.startXPos}),l="animate"));k&&"animate"===l&&k[p?"show":"hide"](p).animate(r);if(k&&!b.styledMode)k[l](this.pointAttribs(h,h.selected&&"select"));k&&k.addClass(h.getClassName(),!0)}else k&&(h.graphic=k.destroy())}};a.prototype.markerAttribs=function(a,b){var c=this.options,d=c.marker,e=a.marker||{},g=e.symbol||d.symbol,f=J(e.radius,d&&d.radius);b&&(d=d.states[b],b=e.states&&e.states[b],f=J(b&&b.radius,d&&d.radius,f&&f+(d&&d.radiusPlus||0)));a.hasImage=g&&0===g.indexOf("url");
+a.hasImage&&(f=0);a=O(f)?{x:c.crisp?Math.floor(a.plotX-f):a.plotX-f,y:a.plotY-f}:{};f&&(a.width=a.height=2*f);return a};a.prototype.pointAttribs=function(a,b){var c=this.options.marker,d=a&&a.options,e=d&&d.marker||{},g=d&&d.color,f=a&&a.color,k=a&&a.zone&&a.zone.color,h=this.color;a=J(e.lineWidth,c.lineWidth);d=1;h=g||k||f||h;g=e.fillColor||c.fillColor||h;f=e.lineColor||c.lineColor||h;b=b||"normal";c=c.states[b]||{};b=e.states&&e.states[b]||{};a=J(b.lineWidth,c.lineWidth,a+J(b.lineWidthPlus,c.lineWidthPlus,
+0));g=b.fillColor||c.fillColor||g;f=b.lineColor||c.lineColor||f;d=J(b.opacity,c.opacity,d);return{stroke:f,"stroke-width":a,fill:g,opacity:d}};a.prototype.destroy=function(a){var c=this,d=c.chart,e=/AppleWebKit\/533/.test(n.navigator.userAgent),g=c.data||[],f,k,h,l;K(c,"destroy",{keepEventsForUpdate:a});this.removeEvents(a);(c.axisTypes||[]).forEach(function(a){(l=c[a])&&l.series&&(b(l.series,c),l.isDirty=l.forceRedraw=!0)});c.legendItem&&c.chart.legend.destroyItem(c);for(k=g.length;k--;)(h=g[k])&&
+h.destroy&&h.destroy();c.clips&&c.clips.forEach(function(a){return a.destroy()});p.clearTimeout(c.animationTimeout);L(c,function(a,b){a instanceof z&&!a.survive&&(f=e&&"group"===b?"hide":"destroy",a[f]())});d.hoverSeries===c&&(d.hoverSeries=void 0);b(d.series,c);d.orderSeries();L(c,function(b,d){a&&"hcEvents"===d||delete c[d]})};a.prototype.applyZones=function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e=this.clips||[],g=this.graph,f=this.area,k=Math.max(b.chartWidth,b.chartHeight),h=this[(this.zoneAxis||
+"y")+"Axis"],l=b.inverted,n,m,r,p,t,w,A,y,v=!1;if(d.length&&(g||f)&&h&&"undefined"!==typeof h.min){var x=h.reversed;var D=h.horiz;g&&!this.showLine&&g.hide();f&&f.hide();var z=h.getExtremes();d.forEach(function(d,E){n=x?D?b.plotWidth:0:D?0:h.toPixels(z.min)||0;n=q(J(m,n),0,k);m=q(Math.round(h.toPixels(J(d.value,z.max),!0)||0),0,k);v&&(n=m=h.toPixels(z.max));p=Math.abs(n-m);t=Math.min(n,m);w=Math.max(n,m);h.isXAxis?(r={x:l?w:t,y:0,width:p,height:k},D||(r.x=b.plotHeight-r.x)):(r={x:0,y:l?w:t,width:k,
+height:p},D&&(r.y=b.plotWidth-r.y));l&&c.isVML&&(r=h.isXAxis?{x:0,y:x?t:w,height:r.width,width:b.chartWidth}:{x:r.y-b.plotLeft-b.spacingBox.x,y:0,width:r.height,height:b.chartHeight});e[E]?e[E].animate(r):e[E]=c.clipRect(r);A=a["zone-area-"+E];y=a["zone-graph-"+E];g&&y&&y.clip(e[E]);f&&A&&A.clip(e[E]);v=d.value>z.max;a.resetZones&&0===m&&(m=void 0)});this.clips=e}else a.visible&&(g&&g.show(!0),f&&f.show(!0))};a.prototype.invertGroups=function(a){function b(){["group","markerGroup"].forEach(function(b){c[b]&&
+(d.renderer.isVML&&c[b].attr({width:c.yAxis.len,height:c.xAxis.len}),c[b].width=c.yAxis.len,c[b].height=c.xAxis.len,c[b].invert(c.isRadialSeries?!1:a))})}var c=this,d=c.chart;c.xAxis&&(c.eventsToUnbind.push(w(d,"resize",b)),b(),c.invertGroups=b)};a.prototype.plotGroup=function(a,b,c,d,e){var f=this[a],k=!f;c={visibility:c,zIndex:d||.1};"undefined"===typeof this.opacity||this.chart.styledMode||"inactive"===this.state||(c.opacity=this.opacity);k&&(this[a]=f=this.chart.renderer.g().add(e));f.addClass("highcharts-"+
+b+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(g(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(f.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0);f.attr(c)[k?"attr":"animate"](this.getPlotBox());return f};a.prototype.getPlotBox=function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}};a.prototype.removeEvents=
+function(a){a||M(this);this.eventsToUnbind.length&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind.length=0)};a.prototype.render=function(){var a=this,b=a.chart,c=a.options,d=m(c.animation),e=a.visible?"inherit":"hidden",g=c.zIndex,f=a.hasRendered,k=b.seriesGroup,h=b.inverted;b=!a.finishedAnimating&&b.renderer.isSVG?d.duration:0;K(this,"render");var l=a.plotGroup("group","series",e,g,k);a.markerGroup=a.plotGroup("markerGroup","markers",e,g,k);!1!==c.clip&&a.setClip();a.animate&&
+b&&a.animate(!0);l.inverted=J(a.invertible,a.isCartesian)?h:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.visible&&a.drawPoints();a.drawDataLabels&&a.drawDataLabels();a.redrawPoints&&a.redrawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(h);a.animate&&b&&a.animate();f||(b&&d.defer&&(b+=d.defer),a.animationTimeout=R(function(){a.afterAnimate()},b||0));a.isDirty=!1;a.hasRendered=!0;K(a,"afterRender")};a.prototype.redraw=function(){var a=this.chart,b=this.isDirty||
+this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:J(d&&d.left,a.plotLeft),translateY:J(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree};a.prototype.searchPoint=function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b,a)};a.prototype.buildKDTree=function(a){function b(a,
+d,e){var g=a&&a.length;if(g){var f=c.kdAxisArray[d%e];a.sort(function(a,b){return a[f]-b[f]});g=Math.floor(g/2);return{point:a[g],left:b(a.slice(0,g),d+1,e),right:b(a.slice(g+1),d+1,e)}}}this.buildingKdTree=!0;var c=this,d=-1<c.options.findNearestPointBy.indexOf("y")?2:1;delete c.kdTree;R(function(){c.kdTree=b(c.getValidPoints(null,!c.directTouch),d,d);c.buildingKdTree=!1},c.options.kdNow||a&&"touchstart"===a.type?0:1)};a.prototype.searchKDTree=function(a,b,c){function d(a,b,c,l){var n=b.point,m=
+e.kdAxisArray[c%l],q=n,r=g(a[f])&&g(n[f])?Math.pow(a[f]-n[f],2):null;var p=g(a[k])&&g(n[k])?Math.pow(a[k]-n[k],2):null;p=(r||0)+(p||0);n.dist=g(p)?Math.sqrt(p):Number.MAX_VALUE;n.distX=g(r)?Math.sqrt(r):Number.MAX_VALUE;m=a[m]-n[m];p=0>m?"left":"right";r=0>m?"right":"left";b[p]&&(p=d(a,b[p],c+1,l),q=p[h]<q[h]?p:n);b[r]&&Math.sqrt(m*m)<q[h]&&(a=d(a,b[r],c+1,l),q=a[h]<q[h]?a:q);return q}var e=this,f=this.kdAxisArray[0],k=this.kdAxisArray[1],h=b?"distX":"dist";b=-1<e.options.findNearestPointBy.indexOf("y")?
+2:1;this.kdTree||this.buildingKdTree||this.buildKDTree(c);if(this.kdTree)return d(a,this.kdTree,b,b)};a.prototype.pointPlacementToXValue=function(){var a=this.options,b=a.pointRange,c=this.xAxis;a=a.pointPlacement;"between"===a&&(a=c.reversed?-.5:.5);return O(a)?a*(b||c.pointRange):0};a.prototype.isPointInside=function(a){var b=this.chart,c=this.xAxis,d=this.yAxis;return"undefined"!==typeof a.plotY&&"undefined"!==typeof a.plotX&&0<=a.plotY&&a.plotY<=(d?d.len:b.plotHeight)&&0<=a.plotX&&a.plotX<=(c?
+c.len:b.plotWidth)};a.prototype.drawTracker=function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=a.chart,g=e.pointer,f=e.renderer,k=e.options.tooltip.snap,l=a.tracker,n=function(b){if(e.hoverSeries!==a)a.onMouseOver()},m="rgba(192,192,192,"+(t?.0001:.002)+")";l?l.attr({d:d}):a.graph&&(a.tracker=f.path(d).attr({visibility:a.visible?"visible":"hidden",zIndex:2}).addClass(c?"highcharts-tracker-area":"highcharts-tracker-line").add(a.group),e.styledMode||a.tracker.attr({"stroke-linecap":"round",
+"stroke-linejoin":"round",stroke:m,fill:c?m:"none","stroke-width":a.graph.strokeWidth()+(c?0:2*k)}),[a.tracker,a.markerGroup,a.dataLabelsGroup].forEach(function(a){if(a&&(a.addClass("highcharts-tracker").on("mouseover",n).on("mouseout",function(a){g.onTrackerMouseOut(a)}),b.cursor&&!e.styledMode&&a.css({cursor:b.cursor}),h))a.on("touchstart",n)}));K(this,"afterDrawTracker")};a.prototype.addPoint=function(a,b,c,d,e){var g=this.options,f=this.data,k=this.chart,h=this.xAxis;h=h&&h.hasNames&&h.names;
+var l=g.data,n=this.xData,m;b=J(b,!0);var q={series:this};this.pointClass.prototype.applyOptions.apply(q,[a]);var r=q.x;var p=n.length;if(this.requireSorting&&r<n[p-1])for(m=!0;p&&n[p-1]>r;)p--;this.updateParallelArrays(q,"splice",p,0,0);this.updateParallelArrays(q,p);h&&q.name&&(h[r]=q.name);l.splice(p,0,a);if(m||this.processedData)this.data.splice(p,0,null),this.processData();"point"===g.legendType&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(q,
+"shift"),l.shift()));!1!==e&&K(this,"addPoint",{point:q});this.isDirtyData=this.isDirty=!0;b&&k.redraw(d)};a.prototype.removePoint=function(a,b,c){var d=this,g=d.data,f=g[a],k=d.points,h=d.chart,l=function(){k&&k.length===g.length&&k.splice(a,1);g.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(f||{series:d},"splice",a,1);f&&f.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&h.redraw()};e(c,h);b=J(b,!0);f?f.firePointEvent("remove",null,l):l()};a.prototype.remove=function(a,b,c,d){function e(){g.destroy(d);
+f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();J(a,!0)&&f.redraw(b)}var g=this,f=g.chart;!1!==c?K(g,"remove",null,e):e()};a.prototype.update=function(a,b){a=k(a,this.userOptions);K(this,"update",{options:a});var c=this,d=c.chart,e=c.userOptions,g=c.initialType||c.type,f=d.options.plotOptions,h=v[g].prototype,l=c.finishedAnimating&&{animation:!1},n={},m,q=["eventOptions","navigatorSeries","baseSeries"],p=a.type||e.type||d.options.chart.type,t=!(this.hasDerivedData||p&&p!==this.type||"undefined"!==
+typeof a.pointStart||"undefined"!==typeof a.pointInterval||"undefined"!==typeof a.relativeXValue||a.joinBy||a.mapData||c.hasOptionChanged("dataGrouping")||c.hasOptionChanged("pointStart")||c.hasOptionChanged("pointInterval")||c.hasOptionChanged("pointIntervalUnit")||c.hasOptionChanged("keys"));p=p||g;t&&(q.push("data","isDirtyData","points","processedXData","processedYData","xIncrement","cropped","_hasPointMarkers","_hasPointLabels","clips","nodes","layout","level","mapMap","mapData","minY","maxY",
+"minX","maxX"),!1!==a.visible&&q.push("area","graph"),c.parallelArrays.forEach(function(a){q.push(a+"Data")}),a.data&&(a.dataSorting&&x(c.options.dataSorting,a.dataSorting),this.setData(a.data,!1)));a=Z(e,l,{index:"undefined"===typeof e.index?c.index:e.index,pointStart:J(f&&f.series&&f.series.pointStart,e.pointStart,c.xData[0])},!t&&{data:c.options.data},a);t&&a.data&&(a.data=c.options.data);q=["group","markerGroup","dataLabelsGroup","transformGroup"].concat(q);q.forEach(function(a){q[a]=c[a];delete c[a]});
+f=!1;if(v[p]){if(f=p!==c.type,c.remove(!1,!1,!1,!0),f)if(Object.setPrototypeOf)Object.setPrototypeOf(c,v[p].prototype);else{l=Object.hasOwnProperty.call(c,"hcEvents")&&c.hcEvents;for(m in h)c[m]=void 0;x(c,v[p].prototype);l?c.hcEvents=l:delete c.hcEvents}}else r(17,!0,d,{missingModuleFor:p});q.forEach(function(a){c[a]=q[a]});c.init(d,a);if(t&&this.points){var w=c.options;!1===w.visible?(n.graphic=1,n.dataLabel=1):c._hasPointLabels||(a=w.marker,h=w.dataLabels,!a||!1!==a.enabled&&(e.marker&&e.marker.symbol)===
+a.symbol||(n.graphic=1),h&&!1===h.enabled&&(n.dataLabel=1));this.points.forEach(function(a){a&&a.series&&(a.resolveColor(),Object.keys(n).length&&a.destroyElements(n),!1===w.showInLegend&&a.legendItem&&d.legend.destroyItem(a))},this)}c.initialType=g;d.linkSeries();f&&c.linkedSeries.length&&(c.isDirtyData=!0);K(this,"afterUpdate");J(b,!0)&&d.redraw(t?void 0:!1)};a.prototype.setName=function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0};a.prototype.hasOptionChanged=
+function(a){var b=this.options[a],c=this.chart.options.plotOptions,d=this.userOptions[a];return d?b!==d:b!==J(c&&c[this.type]&&c[this.type][a],c&&c.series&&c.series[a],b)};a.prototype.onMouseOver=function(){var a=this.chart,b=a.hoverSeries;a.pointer.setHoverChartIndex();if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&K(this,"mouseOver");this.setState("hover");a.hoverSeries=this};a.prototype.onMouseOut=function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=
+null;if(d)d.onMouseOut();this&&a.events.mouseOut&&K(this,"mouseOut");!c||this.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();b.series.forEach(function(a){a.setState("",!0)})};a.prototype.setState=function(a,b){var c=this,d=c.options,e=c.graph,g=d.inactiveOtherPoints,f=d.states,k=J(f[a||"normal"]&&f[a||"normal"].animation,c.chart.options.chart.animation),h=d.lineWidth,l=0,n=d.opacity;a=a||"";if(c.state!==a&&([c.group,c.markerGroup,c.dataLabelsGroup].forEach(function(b){b&&(c.state&&b.removeClass("highcharts-series-"+
+c.state),a&&b.addClass("highcharts-series-"+a))}),c.state=a,!c.chart.styledMode)){if(f[a]&&!1===f[a].enabled)return;a&&(h=f[a].lineWidth||h+(f[a].lineWidthPlus||0),n=J(f[a].opacity,n));if(e&&!e.dashstyle)for(d={"stroke-width":h},e.animate(d,k);c["zone-graph-"+l];)c["zone-graph-"+l].animate(d,k),l+=1;g||[c.group,c.markerGroup,c.dataLabelsGroup,c.labelBySeries].forEach(function(a){a&&a.animate({opacity:n},k)})}b&&g&&c.points&&c.setAllPointsToState(a||void 0)};a.prototype.setAllPointsToState=function(a){this.points.forEach(function(b){b.setState&&
+b.setState(a)})};a.prototype.setVisible=function(a,b){var c=this,d=c.chart,e=c.legendItem,g=d.options.chart.ignoreHiddenSeries,f=c.visible,k=(c.visible=a=c.options.visible=c.userOptions.visible="undefined"===typeof a?!f:a)?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach(function(a){if(c[a])c[a][k]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&d.series.forEach(function(a){a.options.stacking&&
+a.visible&&(a.isDirty=!0)});c.linkedSeries.forEach(function(b){b.setVisible(a,!1)});g&&(d.isDirtyBox=!0);K(c,k);!1!==b&&d.redraw()};a.prototype.show=function(){this.setVisible(!0)};a.prototype.hide=function(){this.setVisible(!1)};a.prototype.select=function(a){this.selected=a=this.options.selected="undefined"===typeof a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);K(this,a?"select":"unselect")};a.prototype.shouldShowTooltip=function(a,b,c){void 0===c&&(c={});c.series=this;c.visiblePlotOnly=
+!0;return this.chart.isInsidePlot(a,b,c)};a.defaultOptions=I;return a}();x(a.prototype,{axisTypes:["xAxis","yAxis"],coll:"series",colorCounter:0,cropShoulder:1,directTouch:!1,drawLegendSymbol:u.drawLineMarker,isCartesian:!0,kdAxisArray:["clientX","plotY"],parallelArrays:["x","y"],pointClass:H,requireSorting:!0,sorted:!0});B.series=a;"";"";return a});M(f,"Extensions/ScrollablePlotArea.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/Axis/Axis.js"],f["Core/Chart/Chart.js"],f["Core/Series/Series.js"],
+f["Core/Renderer/RendererRegistry.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H){var F=a.stop,B=H.addEvent,z=H.createElement,p=H.merge,m=H.pick;B(C,"afterSetChartSize",function(a){var d=this.options.chart.scrollablePlotArea,e=d&&d.minWidth;d=d&&d.minHeight;if(!this.renderer.forExport){if(e){if(this.scrollablePixelsX=e=Math.max(0,e-this.chartWidth)){this.scrollablePlotBox=this.renderer.scrollablePlotBox=p(this.plotBox);this.plotBox.width=this.plotWidth+=e;this.inverted?this.clipBox.height+=e:this.clipBox.width+=
+e;var h={1:{name:"right",value:e}}}}else d&&(this.scrollablePixelsY=e=Math.max(0,d-this.chartHeight))&&(this.scrollablePlotBox=this.renderer.scrollablePlotBox=p(this.plotBox),this.plotBox.height=this.plotHeight+=e,this.inverted?this.clipBox.width+=e:this.clipBox.height+=e,h={2:{name:"bottom",value:e}});h&&!a.skipAxes&&this.axes.forEach(function(a){h[a.side]?a.getPlotLinePath=function(){var d=h[a.side].name,e=this[d];this[d]=e-h[a.side].value;var l=f.prototype.getPlotLinePath.apply(this,arguments);
+this[d]=e;return l}:(a.setAxisSize(),a.setAxisTranslation())})}});B(C,"render",function(){this.scrollablePixelsX||this.scrollablePixelsY?(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});C.prototype.setUpScrolling=function(){var a=this,d={WebkitOverflowScrolling:"touch",overflowX:"hidden",overflowY:"hidden"};this.scrollablePixelsX&&(d.overflowX="auto");this.scrollablePixelsY&&(d.overflowY="auto");this.scrollingParent=z("div",{className:"highcharts-scrolling-parent"},
+{position:"relative"},this.renderTo);this.scrollingContainer=z("div",{className:"highcharts-scrolling"},d,this.scrollingParent);B(this.scrollingContainer,"scroll",function(){a.pointer&&delete a.pointer.chartPosition});this.innerContainer=z("div",{className:"highcharts-inner-container"},null,this.scrollingContainer);this.innerContainer.appendChild(this.container);this.setUpScrolling=null};C.prototype.moveFixedElements=function(){var a=this.container,d=this.fixedRenderer,f=".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-drillup-button .highcharts-scrollbar .highcharts-subtitle .highcharts-title".split(" "),
+h;this.scrollablePixelsX&&!this.inverted?h=".highcharts-yaxis":this.scrollablePixelsX&&this.inverted?h=".highcharts-xaxis":this.scrollablePixelsY&&!this.inverted?h=".highcharts-xaxis":this.scrollablePixelsY&&this.inverted&&(h=".highcharts-yaxis");h&&f.push(h+":not(.highcharts-radial-axis)",h+"-labels:not(.highcharts-radial-axis-labels)");f.forEach(function(e){[].forEach.call(a.querySelectorAll(e),function(a){(a.namespaceURI===d.SVG_NS?d.box:d.box.parentNode).appendChild(a);a.style.pointerEvents="auto"})})};
+C.prototype.applyFixed=function(){var a=!this.fixedDiv,d=this.options.chart,f=d.scrollablePlotArea,h=u.getRendererType();a?(this.fixedDiv=z("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:(d.style&&d.style.zIndex||0)+2,top:0},null,!0),this.scrollingContainer&&this.scrollingContainer.parentNode.insertBefore(this.fixedDiv,this.scrollingContainer),this.renderTo.style.overflow="visible",this.fixedRenderer=d=new h(this.fixedDiv,this.chartWidth,this.chartHeight,
+this.options.chart.style),this.scrollableMask=d.path().attr({fill:this.options.chart.backgroundColor||"#fff","fill-opacity":m(f.opacity,.85),zIndex:-1}).addClass("highcharts-scrollable-mask").add(),B(this,"afterShowResetZoom",this.moveFixedElements),B(this,"afterApplyDrilldown",this.moveFixedElements),B(this,"afterLayOutTitles",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);if(this.scrollableDirty||a)this.scrollableDirty=!1,this.moveFixedElements();d=this.chartWidth+
+(this.scrollablePixelsX||0);h=this.chartHeight+(this.scrollablePixelsY||0);F(this.container);this.container.style.width=d+"px";this.container.style.height=h+"px";this.renderer.boxWrapper.attr({width:d,height:h,viewBox:[0,0,d,h].join(" ")});this.chartBackground.attr({width:d,height:h});this.scrollingContainer.style.height=this.chartHeight+"px";a&&(f.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*f.scrollPositionX),f.scrollPositionY&&(this.scrollingContainer.scrollTop=this.scrollablePixelsY*
+f.scrollPositionY));h=this.axisOffset;a=this.plotTop-h[0]-1;f=this.plotLeft-h[3]-1;d=this.plotTop+this.plotHeight+h[2]+1;h=this.plotLeft+this.plotWidth+h[1]+1;var p=this.plotLeft+this.plotWidth-(this.scrollablePixelsX||0),n=this.plotTop+this.plotHeight-(this.scrollablePixelsY||0);a=this.scrollablePixelsX?[["M",0,a],["L",this.plotLeft-1,a],["L",this.plotLeft-1,d],["L",0,d],["Z"],["M",p,a],["L",this.chartWidth,a],["L",this.chartWidth,d],["L",p,d],["Z"]]:this.scrollablePixelsY?[["M",f,0],["L",f,this.plotTop-
+1],["L",h,this.plotTop-1],["L",h,0],["Z"],["M",f,n],["L",f,this.chartHeight],["L",h,this.chartHeight],["L",h,n],["Z"]]:[["M",0,0]];"adjustHeight"!==this.redrawTrigger&&this.scrollableMask.attr({d:a})};B(f,"afterInit",function(){this.chart.scrollableDirty=!0});B(G,"show",function(){this.chart.scrollableDirty=!0});""});M(f,"Core/Axis/StackingAxis.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/Axis/Axis.js"],f["Core/Utilities.js"]],function(a,f,C){var F=a.getDeferredAnimation,u=C.addEvent,H=
+C.destroyObjectProperties,I=C.fireEvent,B=C.isNumber,z=C.objectEach,p;(function(a){function e(){var a=this.stacking;if(a){var d=a.stacks;z(d,function(a,e){H(a);d[e]=null});a&&a.stackTotalGroup&&a.stackTotalGroup.destroy()}}function d(){this.stacking||(this.stacking=new h(this))}var f=[];a.compose=function(a){-1===f.indexOf(a)&&(f.push(a),u(a,"init",d),u(a,"destroy",e));return a};var h=function(){function a(a){this.oldStacks={};this.stacks={};this.stacksTouched=0;this.axis=a}a.prototype.buildStacks=
+function(){var a=this.axis,d=a.series,e=a.options.reversedStacks,f=d.length,h;if(!a.isXAxis){this.usePercentage=!1;for(h=f;h--;){var l=d[e?h:f-h-1];l.setStackedPoints();l.setGroupedPoints()}for(h=0;h<f;h++)d[h].modifyStacks();I(a,"afterBuildStacks")}};a.prototype.cleanStacks=function(){if(!this.axis.isXAxis){if(this.oldStacks)var a=this.stacks=this.oldStacks;z(a,function(a){z(a,function(a){a.cumulative=a.total})})}};a.prototype.resetStacks=function(){var a=this,d=a.stacks;a.axis.isXAxis||z(d,function(d){z(d,
+function(e,f){B(e.touched)&&e.touched<a.stacksTouched?(e.destroy(),delete d[f]):(e.total=null,e.cumulative=null)})})};a.prototype.renderStackTotals=function(){var a=this.axis,d=a.chart,e=d.renderer,f=this.stacks;a=F(d,a.options.stackLabels&&a.options.stackLabels.animation||!1);var h=this.stackTotalGroup=this.stackTotalGroup||e.g("stack-labels").attr({visibility:"visible",zIndex:6,opacity:0}).add();h.translate(d.plotLeft,d.plotTop);z(f,function(a){z(a,function(a){a.render(h)})});h.animate({opacity:1},
+a)};return a}();a.Additions=h})(p||(p={}));return p});M(f,"Extensions/Stacking.js",[f["Core/Axis/Axis.js"],f["Core/Chart/Chart.js"],f["Core/FormatUtilities.js"],f["Core/Globals.js"],f["Core/Series/Series.js"],f["Core/Axis/StackingAxis.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H,I){var B=C.format,z=I.correctFloat,p=I.defined,m=I.destroyObjectProperties,e=I.isArray,d=I.isNumber,l=I.objectEach,h=I.pick,t=function(){function a(a,d,e,f,h){var k=a.chart.inverted;this.axis=a;this.isNegative=e;this.options=
+d=d||{};this.x=f;this.total=null;this.points={};this.hasValidPoints=!1;this.stack=h;this.rightCliff=this.leftCliff=0;this.alignOptions={align:d.align||(k?e?"left":"right":"center"),verticalAlign:d.verticalAlign||(k?"middle":e?"bottom":"top"),y:d.y,x:d.x};this.textAlign=d.textAlign||(k?e?"right":"left":"center")}a.prototype.destroy=function(){m(this,this.axis)};a.prototype.render=function(a){var d=this.axis.chart,e=this.options,f=e.format;f=f?B(f,this,d):e.formatter.call(this);this.label?this.label.attr({text:f,
+visibility:"hidden"}):(this.label=d.renderer.label(f,null,null,e.shape,null,null,e.useHTML,!1,"stack-labels"),f={r:e.borderRadius||0,text:f,rotation:e.rotation,padding:h(e.padding,5),visibility:"hidden"},d.styledMode||(f.fill=e.backgroundColor,f.stroke=e.borderColor,f["stroke-width"]=e.borderWidth,this.label.css(e.style)),this.label.attr(f),this.label.added||this.label.add(a));this.label.labelrank=d.plotSizeY};a.prototype.setOffset=function(a,e,f,l,m){var k=this.axis,c=k.chart;l=k.translate(k.stacking.usePercentage?
+100:l?l:this.total,0,0,0,1);f=k.translate(f?f:0);f=p(l)&&Math.abs(l-f);a=h(m,c.xAxis[0].translate(this.x))+a;k=p(l)&&this.getStackBox(c,this,a,l,e,f,k);e=this.label;f=this.isNegative;a="justify"===h(this.options.overflow,"justify");var g=this.textAlign;e&&k&&(m=e.getBBox(),l=e.padding,g="left"===g?c.inverted?-l:l:"right"===g?m.width:c.inverted&&"center"===g?m.width/2:c.inverted?f?m.width+l:-l:m.width/2,f=c.inverted?m.height/2:f?-l:m.height,this.alignOptions.x=h(this.options.x,0),this.alignOptions.y=
+h(this.options.y,0),k.x-=g,k.y-=f,e.align(this.alignOptions,null,k),c.isInsidePlot(e.alignAttr.x+g-this.alignOptions.x,e.alignAttr.y+f-this.alignOptions.y)?e.show():(e.alignAttr.y=-9999,a=!1),a&&u.prototype.justifyDataLabel.call(this.axis,e,this.alignOptions,e.alignAttr,m,k),e.attr({x:e.alignAttr.x,y:e.alignAttr.y}),h(!a&&this.options.crop,!0)&&((c=d(e.x)&&d(e.y)&&c.isInsidePlot(e.x-l+e.width,e.y)&&c.isInsidePlot(e.x+l,e.y))||e.hide()))};a.prototype.getStackBox=function(a,d,e,f,h,k,c){var g=d.axis.reversed,
+b=a.inverted,l=c.height+c.pos-(b?a.plotLeft:a.plotTop);d=d.isNegative&&!g||!d.isNegative&&g;return{x:b?d?f-c.right:f-k+c.pos-a.plotLeft:e+a.xAxis[0].transB-a.plotLeft,y:b?c.height-e-h:d?l-f-k:l-f,width:b?k:h,height:b?h:k}};return a}();f.prototype.getStacks=function(){var a=this,d=a.inverted;a.yAxis.forEach(function(a){a.stacking&&a.stacking.stacks&&a.hasVisibleSeries&&(a.stacking.oldStacks=a.stacking.stacks)});a.series.forEach(function(e){var f=e.xAxis&&e.xAxis.options||{};!e.options.stacking||!0!==
+e.visible&&!1!==a.options.chart.ignoreHiddenSeries||(e.stackKey=[e.type,h(e.options.stack,""),d?f.top:f.left,d?f.height:f.width].join())})};H.compose(a);u.prototype.setGroupedPoints=function(){var a=this.yAxis.stacking;this.options.centerInCategory&&(this.is("column")||this.is("columnrange"))&&!this.options.stacking&&1<this.chart.series.length?u.prototype.setStackedPoints.call(this,"group"):a&&l(a.stacks,function(d,e){"group"===e.slice(-5)&&(l(d,function(a){return a.destroy()}),delete a.stacks[e])})};
+u.prototype.setStackedPoints=function(a){var d=a||this.options.stacking;if(d&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var f=this.processedXData,l=this.processedYData,m=[],n=l.length,k=this.options,c=k.threshold,g=h(k.startFromThreshold&&c,0);k=k.stack;a=a?this.type+","+d:this.stackKey;var b="-"+a,r=this.negStacks,x=this.yAxis,D=x.stacking.stacks,u=x.stacking.oldStacks,B,F;x.stacking.stacksTouched+=1;for(F=0;F<n;F++){var C=f[F];var G=l[F];var I=this.getStackIndicator(I,
+C,this.index);var H=I.key;var J=(B=r&&G<(g?0:c))?b:a;D[J]||(D[J]={});D[J][C]||(u[J]&&u[J][C]?(D[J][C]=u[J][C],D[J][C].total=null):D[J][C]=new t(x,x.options.stackLabels,B,C,k));J=D[J][C];null!==G?(J.points[H]=J.points[this.index]=[h(J.cumulative,g)],p(J.cumulative)||(J.base=H),J.touched=x.stacking.stacksTouched,0<I.index&&!1===this.singleStacks&&(J.points[H][0]=J.points[this.index+","+C+",0"][0])):J.points[H]=J.points[this.index]=null;"percent"===d?(B=B?a:b,r&&D[B]&&D[B][C]?(B=D[B][C],J.total=B.total=
+Math.max(B.total,J.total)+Math.abs(G)||0):J.total=z(J.total+(Math.abs(G)||0))):"group"===d?(e(G)&&(G=G[0]),null!==G&&(J.total=(J.total||0)+1)):J.total=z(J.total+(G||0));J.cumulative="group"===d?(J.total||1)-1:h(J.cumulative,g)+(G||0);null!==G&&(J.points[H].push(J.cumulative),m[F]=J.cumulative,J.hasValidPoints=!0)}"percent"===d&&(x.stacking.usePercentage=!0);"group"!==d&&(this.stackedYData=m);x.stacking.oldStacks={}}};u.prototype.modifyStacks=function(){var a=this,d=a.stackKey,e=a.yAxis.stacking.stacks,
+f=a.processedXData,h,l=a.options.stacking;a[l+"Stacker"]&&[d,"-"+d].forEach(function(d){for(var c=f.length,g,b;c--;)if(g=f[c],h=a.getStackIndicator(h,g,a.index,d),b=(g=e[d]&&e[d][g])&&g.points[h.key])a[l+"Stacker"](b,g,c)})};u.prototype.percentStacker=function(a,d,e){d=d.total?100/d.total:0;a[0]=z(a[0]*d);a[1]=z(a[1]*d);this.stackedYData[e]=a[1]};u.prototype.getStackIndicator=function(a,d,e,f){!p(a)||a.x!==d||f&&a.stackKey!==f?a={x:d,index:0,key:f,stackKey:f}:a.index++;a.key=[e,d,a.index].join();
+return a};G.StackItem=t;"";return G.StackItem});M(f,"Series/Line/LineSeries.js",[f["Core/Series/Series.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f,C){var F=this&&this.__extends||function(){var a=function(f,z){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,f){a.__proto__=f}||function(a,f){for(var e in f)f.hasOwnProperty(e)&&(a[e]=f[e])};return a(f,z)};return function(f,z){function p(){this.constructor=f}a(f,z);f.prototype=null===z?Object.create(z):
+(p.prototype=z.prototype,new p)}}(),u=C.defined,H=C.merge;C=function(f){function B(){var a=null!==f&&f.apply(this,arguments)||this;a.data=void 0;a.options=void 0;a.points=void 0;return a}F(B,f);B.prototype.drawGraph=function(){var a=this,f=this.options,m=(this.gappedPath||this.getGraphPath).call(this),e=this.chart.styledMode,d=[["graph","highcharts-graph"]];e||d[0].push(f.lineColor||this.color||"#cccccc",f.dashStyle);d=a.getZonesGraphs(d);d.forEach(function(d,h){var l=d[0],n=a[l],p=n?"animate":"attr";
+n?(n.endX=a.preventGraphAnimation?null:m.xMap,n.animate({d:m})):m.length&&(a[l]=n=a.chart.renderer.path(m).addClass(d[1]).attr({zIndex:1}).add(a.group));n&&!e&&(l={stroke:d[2],"stroke-width":f.lineWidth,fill:a.fillGraph&&a.color||"none"},d[3]?l.dashstyle=d[3]:"square"!==f.linecap&&(l["stroke-linecap"]=l["stroke-linejoin"]="round"),n[p](l).shadow(2>h&&f.shadow));n&&(n.startX=m.xMap,n.isArea=m.isArea)})};B.prototype.getGraphPath=function(a,f,m){var e=this,d=e.options,l=[],h=[],p,n=d.step;a=a||e.points;
+var v=a.reversed;v&&a.reverse();(n={right:1,center:2}[n]||n&&3)&&v&&(n=4-n);a=this.getValidPoints(a,!1,!(d.connectNulls&&!f&&!m));a.forEach(function(t,y){var A=t.plotX,q=t.plotY,k=a[y-1];(t.leftCliff||k&&k.rightCliff)&&!m&&(p=!0);t.isNull&&!u(f)&&0<y?p=!d.connectNulls:t.isNull&&!f?p=!0:(0===y||p?y=[["M",t.plotX,t.plotY]]:e.getPointSpline?y=[e.getPointSpline(a,t,y)]:n?(y=1===n?[["L",k.plotX,q]]:2===n?[["L",(k.plotX+A)/2,k.plotY],["L",(k.plotX+A)/2,q]]:[["L",A,k.plotY]],y.push(["L",A,q])):y=[["L",A,
+q]],h.push(t.x),n&&(h.push(t.x),2===n&&h.push(t.x)),l.push.apply(l,y),p=!1)});l.xMap=h;return e.graphPath=l};B.prototype.getZonesGraphs=function(a){this.zones.forEach(function(f,m){m=["zone-graph-"+m,"highcharts-graph highcharts-zone-graph-"+m+" "+(f.className||"")];this.chart.styledMode||m.push(f.color||this.color,f.dashStyle||this.options.dashStyle);a.push(m)},this);return a};B.defaultOptions=H(a.defaultOptions,{});return B}(a);f.registerSeriesType("line",C);"";return C});M(f,"Series/Area/AreaSeries.js",
+[f["Core/Color/Color.js"],f["Core/Legend/LegendSymbol.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f,C,G){var u=this&&this.__extends||function(){var a=function(e,d){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,d){a.__proto__=d}||function(a,d){for(var e in d)d.hasOwnProperty(e)&&(a[e]=d[e])};return a(e,d)};return function(e,d){function f(){this.constructor=e}a(e,d);e.prototype=null===d?Object.create(d):(f.prototype=d.prototype,new f)}}(),F=a.parse,
+I=C.seriesTypes.line;a=G.extend;var B=G.merge,z=G.objectEach,p=G.pick;G=function(a){function e(){var d=null!==a&&a.apply(this,arguments)||this;d.data=void 0;d.options=void 0;d.points=void 0;return d}u(e,a);e.prototype.drawGraph=function(){this.areaPath=[];a.prototype.drawGraph.apply(this);var d=this,e=this.areaPath,f=this.options,m=[["area","highcharts-area",this.color,f.fillColor]];this.zones.forEach(function(a,e){m.push(["zone-area-"+e,"highcharts-area highcharts-zone-area-"+e+" "+a.className,a.color||
+d.color,a.fillColor||f.fillColor])});m.forEach(function(a){var h=a[0],l=d[h],m=l?"animate":"attr",n={};l?(l.endX=d.preventGraphAnimation?null:e.xMap,l.animate({d:e})):(n.zIndex=0,l=d[h]=d.chart.renderer.path(e).addClass(a[1]).add(d.group),l.isArea=!0);d.chart.styledMode||(n.fill=p(a[3],F(a[2]).setOpacity(p(f.fillOpacity,.75)).get()));l[m](n);l.startX=e.xMap;l.shiftUnit=f.step?2:1})};e.prototype.getGraphPath=function(a){var d=I.prototype.getGraphPath,e=this.options,f=e.stacking,m=this.yAxis,v,w=[],
+y=[],A=this.index,q=m.stacking.stacks[this.stackKey],k=e.threshold,c=Math.round(m.getThreshold(e.threshold));e=p(e.connectNulls,"percent"===f);var g=function(b,d,e){var g=a[b];b=f&&q[g.x].points[A];var h=g[e+"Null"]||0;e=g[e+"Cliff"]||0;g=!0;if(e||h){var l=(h?b[0]:b[1])+e;var n=b[0]+e;g=!!h}else!f&&a[d]&&a[d].isNull&&(l=n=k);"undefined"!==typeof l&&(y.push({plotX:r,plotY:null===l?c:m.getThreshold(l),isNull:g,isCliff:!0}),w.push({plotX:r,plotY:null===n?c:m.getThreshold(n),doCurve:!1}))};a=a||this.points;
+f&&(a=this.getStackPoints(a));for(v=0;v<a.length;v++){f||(a[v].leftCliff=a[v].rightCliff=a[v].leftNull=a[v].rightNull=void 0);var b=a[v].isNull;var r=p(a[v].rectPlotX,a[v].plotX);var x=f?p(a[v].yBottom,c):c;if(!b||e)e||g(v,v-1,"left"),b&&!f&&e||(y.push(a[v]),w.push({x:v,plotX:r,plotY:x})),e||g(v,v+1,"right")}v=d.call(this,y,!0,!0);w.reversed=!0;b=d.call(this,w,!0,!0);(x=b[0])&&"M"===x[0]&&(b[0]=["L",x[1],x[2]]);b=v.concat(b);b.length&&b.push(["Z"]);d=d.call(this,y,!1,e);b.xMap=v.xMap;this.areaPath=
+b;return d};e.prototype.getStackPoints=function(a){var d=this,e=[],f=[],m=this.xAxis,v=this.yAxis,w=v.stacking.stacks[this.stackKey],y={},A=v.series,q=A.length,k=v.options.reversedStacks?1:-1,c=A.indexOf(d);a=a||this.points;if(this.options.stacking){for(var g=0;g<a.length;g++)a[g].leftNull=a[g].rightNull=void 0,y[a[g].x]=a[g];z(w,function(a,b){null!==a.total&&f.push(b)});f.sort(function(a,b){return a-b});var b=A.map(function(a){return a.visible});f.forEach(function(a,g){var h=0,l,n;if(y[a]&&!y[a].isNull)e.push(y[a]),
+[-1,1].forEach(function(e){var h=1===e?"rightNull":"leftNull",m=0,p=w[f[g+e]];if(p)for(var r=c;0<=r&&r<q;){var t=A[r].index;l=p.points[t];l||(t===d.index?y[a][h]=!0:b[r]&&(n=w[a].points[t])&&(m-=n[1]-n[0]));r+=k}y[a][1===e?"rightCliff":"leftCliff"]=m});else{for(var r=c;0<=r&&r<q;){if(l=w[a].points[A[r].index]){h=l[1];break}r+=k}h=p(h,0);h=v.translate(h,0,1,0,1);e.push({isNull:!0,plotX:m.translate(a,0,0,0,1),x:a,plotY:h,yBottom:h})}})}return e};e.defaultOptions=B(I.defaultOptions,{threshold:0});return e}(I);
+a(G.prototype,{singleStacks:!1,drawLegendSymbol:f.drawRectangle});C.registerSeriesType("area",G);"";return G});M(f,"Series/Spline/SplineSeries.js",[f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f){var F=this&&this.__extends||function(){var a=function(f,z){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,f){a.__proto__=f}||function(a,f){for(var e in f)f.hasOwnProperty(e)&&(a[e]=f[e])};return a(f,z)};return function(f,z){function p(){this.constructor=f}a(f,
+z);f.prototype=null===z?Object.create(z):(p.prototype=z.prototype,new p)}}(),G=a.seriesTypes.line,u=f.merge,H=f.pick;f=function(a){function f(){var f=null!==a&&a.apply(this,arguments)||this;f.data=void 0;f.options=void 0;f.points=void 0;return f}F(f,a);f.prototype.getPointSpline=function(a,f,m){var e=f.plotX||0,d=f.plotY||0,l=a[m-1];m=a[m+1];if(l&&!l.isNull&&!1!==l.doCurve&&!f.isCliff&&m&&!m.isNull&&!1!==m.doCurve&&!f.isCliff){a=l.plotY||0;var h=m.plotX||0;m=m.plotY||0;var p=0;var n=(1.5*e+(l.plotX||
+0))/2.5;var v=(1.5*d+a)/2.5;h=(1.5*e+h)/2.5;var w=(1.5*d+m)/2.5;h!==n&&(p=(w-v)*(h-e)/(h-n)+d-w);v+=p;w+=p;v>a&&v>d?(v=Math.max(a,d),w=2*d-v):v<a&&v<d&&(v=Math.min(a,d),w=2*d-v);w>m&&w>d?(w=Math.max(m,d),v=2*d-w):w<m&&w<d&&(w=Math.min(m,d),v=2*d-w);f.rightContX=h;f.rightContY=w}f=["C",H(l.rightContX,l.plotX,0),H(l.rightContY,l.plotY,0),H(n,e,0),H(v,d,0),e,d];l.rightContX=l.rightContY=void 0;return f};f.defaultOptions=u(G.defaultOptions);return f}(G);a.registerSeriesType("spline",f);"";return f});
+M(f,"Series/AreaSpline/AreaSplineSeries.js",[f["Series/Area/AreaSeries.js"],f["Series/Spline/SplineSeries.js"],f["Core/Legend/LegendSymbol.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f,C,G,u){var F=this&&this.__extends||function(){var a=function(f,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,e){a.__proto__=e}||function(a,e){for(var d in e)e.hasOwnProperty(d)&&(a[d]=e[d])};return a(f,e)};return function(f,e){function d(){this.constructor=f}a(f,
+e);f.prototype=null===e?Object.create(e):(d.prototype=e.prototype,new d)}}(),I=a.prototype,B=u.extend,z=u.merge;u=function(p){function m(){var a=null!==p&&p.apply(this,arguments)||this;a.data=void 0;a.points=void 0;a.options=void 0;return a}F(m,p);m.defaultOptions=z(f.defaultOptions,a.defaultOptions);return m}(f);B(u.prototype,{getGraphPath:I.getGraphPath,getStackPoints:I.getStackPoints,drawGraph:I.drawGraph,drawLegendSymbol:C.drawRectangle});G.registerSeriesType("areaspline",u);"";return u});M(f,
+"Series/Column/ColumnSeries.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/Color/Color.js"],f["Core/Globals.js"],f["Core/Legend/LegendSymbol.js"],f["Core/Series/Series.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H,I){var B=this&&this.__extends||function(){var a=function(d,c){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])};return a(d,c)};return function(d,
+c){function e(){this.constructor=d}a(d,c);d.prototype=null===c?Object.create(c):(e.prototype=c.prototype,new e)}}(),z=a.animObject,p=f.parse,m=C.hasTouch;a=C.noop;var e=I.clamp,d=I.css,l=I.defined,h=I.extend,t=I.fireEvent,n=I.isArray,v=I.isNumber,w=I.merge,y=I.pick,A=I.objectEach;I=function(a){function f(){var c=null!==a&&a.apply(this,arguments)||this;c.borderWidth=void 0;c.data=void 0;c.group=void 0;c.options=void 0;c.points=void 0;return c}B(f,a);f.prototype.animate=function(a){var c=this,b=this.yAxis,
+d=c.options,f=this.chart.inverted,k={},l=f?"translateX":"translateY";if(a)k.scaleY=.001,a=e(b.toPixels(d.threshold),b.pos,b.pos+b.len),f?k.translateX=a-b.len:k.translateY=a,c.clipBox&&c.setClip(),c.group.attr(k);else{var m=Number(c.group.attr(l));c.group.animate({scaleY:1},h(z(c.options.animation),{step:function(a,d){c.group&&(k[l]=m+d.pos*(b.pos-m),c.group.attr(k))}}))}};f.prototype.init=function(c,d){a.prototype.init.apply(this,arguments);var b=this;c=b.chart;c.hasRendered&&c.series.forEach(function(a){a.type===
+b.type&&(a.isDirty=!0)})};f.prototype.getColumnMetrics=function(){var a=this,d=a.options,b=a.xAxis,e=a.yAxis,f=b.options.reversedStacks;f=b.reversed&&!f||!b.reversed&&f;var k={},h,l=0;!1===d.grouping?l=1:a.chart.series.forEach(function(b){var c=b.yAxis,d=b.options;if(b.type===a.type&&(b.visible||!a.chart.options.chart.ignoreHiddenSeries)&&e.len===c.len&&e.pos===c.pos){if(d.stacking&&"group"!==d.stacking){h=b.stackKey;"undefined"===typeof k[h]&&(k[h]=l++);var f=k[h]}else!1!==d.grouping&&(f=l++);b.columnIndex=
+f}});var m=Math.min(Math.abs(b.transA)*(b.ordinal&&b.ordinal.slope||d.pointRange||b.closestPointRange||b.tickInterval||1),b.len),n=m*d.groupPadding,q=(m-2*n)/(l||1);d=Math.min(d.maxPointWidth||b.len,y(d.pointWidth,q*(1-2*d.pointPadding)));a.columnMetrics={width:d,offset:(q-d)/2+(n+((a.columnIndex||0)+(f?1:0))*q-m/2)*(f?-1:1),paddedWidth:q,columnCount:l};return a.columnMetrics};f.prototype.crispCol=function(a,d,b,e){var c=this.chart,f=this.borderWidth,g=-(f%2?.5:0);f=f%2?.5:1;c.inverted&&c.renderer.isVML&&
+(f+=1);this.options.crisp&&(b=Math.round(a+b)+g,a=Math.round(a)+g,b-=a);e=Math.round(d+e)+f;g=.5>=Math.abs(d)&&.5<e;d=Math.round(d)+f;e-=d;g&&e&&(--d,e+=1);return{x:a,y:d,width:b,height:e}};f.prototype.adjustForMissingColumns=function(a,d,b,e){var c=this,f=this.options.stacking;if(!b.isNull&&1<e.columnCount){var g=this.yAxis.options.reversedStacks,k=0,h=g?0:-e.columnCount;A(this.yAxis.stacking&&this.yAxis.stacking.stacks,function(a){if("number"===typeof b.x&&(a=a[b.x.toString()])){var d=a.points[c.index],
+e=a.total;f?(d&&(k=h),a.hasValidPoints&&(g?h++:h--)):n(d)&&(k=d[1],h=e||0)}});a=(b.plotX||0)+((h-1)*e.paddedWidth+d)/2-d-k*e.paddedWidth}return a};f.prototype.translate=function(){var a=this,d=a.chart,b=a.options,f=a.dense=2>a.closestPointRange*a.xAxis.transA;f=a.borderWidth=y(b.borderWidth,f?0:1);var k=a.xAxis,h=a.yAxis,m=b.threshold,n=a.translatedThreshold=h.getThreshold(m),q=y(b.minPointLength,5),p=a.getColumnMetrics(),t=p.width,A=a.pointXOffset=p.offset,w=a.dataMin,z=a.dataMax,B=a.barW=Math.max(t,
+1+2*f);d.inverted&&(n-=.5);b.pointPadding&&(B=Math.ceil(B));u.prototype.translate.apply(a);a.points.forEach(function(c){var f=y(c.yBottom,n),g=999+Math.abs(f),r=c.plotX||0;g=e(c.plotY,-g,h.len+g);var x=Math.min(g,f),D=Math.max(g,f)-x,u=t,F=r+A,C=B;q&&Math.abs(D)<q&&(D=q,r=!h.reversed&&!c.negative||h.reversed&&c.negative,v(m)&&v(z)&&c.y===m&&z<=m&&(h.min||0)<m&&(w!==z||(h.max||0)<=m)&&(r=!r),x=Math.abs(x-n)>q?f-q:n-(r?q:0));l(c.options.pointWidth)&&(u=C=Math.ceil(c.options.pointWidth),F-=Math.round((u-
+t)/2));b.centerInCategory&&(F=a.adjustForMissingColumns(F,u,c,p));c.barX=F;c.pointWidth=u;c.tooltipPos=d.inverted?[e(h.len+h.pos-d.plotLeft-g,h.pos-d.plotLeft,h.len+h.pos-d.plotLeft),k.len+k.pos-d.plotTop-F-C/2,D]:[k.left-d.plotLeft+F+C/2,e(g+h.pos-d.plotTop,h.pos-d.plotTop,h.len+h.pos-d.plotTop),D];c.shapeType=a.pointClass.prototype.shapeType||"rect";c.shapeArgs=a.crispCol.apply(a,c.isNull?[F,n,C,0]:[F,x,C,D])})};f.prototype.drawGraph=function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")};
+f.prototype.pointAttribs=function(a,d){var b=this.options,c=this.pointAttrToOptions||{},e=c.stroke||"borderColor",f=c["stroke-width"]||"borderWidth",g=a&&a.color||this.color,k=a&&a[e]||b[e]||g;c=a&&a.options.dashStyle||b.dashStyle;var h=a&&a[f]||b[f]||this[f]||0,l=y(a&&a.opacity,b.opacity,1);if(a&&this.zones.length){var m=a.getZone();g=a.options.color||m&&(m.color||a.nonZonedColor)||this.color;m&&(k=m.borderColor||k,c=m.dashStyle||c,h=m.borderWidth||h)}d&&a&&(a=w(b.states[d],a.options.states&&a.options.states[d]||
+{}),d=a.brightness,g=a.color||"undefined"!==typeof d&&p(g).brighten(a.brightness).get()||g,k=a[e]||k,h=a[f]||h,c=a.dashStyle||c,l=y(a.opacity,l));e={fill:g,stroke:k,"stroke-width":h,opacity:l};c&&(e.dashstyle=c);return e};f.prototype.drawPoints=function(){var a=this,d=this.chart,b=a.options,e=d.renderer,f=b.animationLimit||250,k;a.points.forEach(function(c){var g=c.graphic,h=!!g,l=g&&d.pointCount<f?"animate":"attr";if(v(c.plotY)&&null!==c.y){k=c.shapeArgs;g&&c.hasNewShapeType()&&(g=g.destroy());a.enabledDataSorting&&
+(c.startXPos=a.xAxis.reversed?-(k?k.width||0:0):a.xAxis.width);g||(c.graphic=g=e[c.shapeType](k).add(c.group||a.group))&&a.enabledDataSorting&&d.hasRendered&&d.pointCount<f&&(g.attr({x:c.startXPos}),h=!0,l="animate");if(g&&h)g[l](w(k));if(b.borderRadius)g[l]({r:b.borderRadius});d.styledMode||g[l](a.pointAttribs(c,c.selected&&"select")).shadow(!1!==c.allowShadow&&b.shadow,null,b.stacking&&!b.borderRadius);g&&(g.addClass(c.getClassName(),!0),g.attr({visibility:c.visible?"inherit":"hidden"}))}else g&&
+(c.graphic=g.destroy())})};f.prototype.drawTracker=function(){var a=this,e=a.chart,b=e.pointer,f=function(a){var c=b.getPointFromEvent(a);"undefined"!==typeof c&&(b.isDirectTouch=!0,c.onMouseOver(a))},k;a.points.forEach(function(a){k=n(a.dataLabels)?a.dataLabels:a.dataLabel?[a.dataLabel]:[];a.graphic&&(a.graphic.element.point=a);k.forEach(function(b){b.div?b.div.point=a:b.element.point=a})});a._hasTracking||(a.trackerGroups.forEach(function(c){if(a[c]){a[c].addClass("highcharts-tracker").on("mouseover",
+f).on("mouseout",function(a){b.onTrackerMouseOut(a)});if(m)a[c].on("touchstart",f);!e.styledMode&&a.options.cursor&&a[c].css(d).css({cursor:a.options.cursor})}}),a._hasTracking=!0);t(this,"afterDrawTracker")};f.prototype.remove=function(){var a=this,d=a.chart;d.hasRendered&&d.series.forEach(function(b){b.type===a.type&&(b.isDirty=!0)});u.prototype.remove.apply(a,arguments)};f.defaultOptions=w(u.defaultOptions,{borderRadius:0,centerInCategory:!1,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,
+cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},select:{color:"#cccccc",borderColor:"#000000"}},dataLabels:{align:void 0,verticalAlign:void 0,y:void 0},startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:"#ffffff"});return f}(u);h(I.prototype,{cropShoulder:0,directTouch:!0,drawLegendSymbol:G.drawRectangle,getSymbol:a,negStacks:!0,trackerGroups:["group","dataLabelsGroup"]});H.registerSeriesType("column",I);"";"";return I});M(f,"Core/Series/DataLabel.js",
+[f["Core/Animation/AnimationUtilities.js"],f["Core/FormatUtilities.js"],f["Core/Utilities.js"]],function(a,f,C){var F=a.getDeferredAnimation,u=f.format,H=C.defined,I=C.extend,B=C.fireEvent,z=C.isArray,p=C.merge,m=C.objectEach,e=C.pick,d=C.splat,l;(function(a){function f(a,c,d,b,f){var g=this,k=this.chart,h=this.isCartesian&&k.inverted,l=this.enabledDataSorting,m=e(a.dlBox&&a.dlBox.centerX,a.plotX,-9999),n=e(a.plotY,-9999),q=c.getBBox(),p=d.rotation,r=d.align,t=k.isInsidePlot(m,Math.round(n),{inverted:h,
+paneCoordinates:!0,series:g}),A=function(b){l&&g.xAxis&&!y&&g.setDataLabelStartPos(a,c,f,t,b)},y="justify"===e(d.overflow,l?"none":"justify"),w=this.visible&&!1!==a.visible&&(a.series.forceDL||l&&!y||t||e(d.inside,!!this.options.stacking)&&b&&k.isInsidePlot(m,h?b.x+1:b.y+b.height-1,{inverted:h,paneCoordinates:!0,series:g}));if(w){var v=k.renderer.fontMetrics(k.styledMode?void 0:d.style.fontSize,c).b;b=I({x:h?this.yAxis.len-n:m,y:Math.round(h?this.xAxis.len-m:n),width:0,height:0},b);I(d,{width:q.width,
+height:q.height});p?(y=!1,m=k.renderer.rotCorr(v,p),m={x:b.x+(d.x||0)+b.width/2+m.x,y:b.y+(d.y||0)+{top:0,middle:.5,bottom:1}[d.verticalAlign]*b.height},A(m),c[f?"attr":"animate"](m).attr({align:r}),A=(p+720)%360,A=180<A&&360>A,"left"===r?m.y-=A?q.height:0:"center"===r?(m.x-=q.width/2,m.y-=q.height/2):"right"===r&&(m.x-=q.width,m.y-=A?0:q.height),c.placed=!0,c.alignAttr=m):(A(b),c.align(d,void 0,b),m=c.alignAttr);y&&0<=b.height?this.justifyDataLabel(c,d,m,q,b,f):e(d.crop,!0)&&(w=k.isInsidePlot(m.x,
+m.y,{paneCoordinates:!0,series:g})&&k.isInsidePlot(m.x+q.width,m.y+q.height,{paneCoordinates:!0,series:g}));if(d.shape&&!p)c[f?"attr":"animate"]({anchorX:h?k.plotWidth-a.plotY:a.plotX,anchorY:h?k.plotHeight-a.plotX:a.plotY})}f&&l&&(c.placed=!1);w||l&&!y||(c.hide(!0),c.placed=!1)}function h(a,c){var d=c.filter;return d?(c=d.operator,a=a[d.property],d=d.value,">"===c&&a>d||"<"===c&&a<d||">="===c&&a>=d||"<="===c&&a<=d||"=="===c&&a==d||"==="===c&&a===d?!0:!1):!0}function l(){var a=this,c=a.chart,f=a.options,
+b=a.points,l=a.hasRendered||0,n=c.renderer,q=f.dataLabels,p,t=q.animation;t=q.defer?F(c,t,a):{defer:0,duration:0};q=y(y(c.options.plotOptions&&c.options.plotOptions.series&&c.options.plotOptions.series.dataLabels,c.options.plotOptions&&c.options.plotOptions[a.type]&&c.options.plotOptions[a.type].dataLabels),q);B(this,"drawDataLabels");if(z(q)||q.enabled||a._hasPointLabels){var A=a.plotGroup("dataLabelsGroup","data-labels",l?"inherit":"hidden",q.zIndex||6);A.attr({opacity:+l});!l&&(l=a.dataLabelsGroup)&&
+(a.visible&&A.show(!0),l[f.animation?"animate":"attr"]({opacity:1},t));b.forEach(function(b){p=d(y(q,b.dlOptions||b.options&&b.options.dataLabels));p.forEach(function(d,g){var k=d.enabled&&(!b.isNull||b.dataLabelOnNull)&&h(b,d),l=b.connectors?b.connectors[g]:b.connector,q=b.dataLabels?b.dataLabels[g]:b.dataLabel,p=!q,r=e(d.distance,b.labelDistance);if(k){var t=b.getLabelConfig();var y=e(d[b.formatPrefix+"Format"],d.format);t=H(y)?u(y,t,c):(d[b.formatPrefix+"Formatter"]||d.formatter).call(t,d);y=d.style;
+var x=d.rotation;c.styledMode||(y.color=e(d.color,y.color,a.color,"#000000"),"contrast"===y.color?(b.contrastColor=n.getContrast(b.color||a.color),y.color=!H(r)&&d.inside||0>r||f.stacking?b.contrastColor:"#000000"):delete b.contrastColor,f.cursor&&(y.cursor=f.cursor));var w={r:d.borderRadius||0,rotation:x,padding:d.padding,zIndex:1};c.styledMode||(w.fill=d.backgroundColor,w.stroke=d.borderColor,w["stroke-width"]=d.borderWidth);m(w,function(a,b){"undefined"===typeof a&&delete w[b]})}!q||k&&H(t)&&!!q.div===
+!!d.useHTML&&(q.rotation&&d.rotation||q.rotation===d.rotation)||(p=!0,b.dataLabel=q=b.dataLabel&&b.dataLabel.destroy(),b.dataLabels&&(1===b.dataLabels.length?delete b.dataLabels:delete b.dataLabels[g]),g||delete b.dataLabel,l&&(b.connector=b.connector.destroy(),b.connectors&&(1===b.connectors.length?delete b.connectors:delete b.connectors[g])));k&&H(t)&&(q?w.text=t:(b.dataLabels=b.dataLabels||[],q=b.dataLabels[g]=x?n.text(t,0,-9999,d.useHTML).addClass("highcharts-data-label"):n.label(t,0,-9999,d.shape,
+null,null,d.useHTML,null,"data-label"),g||(b.dataLabel=q),q.addClass(" highcharts-data-label-color-"+b.colorIndex+" "+(d.className||"")+(d.useHTML?" highcharts-tracker":""))),q.options=d,q.attr(w),c.styledMode||q.css(y).shadow(d.shadow),q.added||q.add(A),d.textPath&&!d.useHTML&&(q.setTextPath(b.getDataLabelPath&&b.getDataLabelPath(q)||b.graphic,d.textPath),b.dataLabelPath&&!d.textPath.enabled&&(b.dataLabelPath=b.dataLabelPath.destroy())),a.alignDataLabel(b,q,d,null,p))})})}B(this,"afterDrawDataLabels")}
+function w(a,c,d,b,e,f){var g=this.chart,h=c.align,k=c.verticalAlign,l=a.box?0:a.padding||0,m=c.x;m=void 0===m?0:m;var q=c.y;q=void 0===q?0:q;var n=(d.x||0)+l;if(0>n){"right"===h&&0<=m?(c.align="left",c.inside=!0):m-=n;var p=!0}n=(d.x||0)+b.width-l;n>g.plotWidth&&("left"===h&&0>=m?(c.align="right",c.inside=!0):m+=g.plotWidth-n,p=!0);n=d.y+l;0>n&&("bottom"===k&&0<=q?(c.verticalAlign="top",c.inside=!0):q-=n,p=!0);n=(d.y||0)+b.height-l;n>g.plotHeight&&("top"===k&&0>=q?(c.verticalAlign="bottom",c.inside=
+!0):q+=g.plotHeight-n,p=!0);p&&(c.x=m,c.y=q,a.placed=!f,a.align(c,void 0,e));return p}function y(a,c){var d=[],b;if(z(a)&&!z(c))d=a.map(function(a){return p(a,c)});else if(z(c)&&!z(a))d=c.map(function(b){return p(a,b)});else if(z(a)||z(c))for(b=Math.max(a.length,c.length);b--;)d[b]=p(a[b],c[b]);else d=p(a,c);return d}function A(a,c,d,b,e){var f=this.chart,g=f.inverted,h=this.xAxis,k=h.reversed,l=g?c.height/2:c.width/2;a=(a=a.pointWidth)?a/2:0;c.startXPos=g?e.x:k?-l-a:h.width-l+a;c.startYPos=g?k?this.yAxis.height-
+l+a:-l-a:e.y;b?"hidden"===c.visibility&&(c.show(),c.attr({opacity:0}).animate({opacity:1})):c.attr({opacity:1}).animate({opacity:0},void 0,c.hide);f.hasRendered&&(d&&c.attr({x:c.startXPos,y:c.startYPos}),c.placed=!0)}var q=[];a.compose=function(a){if(-1===q.indexOf(a)){var c=a.prototype;q.push(a);c.alignDataLabel=f;c.drawDataLabels=l;c.justifyDataLabel=w;c.setDataLabelStartPos=A}}})(l||(l={}));"";return l});M(f,"Series/Column/ColumnDataLabel.js",[f["Core/Series/DataLabel.js"],f["Core/Series/SeriesRegistry.js"],
+f["Core/Utilities.js"]],function(a,f,C){var F=f.series,u=C.merge,H=C.pick,I;(function(f){function z(a,e,d,f,h){var l=this.chart.inverted,m=a.series,p=(m.xAxis?m.xAxis.len:this.chart.plotSizeX)||0;m=(m.yAxis?m.yAxis.len:this.chart.plotSizeY)||0;var w=a.dlBox||a.shapeArgs,y=H(a.below,a.plotY>H(this.translatedThreshold,m)),A=H(d.inside,!!this.options.stacking);w&&(f=u(w),0>f.y&&(f.height+=f.y,f.y=0),w=f.y+f.height-m,0<w&&w<f.height&&(f.height-=w),l&&(f={x:m-f.y-f.height,y:p-f.x-f.width,width:f.height,
+height:f.width}),A||(l?(f.x+=y?0:f.width,f.width=0):(f.y+=y?f.height:0,f.height=0)));d.align=H(d.align,!l||A?"center":y?"right":"left");d.verticalAlign=H(d.verticalAlign,l||A?"middle":y?"top":"bottom");F.prototype.alignDataLabel.call(this,a,e,d,f,h);d.inside&&a.contrastColor&&e.css({color:a.contrastColor})}var p=[];f.compose=function(f){a.compose(F);-1===p.indexOf(f)&&(p.push(f),f.prototype.alignDataLabel=z)}})(I||(I={}));return I});M(f,"Series/Bar/BarSeries.js",[f["Series/Column/ColumnSeries.js"],
+f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f,C){var F=this&&this.__extends||function(){var a=function(f,u){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,f){a.__proto__=f}||function(a,f){for(var e in f)f.hasOwnProperty(e)&&(a[e]=f[e])};return a(f,u)};return function(f,u){function p(){this.constructor=f}a(f,u);f.prototype=null===u?Object.create(u):(p.prototype=u.prototype,new p)}}(),u=C.extend,H=C.merge;C=function(f){function u(){var a=null!==f&&f.apply(this,
+arguments)||this;a.data=void 0;a.options=void 0;a.points=void 0;return a}F(u,f);u.defaultOptions=H(a.defaultOptions,{});return u}(a);u(C.prototype,{inverted:!0});f.registerSeriesType("bar",C);"";return C});M(f,"Series/Scatter/ScatterSeries.js",[f["Series/Column/ColumnSeries.js"],f["Series/Line/LineSeries.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f,C,G){var u=this&&this.__extends||function(){var a=function(f,m){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&
+function(a,d){a.__proto__=d}||function(a,d){for(var e in d)d.hasOwnProperty(e)&&(a[e]=d[e])};return a(f,m)};return function(f,m){function e(){this.constructor=f}a(f,m);f.prototype=null===m?Object.create(m):(e.prototype=m.prototype,new e)}}(),F=G.addEvent,I=G.extend,B=G.merge;G=function(a){function p(){var f=null!==a&&a.apply(this,arguments)||this;f.data=void 0;f.options=void 0;f.points=void 0;return f}u(p,a);p.prototype.applyJitter=function(){var a=this,e=this.options.jitter,d=this.points.length;
+e&&this.points.forEach(function(f,h){["x","y"].forEach(function(l,m){var n="plot"+l.toUpperCase();if(e[l]&&!f.isNull){var p=a[l+"Axis"];var t=e[l]*p.transA;if(p&&!p.isLog){var A=Math.max(0,f[n]-t);p=Math.min(p.len,f[n]+t);m=1E4*Math.sin(h+m*d);f[n]=A+(p-A)*(m-Math.floor(m));"x"===l&&(f.clientX=f.plotX)}}})})};p.prototype.drawGraph=function(){this.options.lineWidth?a.prototype.drawGraph.call(this):this.graph&&(this.graph=this.graph.destroy())};p.defaultOptions=B(f.defaultOptions,{lineWidth:0,findNearestPointBy:"xy",
+jitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px"> {series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}});return p}(f);I(G.prototype,{drawTracker:a.prototype.drawTracker,sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1});F(G,"afterTranslate",function(){this.applyJitter()});C.registerSeriesType("scatter",
+G);"";return G});M(f,"Series/CenteredUtilities.js",[f["Core/Globals.js"],f["Core/Series/Series.js"],f["Core/Utilities.js"]],function(a,f,C){var F=a.deg2rad,u=C.isNumber,H=C.pick,I=C.relativeLength,B;(function(a){a.getCenter=function(){var a=this.options,m=this.chart,e=2*(a.slicedOffset||0),d=m.plotWidth-2*e,l=m.plotHeight-2*e,h=a.center,t=Math.min(d,l),n=a.size,v=a.innerSize||0;"string"===typeof n&&(n=parseFloat(n));"string"===typeof v&&(v=parseFloat(v));a=[H(h[0],"50%"),H(h[1],"50%"),H(n&&0>n?void 0:
+a.size,"100%"),H(v&&0>v?void 0:a.innerSize||0,"0%")];!m.angular||this instanceof f||(a[3]=0);for(h=0;4>h;++h)n=a[h],m=2>h||2===h&&/%$/.test(n),a[h]=I(n,[d,l,t,a[2]][h])+(m?e:0);a[3]>a[2]&&(a[3]=a[2]);return a};a.getStartAndEndRadians=function(a,f){a=u(a)?a:0;f=u(f)&&f>a&&360>f-a?f:a+360;return{start:F*(a+-90),end:F*(f+-90)}}})(B||(B={}));"";return B});M(f,"Series/Pie/PiePoint.js",[f["Core/Animation/AnimationUtilities.js"],f["Core/Series/Point.js"],f["Core/Utilities.js"]],function(a,f,C){var F=this&&
+this.__extends||function(){var a=function(e,d){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,d){a.__proto__=d}||function(a,d){for(var e in d)d.hasOwnProperty(e)&&(a[e]=d[e])};return a(e,d)};return function(e,d){function f(){this.constructor=e}a(e,d);e.prototype=null===d?Object.create(d):(f.prototype=d.prototype,new f)}}(),u=a.setAnimation,H=C.addEvent,I=C.defined;a=C.extend;var B=C.isNumber,z=C.pick,p=C.relativeLength;f=function(a){function e(){var d=null!==a&&a.apply(this,arguments)||
+this;d.labelDistance=void 0;d.options=void 0;d.series=void 0;return d}F(e,a);e.prototype.getConnectorPath=function(){var a=this.labelPosition,e=this.series.options.dataLabels,f=this.connectorShapes,m=e.connectorShape;f[m]&&(m=f[m]);return m.call(this,{x:a.final.x,y:a.final.y,alignment:a.alignment},a.connectorPosition,e)};e.prototype.getTranslate=function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}};e.prototype.haloPath=function(a){var d=this.shapeArgs;return this.sliced||
+!this.visible?[]:this.series.chart.renderer.symbols.arc(d.x,d.y,d.r+a,d.r+a,{innerR:d.r-1,start:d.start,end:d.end})};e.prototype.init=function(){var d=this;a.prototype.init.apply(this,arguments);this.name=z(this.name,"Slice");var e=function(a){d.slice("select"===a.type)};H(this,"select",e);H(this,"unselect",e);return this};e.prototype.isValid=function(){return B(this.y)&&0<=this.y};e.prototype.setVisible=function(a,e){var d=this,f=this.series,m=f.chart,l=f.options.ignoreHiddenPoint;e=z(e,l);a!==this.visible&&
+(this.visible=this.options.visible=a="undefined"===typeof a?!this.visible:a,f.options.data[f.data.indexOf(this)]=this.options,["graphic","dataLabel","connector","shadowGroup"].forEach(function(e){if(d[e])d[e][a?"show":"hide"](a)}),this.legendItem&&m.legend.colorizeItem(this,a),a||"hover"!==this.state||this.setState(""),l&&(f.isDirty=!0),e&&m.redraw())};e.prototype.slice=function(a,e,f){var d=this.series;u(f,d.chart);z(e,!0);this.sliced=this.options.sliced=I(a)?a:!this.sliced;d.options.data[d.data.indexOf(this)]=
+this.options;this.graphic&&this.graphic.animate(this.getTranslate());this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())};return e}(f);a(f.prototype,{connectorShapes:{fixedOffset:function(a,e,d){var f=e.breakAt;e=e.touchingSliceAt;return[["M",a.x,a.y],d.softConnector?["C",a.x+("left"===a.alignment?-5:5),a.y,2*f.x-e.x,2*f.y-e.y,f.x,f.y]:["L",f.x,f.y],["L",e.x,e.y]]},straight:function(a,e){e=e.touchingSliceAt;return[["M",a.x,a.y],["L",e.x,e.y]]},crookedLine:function(a,e,d){e=e.touchingSliceAt;
+var f=this.series,h=f.center[0],m=f.chart.plotWidth,n=f.chart.plotLeft;f=a.alignment;var u=this.shapeArgs.r;d=p(d.crookDistance,1);m="left"===f?h+u+(m+n-h-u)*(1-d):n+(h-u)*d;d=["L",m,a.y];h=!0;if("left"===f?m>a.x||m<e.x:m<a.x||m>e.x)h=!1;a=[["M",a.x,a.y]];h&&a.push(d);a.push(["L",e.x,e.y]);return a}}});return f});M(f,"Series/Pie/PieSeries.js",[f["Series/CenteredUtilities.js"],f["Series/Column/ColumnSeries.js"],f["Core/Globals.js"],f["Core/Legend/LegendSymbol.js"],f["Series/Pie/PiePoint.js"],f["Core/Series/Series.js"],
+f["Core/Series/SeriesRegistry.js"],f["Core/Renderer/SVG/Symbols.js"],f["Core/Utilities.js"]],function(a,f,C,G,u,H,I,B,z){var p=this&&this.__extends||function(){var a=function(d,e){a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,d){a.__proto__=d}||function(a,d){for(var e in d)d.hasOwnProperty(e)&&(a[e]=d[e])};return a(d,e)};return function(d,e){function f(){this.constructor=d}a(d,e);d.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),m=a.getStartAndEndRadians;
+C=C.noop;var e=z.clamp,d=z.extend,l=z.fireEvent,h=z.merge,t=z.pick,n=z.relativeLength;z=function(a){function d(){var d=null!==a&&a.apply(this,arguments)||this;d.center=void 0;d.data=void 0;d.maxLabelDistance=void 0;d.options=void 0;d.points=void 0;return d}p(d,a);d.prototype.animate=function(a){var d=this,e=d.points,f=d.startAngleRad;a||e.forEach(function(a){var c=a.graphic,b=a.shapeArgs;c&&b&&(c.attr({r:t(a.startR,d.center&&d.center[3]/2),start:f,end:f}),c.animate({r:b.r,start:b.start,end:b.end},
+d.options.animation))})};d.prototype.drawEmpty=function(){var a=this.startAngleRad,d=this.endAngleRad,e=this.options;if(0===this.total&&this.center){var f=this.center[0];var c=this.center[1];this.graph||(this.graph=this.chart.renderer.arc(f,c,this.center[1]/2,0,a,d).addClass("highcharts-empty-series").add(this.group));this.graph.attr({d:B.arc(f,c,this.center[2]/2,0,{start:a,end:d,innerR:this.center[3]/2})});this.chart.styledMode||this.graph.attr({"stroke-width":e.borderWidth,fill:e.fillColor||"none",
+stroke:e.color||"#cccccc"})}else this.graph&&(this.graph=this.graph.destroy())};d.prototype.drawPoints=function(){var a=this.chart.renderer;this.points.forEach(function(d){d.graphic&&d.hasNewShapeType()&&(d.graphic=d.graphic.destroy());d.graphic||(d.graphic=a[d.shapeType](d.shapeArgs).add(d.series.group),d.delayedRendering=!0)})};d.prototype.generatePoints=function(){a.prototype.generatePoints.call(this);this.updateTotals()};d.prototype.getX=function(a,d,f){var h=this.center,c=this.radii?this.radii[f.index]||
+0:h[2]/2;a=Math.asin(e((a-h[1])/(c+f.labelDistance),-1,1));return h[0]+(d?-1:1)*Math.cos(a)*(c+f.labelDistance)+(0<f.labelDistance?(d?-1:1)*this.options.dataLabels.padding:0)};d.prototype.hasData=function(){return!!this.processedXData.length};d.prototype.redrawPoints=function(){var a=this,d=a.chart,e=d.renderer,f=a.options.shadow,c,g,b,m;this.drawEmpty();!f||a.shadowGroup||d.styledMode||(a.shadowGroup=e.g("shadow").attr({zIndex:-1}).add(a.group));a.points.forEach(function(k){var l={};g=k.graphic;
+if(!k.isNull&&g){var n=void 0;m=k.shapeArgs;c=k.getTranslate();d.styledMode||(n=k.shadowGroup,f&&!n&&(n=k.shadowGroup=e.g("shadow").add(a.shadowGroup)),n&&n.attr(c),b=a.pointAttribs(k,k.selected&&"select"));k.delayedRendering?(g.setRadialReference(a.center).attr(m).attr(c),d.styledMode||g.attr(b).attr({"stroke-linejoin":"round"}).shadow(f,n),k.delayedRendering=!1):(g.setRadialReference(a.center),d.styledMode||h(!0,l,b),h(!0,l,m,c),g.animate(l));g.attr({visibility:k.visible?"inherit":"hidden"});g.addClass(k.getClassName(),
+!0)}else g&&(k.graphic=g.destroy())})};d.prototype.sortByAngle=function(a,d){a.sort(function(a,e){return"undefined"!==typeof a.angle&&(e.angle-a.angle)*d})};d.prototype.translate=function(a){this.generatePoints();var d=this.options,e=d.slicedOffset,f=e+(d.borderWidth||0),c=m(d.startAngle,d.endAngle),g=this.startAngleRad=c.start;c=(this.endAngleRad=c.end)-g;var b=this.points,h=d.dataLabels.distance;d=d.ignoreHiddenPoint;var p=b.length,u,w=0;a||(this.center=a=this.getCenter());for(u=0;u<p;u++){var v=
+b[u];var y=g+w*c;!v.isValid()||d&&!v.visible||(w+=v.percentage/100);var z=g+w*c;var B={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*y)/1E3,end:Math.round(1E3*z)/1E3};v.shapeType="arc";v.shapeArgs=B;v.labelDistance=t(v.options.dataLabels&&v.options.dataLabels.distance,h);v.labelDistance=n(v.labelDistance,B.r);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,v.labelDistance);z=(z+y)/2;z>1.5*Math.PI?z-=2*Math.PI:z<-Math.PI/2&&(z+=2*Math.PI);v.slicedTranslation={translateX:Math.round(Math.cos(z)*
+e),translateY:Math.round(Math.sin(z)*e)};B=Math.cos(z)*a[2]/2;var F=Math.sin(z)*a[2]/2;v.tooltipPos=[a[0]+.7*B,a[1]+.7*F];v.half=z<-Math.PI/2||z>Math.PI/2?1:0;v.angle=z;y=Math.min(f,v.labelDistance/5);v.labelPosition={natural:{x:a[0]+B+Math.cos(z)*v.labelDistance,y:a[1]+F+Math.sin(z)*v.labelDistance},"final":{},alignment:0>v.labelDistance?"center":v.half?"right":"left",connectorPosition:{breakAt:{x:a[0]+B+Math.cos(z)*y,y:a[1]+F+Math.sin(z)*y},touchingSliceAt:{x:a[0]+B,y:a[1]+F}}}}l(this,"afterTranslate")};
+d.prototype.updateTotals=function(){var a=this.points,d=a.length,e=this.options.ignoreHiddenPoint,f,c=0;for(f=0;f<d;f++){var g=a[f];!g.isValid()||e&&!g.visible||(c+=g.y)}this.total=c;for(f=0;f<d;f++)g=a[f],g.percentage=0<c&&(g.visible||!e)?g.y/c*100:0,g.total=c};d.defaultOptions=h(H.defaultOptions,{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,connectorShape:"fixedOffset",crookDistance:"70%",distance:30,enabled:!0,formatter:function(){return this.point.isNull?
+void 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}});return d}(H);d(z.prototype,{axisTypes:[],directTouch:!0,drawGraph:void 0,drawLegendSymbol:G.drawRectangle,drawTracker:f.prototype.drawTracker,getCenter:a.getCenter,getSymbol:C,isCartesian:!1,
+noSharedTooltip:!0,pointAttribs:f.prototype.pointAttribs,pointClass:u,requireSorting:!1,searchPoint:C,trackerGroups:["group","dataLabelsGroup"]});I.registerSeriesType("pie",z);"";return z});M(f,"Series/Pie/PieDataLabel.js",[f["Core/Series/DataLabel.js"],f["Core/Globals.js"],f["Core/Renderer/RendererUtilities.js"],f["Core/Series/SeriesRegistry.js"],f["Core/Utilities.js"]],function(a,f,C,G,u){var F=f.noop,I=C.distribute,B=G.series,z=u.arrayMax,p=u.clamp,m=u.defined,e=u.merge,d=u.pick,l=u.relativeLength,
+h;(function(f){function h(){var a=this,f=a.data,c=a.chart,g=a.options.dataLabels||{},b=g.connectorPadding,h=c.plotWidth,l=c.plotHeight,n=c.plotLeft,p=Math.round(c.chartWidth/3),t=a.center,u=t[2]/2,v=t[1],A=[[],[]],w=[0,0,0,0],y=a.dataLabelPositioners,F,C,G,H,M,E,T,N,U,V,X,S;a.visible&&(g.enabled||a._hasPointLabels)&&(f.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),B.prototype.drawDataLabels.apply(a),
+f.forEach(function(a){a.dataLabel&&(a.visible?(A[a.half].push(a),a.dataLabel._pos=null,!m(g.style.width)&&!m(a.options.dataLabels&&a.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width>p&&(a.dataLabel.css({width:Math.round(.7*p)+"px"}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),A.forEach(function(e,f){var k=e.length,q=[],p;if(k){a.sortByAngle(e,f-.5);if(0<a.maxLabelDistance){var r=
+Math.max(0,v-u-a.maxLabelDistance);var A=Math.min(v+u+a.maxLabelDistance,c.plotHeight);e.forEach(function(a){0<a.labelDistance&&a.dataLabel&&(a.top=Math.max(0,v-u-a.labelDistance),a.bottom=Math.min(v+u+a.labelDistance,c.plotHeight),p=a.dataLabel.getBBox().height||21,a.distributeBox={target:a.labelPosition.natural.y-a.top+p/2,size:p,rank:a.y},q.push(a.distributeBox))});r=A+p-r;I(q,r,r/5)}for(X=0;X<k;X++){F=e[X];E=F.labelPosition;H=F.dataLabel;V=!1===F.visible?"hidden":"inherit";U=r=E.natural.y;q&&
+m(F.distributeBox)&&("undefined"===typeof F.distributeBox.pos?V="hidden":(T=F.distributeBox.size,U=y.radialDistributionY(F)));delete F.positionIndex;if(g.justify)N=y.justify(F,u,t);else switch(g.alignTo){case "connectors":N=y.alignToConnectors(e,f,h,n);break;case "plotEdges":N=y.alignToPlotEdges(H,f,h,n);break;default:N=y.radialDistributionX(a,F,U,r)}H._attr={visibility:V,align:E.alignment};S=F.options.dataLabels||{};H._pos={x:N+d(S.x,g.x)+({left:b,right:-b}[E.alignment]||0),y:U+d(S.y,g.y)-10};E.final.x=
+N;E.final.y=U;d(g.crop,!0)&&(M=H.getBBox().width,r=null,N-M<b&&1===f?(r=Math.round(M-N+b),w[3]=Math.max(r,w[3])):N+M>h-b&&0===f&&(r=Math.round(N+M-h+b),w[1]=Math.max(r,w[1])),0>U-T/2?w[0]=Math.max(Math.round(-U+T/2),w[0]):U+T/2>l&&(w[2]=Math.max(Math.round(U+T/2-l),w[2])),H.sideOverflow=r)}}}),0===z(w)||this.verifyDataLabelOverflow(w))&&(this.placeDataLabels(),this.points.forEach(function(b){S=e(g,b.options.dataLabels);if(C=d(S.connectorWidth,1)){var f;G=b.connector;if((H=b.dataLabel)&&H._pos&&b.visible&&
+0<b.labelDistance){V=H._attr.visibility;if(f=!G)b.connector=G=c.renderer.path().addClass("highcharts-data-label-connector  highcharts-color-"+b.colorIndex+(b.className?" "+b.className:"")).add(a.dataLabelsGroup),c.styledMode||G.attr({"stroke-width":C,stroke:S.connectorColor||b.color||"#666666"});G[f?"attr":"animate"]({d:b.getConnectorPath()});G.attr("visibility",V)}else G&&(b.connector=G.destroy())}}))}function t(){this.points.forEach(function(a){var d=a.dataLabel,c;d&&a.visible&&((c=d._pos)?(d.sideOverflow&&
+(d._attr.width=Math.max(d.getBBox().width-d.sideOverflow,0),d.css({width:d._attr.width+"px",textOverflow:(this.options.dataLabels.style||{}).textOverflow||"ellipsis"}),d.shortened=!0),d.attr(d._attr),d[d.moved?"animate":"attr"](c),d.moved=!0):d&&d.attr({y:-9999}));delete a.distributeBox},this)}function u(a){var d=this.center,c=this.options,e=c.center,b=c.minSize||80,f=null!==c.size;if(!f){if(null!==e[0])var h=Math.max(d[2]-Math.max(a[1],a[3]),b);else h=Math.max(d[2]-a[1]-a[3],b),d[0]+=(a[3]-a[1])/
+2;null!==e[1]?h=p(h,b,d[2]-Math.max(a[0],a[2])):(h=p(h,b,d[2]-a[0]-a[2]),d[1]+=(a[0]-a[2])/2);h<d[2]?(d[2]=h,d[3]=Math.min(l(c.innerSize||0,h),h),this.translate(d),this.drawDataLabels&&this.drawDataLabels()):f=!0}return f}var y=[],A={radialDistributionY:function(a){return a.top+a.distributeBox.pos},radialDistributionX:function(a,d,c,e){return a.getX(c<d.top+2||c>d.bottom-2?e:c,d.half,d)},justify:function(a,d,c){return c[0]+(a.half?-1:1)*(d+a.labelDistance)},alignToPlotEdges:function(a,d,c,e){a=a.getBBox().width;
+return d?a+e:c-a-e},alignToConnectors:function(a,d,c,e){var b=0,f;a.forEach(function(a){f=a.dataLabel.getBBox().width;f>b&&(b=f)});return d?b+e:c-b-e}};f.compose=function(d){a.compose(B);-1===y.indexOf(d)&&(y.push(d),d=d.prototype,d.dataLabelPositioners=A,d.alignDataLabel=F,d.drawDataLabels=h,d.placeDataLabels=t,d.verifyDataLabelOverflow=u)}})(h||(h={}));return h});M(f,"Extensions/OverlappingDataLabels.js",[f["Core/Chart/Chart.js"],f["Core/Utilities.js"]],function(a,f){function F(a,f){var e=!1;if(a){var d=
+a.newOpacity;a.oldOpacity!==d&&(a.alignAttr&&a.placed?(a[d?"removeClass":"addClass"]("highcharts-data-label-hidden"),e=!0,a.alignAttr.opacity=d,a[a.isOld?"animate":"attr"](a.alignAttr,null,function(){f.styledMode||a.css({pointerEvents:d?"auto":"none"})}),u(f,"afterHideOverlappingLabel")):a.attr({opacity:d}));a.isOld=!0}return e}var G=f.addEvent,u=f.fireEvent,H=f.isArray,I=f.isNumber,B=f.objectEach,z=f.pick;G(a,"render",function(){var a=this,f=[];(this.labelCollectors||[]).forEach(function(a){f=f.concat(a())});
+(this.yAxis||[]).forEach(function(a){a.stacking&&a.options.stackLabels&&!a.options.stackLabels.allowOverlap&&B(a.stacking.stacks,function(a){B(a,function(a){a.label&&"hidden"!==a.label.visibility&&f.push(a.label)})})});(this.series||[]).forEach(function(e){var d=e.options.dataLabels;e.visible&&(!1!==d.enabled||e._hasPointLabels)&&(d=function(d){return d.forEach(function(d){d.visible&&(H(d.dataLabels)?d.dataLabels:d.dataLabel?[d.dataLabel]:[]).forEach(function(e){var h=e.options;e.labelrank=z(h.labelrank,
+d.labelrank,d.shapeArgs&&d.shapeArgs.height);h.allowOverlap?(e.oldOpacity=e.opacity,e.newOpacity=1,F(e,a)):f.push(e)})})},d(e.nodes||[]),d(e.points))});this.hideOverlappingLabels(f)});a.prototype.hideOverlappingLabels=function(a){var f=this,e=a.length,d=f.renderer,l,h,p,n=!1;var v=function(a){var e,f=a.box?0:a.padding||0,c=e=0,g;if(a&&(!a.alignAttr||a.placed)){var b=a.alignAttr||{x:a.attr("x"),y:a.attr("y")};var h=a.parentGroup;a.width||(e=a.getBBox(),a.width=e.width,a.height=e.height,e=d.fontMetrics(null,
+a.element).h);var l=a.width-2*f;(g={left:"0",center:"0.5",right:"1"}[a.alignValue])?c=+g*l:I(a.x)&&Math.round(a.x)!==a.translateX&&(c=a.x-a.translateX);return{x:b.x+(h.translateX||0)+f-(c||0),y:b.y+(h.translateY||0)+f-e,width:a.width-2*f,height:a.height-2*f}}};for(h=0;h<e;h++)if(l=a[h])l.oldOpacity=l.opacity,l.newOpacity=1,l.absoluteBox=v(l);a.sort(function(a,d){return(d.labelrank||0)-(a.labelrank||0)});for(h=0;h<e;h++){var w=(v=a[h])&&v.absoluteBox;for(l=h+1;l<e;++l){var y=(p=a[l])&&p.absoluteBox;
+!w||!y||v===p||0===v.newOpacity||0===p.newOpacity||y.x>=w.x+w.width||y.x+y.width<=w.x||y.y>=w.y+w.height||y.y+y.height<=w.y||((v.labelrank<p.labelrank?v:p).newOpacity=0)}}a.forEach(function(a){F(a,f)&&(n=!0)});n&&u(f,"afterHideAllOverlappingLabels")}});M(f,"Core/Responsive.js",[f["Core/Utilities.js"]],function(a){var f=a.extend,C=a.find,G=a.isArray,u=a.isObject,H=a.merge,I=a.objectEach,B=a.pick,z=a.splat,p=a.uniqueKey,m;(function(a){var d=[];a.compose=function(a){-1===d.indexOf(a)&&(d.push(a),f(a.prototype,
+e.prototype));return a};var e=function(){function a(){}a.prototype.currentOptions=function(a){function d(a,f,h,k){var c;I(a,function(a,b){if(!k&&-1<e.collectionsWithUpdate.indexOf(b)&&f[b])for(a=z(a),h[b]=[],c=0;c<Math.max(a.length,f[b].length);c++)f[b][c]&&(void 0===a[c]?h[b][c]=f[b][c]:(h[b][c]={},d(a[c],f[b][c],h[b][c],k+1)));else u(a)?(h[b]=G(a)?[]:{},d(a,f[b]||{},h[b],k+1)):h[b]="undefined"===typeof f[b]?null:f[b]})}var e=this,f={};d(a,this.options,f,0);return f};a.prototype.matchResponsiveRule=
+function(a,d){var e=a.condition;(e.callback||function(){return this.chartWidth<=B(e.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=B(e.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=B(e.minWidth,0)&&this.chartHeight>=B(e.minHeight,0)}).call(this)&&d.push(a._id)};a.prototype.setResponsive=function(a,d){var e=this,f=this.options.responsive,h=this.currentResponsive,l=[];!d&&f&&f.rules&&f.rules.forEach(function(a){"undefined"===typeof a._id&&(a._id=p());e.matchResponsiveRule(a,l)},this);d=H.apply(void 0,
+l.map(function(a){return C((f||{}).rules||[],function(d){return d._id===a})}).map(function(a){return a&&a.chartOptions}));d.isResponsiveOptions=!0;l=l.toString()||void 0;l!==(h&&h.ruleIds)&&(h&&this.update(h.undoOptions,a,!0),l?(h=this.currentOptions(d),h.isResponsiveOptions=!0,this.currentResponsive={ruleIds:l,mergedOptions:d,undoOptions:h},this.update(d,a,!0)):this.currentResponsive=void 0)};return a}()})(m||(m={}));"";"";return m});M(f,"masters/highcharts.src.js",[f["Core/Globals.js"],f["Core/Utilities.js"],
+f["Core/DefaultOptions.js"],f["Core/Animation/Fx.js"],f["Core/Animation/AnimationUtilities.js"],f["Core/Renderer/HTML/AST.js"],f["Core/FormatUtilities.js"],f["Core/Renderer/RendererUtilities.js"],f["Core/Renderer/SVG/SVGElement.js"],f["Core/Renderer/SVG/SVGRenderer.js"],f["Core/Renderer/HTML/HTMLElement.js"],f["Core/Renderer/HTML/HTMLRenderer.js"],f["Core/Axis/Axis.js"],f["Core/Axis/DateTimeAxis.js"],f["Core/Axis/LogarithmicAxis.js"],f["Core/Axis/PlotLineOrBand/PlotLineOrBand.js"],f["Core/Axis/Tick.js"],
+f["Core/Tooltip.js"],f["Core/Series/Point.js"],f["Core/Pointer.js"],f["Core/MSPointer.js"],f["Core/Legend/Legend.js"],f["Core/Chart/Chart.js"],f["Core/Series/Series.js"],f["Core/Series/SeriesRegistry.js"],f["Series/Column/ColumnSeries.js"],f["Series/Column/ColumnDataLabel.js"],f["Series/Pie/PieSeries.js"],f["Series/Pie/PieDataLabel.js"],f["Core/Series/DataLabel.js"],f["Core/Responsive.js"],f["Core/Color/Color.js"],f["Core/Time.js"]],function(a,f,C,G,u,H,I,B,z,p,m,e,d,l,h,t,n,v,w,y,A,q,k,c,g,b,r,x,
+D,K,M,Q,O){a.animate=u.animate;a.animObject=u.animObject;a.getDeferredAnimation=u.getDeferredAnimation;a.setAnimation=u.setAnimation;a.stop=u.stop;a.timers=G.timers;a.AST=H;a.Axis=d;a.Chart=k;a.chart=k.chart;a.Fx=G;a.Legend=q;a.PlotLineOrBand=t;a.Point=w;a.Pointer=A.isRequired()?A:y;a.Series=c;a.SVGElement=z;a.SVGRenderer=p;a.Tick=n;a.Time=O;a.Tooltip=v;a.Color=Q;a.color=Q.parse;e.compose(p);m.compose(z);a.defaultOptions=C.defaultOptions;a.getOptions=C.getOptions;a.time=C.defaultTime;a.setOptions=
+C.setOptions;a.dateFormat=I.dateFormat;a.format=I.format;a.numberFormat=I.numberFormat;a.addEvent=f.addEvent;a.arrayMax=f.arrayMax;a.arrayMin=f.arrayMin;a.attr=f.attr;a.clearTimeout=f.clearTimeout;a.correctFloat=f.correctFloat;a.createElement=f.createElement;a.css=f.css;a.defined=f.defined;a.destroyObjectProperties=f.destroyObjectProperties;a.discardElement=f.discardElement;a.distribute=B.distribute;a.erase=f.erase;a.error=f.error;a.extend=f.extend;a.extendClass=f.extendClass;a.find=f.find;a.fireEvent=
+f.fireEvent;a.getMagnitude=f.getMagnitude;a.getStyle=f.getStyle;a.inArray=f.inArray;a.isArray=f.isArray;a.isClass=f.isClass;a.isDOMElement=f.isDOMElement;a.isFunction=f.isFunction;a.isNumber=f.isNumber;a.isObject=f.isObject;a.isString=f.isString;a.keys=f.keys;a.merge=f.merge;a.normalizeTickInterval=f.normalizeTickInterval;a.objectEach=f.objectEach;a.offset=f.offset;a.pad=f.pad;a.pick=f.pick;a.pInt=f.pInt;a.relativeLength=f.relativeLength;a.removeEvent=f.removeEvent;a.seriesType=g.seriesType;a.splat=
+f.splat;a.stableSort=f.stableSort;a.syncTimeout=f.syncTimeout;a.timeUnits=f.timeUnits;a.uniqueKey=f.uniqueKey;a.useSerialIds=f.useSerialIds;a.wrap=f.wrap;r.compose(b);K.compose(c);l.compose(d);h.compose(d);D.compose(x);t.compose(d);M.compose(k);return a});f["masters/highcharts.src.js"]._modules=f;return f["masters/highcharts.src.js"]});
+//# sourceMappingURL=highcharts.js.map
\ No newline at end of file
diff --git a/aa_chart_core/src/main/assets/AARounded-Corners.js b/aa_chart_core/src/main/assets/AARounded-Corners.js
new file mode 100644
index 0000000..9d0879b
--- /dev/null
+++ b/aa_chart_core/src/main/assets/AARounded-Corners.js
@@ -0,0 +1,8 @@
+/**
+ * Highcharts plugin for creating individual rounded corners.
+ * 
+ * Author: Torstein Honsi
+ * Version: 1.0.5
+ * License: MIT License
+ */
+(function(factory){if(typeof module==="object"&&module.exports){module.exports=factory}else{factory(Highcharts)}}(function(H){var rel=H.relativeLength;H.wrap(H.seriesTypes.column.prototype,"translate",function(proceed){var options=this.options,topMargin=options.topMargin||0,bottomMargin=options.bottomMargin||0;proceed.call(this);this.points.forEach(function(point){var shapeArgs=point.shapeArgs,w=shapeArgs.width,h=shapeArgs.height,x=shapeArgs.x,y=shapeArgs.y;var rTopLeft=rel(options.borderRadiusTopLeft||0,w),rTopRight=rel(options.borderRadiusTopRight||0,w),rBottomRight=rel(options.borderRadiusBottomRight||0,w),rBottomLeft=rel(options.borderRadiusBottomLeft||0,w);if(rTopLeft||rTopRight||rBottomRight||rBottomLeft){var maxR=Math.min(w,h)/2;if(rTopLeft>maxR){rTopLeft=maxR}if(rTopRight>maxR){rTopRight=maxR}if(rBottomRight>maxR){rBottomRight=maxR}if(rBottomLeft>maxR){rBottomLeft=maxR}point.dlBox=point.shapeArgs;point.shapeType="path";point.shapeArgs={d:[["M",x+rTopLeft,y+topMargin],["L",x+w-rTopRight,y+topMargin],["C",x+w-rTopRight/2,y,x+w,y+rTopRight/2,x+w,y+rTopRight],["L",x+w,y+h-rBottomRight],["C",x+w,y+h-rBottomRight/2,x+w-rBottomRight/2,y+h,x+w-rBottomRight,y+h+bottomMargin],["L",x+rBottomLeft,y+h+bottomMargin],["C",x+rBottomLeft/2,y+h,x,y+h-rBottomLeft/2,x,y+h-rBottomLeft],["L",x,y+rTopLeft],["C",x,y+rTopLeft/2,x+rTopLeft/2,y,x+rTopLeft,y],["Z"]]}}})})}));
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartEvents.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartEvents.java
new file mode 100644
index 0000000..70ac2ce
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartEvents.java
@@ -0,0 +1,31 @@
+package com.github.AAChartModel.AAChartCore.AAChartCreator;
+
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+
+public class AAChartEvents {
+    public String load;
+    public String redraw;
+    public String render;
+    public String selection;
+
+
+    public AAChartEvents load(String prop) {
+        load = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAChartEvents redraw(String prop) {
+        redraw = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAChartEvents render(String prop) {
+        render = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAChartEvents selection(String prop) {
+        selection = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartModel.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartModel.java
new file mode 100644
index 0000000..f4e5226
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartModel.java
@@ -0,0 +1,354 @@
+/**
+//  AAChartModel.java
+//  AAChartCore
+//
+//  Created by AnAn on 2017/9/5.
+//  Copyright 漏 2018骞� An An. All rights reserved.
+
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore            鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore-Kotlin     鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+
+
+ * -------------------------------------------------------------------------------
+ *
+ *  馃寱 馃寲 馃寳 馃寴  鉂�鉂�鉂�   WARM TIPS!!!   鉂�鉂�鉂� 馃寫 馃寬 馃寭 馃寯
+ *
+ * Please contact me on GitHub,if there are any problems encountered in use.
+ * GitHub Issues : https://github.com/AAChartModel/AAChartCore/issues
+ * -------------------------------------------------------------------------------
+ * And if you want to contribute for this project, please contact me as well
+ * GitHub        : https://github.com/AAChartModel
+ * StackOverflow : https://stackoverflow.com/users/7842508/codeforu
+ * JianShu       : http://www.jianshu.com/u/f1e6753d4254
+ * SegmentFault  : https://segmentfault.com/u/huanghunbieguan
+ *
+ * -------------------------------------------------------------------------------
+
+ */
+
+package com.github.AAChartModel.AAChartCore.AAChartCreator;
+
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartAnimationType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartStackingType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartSymbolStyleType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartZoomType;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAOptions;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAScrollablePlotArea;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAStyle;
+
+
+public class AAChartModel {
+
+    public String  animationType;         //鍔ㄧ敾绫诲瀷
+    public Integer animationDuration;     //鍔ㄧ敾鏃堕棿
+    public String  title;                 //鏍囬鍐呭
+    public AAStyle titleStyle;            //鏍囬鏂囨湰椋庢牸鏍峰紡
+    public String  subtitle;              //鍓爣棰樺唴瀹�
+    public String  subtitleAlign;         //鍓爣棰樻按骞冲榻愭柟寮�
+    public AAStyle subtitleStyle;         //鍓爣棰樻枃鏈鏍兼牱寮�
+    public String  axesTextColor;         //x 杞村拰 y 杞存枃瀛楅鑹�
+    public String  chartType;             //鍥捐〃绫诲瀷
+    public String  stacking;              //鍫嗙Н鏍峰紡
+    public String  markerSymbol;          //鎶樼嚎鏇茬嚎杩炴帴鐐圭殑绫诲瀷锛�"circle", "square", "diamond", "triangle","triangle-down"锛岄粯璁ゆ槸"circle"
+    public String  markerSymbolStyle;     //鎶樼嚎鏇茬嚎杩炴帴鐐圭殑鑷畾涔夐鏍兼牱寮�
+    public String  zoomType;              //缂╂斁绫诲瀷 AAChartZoomTypeX琛ㄧず鍙部鐫� x 杞磋繘琛屾墜鍔跨缉鏀�
+    public Boolean inverted;              //x 杞存槸鍚︾炕杞�(鍨傜洿)
+    public Boolean xAxisReversed;         //x 杞寸炕杞�
+    public Boolean yAxisReversed;         //y 杞寸炕杞�
+    public Boolean tooltipEnabled;        //鏄惁鏄剧ず娴姩鎻愮ず妗�(榛樿鏄剧ず)
+    public String  tooltipValueSuffix;    //娴姩鎻愮ず妗嗗崟浣嶅悗缂�
+    public Boolean gradientColorEnable;   //鏄惁瑕佷负娓愬彉鑹�
+    public Boolean polar;                 //鏄惁鏋佸寲鍥惧舰(鍙樹负闆疯揪鍥�)
+    public Number[]margin;                //鍥捐〃澶栬竟缂樺拰缁樺浘鍖哄煙涔嬮棿鐨勮竟璺�
+    public Boolean dataLabelsEnabled;     //鏄惁鏄剧ず鏁版嵁
+    public AAStyle dataLabelsStyle;       //鏁版嵁鏂囨湰椋庢牸鏍峰紡
+    public Boolean xAxisLabelsEnabled;    //x 杞存槸鍚︽樉绀烘暟鎹�
+    public Integer xAxisTickInterval;     //x 杞村埢搴︾偣闂撮殧鏁�(璁剧疆姣忛殧鍑犱釜鐐规樉绀轰竴涓� X杞寸殑鍐呭)
+    public String[]categories;            //x 杞存槸鍚︽樉绀烘暟鎹�
+    public Number  xAxisGridLineWidth;    //x 杞寸綉鏍肩嚎鐨勫搴�
+    public Boolean xAxisVisible;          //x 杞存槸鍚︽樉绀�
+    public Boolean yAxisVisible;          //y 杞存槸鍚︽樉绀�
+    public Boolean yAxisLabelsEnabled;    //y 杞存槸鍚︽樉绀烘暟鎹�
+    public String  yAxisTitle;            //y 杞存爣棰�
+    public Number  yAxisLineWidth;        //y 杞磋酱绾跨殑瀹藉害
+    public Number  yAxisMin;              //y 杞存渶灏忓��
+    public Number  yAxisMax;              //y 杞存渶澶у��
+    public Boolean yAxisAllowDecimals;    //y 杞存槸鍚﹀厑璁告樉绀哄皬鏁�
+    public Number  yAxisGridLineWidth;    //y 杞寸綉鏍肩嚎鐨勫搴�
+    public Object[]colorsTheme;           //鍥捐〃涓婚棰滆壊鏁扮粍
+    public Boolean legendEnabled;         //鏄惁鏄剧ず鍥句緥
+    public Object  backgroundColor;       //鍥捐〃鑳屾櫙鑹�
+    public Number  borderRadius;          //鏌辩姸鍥鹃暱鏉″浘澶撮儴鍦嗚鍗婂緞(鍙敤浜庤缃ご閮ㄧ殑褰㈢姸,浠呭鏉″舰鍥�,鏌辩姸鍥炬湁鏁�)
+    public Number  markerRadius;          //鎶樼嚎杩炴帴鐐圭殑鍗婂緞闀垮害
+    public Object[]series;                //鍥捐〃鐨勬暟鎹垪鍐呭
+    public Boolean touchEventEnabled;     //鏄惁鏀寔鐢ㄦ埛瑙︽懜浜嬩欢
+    public AAScrollablePlotArea scrollablePlotArea;
+
+
+
+    public AAChartModel animationType(String prop) {
+        animationType = prop;
+        return this;
+    }
+
+    public AAChartModel animationDuration(Integer prop) {
+        animationDuration = prop;
+        return this;
+    }
+
+    public AAChartModel title(String prop) {
+        title = prop;
+        return this;
+    }
+
+    public AAChartModel titleStyle(AAStyle prop) {
+        titleStyle = prop;
+        return this;
+    }
+
+    public AAChartModel subtitle(String prop) {
+        subtitle = prop;
+        return this;
+    }
+
+    public AAChartModel subtitleAlign(String prop) {
+        subtitleAlign = prop;
+        return this;
+    }
+
+    public AAChartModel subtitleStyle(AAStyle prop) {
+        subtitleStyle = prop;
+        return this;
+    }
+
+    public AAChartModel axesTextColor(String prop) {
+        axesTextColor = prop;
+        return this;
+    }
+
+    public AAChartModel chartType(String prop) {
+        chartType = prop;
+        return this;
+    }
+
+    public AAChartModel stacking(String prop) {
+        stacking = prop;
+        return this;
+    }
+
+    public AAChartModel markerSymbol(String prop) {
+        markerSymbol = prop;
+        return this;
+    }
+
+    public AAChartModel markerSymbolStyle(String prop) {
+        markerSymbolStyle = prop;
+        return this;
+    }
+
+    public AAChartModel zoomType(String prop) {
+        zoomType = prop;
+        return this;
+    }
+
+    public AAChartModel inverted(Boolean prop) {
+        inverted = prop;
+        return this;
+    }
+
+    public AAChartModel xAxisReversed(Boolean prop) {
+        xAxisReversed = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisReversed(Boolean prop) {
+        yAxisReversed = prop;
+        return this;
+    }
+
+    public AAChartModel tooltipEnabled(Boolean prop) {
+        tooltipEnabled = prop;
+        return this;
+    }
+
+    public AAChartModel tooltipValueSuffix(String prop) {
+        tooltipValueSuffix = prop;
+        return this;
+    }
+
+    public AAChartModel gradientColorEnable(Boolean prop) {
+        gradientColorEnable = prop;
+        return this;
+    }
+
+    public AAChartModel polar(Boolean prop) {
+        polar = prop;
+        return this;
+    }
+
+    public AAChartModel margin(Number[] prop) {
+        margin = prop;
+        return this;
+    }
+
+    public AAChartModel dataLabelsEnabled(Boolean prop) {
+        dataLabelsEnabled = prop;
+        return this;
+    }
+
+    public AAChartModel dataLabelsStyle(AAStyle prop) {
+        dataLabelsStyle = prop;
+        return this;
+    }
+
+    public AAChartModel xAxisLabelsEnabled(Boolean prop) {
+        xAxisLabelsEnabled = prop;
+        return this;
+    }
+
+    public AAChartModel xAxisTickInterval(Integer prop) {
+        xAxisTickInterval = prop;
+        return this;
+    }
+
+    public AAChartModel categories(String[] prop) {
+        categories = prop;
+        return this;
+    }
+
+    public AAChartModel xAxisGridLineWidth(Number prop) {
+        xAxisGridLineWidth = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisGridLineWidth(Number prop) {
+        yAxisGridLineWidth = prop;
+        return this;
+    }
+
+    public AAChartModel xAxisVisible(Boolean prop) {
+        xAxisVisible = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisVisible(Boolean prop) {
+        yAxisVisible = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisLabelsEnabled(Boolean prop) {
+        yAxisLabelsEnabled = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisTitle(String prop) {
+        yAxisTitle = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisLineWidth(Number prop) {
+        yAxisLineWidth = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisMin(Number prop) {
+        yAxisMin = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisMax(Number prop) {
+        yAxisMax = prop;
+        return this;
+    }
+
+    public AAChartModel yAxisAllowDecimals(Boolean prop) {
+        yAxisAllowDecimals = prop;
+        return this;
+    }
+
+    public AAChartModel colorsTheme(Object[] prop) {
+        colorsTheme = prop;
+        return this;
+    }
+
+    public AAChartModel legendEnabled(Boolean prop) {
+        legendEnabled = prop;
+        return this;
+    }
+
+    public AAChartModel backgroundColor(Object prop) {
+        backgroundColor = prop;
+        return this;
+    }
+
+
+    public AAChartModel borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AAChartModel markerRadius(Number prop) {
+        markerRadius = prop;
+        return this;
+    }
+
+    public AAChartModel series(Object[] prop) {
+        series = prop;
+        return this;
+    }
+
+    public AAChartModel touchEventEnabled(Boolean prop) {
+        touchEventEnabled = prop;
+        return this;
+    }
+
+    public AAChartModel scrollablePlotArea(AAScrollablePlotArea prop) {
+        scrollablePlotArea = prop;
+        return this;
+    }
+
+    public AAOptions aa_toAAOptions() {
+        return AAOptionsConstructor.configureChartOptions(this);
+    }
+
+    public AAChartModel() {
+        chartType             = AAChartType.Line;
+        title                 = "";
+        yAxisTitle            = "";
+        animationDuration     = 500;//浠ユ绉掍负鍗曚綅
+        animationType         = AAChartAnimationType.Linear;
+        inverted              = false;
+        stacking              = AAChartStackingType.False;
+        xAxisReversed         = false;
+        yAxisReversed         = false;
+        zoomType              = AAChartZoomType.None;
+        dataLabelsEnabled     = false;
+        markerSymbolStyle     = AAChartSymbolStyleType.Normal;
+        colorsTheme           = new String[]{"#fe117c","#ffc069","#06caf4","#7dffc0"};//榛樿鐨勯鑹叉暟缁�(蹇呴』瑕佹坊鍔犻粯璁ゆ暟缁�,鍚﹀垯灏变細鍑洪敊)
+        gradientColorEnable   = false;
+        polar                 = false;
+        xAxisLabelsEnabled    = true;
+        xAxisGridLineWidth    = 0f;
+        yAxisLabelsEnabled    = true;
+        yAxisGridLineWidth    = 1f;
+        legendEnabled         = true;
+        backgroundColor       = "#ffffff";
+        borderRadius          = 0f;//鏌辩姸鍥鹃暱鏉″浘澶撮儴鍦嗚鍗婂緞(鍙敤浜庤缃ご閮ㄧ殑褰㈢姸,浠呭鏉″舰鍥�,鏌辩姸鍥炬湁鏁�,璁剧疆涓�1000鏃�,鏌卞舰鍥炬垨鑰呮潯褰㈠浘澶撮儴涓烘褰�)
+        markerRadius          = 6f;//鎶樼嚎杩炴帴鐐圭殑鍗婂緞闀垮害,濡傛灉鍊艰缃负0,杩欐牱灏辩浉褰撲簬涓嶆樉绀轰簡
+    }
+
+}
+
+
+
+
+
+
+
+
+
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartView.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartView.java
new file mode 100644
index 0000000..eef8d54
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAChartView.java
@@ -0,0 +1,399 @@
+/**
+//  AAChartModel.java
+//  AAChartCore
+//
+//  Created by AnAn on 2017/9/8..
+//  Copyright 漏 2018骞� An An. All rights reserved.
+
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore            鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore-Kotlin     鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+
+
+ * -------------------------------------------------------------------------------
+ *
+ *  馃寱 馃寲 馃寳 馃寴  鉂�鉂�鉂�   WARM TIPS!!!   鉂�鉂�鉂� 馃寫 馃寬 馃寭 馃寯
+ *
+ * Please contact me on GitHub,if there are any problems encountered in use.
+ * GitHub Issues : https://github.com/AAChartModel/AAChartCore/issues
+ * -------------------------------------------------------------------------------
+ * And if you want to contribute for this project, please contact me as well
+ * GitHub        : https://github.com/AAChartModel
+ * StackOverflow : https://stackoverflow.com/users/7842508/codeforu
+ * JianShu       : http://www.jianshu.com/u/f1e6753d4254
+ * SegmentFault  : https://segmentfault.com/u/huanghunbieguan
+ *
+ * -------------------------------------------------------------------------------
+
+ */
+
+package com.github.AAChartModel.AAChartCore.AAChartCreator;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.webkit.JavascriptInterface;
+import android.webkit.JsResult;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAOptions;
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+import com.google.gson.Gson;
+import com.google.gson.internal.LinkedTreeMap;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class AAChartView extends WebView {
+
+    public interface AAChartViewCallBack {
+        void chartViewDidFinishLoad(AAChartView aaChartView);
+        void chartViewMoveOverEventMessage(
+                AAChartView aaChartView,
+                AAMoveOverEventMessageModel messageModel
+        );
+    }
+
+    public Number contentWidth;
+    public Number contentHeight;
+    public Boolean chartSeriesHidden;
+    public Boolean isClearBackgroundColor;
+    public AAChartViewCallBack callBack;
+
+    public void setContentWidth(Number contentWidth) {
+        this.contentWidth = contentWidth;
+        String jsStr = "setTheChartViewContentWidth('"
+                + this.contentWidth + "')";
+        safeEvaluateJavaScriptString(jsStr);
+    }
+
+    public void setContentHeight(Number contentHeight) {
+        this.contentHeight = contentHeight;
+        String jsStr = "setTheChartViewContentHeight('"
+                + this.contentHeight + "')";
+        safeEvaluateJavaScriptString(jsStr);
+    }
+
+    public void setChartSeriesHidden(Boolean chartSeriesHidden) {
+        this.chartSeriesHidden = chartSeriesHidden;
+        String jsStr = "setChartSeriesHidden('"
+                + this.chartSeriesHidden + "')";
+        safeEvaluateJavaScriptString(jsStr);
+    }
+
+    public void setIsClearBackgroundColor(Boolean isClearBackgroundColor) {
+        this.isClearBackgroundColor = isClearBackgroundColor;
+        if (this.isClearBackgroundColor) {
+            this.setBackgroundColor(0);
+            this.getBackground().setAlpha(0);
+        } else {
+            this.setBackgroundColor(1);
+            this.getBackground().setAlpha(255);
+        }
+
+    }
+
+
+    private String optionsJson;
+
+    public AAChartView(
+            Context context
+    ) {
+        super(context);
+        setupBasicContent();
+    }
+
+    public AAChartView(
+            Context context,
+            AttributeSet attrs
+    ) {
+        super(context, attrs);
+        setupBasicContent();
+    }
+
+    public AAChartView(
+            Context context,
+            AttributeSet attrs,
+            int defStyleAttr
+    ) {
+        super(context, attrs, defStyleAttr);
+        setupBasicContent();
+    }
+
+    private void setupBasicContent() {
+        // Do some initialize work.
+        this.contentWidth = 420f;
+        this.contentHeight = 580f;
+        this.isClearBackgroundColor = false;
+        this.getSettings().setJavaScriptEnabled(true);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            this.setWebContentsDebuggingEnabled(true);
+        }
+        //鎶婂綋鍓嶅璞′綔涓篴ndroidObject鍒悕浼犻�掔粰js
+        //js閫氳繃window.androidObject.androidMethod()灏卞彲浠ョ洿鎺ヨ皟鐢ㄥ畨鍗撶殑androidMethod鏂规硶
+        this.addJavascriptInterface(this, "androidObject");
+    }
+
+
+    //js璋冪敤瀹夊崜锛屽繀椤诲姞@JavascriptInterface娉ㄩ噴鐨勬柟娉曟墠鍙互琚玧s璋冪敤
+    @JavascriptInterface
+    public String androidMethod(String message) {
+        Gson gson = new Gson();
+        Map<String, Object> messageBody = new HashMap<>();
+        messageBody = gson.fromJson(message, messageBody.getClass());
+        AAMoveOverEventMessageModel eventMessageModel = getEventMessageModel(messageBody);
+        if (callBack != null) {
+            callBack.chartViewMoveOverEventMessage(this,eventMessageModel);
+        }
+//       Log.i("androidMethod","++++++++++++++++鏄剧ず鎬诲叡璋冪敤浜嗗嚑娆�");
+        return "";
+    }
+
+
+    public void aa_drawChartWithChartModel(final AAChartModel chartModel) {
+        AAOptions aaOptions = chartModel.aa_toAAOptions();
+        this.aa_drawChartWithChartOptions(aaOptions);
+    }
+
+    public void aa_refreshChartWithChartModel(AAChartModel chartModel) {
+        AAOptions aaOptions = chartModel.aa_toAAOptions();
+        this.aa_refreshChartWithChartOptions(aaOptions);
+    }
+
+    public void aa_drawChartWithChartOptions(final AAOptions chartOptions) {
+        if (this.optionsJson != null) {
+            this.aa_refreshChartWithChartOptions(chartOptions);
+        } else {
+            this.loadLocalFilesAndDrawChart(chartOptions);
+            this.showJavaScriptAlertView();
+        }
+    }
+
+    public void aa_refreshChartWithChartOptions(AAOptions chartOptions) {
+        configureChartOptionsAndDrawChart(chartOptions);
+    }
+
+
+    public void aa_onlyRefreshTheChartDataWithChartOptionsSeriesArray(
+            AASeriesElement[] seriesElementsArr
+    ) {
+        aa_onlyRefreshTheChartDataWithChartOptionsSeriesArray(seriesElementsArr,true);
+    }
+
+    public void aa_onlyRefreshTheChartDataWithChartOptionsSeriesArray(
+            AASeriesElement[] seriesElementsArr,
+            Boolean animation
+    ) {
+        String seriesArr = new Gson().toJson(seriesElementsArr);
+        String javaScriptStr = "onlyRefreshTheChartDataWithSeries('"
+                + seriesArr + "','" + animation + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+
+    public  void aa_updateChartWithOptions(
+            Object options,
+            Boolean redraw
+    ) {
+        boolean isAAOptionsClass = options instanceof AAOptions;
+        String finalOptionsMapStr;
+
+        if (isAAOptionsClass) {
+            String aaOptionsMapStr = new Gson().toJson(options);
+            finalOptionsMapStr = aaOptionsMapStr;
+        } else {
+            String classNameStr = options.getClass().getSimpleName();
+            classNameStr = classNameStr.replace("AA","");
+
+            //convert fist character to be lowercase string
+            String firstChar = classNameStr.substring(0,1);
+            String lowercaseFirstStr = firstChar.toLowerCase();
+            classNameStr = classNameStr.substring(1);
+            String finalClassName = lowercaseFirstStr + classNameStr;
+
+            Map<String, Object> finalOptionsMap = new HashMap();
+            finalOptionsMap.put(finalClassName,options);
+
+            String optionsStr = new Gson().toJson(finalOptionsMap);
+            finalOptionsMapStr = optionsStr;
+        }
+
+        String javaScriptStr = "updateChart('" + finalOptionsMapStr + "','" + redraw + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+    public void aa_addPointToChartSeriesElement(
+            Integer elementIndex,
+            Object options
+    ) {
+        aa_addPointToChartSeriesElement(
+                elementIndex,
+                options,
+                true);
+    }
+    public void aa_addPointToChartSeriesElement(
+            Integer elementIndex,
+            Object options,
+            Boolean shift
+    ) {
+        aa_addPointToChartSeriesElement(
+                elementIndex,
+                options,
+                true,
+                shift,
+                true);
+    }
+
+
+    public void aa_addPointToChartSeriesElement(
+            Integer elementIndex,
+            Object options,
+            Boolean redraw,
+            Boolean shift,
+            Boolean animation
+    ) {
+        String optionsStr;
+        if (       options instanceof Integer
+                || options instanceof Float
+                || options instanceof Double) {
+            optionsStr = String.valueOf(options);
+        } else {
+            optionsStr = new Gson().toJson(options);
+        }
+
+        String javaScriptStr = "addPointToChartSeries('"
+                + elementIndex + "','"
+                + optionsStr + "','"
+                + redraw + "','"
+                + shift + "','"
+                + animation + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+    public void aa_showTheSeriesElementContent(Integer elementIndex) {
+        String javaScriptStr = "showTheSeriesElementContentWithIndex('"
+                + elementIndex + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+    public void aa_hideTheSeriesElementContent(Integer elementIndex) {
+        String javaScriptStr = "hideTheSeriesElementContentWithIndex('"
+                + elementIndex + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+    public void aa_addElementToChartSeries(AASeriesElement aaSeriesElement) {
+        String pureElementJsonStr = new Gson().toJson(aaSeriesElement);
+        String javaScriptStr = "addElementToChartSeriesWithElement('"
+                + pureElementJsonStr + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+    public void aa_removeElementFromChartSeries(Integer elementIndex) {
+        String javaScriptStr = "removeElementFromChartSeriesWithElementIndex('"
+                + elementIndex + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+    public void aa_evaluateTheJavaScriptStringFunction(String jsFunctionStr) {
+        String pureJSFunctionStr = AAJSStringPurer.pureJavaScriptFunctionString(jsFunctionStr);
+
+        String jsFunctionNameStr = "evaluateTheJavaScriptStringFunction('"
+                + pureJSFunctionStr + "')";
+        safeEvaluateJavaScriptString(jsFunctionNameStr);
+    }
+
+
+
+    private void loadLocalFilesAndDrawChart(final AAOptions aaOptions) {
+        this.loadUrl("file:///android_asset/AAChartView.html");
+        this.setWebViewClient(new WebViewClient() {
+            @Override
+            public void onPageFinished(WebView view,String url) {
+//                Log.i("js files load","鍥捐〃鍔犺浇瀹屾垚!!!!!!!! ");
+                configureChartOptionsAndDrawChart(aaOptions);
+
+                if (callBack != null) {
+                    callBack.chartViewDidFinishLoad(AAChartView.this);
+                }
+            }
+        });
+    }
+
+    private void configureChartOptionsAndDrawChart(AAOptions chartOptions) {
+        if (isClearBackgroundColor) {
+            chartOptions.chart.backgroundColor("rgba(0,0,0,0)");
+        }
+
+        Gson gson = new Gson();
+        String aaOptionsJsonStr = gson.toJson(chartOptions);
+        this.optionsJson = aaOptionsJsonStr;
+        String javaScriptStr = "loadTheHighChartView('"
+                + aaOptionsJsonStr + "','"
+                + this.contentWidth + "','"
+                + this.contentHeight + "')";
+        this.safeEvaluateJavaScriptString(javaScriptStr);
+    }
+
+    private void showJavaScriptAlertView() {
+        this.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public boolean onJsAlert(WebView view,
+                                     String url,
+                                     String message,
+                                     final JsResult result) {
+                super.onJsAlert(view, url, message, result);
+
+                String urlStr = "url --->" + url + "\n\n\n";
+                String messageStr = "message --->" + message + "\n\n\n";
+                String resultStr = "result --->" + result;
+
+                String alertMessageStr = urlStr + messageStr + resultStr;
+
+                new AlertDialog.Builder(getContext())
+                        .setTitle("JavaScript alert Information")//璁剧疆瀵硅瘽妗嗘爣棰�
+                        .setMessage(alertMessageStr)
+                        .setNeutralButton("sure",null)
+                        .show();
+
+                return true;
+            }
+        });
+    }
+
+    private AAMoveOverEventMessageModel getEventMessageModel(Map<String, Object> messageBody) {
+        AAMoveOverEventMessageModel eventMessageModel =  new AAMoveOverEventMessageModel();
+        eventMessageModel.name = messageBody.get("name").toString();
+        eventMessageModel.x = (Double) messageBody.get("x");
+        eventMessageModel.y = (Double) messageBody.get("y");
+        eventMessageModel.category = messageBody.get("category").toString();
+        eventMessageModel.offset = (LinkedTreeMap) messageBody.get("offset");
+        Double index = (Double) messageBody.get("index");
+        eventMessageModel.index = index.intValue();
+        return eventMessageModel;
+    }
+
+
+    private void safeEvaluateJavaScriptString(String javaScriptString) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            this.evaluateJavascript("javascript:"+javaScriptString, new ValueCallback<String>() {
+                @Override
+                public void onReceiveValue(String s) {
+//                    Log.i("call back information","杈撳嚭鎵撳嵃鏌ョ湅鍥炶皟鐨勭粨鏋�"+s);
+                }
+            });
+        } else {
+            this.loadUrl("javascript:"+javaScriptString);
+        }
+    }
+
+
+
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAMoveOverEventMessageModel.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAMoveOverEventMessageModel.java
new file mode 100644
index 0000000..2c59598
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAMoveOverEventMessageModel.java
@@ -0,0 +1,37 @@
+/**
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore            鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore-Kotlin     鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+
+ * -------------------------------------------------------------------------------
+ *
+ *  馃寱 馃寲 馃寳 馃寴  鉂�鉂�鉂�   WARM TIPS!!!   鉂�鉂�鉂� 馃寫 馃寬 馃寭 馃寯
+ *
+ * Please contact me on GitHub,if there are any problems encountered in use.
+ * GitHub Issues : https://github.com/AAChartModel/AAChartCore/issues
+ * -------------------------------------------------------------------------------
+ * And if you want to contribute for this project, please contact me as well
+ * GitHub        : https://github.com/AAChartModel
+ * StackOverflow : https://stackoverflow.com/users/7842508/codeforu
+ * JianShu       : http://www.jianshu.com/u/f1e6753d4254
+ * SegmentFault  : https://segmentfault.com/u/huanghunbieguan
+ *
+ * -------------------------------------------------------------------------------
+
+ */
+
+package com.github.AAChartModel.AAChartCore.AAChartCreator;
+
+import com.google.gson.internal.LinkedTreeMap;
+
+public class AAMoveOverEventMessageModel {
+    public String name;
+    public Double x;
+    public Double y;
+    public String category;
+    public LinkedTreeMap offset;
+    public Integer index;
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAOptionsConstructor.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAOptionsConstructor.java
new file mode 100644
index 0000000..385b02e
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AAOptionsConstructor.java
@@ -0,0 +1,297 @@
+/**
+ //  AAOptionsConstructor.java
+ //  AAChartCore
+ //
+ //  Created by AnAn on 2018/12/08.
+ //  Copyright 漏 2018骞� An An. All rights reserved.
+ /**
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore            鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore-Kotlin     鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+ */
+
+/**
+
+ * -------------------------------------------------------------------------------
+ *
+ *  馃寱 馃寲 馃寳 馃寴  鉂�鉂�鉂�   WARM TIPS!!!   鉂�鉂�鉂� 馃寫 馃寬 馃寭 馃寯
+ *
+ * Please contact me on GitHub,if there are any problems encountered in use.
+ * GitHub Issues : https://github.com/AAChartModel/AAChartCore/issues
+ * -------------------------------------------------------------------------------
+ * And if you want to contribute for this project, please contact me as well
+ * GitHub        : https://github.com/AAChartModel
+ * StackOverflow : https://stackoverflow.com/users/7842508/codeforu
+ * JianShu       : http://www.jianshu.com/u/f1e6753d4254
+ * SegmentFault  : https://segmentfault.com/u/huanghunbieguan
+ *
+ * -------------------------------------------------------------------------------
+
+ */
+
+
+package com.github.AAChartModel.AAChartCore.AAChartCreator;
+
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartAnimationType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartSymbolStyleType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartType;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAAnimation;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AABar;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAChart;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAColumn;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAColumnrange;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AADataLabels;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAItemStyle;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AALabels;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AALegend;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAMarker;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAOptions;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAPie;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAPlotOptions;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AASeries;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAStyle;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AASubtitle;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AATitle;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AATooltip;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAXAxis;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAYAxis;
+import com.github.AAChartModel.AAChartCore.AATools.AAColor;
+
+public class AAOptionsConstructor
+{
+    public static AAOptions configureChartOptions (
+            AAChartModel aaChartModel
+    ) {
+        AAChart aaChart = new AAChart()
+                .type(aaChartModel.chartType) //缁樺浘绫诲瀷
+                .inverted(aaChartModel.inverted) //璁剧疆鏄惁鍙嶈浆鍧愭爣杞达紝浣縓杞村瀭鐩达紝Y杞存按骞炽�� 濡傛灉鍊间负 true锛屽垯 x 杞撮粯璁ゆ槸 鍊掔疆 鐨勩�� 濡傛灉鍥捐〃涓嚭鐜版潯褰㈠浘绯诲垪锛屽垯浼氳嚜鍔ㄥ弽杞�
+                .backgroundColor(aaChartModel.backgroundColor) //璁剧疆鍥捐〃鐨勮儗鏅壊(鍖呭惈閫忔槑搴︾殑璁剧疆)
+                .pinchType(aaChartModel.zoomType) //璁剧疆鎵嬪娍缂╂斁鏂瑰悜
+                .panning(true) //璁剧疆鎵嬪娍缂╂斁鍚庢槸鍚﹀彲骞崇Щ
+                .polar(aaChartModel.polar) //鏄惁鏋佸寲鍥捐〃(寮�鍚瀬鍧愭爣妯″紡)
+                .margin(aaChartModel.margin) //鍥捐〃杈硅窛
+                .scrollablePlotArea(aaChartModel.scrollablePlotArea)
+                ;
+
+        AATitle aaTitle = new AATitle()
+                .text(aaChartModel.title) //鏍囬鏂囨湰鍐呭
+                .style(aaChartModel.titleStyle)
+                ;
+
+        AASubtitle aaSubtitle = new AASubtitle()
+                .text(aaChartModel.subtitle) //鍓爣棰樺唴瀹�
+                .align(aaChartModel.subtitleAlign) //鍥捐〃鍓爣棰樻枃鏈按骞冲榻愭柟寮忋�傚彲閫夌殑鍊兼湁 鈥渓eft鈥濓紝鈥漜enter鈥滃拰鈥渞ight鈥濄�� 榛樿鏄細center.
+                .style(aaChartModel.subtitleStyle)
+                ;
+
+        AATooltip aaTooltip = new AATooltip()
+                .enabled(aaChartModel.tooltipEnabled) //鍚敤娴姩鎻愮ず妗�
+                .shared(true) //澶氱粍鏁版嵁鍏变韩涓�涓诞鍔ㄦ彁绀烘
+                .valueSuffix(aaChartModel.tooltipValueSuffix) //娴姩鎻愮ず妗嗙殑鍗曚綅鍚嶇О鍚庣紑
+                ;
+
+        AAPlotOptions aaPlotOptions = new AAPlotOptions()
+                .series(new AASeries()
+                        .stacking(aaChartModel.stacking) //璁剧疆鏄惁鐧惧垎姣斿爢鍙犳樉绀哄浘褰�
+                )
+                ;
+
+        if (!aaChartModel.animationType.equals(AAChartAnimationType.Linear)) {
+            aaPlotOptions.series.animation((new AAAnimation()
+                    .easing(aaChartModel.animationType)
+                    .duration(aaChartModel.animationDuration)
+            ));
+        }
+
+        configureAAPlotOptionsMarkerStyle(aaChartModel,aaPlotOptions);
+        configureAAPlotOptionsDataLabels(aaPlotOptions,aaChartModel);
+
+        AALegend aaLegend = new AALegend()
+                .enabled(aaChartModel.legendEnabled) //鏄惁鏄剧ず legend
+                .itemStyle(new AAItemStyle()
+                        .color(aaChartModel.axesTextColor))
+                ;
+
+        AAOptions aaOptions = new AAOptions()
+                .chart(aaChart)
+                .title(aaTitle)
+                .subtitle(aaSubtitle)
+                .tooltip(aaTooltip)
+                .plotOptions(aaPlotOptions)
+                .legend(aaLegend)
+                .series(aaChartModel.series)
+                .colors(aaChartModel.colorsTheme) //璁剧疆棰滆壊涓婚
+                .touchEventEnabled(aaChartModel.touchEventEnabled) //鏄惁鏀寔鐐瑰嚮浜嬩欢
+                ;
+
+        configureAxisContentAndStyle(aaOptions,aaChartModel);
+
+        return aaOptions;
+    }
+
+    private static void configureAAPlotOptionsMarkerStyle (
+            AAChartModel aaChartModel,
+            AAPlotOptions aaPlotOptions
+    ) {
+        String aaChartType = aaChartModel.chartType;
+        //鏁版嵁鐐规爣璁扮浉鍏抽厤缃紝鍙湁绾挎�у浘(鎶樼嚎鍥俱�佹洸绾垮浘銆佹姌绾垮尯鍩熷~鍏呭浘銆佹洸绾垮尯鍩熷~鍏呭浘銆佹暎鐐瑰浘銆佹姌绾胯寖鍥村~鍏呭浘銆佹洸绾胯寖鍥村~鍏呭浘銆佸杈瑰舰鍥�)鎵嶆湁鏁版嵁鐐规爣璁�
+        switch (aaChartType) {
+            case AAChartType.Area:
+            case AAChartType.Areaspline:
+            case AAChartType.Line:
+            case AAChartType.Spline:
+            case AAChartType.Scatter:
+            case AAChartType.Arearange:
+            case AAChartType.Areasplinerange:
+            case AAChartType.Polygon:
+                AAMarker aaMarker = new AAMarker()
+                        .radius(aaChartModel.markerRadius) //鏇茬嚎杩炴帴鐐瑰崐寰勶紝榛樿鏄�4
+                        .symbol(aaChartModel.markerSymbol); //鏇茬嚎鐐圭被鍨嬶細"circle", "square", "diamond", "triangle","triangle-down"锛岄粯璁ゆ槸"circle"
+
+                if (aaChartModel.markerSymbolStyle.equals(AAChartSymbolStyleType.InnerBlank)) {
+                    aaMarker.fillColor(AAColor.White) //鐐圭殑濉厖鑹�(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑濉厖鑹�)
+                            .lineWidth(2f) //澶栨部绾跨殑瀹藉害(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟鐨勫搴�)
+                            .lineColor(""); //澶栨部绾跨殑棰滆壊(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟棰滆壊锛屽綋鍊间负绌哄瓧绗︿覆鏃讹紝榛樿鍙栨暟鎹偣鎴栨暟鎹垪鐨勯鑹�)
+                } else if (aaChartModel.markerSymbolStyle.equals(AAChartSymbolStyleType.BorderBlank)) {
+                    aaMarker.lineWidth(2f)
+                            .lineColor(aaChartModel.backgroundColor);
+                }
+                AASeries aaSeries = aaPlotOptions.series;
+                aaSeries.marker(aaMarker);
+
+                break;
+        }
+    }
+
+
+    private static void configureAAPlotOptionsDataLabels (
+            AAPlotOptions aaPlotOptions,
+            AAChartModel aaChartModel
+    ) {
+        String aaChartType = aaChartModel.chartType;
+
+        AADataLabels aaDataLabels = new AADataLabels()
+                .enabled(aaChartModel.dataLabelsEnabled);
+        if (aaChartModel.dataLabelsEnabled) {
+            aaDataLabels
+                    .style(aaChartModel.dataLabelsStyle);
+        }
+
+        switch (aaChartType) {
+            case AAChartType.Column:
+                AAColumn aaColumn = new AAColumn()
+                        .borderWidth(0f)
+                        .borderRadius(aaChartModel.borderRadius);
+                if (aaChartModel.polar) {
+                    aaColumn.pointPadding(0f)
+                            .groupPadding(0.005f);
+                }
+                aaPlotOptions.column(aaColumn);
+                break;
+            case AAChartType.Bar:
+                AABar aaBar = new AABar()
+                        .borderWidth(0f)
+                        .borderRadius(aaChartModel.borderRadius)
+                        ;
+                if (aaChartModel.polar) {
+                    aaBar.pointPadding(0f)
+                            .groupPadding(0.005f);
+                }
+                aaPlotOptions.bar(aaBar);
+                break;
+            case AAChartType.Pie:
+                AAPie aaPie = new AAPie()
+                        .allowPointSelect(true)
+                        .cursor("pointer")
+                        .showInLegend(true);
+                if (aaChartModel.dataLabelsEnabled) {
+                    aaDataLabels.format("<b>{point.name}</b>: {point.percentage:.1f} %");
+                }
+                aaPlotOptions.pie(aaPie);
+                break;
+            case AAChartType.Columnrange:
+                AAColumnrange aaColumnrange = new AAColumnrange()
+                        .borderRadius(0f) //The color of the border surrounding each column or bar
+                        .borderWidth(0f) //The corner radius of the border surrounding each column or bar. default锛�0
+                        ;
+                aaPlotOptions.columnrange(aaColumnrange);
+                break;
+        }
+        aaPlotOptions.series.dataLabels(aaDataLabels);
+
+    }
+
+    private static void configureAxisContentAndStyle (
+            AAOptions aaOptions,
+            AAChartModel aaChartModel
+    ) {
+        String aaChartType = aaChartModel.chartType;
+        //x 杞村拰 Y 杞寸殑鐩稿叧閰嶇疆,鎵囧舰鍥俱�侀噾瀛楀鍥惧拰婕忔枟鍥惧垯涓嶉渶瑕佽缃� X 杞村拰 Y 杞寸殑鐩稿叧鍐呭
+        switch (aaChartType) {
+            case AAChartType.Column:
+            case AAChartType.Bar:
+            case AAChartType.Area:
+            case AAChartType.Areaspline:
+            case AAChartType.Line:
+            case AAChartType.Spline:
+            case AAChartType.Scatter:
+            case AAChartType.Bubble:
+            case AAChartType.Columnrange:
+            case AAChartType.Arearange:
+            case AAChartType.Areasplinerange:
+            case AAChartType.Boxplot:
+            case AAChartType.Waterfall:
+            case AAChartType.Polygon:
+            case AAChartType.Gauge:
+                if (!aaChartType.equals(AAChartType.Gauge)) {
+                    Boolean aaXAxisLabelsEnabled = aaChartModel.xAxisLabelsEnabled;
+                    AALabels aaXAxisLabels = new AALabels()
+                            .enabled(aaXAxisLabelsEnabled);//璁剧疆 x 杞存槸鍚︽樉绀烘枃瀛�
+                    if (aaXAxisLabelsEnabled) {
+                        aaXAxisLabels.style(new AAStyle()
+                                .color(aaChartModel.axesTextColor));
+                    }
+
+                    AAXAxis aaXAxis = new AAXAxis()
+                            .labels(aaXAxisLabels) //璁剧疆 x 杞存槸鍚︽樉绀烘枃瀛�
+                            .reversed(aaChartModel.xAxisReversed)
+                            .gridLineWidth(aaChartModel.xAxisGridLineWidth) //x杞寸綉鏍肩嚎瀹藉害
+                            .categories(aaChartModel.categories)
+                            .visible(aaChartModel.xAxisVisible) //x杞存槸鍚﹀彲瑙�
+                            .tickInterval(aaChartModel.xAxisTickInterval);//x杞村潗鏍囩偣闂撮殧鏁�
+
+                    aaOptions.xAxis(aaXAxis);
+                }
+
+                Boolean aaYAxisLabelsEnabled = aaChartModel.yAxisLabelsEnabled;
+                AALabels aaYAxisLabels = new AALabels()
+                        .enabled(aaChartModel.yAxisLabelsEnabled);
+                if (aaYAxisLabelsEnabled) {
+                    aaYAxisLabels.style(new AAStyle()
+                            .color(aaChartModel.axesTextColor));
+                }
+
+                AAYAxis aaYAxis = new AAYAxis()
+                        .labels(aaYAxisLabels) //璁剧疆 y 杞存槸鍚︽樉绀烘暟瀛�
+                        .min(aaChartModel.yAxisMin) //璁剧疆 y 杞存渶灏忓��,鏈�灏忓�肩瓑浜庨浂灏变笉鑳芥樉绀鸿礋鍊间簡
+                        .max(aaChartModel.yAxisMax) //y杞存渶澶у��
+                        .allowDecimals(aaChartModel.yAxisAllowDecimals) //鏄惁鍏佽鏄剧ず灏忔暟
+                        .reversed(aaChartModel.yAxisReversed)
+                        .gridLineWidth(aaChartModel.yAxisGridLineWidth) //y杞寸綉鏍肩嚎瀹藉害
+                        .title(new AATitle()
+                                .text(aaChartModel.yAxisTitle)
+                                .style(new AAStyle()
+                                        .color(aaChartModel.axesTextColor)))
+                        .lineWidth(aaChartModel.yAxisLineWidth) //璁剧疆 y杞磋酱绾跨殑瀹藉害,涓�0鍗虫槸闅愯棌 y杞磋酱绾�
+                        .visible(aaChartModel.yAxisVisible);
+
+                aaOptions.yAxis(aaYAxis);
+                break;
+        }
+    }
+
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AASeriesElement.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AASeriesElement.java
new file mode 100644
index 0000000..9e54326
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartCreator/AASeriesElement.java
@@ -0,0 +1,281 @@
+/**
+//  AASeriesElement.java
+//  AAChartCore
+//
+//  Created by anan on 2018/4/16..
+//  Copyright 漏 2018骞� An An. All rights reserved.
+
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore            鈼夆棄鈼�
+ * 鈼夆棄鈼�   https://github.com/AAChartModel/AAChartCore-Kotlin     鈼夆棄鈼�
+ * 鈼夆棄鈼�...................................................       鈼夆棄鈼�
+ * 鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼� ...... SOURCE CODE ......鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼夆棄鈼�
+
+
+ * -------------------------------------------------------------------------------
+ *
+ *  馃寱 馃寲 馃寳 馃寴  鉂�鉂�鉂�   WARM TIPS!!!   鉂�鉂�鉂� 馃寫 馃寬 馃寭 馃寯
+ *
+ * Please contact me on GitHub,if there are any problems encountered in use.
+ * GitHub Issues : https://github.com/AAChartModel/AAChartCore/issues
+ * -------------------------------------------------------------------------------
+ * And if you want to contribute for this project, please contact me as well
+ * GitHub        : https://github.com/AAChartModel
+ * StackOverflow : https://stackoverflow.com/users/7842508/codeforu
+ * JianShu       : http://www.jianshu.com/u/f1e6753d4254
+ * SegmentFault  : https://segmentfault.com/u/huanghunbieguan
+ *
+ * -------------------------------------------------------------------------------
+
+ */
+
+package com.github.AAChartModel.AAChartCore.AAChartCreator;
+
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AADataLabels;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAMarker;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAShadow;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AATooltip;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAZonesElement;
+
+/**
+ * Created by anan on 2018/4/16.
+ */
+
+public class AASeriesElement {
+
+    private String type;
+    private Boolean allowPointSelect;
+    private String name;
+    private Object[] data;
+    private Number lineWidth;//鎶樼嚎鍥俱�佹洸绾垮浘銆佺洿鏂规姌绾垮浘銆佹姌绾垮~鍏呭浘銆佹洸绾垮~鍏呭浘銆佺洿鏂规姌绾垮~鍏呭浘鐨勭嚎鏉″搴�
+    private String borderColor; //The border color, It is only valid for column, bar, pie, columnrange, pyramid and funnel chart types
+    private Number borderWidth; //The border width, It is only valid for column, bar, pie, columnrange, pyramid and funnel chart types
+    private Number borderRadius; //The corner radius of the border surrounding each column or bar.
+    private Object borderRadiusTopLeft;
+    private Object borderRadiusTopRight;
+    private Object borderRadiusBottomLeft;
+    private Object borderRadiusBottomRight;
+    private Object color;
+    private Object fillColor;
+    private Number fillOpacity;//鎶樼嚎濉厖鍥俱�佹洸绾垮~鍏呭浘銆佺洿鏂规姌绾垮~鍏呭浘绛夊~鍏呭浘绫诲瀷鐨勫~鍏呴鑹查�忔槑搴�
+    private Number threshold;//The threshold, also called zero level or base level. For line type series this is only used in conjunction with negativeColor. default锛�0.
+    private String negativeColor;// The color for the parts of the graph or points that are below the threshold
+    private Object negativeFillColor;
+    private Object size;
+    private Object innerSize;
+    private String dashStyle;
+    private Integer yAxis;
+    private AADataLabels dataLabels;
+    private AAMarker marker;
+    private Object step;
+    private Object states;
+    private Boolean colorByPoint;
+    private Integer zIndex;
+    private AAZonesElement[] zones;
+    private String zoneAxis;
+    private AAShadow shadow;
+    private String stack;
+    private AATooltip tooltip;
+    private Boolean showInLegend;
+    private Boolean enableMouseTracking;
+    private Boolean reversed;
+    private String id;
+    private Boolean connectNulls;
+
+    public AASeriesElement type(String prop) {
+        type = prop;
+        return this;
+    }
+
+    public AASeriesElement allowPointSelect(Boolean prop) {
+        allowPointSelect = prop;
+        return this;
+    }
+
+    public AASeriesElement name(String prop) {
+        name = prop;
+        return this;
+    }
+
+    public AASeriesElement data(Object[] prop) {
+        data = prop;
+        return this;
+    }
+
+    public AASeriesElement lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AASeriesElement borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AASeriesElement borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AASeriesElement borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AASeriesElement borderRadiusTopLeft(Object prop) {
+        borderRadiusTopLeft = prop;
+        return this;
+    }
+
+    public AASeriesElement borderRadiusTopRight(Object prop) {
+        borderRadiusTopRight = prop;
+        return this;
+    }
+
+    public AASeriesElement borderRadiusBottomLeft(Object prop) {
+        borderRadiusBottomLeft = prop;
+        return this;
+    }
+
+    public AASeriesElement borderRadiusBottomRight(Object prop) {
+        borderRadiusBottomRight = prop;
+        return this;
+    }
+
+    public AASeriesElement color(Object prop) {
+        color = prop;
+        return this;
+    }
+
+    public AASeriesElement fillColor(Object prop) {
+        fillColor = prop;
+        return this;
+    }
+
+    public AASeriesElement fillOpacity(Number prop) {
+        fillOpacity = prop;
+        return this;
+    }
+
+    public AASeriesElement threshold(Number prop) {
+        threshold = prop;
+        return this;
+    }
+
+    public AASeriesElement negativeColor(String prop) {
+        negativeColor = prop;
+        return this;
+    }
+
+    public AASeriesElement negativeFillColor(Object prop) {
+        negativeFillColor = prop;
+        return this;
+    }
+
+    public AASeriesElement size(Object prop) {
+        size = prop;
+        return this;
+    }
+
+    public AASeriesElement innerSize(Object prop) {
+        innerSize = prop;
+        return this;
+    }
+
+    public AASeriesElement dashStyle(String prop) {
+        dashStyle = prop;
+        return this;
+    }
+
+    public AASeriesElement yAxis(Integer prop) {
+        yAxis = prop;
+        return this;
+    }
+
+    public AASeriesElement dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+    public AASeriesElement marker(AAMarker prop) {
+        marker = prop;
+        return this;
+    }
+
+    public AASeriesElement step(Object prop) {
+        step = prop;
+        return this;
+    }
+
+    public AASeriesElement states(Object prop) {
+        states = prop;
+        return this;
+    }
+
+    public AASeriesElement colorByPoint(Boolean prop) {
+        colorByPoint = prop;
+        return this;
+    }
+
+    public AASeriesElement zIndex(Integer prop) {
+        zIndex = prop;
+        return this;
+    }
+
+    public AASeriesElement zones(AAZonesElement[] prop) {
+        zones = prop;
+        return this;
+    }
+
+    public AASeriesElement zoneAxis(String prop) {
+        zoneAxis = prop;
+        return this;
+    }
+
+    public AASeriesElement shadow(AAShadow prop) {
+        shadow = prop;
+        return this;
+    }
+
+    public AASeriesElement stack(String prop) {
+        stack = prop;
+        return this;
+    }
+
+    public AASeriesElement tooltip(AATooltip prop) {
+        tooltip = prop;
+        return this;
+    }
+
+    public AASeriesElement showInLegend(Boolean prop) {
+        showInLegend = prop;
+        return this;
+    }
+
+    public AASeriesElement enableMouseTracking(Boolean prop) {
+        enableMouseTracking = prop;
+        return this;
+    }
+
+    public AASeriesElement reversed(Boolean prop) {
+        reversed = prop;
+        return this;
+    }
+
+    public AASeriesElement id(String prop) {
+        id = prop;
+        return this;
+    }
+
+    public AASeriesElement connectNulls(Boolean prop) {
+        connectNulls = prop;
+        return this;
+    }
+
+}
+
+
+
+
+
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAlignType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAlignType.java
new file mode 100644
index 0000000..73181d4
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAlignType.java
@@ -0,0 +1,7 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartAlignType {
+    String Left     = "left";
+    String Center   = "center";
+    String Right    = "right";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAnimationType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAnimationType.java
new file mode 100644
index 0000000..ac9deeb
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAnimationType.java
@@ -0,0 +1,39 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartAnimationType {
+    String Linear         = "linear";
+    String EaseInQuad     = "easeInQuad";
+    String EaseOutQuad    = "easeOutQuad";
+    String EaseInOutQuad  = "easeInOutQuad";
+    String EaseInCubic    = "easeInCubic";
+    String EaseOutCubic   = "easeOutCubic";
+    String EaseInOutCubic = "easeInOutCubic";
+    String EaseInQuart    = "easeInQuart";
+    String EaseOutQuart   = "easeOutQuart";
+    String EaseInOutQuart = "easeInOutQuart";
+    String EaseInQuint    = "easeInQuint";
+    String EaseOutQuint   = "easeOutQuint";
+    String EaseInOutQuint = "easeInOutQuint";
+    String EaseInSine     = "easeInSine";
+    String EaseOutSine    = "easeOutSine";
+    String EaseInOutSine  = "easeInOutSine";
+    String EaseInExpo     = "easeInExpo";
+    String EaseOutExpo    = "easeOutExpo";
+    String EaseInOutExpo  = "easeInOutExpo";
+    String EaseInCirc     = "easeInCirc";
+    String EaseOutCirc    = "easeOutCirc";
+    String EaseInOutCirc  = "easeInOutCirc";
+    String EaseOutBounce  = "easeOutBounce";
+    String EaseInBack     = "easeInBack";
+    String EaseOutBack    = "easeOutBack";
+    String EaseInOutBack  = "easeInOutBack";
+    String Elastic        = "elastic";
+    String SwingFromTo    = "swingFromTo";
+    String SwingFrom      = "swingFrom";
+    String SwingTo        = "swingTo";
+    String Bounce         = "bounce";
+    String BouncePast     = "bouncePast";
+    String EaseFromTo     = "easeFromTo";
+    String EaseFrom       = "easeFrom";
+    String EaseTo         = "easeTo";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAxisType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAxisType.java
new file mode 100644
index 0000000..bebfd40
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartAxisType.java
@@ -0,0 +1,8 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartAxisType {
+    String Linear      = "linear";
+    String Logarithmic = "logarithmic";
+    String Datetime    = "datetime";
+    String Category    = "category";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartFontWeightType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartFontWeightType.java
new file mode 100644
index 0000000..00c031c
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartFontWeightType.java
@@ -0,0 +1,7 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartFontWeightType {
+    String Thin = "thin";
+    String Regular = "regular";
+    String Bold = "bold";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLayoutType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLayoutType.java
new file mode 100644
index 0000000..b90e80e
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLayoutType.java
@@ -0,0 +1,6 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartLayoutType {
+    String Horizontal  = "horizontal";
+    String Vertical    = "vertical";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLineDashStyleType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLineDashStyleType.java
new file mode 100644
index 0000000..4063897
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartLineDashStyleType.java
@@ -0,0 +1,15 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartLineDashStyleType {
+    String Solid           = "Solid";           //鈥斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺��
+    String ShortDash       = "ShortDash";       //鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥� 鈥�
+    String ShortDot        = "ShortDot";        //獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱獾堚祱
+    String ShortDashDot    = "ShortDashDot";    //鈥斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺�р�斺��
+    String ShortDashDotDot = "ShortDashDotDot"; //鈥斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р�р�斺�р��
+    String Dot             = "Dot";             //鈥р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р�р��
+    String Dash            = "Dash";            //鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺�� 鈥斺��
+    String LongDash        = "LongDash";        //鈥斺�斺�� 鈥斺�斺�� 鈥斺�斺�� 鈥斺�斺�� 鈥斺�斺�� 鈥斺�斺�� 鈥斺�斺�� 鈥斺�斺�� 鈥斺�斺��
+    String DashDot         = "DashDot";         //鈥斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺�р�斺�斺��
+    String LongDashDot     = "LongDashDot";     //鈥斺�斺�斺�р�斺�斺�斺�р�斺�斺�斺�р�斺�斺�斺�р�斺�斺�斺�р�斺�斺�斺�р�斺�斺�斺�р�斺�斺�斺�р�斺�斺�斺��
+    String LongDashDotDot  = "LongDashDotDot";  //鈥斺�斺�斺�р�р�斺�斺�斺�р�р�斺�斺�斺�р�р�斺�斺�斺�р�р�斺�斺�斺�р�р�斺�斺�斺�р�р�斺�斺�斺�р��
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartStackingType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartStackingType.java
new file mode 100644
index 0000000..23244b4
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartStackingType.java
@@ -0,0 +1,7 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartStackingType {
+    String False   = "";
+    String Normal  = "normal";
+    String Percent = "percent";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolStyleType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolStyleType.java
new file mode 100644
index 0000000..897ba56
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolStyleType.java
@@ -0,0 +1,7 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartSymbolStyleType {
+    String Normal       = "normal";
+    String InnerBlank   = "innerBlank";
+    String BorderBlank  = "borderBlank";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolType.java
new file mode 100644
index 0000000..b2d7317
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartSymbolType.java
@@ -0,0 +1,9 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartSymbolType {
+    String Circle         = "circle";        //鈼� 鈼� 鈼�
+    String Square         = "square";        //鈻� 鈻� 鈻�
+    String Diamond        = "diamond";       //鈼� 鈼� 鈼�
+    String Triangle       = "triangle";      //鈻� 鈻� 鈻�
+    String Triangle_down  = "triangle-down"; //鈻� 鈻� 鈻�
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartType.java
new file mode 100644
index 0000000..055d36e
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartType.java
@@ -0,0 +1,23 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartType {
+    String Column          = "column"; //Column series display one column per value along an X axis.
+    String Bar             = "bar"; //A bar series is a special type of column series where the columns are horizontal.
+    String Area            = "area"; //The area series type.
+    String Areaspline      = "areaspline"; //The area spline series is an area series where the graph between the points is smoothed into a spline.
+    String Line            = "line"; //A line series displays information as a series of data points connected by straight line segments.
+    String Spline          = "spline"; //A spline series is a special type of line series, where the segments between the data points are smoothed.
+    String Scatter         = "scatter"; //A scatter plot uses cartesian coordinates to display values for two variables for a set of data.
+    String Pie             = "pie"; //A pie chart is a circular graphic which is divided into slices to illustrate numerical proportion.
+    String Bubble          = "bubble"; //A bubble series is a three dimensional series type where each point renders an X, Y and Z value. Each points is drawn as a bubble where the position along the X and Y axes mark the X and Y values, and the size of the bubble relates to the Z value.
+    String Pyramid         = "pyramid"; //A pyramid series is a special type of funnel, without neck and reversed by default.
+    String Funnel          = "funnel"; //Funnel charts are a type of chart often used to visualize stages in a sales project, where the top are the initial stages with the most clients. It requires that the modules/funnel.js file is loaded.
+    String Columnrange     = "columnrange"; //The column range is a cartesian series type with higher and lower Y values along an X axis. To display horizontal bars, set chart.inverted to true.
+    String Arearange       = "arearange"; //The area range series is a carteseian series with higher and lower values for each point along an X axis, where the area between the values is shaded.
+    String Areasplinerange = "areasplinerange"; //The area spline range is a cartesian series type with higher and lower Y values along an X axis. The area inside the range is colored, and the graph outlining the area is a smoothed spline.
+    String Boxplot         = "boxplot"; //A box plot is a convenient way of depicting groups of data through their five-number summaries: the smallest observation (sample minimum), lower quartile (Q1), median (Q2), upper quartile (Q3), and largest observation (sample maximum).
+    String Waterfall       = "waterfall"; //A waterfall chart displays sequentially introduced positive or negative values in cumulative columns.
+    String Polygon         = "polygon"; //A polygon series can be used to draw any freeform shape in the cartesian coordinate system. A fill is applied with the color option, and stroke is applied through lineWidth and lineColor options.
+    String Gauge           = "gauge"; //Gauges are circular plots displaying one or more values with a dial pointing to values along the perimeter.
+    String Errorbar        = "errorbar"; //Error bars are a graphical representation of the variability of data and are used on graphs to indicate the error, or uncertainty in a reported measurement.
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartVerticalAlignType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartVerticalAlignType.java
new file mode 100644
index 0000000..b6e4e55
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartVerticalAlignType.java
@@ -0,0 +1,7 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartVerticalAlignType {
+    String Top     = "top";
+    String Middle  = "middle";
+    String Bottom  = "bottom";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartZoomType.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartZoomType.java
new file mode 100644
index 0000000..b69717f
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAChartEnum/AAChartZoomType.java
@@ -0,0 +1,8 @@
+package com.github.AAChartModel.AAChartCore.AAChartEnum;
+
+public interface AAChartZoomType {
+    String None = "none";
+    String X  = "x";
+    String Y  = "y";
+    String XY = "xy";
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAnimation.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAnimation.java
new file mode 100644
index 0000000..473c53e
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAnimation.java
@@ -0,0 +1,16 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAAnimation {
+    public Integer duration;
+    public String easing;
+
+    public AAAnimation duration(Integer prop) {
+        duration = prop;
+        return this;
+    }
+
+    public AAAnimation easing(String prop) {
+        easing = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArea.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArea.java
new file mode 100644
index 0000000..85a136b
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArea.java
@@ -0,0 +1,9 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAArea {
+    public AADataLabels dataLabels;
+    public AAArea dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArearange.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArearange.java
new file mode 100644
index 0000000..517f784
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAArearange.java
@@ -0,0 +1,10 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAArearange {
+    public AADataLabels dataLabels;
+
+    public AAArearange dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAreaspline.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAreaspline.java
new file mode 100644
index 0000000..4281dab
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAreaspline.java
@@ -0,0 +1,10 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAAreaspline {
+    public AADataLabels dataLabels;
+
+    public AAAreaspline dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAxis.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAxis.java
new file mode 100644
index 0000000..a564058
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAAxis.java
@@ -0,0 +1,55 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAAxis {
+    public Boolean allowDecimals;
+    public Object alternateGridColor;
+    public AACrosshair crosshair; //鍑嗘槦绾挎牱寮忚缃�
+    public AATitle title;
+    public String type;
+    public AADateTimeLabelFormats dateTimeLabelFormats;
+    public AAPlotBandsElement[] plotBands;
+    public AAPlotLinesElement[] plotLines;
+    public String[] categories;
+    public Integer linkedTo;
+    public Boolean reversed;
+    public Boolean opposite;
+    public Number lineWidth; //鍧愭爣杞磋酱绾垮搴�
+    public String lineColor; //鍧愭爣杞磋酱绾跨嚎棰滆壊
+    public Number max; //鍧愭爣杞存渶澶у��
+    public Number min;//鍧愭爣杞存渶灏忓�硷紙璁剧疆涓�0灏变笉浼氭湁璐熸暟锛�
+    public Number maxPadding;
+    public Number minPadding;
+    public Integer minRange;
+    public Integer minTickInterval; //The minimum tick interval allowed in axis values. For example on zooming in on an axis with daily data, this can be used to prevent the axis from showing hours. Defaults to the closest distance between two points on the axis.
+    public Boolean minorTicks; //鏄惁鏄剧ず娆″埢搴︾嚎
+    public String minorGridLineColor; //Color of the minor, secondary grid lines.
+    public String minorGridLineDashStyle; //The dash or dot style of the minor grid lines.
+    public Number minorGridLineWidth; //Width of the minor, secondary grid lines.
+    public String minorTickColor; //Color for the minor tick marks.
+    public Object minorTickInterval; /*Specific tick interval in axis units for the minor ticks. On a linear axis, if "auto", the minor tick interval is calculated as a fifth of the tickInterval. If null or undefined, minor ticks are not shown.
+     On logarithmic axes, the unit is the power of the value. For example, setting the minorTickInterval to 1 puts one tick on each of 0.1, 1, 10, 100 etc. Setting the minorTickInterval to 0.1 produces 9 ticks between 1 and 10, 10 and 100 etc.
+    If user settings dictate minor ticks to become too dense, they don't make sense, and will be ignored to prevent performance problems.*/
+    public Number minorTickLength; //The pixel length of the minor tick marks.
+    public String minorTickPosition; //The position of the minor tick marks relative to the axis line. Can be one of inside and outside. Defaults to outside.
+    public Number minorTickWidth; //The pixel width of the minor tick mark.
+
+    public Number gridLineWidth; //鍧愭爣杞寸綉鏍肩嚎瀹藉害
+    public String gridLineColor; //鍧愭爣杞寸綉鏍肩嚎棰滆壊
+    public String gridLineDashStyle; //鍧愭爣杞寸綉鏍肩嚎鏍峰紡
+    public String gridLineInterpolation;
+    public Number offset;//鍧愭爣杞村瀭鐩村亸绉�
+    public AALabels labels; //鐢ㄤ簬璁剧疆鍧愭爣杞存枃瀛楃浉鍏崇殑
+    public Boolean visible; //鐢ㄤ簬璁剧疆鍧愭爣杞翠互鍙婂潗鏍囪酱鏂囧瓧鏄惁鏄剧ず
+    public Boolean startOnTick; // Whether to force the axis to start on a tick. Use this option with the minPadding option to control the axis start. The default is false.
+    public Boolean endOnTick; // Whether to force the axis to end on a tick. Use this option with the minPadding option to control the axis end. The default is false.
+    public String tickColor; //鍧愭爣杞磋酱绾夸笅鏂瑰埢搴︾嚎棰滆壊
+    public Integer tickAmount;
+    public Number tickInterval;//鍧愭爣杞村埢搴︾偣闂撮殧鏁�(璁剧疆姣忛殧鍑犱釜鐐规樉绀轰竴涓� 鍧愭爣杞寸殑鍐呭:
+    public String tickmarkPlacement; //鏈弬鏁板彧瀵瑰垎绫昏酱鏈夋晥銆� 褰撳�间负 on 鏃跺埢搴︾嚎灏嗗湪鍒嗙被涓婃柟鏄剧ず锛涘綋鍊间负 between 鏃讹紝鍒诲害绾垮皢鍦ㄤ袱涓垎绫讳腑闂存樉绀恒�傚綋 tickInterval 涓� 1 鏃讹紝榛樿鏄� between锛屽叾浠栨儏鍐甸粯璁ゆ槸 on銆� 榛樿鏄細null.
+    public Number tickWidth;//鍧愭爣杞村埢搴︾嚎鐨勫搴︼紝璁剧疆涓� 0 鏃跺垯涓嶆樉绀哄埢搴︾嚎
+    public Number tickLength;//鍧愭爣杞村埢搴︾嚎鐨勯暱搴︺�� 榛樿鏄細10.
+    public String tickPosition; //鍒诲害绾跨浉瀵逛簬杞寸嚎鐨勪綅缃紝鍙敤鐨勫�兼湁 inside 鍜� outside锛屽垎鍒〃绀哄湪杞寸嚎鐨勫唴閮ㄥ拰澶栭儴銆� 榛樿鏄細outside.
+    public Object[] tickPositions; // Custom chart axis coordinates
+    public Object left;
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABackgroundElement.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABackgroundElement.java
new file mode 100644
index 0000000..0641875
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABackgroundElement.java
@@ -0,0 +1,46 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AABackgroundElement {
+    public Object backgroundColor;
+    public String borderColor;
+    public Number borderWidth;
+    public String className;
+    public Number innerRadius;
+    public Number outerRadius;
+    public String shape;
+
+    public AABackgroundElement backgroundColor(Object prop) {
+        backgroundColor = prop;
+        return this;
+    }
+    public AABackgroundElement borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AABackgroundElement borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AABackgroundElement className(String prop) {
+        className = prop;
+        return this;
+    }
+
+    public AABackgroundElement innerRadius(Number prop) {
+        innerRadius = prop;
+        return this;
+    }
+
+    public AABackgroundElement outerRadius(Number prop) {
+        outerRadius = prop;
+        return this;
+    }
+
+    public AABackgroundElement shape(String prop) {
+        shape = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABar.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABar.java
new file mode 100644
index 0000000..6c40773
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABar.java
@@ -0,0 +1,82 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AABar {
+    public String name;
+    public Object[] data;
+    public String color;
+    public Boolean grouping;//Whether to group non-stacked columns or to let them render independent of each other. Non-grouped columns will be laid out individually and overlap each other. 榛樿鏄細true.
+    public Float pointPadding;//Padding between each column or bar, in x axis units. 榛樿鏄細0.1.
+    public Float pointPlacement;//Padding between each column or bar, in x axis units. 榛樿鏄細0.1.
+    public Float groupPadding;//Padding between each value groups, in x axis units. 榛樿鏄細0.2.
+    public Number borderWidth;
+    public Boolean colorByPoint;//瀵规瘡涓笉鍚岀殑鐐硅缃鑹�(褰撳浘琛ㄧ被鍨嬩负 AABar 鏃�,璁剧疆涓� AABar 瀵硅薄鐨勫睘鎬�,褰撳浘琛ㄧ被鍨嬩负 bar 鏃�,搴旇璁剧疆涓� bar 瀵硅薄鐨勫睘鎬ф墠鏈夋晥)
+    public AADataLabels dataLabels;
+    public String stacking;
+    public Number borderRadius;
+    public Integer yAxis;
+
+    public AABar name(String prop) {
+        name = prop;
+        return this;
+    }
+
+    public AABar data(Object[] prop) {
+        data = prop;
+        return this;
+    }
+
+    public AABar color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AABar grouping(Boolean prop) {
+        grouping = prop;
+        return this;
+    }
+
+    public AABar pointPadding(Float prop) {
+        pointPadding = prop;
+        return this;
+    }
+
+    public AABar pointPlacement(Float prop) {
+        pointPlacement = prop;
+        return this;
+    }
+
+    public AABar groupPadding(Float prop) {
+        groupPadding = prop;
+        return this;
+    }
+
+    public AABar borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AABar colorByPoint(Boolean prop) {
+        colorByPoint = prop;
+        return this;
+    }
+
+    public AABar dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+    public AABar stacking(String prop) {
+        stacking = prop;
+        return this;
+    }
+
+    public AABar borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AABar yAxis(Integer prop) {
+        yAxis = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABoxplot.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABoxplot.java
new file mode 100644
index 0000000..13f8037
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABoxplot.java
@@ -0,0 +1,82 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AABoxplot {
+    public String boxDashStyle;
+    public Object fillColor;
+    public Number lineWidth;
+    public String medianColor;
+    public String medianDashStyle;
+    public Number medianWidth;
+    public String stemColor;
+    public String stemDashStyle;
+    public Number stemWidth;
+    public String whiskerColor;
+    public String whiskerDashStyle;
+    public String whiskerLength;
+    public Number whiskerWidth;
+
+    public AABoxplot boxDashStyle(String prop) {
+        boxDashStyle = prop;
+        return this;
+    }
+
+    public AABoxplot fillColor(Object prop) {
+        fillColor = prop;
+        return this;
+    }
+
+    public AABoxplot lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AABoxplot medianColor(String prop) {
+        medianColor = prop;
+        return this;
+    }
+
+    public AABoxplot medianDashStyle(String prop) {
+        medianDashStyle = prop;
+        return this;
+    }
+
+    public AABoxplot medianWidth(Number prop) {
+        medianWidth = prop;
+        return this;
+    }
+
+    public AABoxplot stemColor(String prop) {
+        stemColor = prop;
+        return this;
+    }
+
+    public AABoxplot stemDashStyle(String prop) {
+        stemDashStyle = prop;
+        return this;
+    }
+
+    public AABoxplot stemWidth(Number prop) {
+        stemWidth = prop;
+        return this;
+    }
+
+    public AABoxplot whiskerColor(String prop) {
+        whiskerColor = prop;
+        return this;
+    }
+
+    public AABoxplot whiskerDashStyle(String prop) {
+        whiskerDashStyle = prop;
+        return this;
+    }
+
+    public AABoxplot whiskerLength(String prop) {
+        whiskerLength = prop;
+        return this;
+    }
+
+    public AABoxplot whiskerWidth(Number prop) {
+        whiskerWidth = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABubble.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABubble.java
new file mode 100644
index 0000000..fae5daa
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AABubble.java
@@ -0,0 +1,35 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AABubble {
+    public Object minSize;
+    public Object maxSize;
+    public Number zMin;
+    public Number zMax;
+    public AADataLabels dataLabels;
+
+    public AABubble minSize(Object prop) {
+        minSize = prop;
+        return this;
+    }
+
+    public AABubble maxSize(Object prop) {
+        maxSize = prop;
+        return this;
+    }
+
+    public AABubble zMin(Number prop) {
+        zMin = prop;
+        return this;
+    }
+
+    public AABubble zMax(Number prop) {
+        zMax = prop;
+        return this;
+    }
+
+    public AABubble dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAChart.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAChart.java
new file mode 100644
index 0000000..db7f202
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAChart.java
@@ -0,0 +1,123 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AAChartEvents;
+
+public class AAChart {
+    public String type;
+    public Object backgroundColor;
+    public String plotBackgroundImage;
+    public String pinchType;
+    public Boolean panning;
+    public String panKey;
+    public Boolean polar;
+    public Object animation; //AAAnimation | Boolean
+    public Boolean inverted;
+    /*鍥捐〃澶栬竟缂樺拰缁樺浘鍖哄煙涔嬮棿鐨勮竟璺濄�� 鏁扮粍涓殑鏁板瓧鍒嗗埆琛ㄧず椤堕儴锛屽彸渚э紝搴曢儴鍜屽乏渚� ([馃憜,馃憠,馃憞,馃憟])銆�
+    涔熷彲浠ヤ娇鐢� marginTop锛宮arginRight锛宮arginBottom 鍜� marginLeft 鏉ヨ缃煇涓�涓柟鍚戠殑杈硅窛*/
+    public Number[] margin;
+    public Number marginTop; //馃憜
+    public Number marginRight; //馃憠
+    public Number marginBottom; //馃憞
+    public Number marginLeft; //馃憟
+    public AAScrollablePlotArea scrollablePlotArea;
+    public AAResetZoomButton resetZoomButton;
+    public String zoomType;
+    public AAChartEvents events;
+    public Number height;
+
+    public AAChart type(String prop) {
+        type = prop;
+        return this;
+    }
+
+    public AAChart backgroundColor(Object prop) {
+        backgroundColor = prop;
+        return this;
+    }
+
+    public AAChart plotBackgroundImage(String prop) {
+        plotBackgroundImage = prop;
+        return this;
+    }
+
+    public AAChart pinchType(String prop) {
+        pinchType = prop;
+        return this;
+    }
+
+    public AAChart panning(Boolean prop) {
+        panning = prop;
+        return this;
+    }
+
+    public AAChart panKey(String prop) {
+        panKey = prop;
+        return this;
+    }
+
+    public AAChart polar(Boolean prop) {
+        polar = prop;
+        return this;
+    }
+
+    public AAChart animation(Object prop) {
+        animation = prop;
+        return this;
+    }
+
+    public AAChart inverted(Boolean prop) {
+        inverted = prop;
+        return this;
+    }
+
+    public AAChart margin(Number[] prop) {
+        margin = prop;
+        return this;
+    }
+
+    public AAChart marginTop(Number prop) {
+        marginTop = prop;
+        return this;
+    }
+
+    public AAChart marginRight(Number prop) {
+        marginRight = prop;
+        return this;
+    }
+
+    public AAChart marginBottom(Number prop) {
+        marginBottom = prop;
+        return this;
+    }
+
+    public AAChart marginLeft(Number prop) {
+        marginLeft = prop;
+        return this;
+    }
+
+    public AAChart scrollablePlotArea(AAScrollablePlotArea prop) {
+        scrollablePlotArea = prop;
+        return this;
+    }
+
+    public AAChart resetZoomButton(AAResetZoomButton prop) {
+        resetZoomButton = prop;
+        return this;
+    }
+
+    public AAChart zoomType(String zoomType) {
+        this.zoomType = zoomType;
+        return this;
+    }
+
+    public AAChart events(AAChartEvents events) {
+        this.events = events;
+        return this;
+    }
+
+    public AAChart height(Number height) {
+        this.height = height;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumn.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumn.java
new file mode 100644
index 0000000..eba1abc
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumn.java
@@ -0,0 +1,83 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAColumn {
+    public String name;
+    public Object[] data;
+    public String color;
+    public Boolean grouping;//Whether to group non-stacked columns or to let them render independent of each other. Non-grouped columns will be laid out individually and overlap each other. 榛樿鏄細true.
+    public Float pointPadding;//Padding between each column or bar, in x axis units. 榛樿鏄細0.1.
+    public Float pointPlacement;//Padding between each column or bar, in x axis units. 榛樿鏄細0.1.
+    public Float groupPadding;//Padding between each value groups, in x axis units. 榛樿鏄細0.2.
+    public Number borderWidth;
+    public Boolean colorByPoint;//瀵规瘡涓笉鍚岀殑鐐硅缃鑹�(褰撳浘琛ㄧ被鍨嬩负 AAColumn 鏃�,璁剧疆涓� AAColumn 瀵硅薄鐨勫睘鎬�,褰撳浘琛ㄧ被鍨嬩负 bar 鏃�,搴旇璁剧疆涓� bar 瀵硅薄鐨勫睘鎬ф墠鏈夋晥)
+    public AADataLabels dataLabels;
+    public String stacking;
+    public Number borderRadius;
+    public Integer yAxis;
+
+    public AAColumn name(String prop) {
+        name = prop;
+        return this;
+    }
+
+    public AAColumn data(Object[] prop) {
+        data = prop;
+        return this;
+    }
+
+    public AAColumn color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAColumn grouping(Boolean prop) {
+        grouping = prop;
+        return this;
+    }
+
+    public AAColumn pointPadding(Float prop) {
+        pointPadding = prop;
+        return this;
+    }
+
+    public AAColumn pointPlacement(Float prop) {
+        pointPlacement = prop;
+        return this;
+    }
+
+    public AAColumn groupPadding(Float prop) {
+        groupPadding = prop;
+        return this;
+    }
+
+    public AAColumn borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AAColumn colorByPoint(Boolean prop) {
+        colorByPoint = prop;
+        return this;
+    }
+
+    public AAColumn dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+    public AAColumn stacking(String prop) {
+        stacking = prop;
+        return this;
+    }
+
+    public AAColumn borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AAColumn yAxis(Integer prop) {
+        yAxis = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumnrange.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumnrange.java
new file mode 100644
index 0000000..8fab76e
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAColumnrange.java
@@ -0,0 +1,46 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAColumnrange {
+    public Number borderRadius; //The color of the border surrounding each column or bar
+    public Number borderWidth; //The corner radius of the border surrounding each column or bar. default锛�0.
+    public AADataLabels dataLabels; //The options for the data labels appearing on top of each column or bar
+    public Number groupPadding; //Padding between each value groups, in x axis units. default锛�0.2.
+    public Boolean grouping; //Whether to group non-stacked columns or to let them render independent of each other. default锛歠alse.
+    public Number pointPadding; //Padding between each column or bar, in x axis units. default锛�0.1.
+    public Number pointPlacement; //Padding between each column or bar, in x axis units. default锛�0.1.
+
+    public AAColumnrange borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AAColumnrange borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AAColumnrange dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+    public AAColumnrange groupPadding(Number prop) {
+        groupPadding = prop;
+        return this;
+    }
+
+    public AAColumnrange grouping(Boolean prop) {
+        grouping = prop;
+        return this;
+    }
+
+    public AAColumnrange pointPadding(Number prop) {
+        pointPadding = prop;
+        return this;
+    }
+
+    public AAColumnrange pointPlacement(Number prop) {
+        pointPlacement = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACredits.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACredits.java
new file mode 100644
index 0000000..615c6ff
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACredits.java
@@ -0,0 +1,34 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+class AACredits {
+    public Boolean enabled;
+    public String href;
+    public AAPosition position;
+    public AAStyle style;
+    public String text;
+
+    public AACredits enabled(boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AACredits href(String prop) {
+        href = prop;
+        return this;
+    }
+
+    public AACredits position(AAPosition prop) {
+        position = prop;
+        return this;
+    }
+
+    public AACredits style(AAStyle prop) {
+        style = prop;
+        return this;
+    }
+
+    public AACredits text(String prop) {
+        text = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACrosshair.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACrosshair.java
new file mode 100644
index 0000000..b8aba8c
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AACrosshair.java
@@ -0,0 +1,22 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AACrosshair {
+    public Number width;
+    public String color;
+    public String dashStyle;
+
+    public AACrosshair width(Number prop) {
+        width = prop;
+        return this;
+    }
+
+    public AACrosshair color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AACrosshair dashStyle(String prop) {
+        dashStyle = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataElement.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataElement.java
new file mode 100644
index 0000000..e1912ca
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataElement.java
@@ -0,0 +1,40 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AADataElement {
+    public String name;
+    public Number x;
+    public Number y;
+    public Object color;
+    public AADataLabels dataLabels;
+    public AAMarker marker;
+
+    public AADataElement name(String prop) {
+        name = prop;
+        return this;
+    }
+
+    public AADataElement x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AADataElement y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+    public AADataElement color(Object prop) {
+        color = prop;
+        return this;
+    }
+
+    public AADataElement dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+    public AADataElement marker(AAMarker prop) {
+        marker = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataLabels.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataLabels.java
new file mode 100644
index 0000000..13a105f
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADataLabels.java
@@ -0,0 +1,151 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+
+public class AADataLabels {
+    public Boolean enabled;
+    public String align;
+    public Boolean inside;
+    public AAStyle style;
+    public String format;
+    public String formatter;
+    public Number rotation;
+    public Boolean allowOverlap;
+    public Boolean useHTML;
+    public Number distance;
+    public String verticalAlign;
+    public Number x;
+    public Number y;
+    public String color;
+    public String backgroundColor;
+    public String borderColor;
+    public Number borderRadius;
+    public Number borderWidth;
+    public String shape;
+    public Boolean crop;
+    public String overflow;
+    public Boolean softConnector;
+    public Object textPath;
+    public Object filter;
+
+    public AADataLabels enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AADataLabels align(String prop) {
+        align = prop;
+        return this;
+    }
+
+    public AADataLabels inside(Boolean prop) {
+        inside = prop;
+        return this;
+    }
+
+
+    public AADataLabels style(AAStyle prop) {
+        style = prop;
+        return this;
+    }
+
+    public AADataLabels format(String prop) {
+        format = prop;
+        return this;
+    }
+
+    public AADataLabels formatter(String prop) {
+        formatter = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AADataLabels rotation(Number prop) {
+        rotation = prop;
+        return this;
+    }
+
+    public AADataLabels allowOverlap(Boolean prop) {
+        allowOverlap = prop;
+        return this;
+    }
+
+    public AADataLabels useHTML(Boolean prop) {
+        useHTML = prop;
+        return this;
+    }
+
+    public AADataLabels distance(Number prop) {
+        distance = prop;
+        return this;
+    }
+
+    public AADataLabels verticalAlign(String prop) {
+        verticalAlign = prop;
+        return this;
+    }
+
+    public AADataLabels x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AADataLabels y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+    public AADataLabels color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AADataLabels backgroundColor(String prop) {
+        backgroundColor = prop;
+        return this;
+    }
+
+    public AADataLabels borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AADataLabels borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AADataLabels borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AADataLabels shape(String prop) {
+        shape = prop;
+        return this;
+    }
+
+    public AADataLabels crop(Boolean prop) {
+        crop = prop;
+        return this;
+    }
+
+    public AADataLabels overflow(String prop) {
+        overflow = prop;
+        return this;
+    }
+
+    public AADataLabels softConnector(Boolean prop) {
+        softConnector = prop;
+        return this;
+    }
+
+    public AADataLabels textPath(Object prop) {
+        textPath = prop;
+        return this;
+    }
+
+    public AADataLabels filter(Object prop) {
+        filter = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADateTimeLabelFormats.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADateTimeLabelFormats.java
new file mode 100644
index 0000000..4eb630b
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AADateTimeLabelFormats.java
@@ -0,0 +1,53 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AADateTimeLabelFormats {
+    public String millisecond;
+    public String second;
+    public String minute;
+    public String hour;
+    public String day;
+    public String week;
+    public String month;
+    public String year;
+
+    public AADateTimeLabelFormats millisecond(String prop) {
+        millisecond = prop;
+        return this;
+    }
+
+    public AADateTimeLabelFormats second(String prop) {
+        second = prop;
+        return this;
+    }
+
+    public AADateTimeLabelFormats minute(String prop) {
+        minute = prop;
+        return this;
+    }
+
+    public AADateTimeLabelFormats hour(String prop) {
+        hour = prop;
+        return this;
+    }
+
+    public AADateTimeLabelFormats day(String prop) {
+        day = prop;
+        return this;
+    }
+
+    public AADateTimeLabelFormats week(String prop) {
+        week = prop;
+        return this;
+    }
+
+    public AADateTimeLabelFormats month(String prop) {
+        month = prop;
+        return this;
+    }
+
+    public AADateTimeLabelFormats year(String prop) {
+        year = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHalo.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHalo.java
new file mode 100644
index 0000000..f2c1474
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHalo.java
@@ -0,0 +1,24 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import java.util.Map;
+
+public class AAHalo {
+    public Map<String, Object> attributes;
+    public Number opacity;
+    public Number size;
+
+    public AAHalo attributes(AASVGAttributes prop) {
+        attributes = prop.toDic();
+        return this;
+    }
+
+    public AAHalo opacity(Number prop) {
+        opacity = prop;
+        return this;
+    }
+
+    public AAHalo size(Number prop) {
+        size = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHover.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHover.java
new file mode 100644
index 0000000..e1914ea
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAHover.java
@@ -0,0 +1,46 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAHover {
+    public Boolean enabled;
+    public String borderColor;
+    public Number brightness;
+    public String color;
+    public AAHalo halo;
+    public Number lineWidth;
+    public Number lineWidthPlus;
+
+    public AAHover enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AAHover borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AAHover brightness(Number prop) {
+        brightness = prop;
+        return this;
+    }
+
+    public AAHover color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAHover halo(AAHalo prop) {
+        halo = prop;
+        return this;
+    }
+
+    public AAHover lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AAHover lineWidthPlus(Number prop) {
+        lineWidthPlus = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAInactive.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAInactive.java
new file mode 100644
index 0000000..22c0c34
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAInactive.java
@@ -0,0 +1,16 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAInactive {
+    public Boolean enabled;
+    public Number opacity;
+
+    public AAInactive enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AAInactive opacity(Number prop) {
+        opacity = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAItemStyle.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAItemStyle.java
new file mode 100644
index 0000000..2aecc52
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAItemStyle.java
@@ -0,0 +1,35 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAItemStyle {
+    public String color;
+    public String cursor;
+    public String pointer;
+    public String fontSize;
+    public String fontWeight;
+
+
+    public AAItemStyle color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAItemStyle cursor(String prop) {
+        cursor = prop;
+        return this;
+    }
+
+    public AAItemStyle pointer(String prop) {
+        pointer = prop;
+        return this;
+    }
+
+    public AAItemStyle fontSize(Number prop) {
+        fontSize = prop + "px";
+        return this;
+    }
+
+    public AAItemStyle fontWeight(String prop) {
+        fontWeight = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabel.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabel.java
new file mode 100644
index 0000000..2c5315c
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabel.java
@@ -0,0 +1,72 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+
+public class AALabel {
+    public String  align;//鏍囩鐨勫榻愭柟寮忥紝鍙敤鐨勫�兼湁 "left"銆�"center" 鍙� "right"銆傞粯璁ゅ�兼槸鏍规嵁鍧愭爣杞寸殑浣嶇疆锛堝湪鍥捐〃涓殑浣嶇疆锛夊嵆鏍囩鐨勬棆杞搴﹁繘琛屾櫤鑳藉垽鏂殑銆� 榛樿鏄細center.
+    public Number  rotation;//鏍囩鐨勬棆杞搴� 榛樿鏄細0.
+    public String  text;//鏂囧瓧
+    public String  textAlign;//鏂囧瓧瀵归綈
+    public Boolean useHTML;//HTML娓叉煋
+    public String  verticalAlign;//绔栫洿瀵归綈
+    public AAStyle style;//杞存爣绛剧殑 CSS 鏍峰紡
+    public Number  x;//姘村钩鍋忕Щ
+    public Number  y;// 绔栫洿鍋忕Щ
+    public String  format;//鏍煎紡鍖栧瓧绗︿覆
+    public String  formatter;//鏍煎紡鍖栧嚱鏁�
+
+    public AALabel align(String prop) {
+        align = prop;
+        return this;
+    }
+
+    public AALabel rotation(Number prop) {
+        rotation = prop;
+        return this;
+    }
+
+    public AALabel text(String prop) {
+        text = prop;
+        return this;
+    }
+
+    public AALabel textAlign(String prop) {
+        textAlign = prop;
+        return this;
+    }
+
+    public AALabel useHTML(Boolean prop) {
+        useHTML = prop;
+        return this;
+    }
+
+    public AALabel verticalAlign(String prop) {
+        verticalAlign = prop;
+        return this;
+    }
+
+    public AALabel style(AAStyle prop) {
+        style = prop;
+        return this;
+    }
+
+    public AALabel x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AALabel y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+    public AALabel format(String prop) {
+        format = prop;
+        return this;
+    }
+
+    public AALabel formatter(String prop) {
+        formatter = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+}
\ No newline at end of file
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabels.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabels.java
new file mode 100644
index 0000000..b14eb8e
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALabels.java
@@ -0,0 +1,97 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+
+public class AALabels {
+    public String align;//杞存爣绛剧殑瀵归綈鏂瑰紡锛屽彲鐢ㄧ殑鍊兼湁 "left"銆�"center" 鍙� "right"銆傞粯璁ゅ�兼槸鏍规嵁鍧愭爣杞寸殑浣嶇疆锛堝湪鍥捐〃涓殑浣嶇疆锛夊嵆鏍囩鐨勬棆杞搴﹁繘琛屾櫤鑳藉垽鏂殑銆� 榛樿鏄細center.
+    public Object autoRotation; //鍙拡瀵规按骞宠酱鏈夋晥锛屽厑璁稿湪闃叉杞存爣绛鹃噸鍙犳椂鑷姩鏃嬭浆杞存爣绛剧殑瑙掑害銆傚綋绌洪棿瓒冲鏃讹紝杞存爣绛句笉浼氳鏃嬭浆銆傚綋鍥捐〃鍙樺皬鏃讹紙涓昏鏄搴﹀彉灏忥級 锛岃酱鏍囩寮�濮嬫棆杞搴旂殑瑙掑害锛岀劧鍚庝細渚濇鍒犻櫎闂撮殧鐨勮酱鏍囩骞跺皾璇曟棆杞暟缁勪腑鐨勮搴︺�傚彲浠ラ�氳繃灏嗘鍙傛暟璁剧疆涓� false 鏉ュ叧闂酱鏍囩鏃嬭浆锛堣繖灏嗗鑷存爣绛捐嚜鍔ㄦ崲琛岋級銆� 榛樿鏄細[-45].
+    public Number autoRotationLimit;//褰撴瘡涓垎绫荤殑瀹藉害姣旇鍙傛暟鐨勫�煎ぇ寰堝锛堝儚绱狅級鏃讹紝杞存爣绛惧皢涓嶄細琚嚜鍔ㄦ棆杞紝鑰屾槸浠ユ崲琛岀殑褰㈠紡灞曠ず杞存爣绛俱�� 褰撹酱鏍囩鍖呭惈澶氫釜鐭瘝鏃舵崲琛屽睍绀鸿酱鏍囩鍙互浣垮緱杞存爣绛炬湁瓒冲鐨勭┖闂达紝鎵�浠ヨ缃悎鐞嗙殑鑷姩鏃嬭浆涓嬮檺鏄潪甯告湁鎰忎箟鐨勩�� 榛樿鏄細80.
+    public Number distance;//鍙拡瀵规瀬鍦板浘鏈夋晥锛屽畾涔夊懆鏍囩涓庣粯鍥惧尯杈圭紭鐨勮窛绂汇�� 榛樿鏄細15.
+    public Boolean enabled;//鏄惁鏄剧ず鍧愭爣杞存爣绛� 榛樿鏄細true.
+    public String format;//鍧愭爣杞存牸寮忓寲瀛楃涓层�� 榛樿鏄細{value}.
+    public String formatter;//鍧愭爣杞存牸寮忓寲瀛楃涓层�� 榛樿鏄細{value}.
+    public Number padding;//杞存爣绛剧殑鍐呴棿璺濓紝浣滅敤鏄繚璇佽酱鏍囩涔嬮棿鏈夌┖闅欍�� 榛樿鏄細5.
+    public Number rotation;//杞存爣绛剧殑鏃嬭浆瑙掑害 榛樿鏄細0.
+    public Integer staggerLines;//鍙拡瀵规按骞宠酱鏈夋晥锛屽畾涔夎酱鏍囩鏄剧ず琛屾暟銆�
+    public Integer step;//鏄剧ず n 鐨勫�嶆暟鏍囩锛屼緥濡傝缃负 2 鍒欒〃绀烘爣绛鹃棿闅斾竴涓酱鏍囩鏄剧ず銆傞粯璁ゆ儏鍐典笅锛屼负浜嗛伩鍏嶈酱鏍囩琚鐩栵紝璇ュ弬鏁颁細鏍规嵁鎯呭喌鑷姩璁$畻銆傚彲浠ラ�氳繃璁剧疆姝ゅ弬鏁颁负 1 鏉ラ樆姝㈣嚜鍔ㄨ绠椼��
+    public AAStyle style;//杞存爣绛剧殑 CSS 鏍峰紡
+    public Number x;//鐩稿浜庡潗鏍囪酱鍒诲害绾跨殑姘村钩鍋忕Щ銆� 榛樿鏄細0.
+    public Number y;//鐩稿浜庡潗鏍囪酱鍒诲害绾跨殑鍨傜洿骞冲亸绉汇�� 榛樿鏄細null.
+    public Boolean useHTML;//HTML娓叉煋
+
+    public AALabels align(String prop) {
+        align = prop;
+        return this;
+    }
+
+    public AALabels autoRotation(Object prop) {
+        autoRotation = prop;        
+        return this;
+    }
+
+    public AALabels autoRotationLimit(Number prop) {
+        autoRotationLimit = prop;
+        return this;
+    }
+
+    public AALabels distance(Number prop) {
+        distance = prop;
+        return this;
+    }
+
+    public AALabels enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AALabels format(String prop) {
+        format = prop;
+        return this;
+    }
+
+    public AALabels formatter(String prop) {
+        formatter = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AALabels padding(Number prop) {
+        padding = prop;
+        return this;
+    }
+
+    public AALabels rotation(Number prop) {
+        rotation = prop;
+        return this;
+    }
+
+    public AALabels staggerLines(Integer prop) {
+        staggerLines = prop;
+        return this;
+    }
+
+    public AALabels step(Integer prop) {
+        step = prop;
+        return this;
+    }
+
+    public AALabels style(AAStyle prop) {
+        style =  prop;
+        return this;
+    }
+
+    public AALabels x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AALabels y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+    public AALabels useHTML(Boolean prop) {
+        useHTML = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALang.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALang.java
new file mode 100644
index 0000000..24705b8
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALang.java
@@ -0,0 +1,34 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AALang {
+    public String noData;
+    public Integer numericSymbolMagnitude;
+    public String[] numericSymbols;
+    public String resetZoom;
+    public String thousandsSep;
+
+    public AALang noData(String prop) {
+        noData = prop;
+        return this;
+    }
+
+    public AALang numericSymbolMagnitude(Integer prop) {
+        numericSymbolMagnitude = prop;
+        return this;
+    }
+
+    public AALang numericSymbols(String[] prop) {
+        numericSymbols = prop;
+        return this;
+    }
+
+    public AALang resetZoom(String prop) {
+        resetZoom = prop;
+        return this;
+    }
+
+    public AALang thousandsSep(String prop) {
+        thousandsSep = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALegend.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALegend.java
new file mode 100644
index 0000000..232c31c
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALegend.java
@@ -0,0 +1,103 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AALegend {
+    public String layout; //鍥句緥鏁版嵁椤圭殑甯冨眬銆傚竷灞�绫诲瀷锛� "horizontal" 鎴� "vertical" 鍗虫按骞冲竷灞�鍜屽瀭鐩村竷灞� 榛樿鏄細horizontal.
+    public String align; //璁惧畾鍥句緥鍦ㄥ浘琛ㄥ尯涓殑姘村钩瀵归綈鏂瑰紡锛屽悎娉曞�兼湁left锛宑enter 鍜� right銆�
+    public String verticalAlign; //璁惧畾鍥句緥鍦ㄥ浘琛ㄥ尯涓殑鍨傜洿瀵归綈鏂瑰紡锛屽悎娉曞�兼湁 top锛宮iddle 鍜� bottom銆傚瀭鐩翠綅缃彲浠ラ�氳繃 y 閫夐」鍋氳繘涓�姝ヨ瀹氥��
+    public Boolean enabled;
+    public String borderColor;
+    public Number borderWidth;
+    public Number itemMarginTop; //鍥句緥鐨勬瘡涓�椤圭殑椤堕儴澶栬竟璺濓紝鍗曚綅px銆� 榛樿鏄細0.
+    public AAItemStyle itemStyle;
+    public Number symbolHeight;
+    public Number symbolPadding;
+    public Number symbolRadius;
+    public Number symbolWidth;
+    public Number x;
+    public Number y;
+    public Boolean floating;
+    public String labelFormat;
+
+    public AALegend layout(String prop) {
+        layout = prop;
+        return this;
+    }
+
+    public AALegend align(String prop) {
+        align = prop;
+        return this;
+    }
+
+    public AALegend verticalAlign(String prop) {
+        verticalAlign = prop;
+        return this;
+    }
+
+    public AALegend enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AALegend borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AALegend BorderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AALegend itemMarginTop(Number prop) {
+        itemMarginTop = prop;
+        return this;
+    }
+
+    public AALegend itemStyle(AAItemStyle prop) {
+        itemStyle = prop;
+        return this;
+    }
+
+    public AALegend symbolHeight(Number prop) {
+        symbolHeight = prop;
+        return this;
+    }
+
+    public AALegend symbolPadding(Number prop) {
+        symbolPadding = prop;
+        return this;
+    }
+
+    public AALegend symbolRadius(Number prop) {
+        symbolRadius = prop;
+        return this;
+    }
+
+    public AALegend symbolWidth(Number prop) {
+        symbolWidth = prop;
+        return this;
+    }
+
+    public AALegend x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AALegend y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+    public AALegend floating(Boolean prop) {
+        floating = prop;
+        return this;
+    }
+
+    public AALegend labelFormat(String prop) {
+        labelFormat = prop;
+        return this;
+    }
+
+
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALine.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALine.java
new file mode 100644
index 0000000..7c4be54
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AALine.java
@@ -0,0 +1,9 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AALine {
+    public AADataLabels dataLabels;
+    public AALine dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarker.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarker.java
new file mode 100644
index 0000000..caeaa75
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarker.java
@@ -0,0 +1,46 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAMarker {
+    public Boolean enabled;
+    public Number radius;
+    public String symbol;
+    public String fillColor;//鐐圭殑濉厖鑹�(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑濉厖鑹�)
+    public Number lineWidth;//澶栨部绾跨殑瀹藉害(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟鐨勫搴�)
+    public Object lineColor;//澶栨部绾跨殑棰滆壊(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟棰滆壊锛屽綋鍊间负绌哄瓧绗︿覆鏃讹紝榛樿鍙栨暟鎹偣鎴栨暟鎹垪鐨勯鑹层��)
+    public AAMarkerStates states;
+
+    public AAMarker enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AAMarker radius(Number prop) {
+        radius = prop;
+        return this;
+    }
+
+    public AAMarker symbol(String prop) {
+        symbol = prop;
+        return this;
+    }
+
+    public AAMarker fillColor(String prop) {
+        fillColor = prop;
+        return this;
+    }
+
+    public AAMarker lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AAMarker lineColor(Object prop) {
+        lineColor = prop;
+        return this;
+    }
+
+    public AAMarker states(AAMarkerStates prop) {
+        states = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerHover.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerHover.java
new file mode 100644
index 0000000..c16112b
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerHover.java
@@ -0,0 +1,48 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAMarkerHover {
+
+    public Boolean enabled;
+    public String fillColor;
+    public String lineColor;
+    public Number lineWidth;
+    public Number lineWidthPlus;
+    public Number radius;
+    public Number radiusPlus;
+
+    public AAMarkerHover enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AAMarkerHover fillColor(String prop) {
+        fillColor = prop;
+        return this;
+    }
+
+    public AAMarkerHover lineColor(String prop) {
+        lineColor = prop;
+        return this;
+    }
+
+    public AAMarkerHover lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AAMarkerHover lineWidthPlus(Number prop) {
+        lineWidthPlus = prop;
+        return this;
+    }
+
+    public AAMarkerHover radius(Number prop) {
+        radius = prop;
+        return this;
+    }
+
+    public AAMarkerHover radiusPlus(Number prop) {
+        radiusPlus = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerStates.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerStates.java
new file mode 100644
index 0000000..f311897
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAMarkerStates.java
@@ -0,0 +1,11 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAMarkerStates {
+    public AAMarkerHover hover;
+
+
+    public AAMarkerStates hover(AAMarkerHover prop) {
+        hover = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAOptions.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAOptions.java
new file mode 100644
index 0000000..d652f99
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAOptions.java
@@ -0,0 +1,108 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAOptions {
+    public AAChart chart;
+    public AATitle title;
+    public AASubtitle subtitle;
+    public AAXAxis xAxis;
+    public AAYAxis yAxis;
+    public AAXAxis[] xAxisArray;
+    public AAYAxis[] yAxisArray;
+    public AATooltip tooltip;
+    public AAPlotOptions plotOptions;
+    public Object[] series;
+    public AALegend legend;
+    public AAPane pane;
+    public Object[] colors;
+    public AACredits credits;
+    public AALang defaultOptions;
+    public Boolean touchEventEnabled;
+
+    public AAOptions chart(AAChart prop) {
+        chart = prop;
+        return this;
+    }
+
+    public AAOptions title(AATitle prop) {
+        title = prop;
+        return this;
+    }
+
+    public AAOptions subtitle(AASubtitle prop) {
+        subtitle = prop;
+        return this;
+    }
+
+    public AAOptions xAxis(AAXAxis prop) {
+        xAxis = prop;
+        return this;
+    }
+
+    public AAOptions yAxis(AAYAxis prop) {
+        yAxis = prop;
+        return this;
+    }
+
+    public AAOptions xAxisArray(AAXAxis[] prop) {
+        xAxisArray = prop;
+        return this;
+    }
+
+    public AAOptions yAxisArray(AAYAxis[] prop) {
+        yAxisArray = prop;
+        return this;
+    }
+
+    public AAOptions tooltip(AATooltip prop) {
+        tooltip = prop;
+        return this;
+    }
+
+    public AAOptions plotOptions(AAPlotOptions prop) {
+        plotOptions = prop;
+        return this;
+    }
+
+    public AAOptions series(Object[] prop) {
+        series = prop;
+        return this;
+    }
+
+    public AAOptions legend(AALegend prop) {
+        legend = prop;
+        return this;
+    }
+
+    public AAOptions pane(AAPane prop) {
+        pane = prop;
+        return this;
+    }
+
+    public AAOptions colors(Object[] prop) {
+        colors = prop;
+        return this;
+    }
+
+    public AAOptions credits(AACredits prop) {
+        credits = prop;
+        return this;
+    }
+
+    public AAOptions defaultOptions(AALang prop) {
+        defaultOptions = prop;
+        return this;
+    }
+
+    public AAOptions touchEventEnabled(Boolean prop) {
+        touchEventEnabled = prop;
+        return this;
+    }
+
+
+    public AAOptions() {
+        AACredits aaCredits = new AACredits();
+        aaCredits.enabled = false;
+        this.credits = aaCredits;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPane.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPane.java
new file mode 100644
index 0000000..9e52620
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPane.java
@@ -0,0 +1,34 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAPane {
+    public AABackgroundElement[] background;
+    public Object[] center;
+    public Number endAngle;
+    public Number size;
+    public Number startAngle;
+
+    public AAPane background(AABackgroundElement[] prop) {
+        background = prop;
+        return this;
+    }
+
+    public AAPane center(Object[] prop) {
+        center = prop;
+        return this;
+    }
+
+    public AAPane endAngle(Number prop) {
+        endAngle = prop;
+        return this;
+    }
+
+    public AAPane size(Number prop) {
+        size = prop;
+        return this;
+    }
+
+    public AAPane startAngle(Number prop) {
+        startAngle = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPie.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPie.java
new file mode 100644
index 0000000..775c7da
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPie.java
@@ -0,0 +1,83 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAPie {
+    public String type;
+    public String name;
+    public Object[] data;
+    public AADataLabels dataLabels;
+    public Number size;
+    public String innerSize;
+    public Boolean allowPointSelect;
+    public String cursor;
+    public Boolean showInLegend;
+    public Number startAngle;
+    public Number endAngle;
+    public Number depth;
+    public Object center;
+
+    public AAPie type(String prop) {
+        type = prop;
+        return this;
+    }
+
+    public AAPie name(String prop) {
+        name = prop;
+        return this;
+    }
+
+    public AAPie data(Object[] prop) {
+        data = prop;
+        return this;
+    }
+
+    public AAPie dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+    public AAPie size(Number prop) {
+        size = prop;
+        return this;
+    }
+
+    public AAPie innerSize(String prop) {
+        innerSize = prop;
+        return this;
+    }
+
+    public AAPie allowPointSelect(Boolean prop) {
+        allowPointSelect = prop;
+        return this;
+    }
+
+    public AAPie cursor(String prop) {
+        cursor = prop;
+        return this;
+    }
+
+    public AAPie showInLegend(Boolean prop) {
+        showInLegend = prop;
+        return this;
+    }
+
+    public AAPie startAngle(Number prop) {
+        startAngle = prop;
+        return this;
+    }
+
+    public AAPie endAngle(Number prop) {
+        endAngle = prop;
+        return this;
+    }
+
+    public AAPie depth(Number prop) {
+        depth = prop;
+        return this;
+    }
+
+    public AAPie center(Object prop) {
+        center = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotBandsElement.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotBandsElement.java
new file mode 100644
index 0000000..0c9cb5b
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotBandsElement.java
@@ -0,0 +1,53 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAPlotBandsElement {
+    public Number from;
+    public Number to;
+    public Object color;
+    public String borderColor;
+    public Number borderWidth;
+    public String className;
+    public AALabel label;
+    public Integer zIndex;
+
+    public AAPlotBandsElement from(Number prop) {
+        from = prop;
+        return this;
+    }
+
+    public AAPlotBandsElement to(Number prop) {
+        to = prop;
+        return this;
+    }
+
+    public AAPlotBandsElement color(Object prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAPlotBandsElement borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AAPlotBandsElement borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AAPlotBandsElement className(String prop) {
+        className = prop;
+        return this;
+    }
+
+    public AAPlotBandsElement label(AALabel prop) {
+        label = prop;
+        return this;
+    }
+
+    public AAPlotBandsElement zIndex(Integer prop) {
+        zIndex = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotLinesElement.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotLinesElement.java
new file mode 100644
index 0000000..ed48e0f
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotLinesElement.java
@@ -0,0 +1,50 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAPlotLinesElement {
+
+    public Object color;
+    public String dashStyle;
+    public Number width;
+    public Number value;
+    public Integer zIndex;
+    public AALabel label;
+
+    public AAPlotLinesElement color(Object prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAPlotLinesElement dashStyle(String prop) {
+        dashStyle = prop;
+        return this;
+    }
+
+    public AAPlotLinesElement width(Number prop) {
+        width = prop;
+        return this;
+    }
+
+    public AAPlotLinesElement value(Number prop) {
+        value = prop;
+        return this;
+    }
+
+    public AAPlotLinesElement zIndex(Integer prop) {
+        zIndex = prop;
+        return this;
+    }
+
+    public AAPlotLinesElement label(AALabel prop) {
+        label = prop;
+        return this;
+    }
+
+
+
+}
+
+
+
+
+
+
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotOptions.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotOptions.java
new file mode 100644
index 0000000..be1de74
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPlotOptions.java
@@ -0,0 +1,84 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAPlotOptions {
+    public AAColumn column;
+    public AALine line;
+    public AAPie pie;
+    public AABar bar;
+    public AASpline spline;
+    public AAArea area;
+    public AAAreaspline areaspline;
+    public AABubble bubble;
+    public AAColumnrange columnrange;
+    public AAArearange arearange;
+    public AASeries series;
+    public AABoxplot boxplot;
+    public AAScatter scatter;
+
+
+    public AAPlotOptions column(AAColumn prop) {
+        column = prop;
+        return this;
+    }
+
+    public AAPlotOptions line(AALine prop) {
+        line = prop;
+        return this;
+    }
+
+    public AAPlotOptions pie(AAPie prop) {
+        pie = prop;
+        return this;
+    }
+
+    public AAPlotOptions bar(AABar prop) {
+        bar = prop;
+        return this;
+    }
+
+    public AAPlotOptions spline(AASpline prop) {
+        spline = prop;
+        return this;
+    }
+
+    public AAPlotOptions area(AAArea prop) {
+        area = prop;
+        return this;
+    }
+
+    public AAPlotOptions areaspline(AAAreaspline prop) {
+        areaspline = prop;
+        return this;
+    }
+
+    public AAPlotOptions bubble(AABubble prop) {
+        bubble = prop;
+        return this;
+    }
+
+    public AAPlotOptions columnrange(AAColumnrange prop) {
+        columnrange = prop;
+        return this;
+    }
+
+    public AAPlotOptions arearange(AAArearange prop) {
+        arearange = prop;
+        return this;
+    }
+
+    public AAPlotOptions series(AASeries prop) {
+        series = prop;
+        return this;
+    }
+
+    public AAPlotOptions boxplot(AABoxplot prop) {
+        boxplot = prop;
+        return this;
+    }
+
+    public AAPlotOptions scatter(AAScatter prop) {
+        scatter = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPoint.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPoint.java
new file mode 100644
index 0000000..acf2c62
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPoint.java
@@ -0,0 +1,10 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAPoint {
+    public AAPointEvents events;
+
+    public AAPoint events(AAPointEvents prop) {
+        events = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPointEvents.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPointEvents.java
new file mode 100644
index 0000000..faddeb3
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPointEvents.java
@@ -0,0 +1,56 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+
+public class AAPointEvents {
+    public String click; //鐐瑰嚮浜嬩欢
+    public String mouseOut; //榧犳爣鍒掑嚭
+    public String mouseOver; //榧犳爣鍒掕繃
+    public String remove; //鍒犻櫎
+    public String select; //閫変腑
+    public String unselect; //鍙栨秷閫変腑
+    public String update; //鏇存柊
+    public String legendItemClick; //鍥句緥鐐瑰嚮浜嬩欢
+
+    public AAPointEvents click(String prop) {
+        click = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAPointEvents mouseOut(String prop) {
+        mouseOut = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAPointEvents mouseOver(String prop) {
+        mouseOver = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAPointEvents remove(String prop) {
+        remove = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAPointEvents select(String prop) {
+        select = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAPointEvents unselect(String prop) {
+        unselect = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAPointEvents update(String prop) {
+        update = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AAPointEvents legendItemClick(String prop) {
+        legendItemClick = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPosition.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPosition.java
new file mode 100644
index 0000000..5eb8c74
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAPosition.java
@@ -0,0 +1,29 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAPosition {
+    public String align;
+    public String verticalAlign;
+    public Number x;
+    public Number y;
+
+    public AAPosition align(String prop) {
+        align = prop;
+        return this;
+    }
+
+    public AAPosition verticalAlign(String prop) {
+        verticalAlign = prop;
+        return this;
+    }
+
+    public AAPosition x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AAPosition y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAResetZoomButton.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAResetZoomButton.java
new file mode 100644
index 0000000..73b5f14
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAResetZoomButton.java
@@ -0,0 +1,26 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import java.util.Map;
+
+public class AAResetZoomButton {
+    public AAPosition position;
+    public String relativeTo;
+    public Map theme;
+
+    public AAResetZoomButton position(AAPosition prop) {
+        position = prop;
+        return this;
+    }
+
+    public AAResetZoomButton relativeTo(String prop) {
+        relativeTo = prop;
+        return this;
+    }
+
+    public AAResetZoomButton theme(Map prop) {
+        theme = prop;
+        return this;
+    }
+
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASVGAttributes.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASVGAttributes.java
new file mode 100644
index 0000000..7df4804
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASVGAttributes.java
@@ -0,0 +1,40 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AASVGAttributes {
+    public Number strokeWidth;
+    public String fill;
+    public String stroke;
+
+    public AASVGAttributes strokeWidth(Number prop) {
+        strokeWidth = prop;
+        return this;
+    }
+
+    public AASVGAttributes fill(String prop) {
+        fill = prop;
+        return this;
+    }
+
+    public AASVGAttributes stroke(String prop) {
+        stroke = prop;
+        return this;
+    }
+
+    public Map<String, Object> toDic() {
+        Map<String, Object> dic = new HashMap<>();
+        if (strokeWidth != null) {
+            dic.put("stroke-width", strokeWidth);
+        }
+        if (fill != null) {
+            dic.put("fill", fill);
+        }
+        if (stroke != null) {
+            dic.put("stroke", stroke);
+        }
+        return dic;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScatter.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScatter.java
new file mode 100644
index 0000000..aee5817
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScatter.java
@@ -0,0 +1,46 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAScatter {
+    public Number lineWidth;
+    public String lineColor;
+    public String dashStyle;
+    public Object enableMouseTracking;
+    public String linkedTo;
+    public AAStates states;
+    public AAMarker marker;
+
+    public AAScatter lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AAScatter lineColor(String prop) {
+        lineColor = prop;
+        return this;
+    }
+
+    public AAScatter dashStyle(String prop) {
+        dashStyle = prop;
+        return this;
+    }
+
+    public AAScatter enableMouseTracking(Object prop) {
+        enableMouseTracking = prop;
+        return this;
+    }
+
+    public AAScatter linkedTo(String prop) {
+        linkedTo = prop;
+        return this;
+    }
+
+    public AAScatter states(AAStates prop) {
+        states = prop;
+        return this;
+    }
+
+    public AAScatter marker(AAMarker prop) {
+        marker = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScrollablePlotArea.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScrollablePlotArea.java
new file mode 100644
index 0000000..07cbc6c
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAScrollablePlotArea.java
@@ -0,0 +1,34 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAScrollablePlotArea {
+    public Number minHeight;
+    public Number minWidth;
+    public Float opacity;
+    public Number scrollPositionX;
+    public Number scrollPositionY;
+
+    public AAScrollablePlotArea minHeight(Number prop) {
+        minHeight = prop;
+        return this;
+    }
+
+    public AAScrollablePlotArea minWidth(Number prop) {
+        minWidth = prop;
+        return this;
+    }
+
+    public AAScrollablePlotArea opacity(Float prop) {
+        opacity = prop;
+        return this;
+    }
+
+    public AAScrollablePlotArea scrollPositionX(Number prop) {
+        scrollPositionX = prop;
+        return this;
+    }
+
+    public AAScrollablePlotArea scrollPositionY(Number prop) {
+        scrollPositionY = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASelect.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASelect.java
new file mode 100644
index 0000000..7647259
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASelect.java
@@ -0,0 +1,28 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AASelect {
+    public Boolean enabled;
+    public String borderColor;
+    public String color;
+    public AAHalo halo;
+
+    public AASelect enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AASelect borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AASelect color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public  AASelect halo(AAHalo prop) {
+        halo = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeries.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeries.java
new file mode 100644
index 0000000..481c858
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeries.java
@@ -0,0 +1,158 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AASeries {
+    public String borderColor;
+    public Number  borderWidth;
+    public Number  borderRadius;
+    public Object borderRadiusTopLeft;
+    public Object borderRadiusTopRight;
+    public Object borderRadiusBottomLeft;
+    public Object borderRadiusBottomRight;
+    public AAMarker marker;
+    public String stacking;
+    public AAAnimation animation;
+    public String[] keys;
+    public Boolean colorByPoint;//鍐冲畾浜嗗浘琛ㄦ槸鍚︾粰姣忎釜鏁版嵁鍒楁垨姣忎釜鐐瑰垎閰嶄竴涓鑹诧紝榛樿鍊兼槸 false锛� 鍗抽粯璁ゆ槸缁欐瘡涓暟鎹被鍒嗛厤棰滆壊锛�
+    public Boolean connectNulls;//璁剧疆鎶樼嚎鏄惁鏂偣閲嶈繛
+    public AASeriesEvents events;
+    public AAShadow shadow;
+    public AADataLabels dataLabels;
+    public AAStates states;
+    public AAPoint point;
+    public Integer pointInterval;
+    public String pointIntervalUnit;
+    public Object pointPlacement;
+    public Number pointStart;
+    public Number pointWidth; //鏌辩姸鍥�, 鏉″舰鍥�, 鏌卞舰鑼冨洿鍥�, 鐎戝竷鍥�, 绠辩嚎鍥�(鐩掗』鍥�)鐩存帴璁剧疆鍗曚釜鍥惧舰鍏冪礌鐨勫搴�
+    public Number maxPointWidth; //鏌辩姸鍥�, 鏉″舰鍥�, 鏌卞舰鑼冨洿鍥�, 鐎戝竷鍥�, 绠辩嚎鍥�(鐩掗』鍥�)鐩存帴璁剧疆鍗曚釜鍥惧舰鍏冪礌鐨勬渶澶у搴�
+    public Number minPointLength; //鏌辩姸鍥�, 鏉″舰鍥�, 鏌卞舰鑼冨洿鍥�, 鐎戝竷鍥�, 绠辩嚎鍥�(鐩掗』鍥�)鐩存帴璁剧疆鍗曚釜鍥惧舰鍏冪礌鐨勬渶灏忛珮搴�
+
+
+
+
+    public AASeries borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+    
+    public AASeries borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AASeries borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AASeries borderRadiusTopLeft(Object prop) {
+        borderRadiusTopLeft = prop;
+        return this;
+    }
+
+    public AASeries borderRadiusTopRight(Object prop) {
+        borderRadiusTopRight = prop;
+        return this;
+    }
+
+    public AASeries borderRadiusBottomLeft(Object prop) {
+        borderRadiusBottomLeft = prop;
+        return this;
+    }
+
+    public AASeries borderRadiusBottomRight(Object prop) {
+        borderRadiusBottomRight = prop;
+        return this;
+    }
+
+    public AASeries marker(AAMarker prop) {
+        marker = prop;
+        return this;
+    }
+
+    public AASeries stacking(String prop) {
+        stacking = prop;
+        return this;
+    }
+
+    public AASeries animation(AAAnimation prop) {
+        animation = prop;
+        return this;
+    }
+
+    public AASeries keys(String[] prop) {
+        keys = prop;
+        return this;
+    }
+
+    public AASeries colorByPoint(Boolean prop) {
+        colorByPoint = prop;
+        return this;
+    }
+
+    public AASeries connectNulls(Boolean prop) {
+        connectNulls = prop;
+        return this;
+    }
+
+    public AASeries events(AASeriesEvents prop) {
+        events = prop;
+        return this;
+    }
+
+    public AASeries shadow(AAShadow prop) {
+        shadow = prop;
+        return this;
+    }
+
+    public AASeries dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+
+    public AASeries states(AAStates prop) {
+        states = prop;
+        return this;
+    }
+
+    public AASeries point(AAPoint prop) {
+        point = prop;
+        return this;
+    }
+
+    public AASeries pointInterval(Integer prop) {
+        pointInterval = prop;
+        return this;
+    }
+
+    public AASeries pointIntervalUnit(String prop) {
+        pointIntervalUnit = prop;
+        return this;
+    }
+
+    public AASeries pointPlacement(Object prop) {
+        pointPlacement = prop;
+        return this;
+    }
+
+    public AASeries pointStart(Number prop) {
+        pointStart = prop;
+        return this;
+    }
+
+    public AASeries pointWidth(Number prop) {
+        pointWidth = prop;
+        return this;
+    }
+
+    public AASeries maxPointWidth(Number prop) {
+        maxPointWidth = prop;
+        return this;
+    }
+
+    public AASeries minPointLength(Number prop) {
+        minPointLength = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeriesEvents.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeriesEvents.java
new file mode 100644
index 0000000..185bb81
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASeriesEvents.java
@@ -0,0 +1,13 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+
+public class AASeriesEvents {
+    public String legendItemClick;
+
+    public AASeriesEvents legendItemClick(String prop) {
+        legendItemClick = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAShadow.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAShadow.java
new file mode 100644
index 0000000..2389b21
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAShadow.java
@@ -0,0 +1,35 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAShadow {
+    public String color;
+    public Number offsetX;
+    public Number offsetY;
+    public Float opacity;
+    public Number width;
+
+    public AAShadow color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAShadow offsetX(Number prop) {
+        offsetX = prop;
+        return this;
+    }
+
+    public AAShadow offsetY(Number prop) {
+        offsetY = prop;
+        return this;
+    }
+
+    public AAShadow opacity(Float prop) {
+        opacity = prop;
+        return this;
+    }
+
+    public AAShadow width(Number prop) {
+        width = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASpline.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASpline.java
new file mode 100644
index 0000000..8f70fa5
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASpline.java
@@ -0,0 +1,9 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AASpline {
+    public AADataLabels dataLabels;
+    public AASpline dataLabels(AADataLabels prop) {
+        dataLabels = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStates.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStates.java
new file mode 100644
index 0000000..e73276d
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStates.java
@@ -0,0 +1,24 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAStates {
+
+    public AAHover hover;
+    public AASelect select;
+    public AAInactive inactive;
+
+    public AAStates hover(AAHover prop) {
+        hover = prop;
+        return this;
+    }
+
+    public AAStates select(AASelect prop) {
+        select = prop;
+        return this;
+    }
+
+    public AAStates inactive(AAInactive prop) {
+        inactive = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStyle.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStyle.java
new file mode 100644
index 0000000..eaa4a20
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAStyle.java
@@ -0,0 +1,192 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAStyle {
+
+    public String background;
+    public String backgroundColor;
+    public String border;
+    public String borderRadius;
+    public String color;
+    public String cursor;
+    public String fontFamily;
+    public String fontSize;
+    public String fontWeight;
+    public Number height;
+    public Number lineWidth;
+    public Number opacity;
+    public String padding;
+    public String pointerEvents;
+    public String position;
+    public String textAlign;
+    public String textDecoration;
+    public String textOutline;
+    public String textOverflow;
+    public String top;
+    public String transition;
+    public String whiteSpace;
+    public Number width;
+
+    public AAStyle background(String prop) {
+        background = prop;
+        return this;
+    }
+
+    public AAStyle backgroundColor(String prop) {
+        backgroundColor = prop;
+        return this;
+    }
+
+    public AAStyle border(String prop) {
+        border = prop;
+        return this;
+    }
+
+    public AAStyle borderRadius(Number prop) {
+        if (prop != null) {
+            borderRadius = prop + "px";
+        }
+        return this;
+    }
+
+    public AAStyle color(String prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAStyle cursor(String prop) {
+        cursor = prop;
+        return this;
+    }
+
+    public AAStyle fontFamily(String prop) {
+        fontFamily = prop;
+        return this;
+    }
+
+    public AAStyle fontSize(Number prop) {
+        if (prop != null) {
+            fontSize = prop + "px";
+        }
+        return this;
+    }
+
+
+    public AAStyle fontWeight(String prop) {
+        fontWeight = prop;
+        return this;
+    }
+
+
+
+    public AAStyle height(Number prop) {
+        height = prop;
+        return this;
+    }
+
+    public AAStyle lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AAStyle opacity(Number prop) {
+        opacity = prop;
+        return this;
+    }
+
+    public AAStyle padding(Number prop) {
+        if (prop != null) {
+            padding = prop + "px";
+        }
+        return this;
+    }
+
+    public AAStyle pointerEvents(String prop) {
+        pointerEvents = prop;
+        return this;
+    }
+
+    public AAStyle position(String prop) {
+        position = prop;
+        return this;
+    }
+
+    public AAStyle textAlign(String prop) {
+        textAlign = prop;
+        return this;
+    }
+
+    public AAStyle textDecoration(String prop) {
+        textDecoration = prop;
+        return this;
+    }
+
+    public AAStyle textOutline(String prop) {
+        textOutline = prop;
+        return this;
+    }
+
+    public AAStyle textOverflow(String prop) {
+        textOverflow = prop;
+        return this;
+    }
+
+    public AAStyle top(String prop) {
+        top = prop;
+        return this;
+    }
+
+    public AAStyle transition(String prop) {
+        transition = prop;
+        return this;
+    }
+
+    public AAStyle whiteSpace(String prop) {
+        whiteSpace = prop;
+        return this;
+    }
+
+    public AAStyle width(Number prop) {
+        width = prop;
+        return this;
+    }
+
+
+
+
+
+    public static AAStyle style(
+            String color
+    ) {
+        return AAStyle.style(color,null);
+    }
+
+    public static AAStyle style(
+            String color,
+            Number fontSize
+    ) {
+        return AAStyle.style(color,fontSize,null);
+    }
+
+    public static AAStyle style(
+            String color,
+            Number fontSize,
+            String fontWeight
+    ) {
+        return AAStyle.style(color,fontSize,fontWeight,null);
+    }
+
+    public static AAStyle style(
+            String color,
+            Number fontSize,
+            String fontWeight,
+            String textOutline
+    ) {
+        AAStyle aaStyle = new AAStyle()
+                .color(color)
+                .fontSize(fontSize)
+                .fontWeight(fontWeight)
+                .textOutline(textOutline);
+        return aaStyle;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASubtitle.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASubtitle.java
new file mode 100644
index 0000000..b925fcd
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AASubtitle.java
@@ -0,0 +1,48 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartVerticalAlignType;
+
+public class AASubtitle {
+    public String text;
+    public AAStyle style;
+    public String align;
+    public String verticalAlign;
+    public Number x;
+    public Number y;
+    public Boolean userHTML;
+
+    public AASubtitle text(String prop) {
+        text = prop;
+        return this;
+    }
+
+    public AASubtitle style(AAStyle prop) {
+        style = prop;
+        return this;
+    }
+
+    public AASubtitle align(String prop) {
+        align = prop;
+        return this;
+    }
+
+    public AASubtitle verticalAlign(AAChartVerticalAlignType prop) {
+        verticalAlign = prop.toString();
+        return this;
+    }
+
+    public AASubtitle x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AASubtitle y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+    public AASubtitle userHTML(Boolean prop) {
+        userHTML = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATitle.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATitle.java
new file mode 100644
index 0000000..a94452a
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATitle.java
@@ -0,0 +1,49 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartAlignType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartVerticalAlignType;
+
+public class AATitle {
+    public String text;
+    public AAStyle style;
+    public String align;
+    public String verticalAlign;
+    public Number x;
+    public Number y;
+    public Boolean userHTML;
+
+    public AATitle text(String prop) {
+        text = prop;
+        return this;
+    }
+
+    public AATitle style(AAStyle prop) {
+        style = prop;
+        return this;
+    }
+
+    public AATitle align(String prop) {
+        align = prop;
+        return this;
+    }
+
+    public AATitle verticalAlign(String prop) {
+        verticalAlign = prop;
+        return this;
+    }
+
+    public AATitle x(Number prop) {
+        x = prop;
+        return this;
+    }
+
+    public AATitle y(Number prop) {
+        y = prop;
+        return this;
+    }
+
+    public AATitle userHTML(Boolean prop) {
+        userHTML = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATooltip.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATooltip.java
new file mode 100644
index 0000000..e88e353
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AATooltip.java
@@ -0,0 +1,141 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+import com.github.AAChartModel.AAChartCore.AATools.AAJSStringPurer;
+
+public class AATooltip {
+    public Object backgroundColor;
+    public String borderColor;
+    public Number borderRadius;
+    public Number borderWidth;
+    public AAStyle style;
+    public Boolean enabled;
+    public Boolean useHTML;
+    public String formatter;
+    public String headerFormat;
+    public String pointFormat;
+    public String footerFormat;
+    public Integer valueDecimals;
+    public Boolean shared;
+    public String valueSuffix;
+    public Boolean followTouchMove;//https://api.highcharts.com.cn/highcharts#chart.panning
+    public Boolean shadow;
+    public Number padding;
+    public String pointFormatter;
+    public String positioner;
+    public AADateTimeLabelFormats dateTimeLabelFormats;
+    public String shape;
+
+    public AATooltip backgroundColor(Object prop) {
+        backgroundColor = prop;
+        return this;
+    }
+
+    public AATooltip borderColor(String prop) {
+        borderColor = prop;
+        return this;
+    }
+
+    public AATooltip borderRadius(Number prop) {
+        borderRadius = prop;
+        return this;
+    }
+
+    public AATooltip borderWidth(Number prop) {
+        borderWidth = prop;
+        return this;
+    }
+
+    public AATooltip style(AAStyle prop) {
+        style = prop;
+        return this;
+    }
+
+    public AATooltip enabled(Boolean prop) {
+        enabled = prop;
+        return this;
+    }
+
+    public AATooltip useHTML(Boolean prop) {
+        useHTML = prop;
+        return this;
+    }
+
+    public AATooltip formatter(String prop) {
+        formatter = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AATooltip headerFormat(String prop) {
+        headerFormat = prop;
+        return this;
+    }
+
+    public AATooltip pointFormat(String prop) {
+        pointFormat = prop;
+        return this;
+    }
+
+    public AATooltip footerFormat(String prop) {
+        footerFormat = prop;
+        return this;
+    }
+
+    public AATooltip valueDecimals(Integer prop) {
+        valueDecimals = prop;
+        return this;
+    }
+
+    public AATooltip shared(Boolean prop) {
+        shared = prop;
+        return this;
+    }
+
+    public AATooltip valueSuffix(String prop) {
+        valueSuffix = prop;
+        return this;
+    }
+
+    public AATooltip followTouchMove(Boolean prop) {
+        followTouchMove = prop;
+        return this;
+    }
+
+    public AATooltip shadow(Boolean prop) {
+        shadow = prop;
+        return this;
+    }
+
+    public AATooltip padding(Number prop) {
+        padding = prop;
+        return this;
+    }
+
+    public AATooltip pointFormatter(String prop) {
+        pointFormatter = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AATooltip positioner(String prop) {
+        positioner = AAJSStringPurer.pureAnonymousJSFunctionString(prop);
+        return this;
+    }
+
+    public AATooltip dateTimeLabelFormats(AADateTimeLabelFormats prop) {
+        dateTimeLabelFormats = prop;
+        return this;
+    }
+
+    public AATooltip shape(String prop) {
+        shape = prop;
+        return this;
+    }
+
+    public AATooltip() {
+        enabled = true;
+        shared = true;
+    }
+
+
+    
+  
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAXAxis.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAXAxis.java
new file mode 100644
index 0000000..eaada4c
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAXAxis.java
@@ -0,0 +1,238 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAXAxis extends AAAxis {
+    public AAXAxis allowDecimals(Boolean prop) {
+        allowDecimals = prop;
+        return this;
+    }
+
+    public AAXAxis alternateGridColor(Object prop) {
+        alternateGridColor = prop;
+        return this;
+    }
+
+    public AAXAxis crosshair(AACrosshair prop) {
+        crosshair = prop;
+        return this;
+    }
+
+    public AAXAxis title(AATitle prop) {
+        title = prop;
+        return this;
+    }
+
+    public AAXAxis type(String prop) {
+        type = prop;
+        return this;
+    }
+
+    public AAXAxis dateTimeLabelFormats(AADateTimeLabelFormats prop) {
+        dateTimeLabelFormats = prop;
+        return this;
+    }
+
+    public AAXAxis plotBands(AAPlotBandsElement[] prop) {
+        plotBands = prop;
+        return this;
+    }
+
+    public AAXAxis plotLines(AAPlotLinesElement[] prop) {
+        plotLines = prop;
+        return this;
+    }
+
+    public AAXAxis categories(String[] prop) {
+        categories = prop;
+        return this;
+    }
+
+    public AAXAxis linkedTo(Integer prop) {
+        linkedTo = prop;
+        return this;
+    }
+
+    public AAXAxis reversed(Boolean prop) {
+        reversed = prop;
+        return this;
+    }
+
+    public AAXAxis opposite(Boolean prop) {
+        opposite = prop;
+        return this;
+    }
+
+    public AAXAxis lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AAXAxis lineColor(String prop) {
+        lineColor = prop;
+        return this;
+    }
+
+    public AAXAxis max(Number prop) {
+        max = prop;
+        return this;
+    }
+
+    public AAXAxis min(Number prop) {
+        min = prop;
+        return this;
+    }
+
+    public AAXAxis maxPadding(Number prop) {
+        maxPadding = prop;
+        return this;
+    }
+
+    public AAXAxis minPadding(Number prop) {
+        minPadding = prop;
+        return this;
+    }
+
+    public AAXAxis minRange(Integer prop) {
+        minRange = prop;
+        return this;
+    }
+
+    public AAXAxis minTickInterval(Integer prop) {
+        minTickInterval = prop;
+        return this;
+    }
+
+    public AAXAxis minorTicks(Boolean prop) {
+        minorTicks = prop;
+        return this;
+    }
+
+    public AAXAxis minorGridLineColor(String prop) {
+        minorGridLineColor = prop;
+        return this;
+    }
+
+    public AAXAxis minorGridLineDashStyle(String prop) {
+        minorGridLineDashStyle = prop;
+        return this;
+    }
+
+    public AAXAxis minorGridLineWidth(Number prop) {
+        minorGridLineWidth = prop;
+        return this;
+    }
+
+    public AAXAxis minorTickColor(String prop) {
+        minorTickColor = prop;
+        return this;
+    }
+
+    public AAXAxis minorTickInterval(Object prop) {
+        minorTickInterval = prop;
+        return this;
+    }
+
+    public AAXAxis minorTickLength(Number prop) {
+        minorTickLength = prop;
+        return this;
+    }
+
+    public AAXAxis minorTickPosition(String prop) {
+        minorTickPosition = prop;
+        return this;
+    }
+
+    public AAXAxis minorTickWidth(Number prop) {
+        minorTickWidth = prop;
+        return this;
+    }
+
+    public AAXAxis gridLineWidth(Number prop) {
+        gridLineWidth = prop;
+        return this;
+    }
+
+    public AAXAxis gridLineColor(String prop) {
+        gridLineColor = prop;
+        return this;
+    }
+
+    public AAXAxis gridLineDashStyle(String prop) {
+        gridLineDashStyle = prop;
+        return this;
+    }
+
+    public AAXAxis gridLineInterpolation(String prop) {
+        gridLineInterpolation = prop;
+        return this;
+    }
+
+    public AAXAxis offset(Number prop) {
+        offset = prop;
+        return this;
+    }
+
+    public AAXAxis labels(AALabels prop) {
+        labels = prop;
+        return this;
+    }
+
+    public AAXAxis visible(Boolean prop) {
+        visible = prop;
+        return this;
+    }
+
+    public AAXAxis startOnTick(Boolean prop) {
+        startOnTick = prop;
+        return this;
+    }
+
+    public AAXAxis endOnTick(Boolean prop) {
+        endOnTick = prop;
+        return this;
+    }
+
+    public AAXAxis tickColor(String prop) {
+        tickColor = prop;
+        return this;
+    }
+
+    public AAXAxis tickAmount(Integer prop) {
+        tickAmount = prop;
+        return this;
+    }
+
+    public AAXAxis tickInterval(Number prop) {
+        tickInterval = prop;
+        return this;
+    }
+
+    public AAXAxis tickmarkPlacement(String prop) {
+        tickmarkPlacement = prop;
+        return this;
+    }
+
+    public AAXAxis tickWidth(Number prop) {
+        tickWidth = prop;
+        return this;
+    }
+
+    public AAXAxis tickLength(Number prop) {
+        tickLength = prop;
+        return this;
+    }
+
+    public AAXAxis tickPosition(String prop) {
+        tickPosition = prop;
+        return this;
+    }
+
+    public AAXAxis tickPositions(Object[] prop) {
+        tickPositions = prop;
+        return this;
+    }
+
+    public AAXAxis left(Object prop) {
+        left = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAYAxis.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAYAxis.java
new file mode 100644
index 0000000..a16633a
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAYAxis.java
@@ -0,0 +1,259 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAYAxis extends AAAxis {
+    public Object stackLabels;
+    public String tooltipValueFormat; ////Parallel coordinates only. https://api.highcharts.com.cn/highcharts/yAxis.tooltipValueFormat.html
+    public Object width;
+    public AAYAxis stackLabels(String prop) {
+        stackLabels = prop;
+        return this;
+    }
+
+    public AAYAxis tooltipValueFormat(String prop) {
+        tooltipValueFormat = prop;
+        return this;
+    }
+
+    public AAYAxis width(Object prop) {
+        width = prop;
+        return this;
+    }
+
+    ///////////////////////////////////////////
+
+    public AAYAxis allowDecimals(Boolean prop) {
+        allowDecimals = prop;
+        return this;
+    }
+
+    public AAYAxis alternateGridColor(Object prop) {
+        alternateGridColor = prop;
+        return this;
+    }
+
+    public AAYAxis crosshair(AACrosshair prop) {
+        crosshair = prop;
+        return this;
+    }
+
+    public AAYAxis title(AATitle prop) {
+        title = prop;
+        return this;
+    }
+
+    public AAYAxis type(String prop) {
+        type = prop;
+        return this;
+    }
+
+    public AAYAxis dateTimeLabelFormats(AADateTimeLabelFormats prop) {
+        dateTimeLabelFormats = prop;
+        return this;
+    }
+
+    public AAYAxis plotBands(AAPlotBandsElement[] prop) {
+        plotBands = prop;
+        return this;
+    }
+
+    public AAYAxis plotLines(AAPlotLinesElement[] prop) {
+        plotLines = prop;
+        return this;
+    }
+
+    public AAYAxis categories(String[] prop) {
+        categories = prop;
+        return this;
+    }
+
+    public AAYAxis linkedTo(Integer prop) {
+        linkedTo = prop;
+        return this;
+    }
+
+    public AAYAxis reversed(Boolean prop) {
+        reversed = prop;
+        return this;
+    }
+
+    public AAYAxis opposite(Boolean prop) {
+        opposite = prop;
+        return this;
+    }
+
+    public AAYAxis lineWidth(Number prop) {
+        lineWidth = prop;
+        return this;
+    }
+
+    public AAYAxis lineColor(String prop) {
+        lineColor = prop;
+        return this;
+    }
+
+    public AAYAxis max(Number prop) {
+        max = prop;
+        return this;
+    }
+
+    public AAYAxis min(Number prop) {
+        min = prop;
+        return this;
+    }
+
+    public AAYAxis maxPadding(Number prop) {
+        maxPadding = prop;
+        return this;
+    }
+
+    public AAYAxis minPadding(Number prop) {
+        minPadding = prop;
+        return this;
+    }
+
+    public AAYAxis minRange(Integer prop) {
+        minRange = prop;
+        return this;
+    }
+
+    public AAYAxis minTickInterval(Integer prop) {
+        minTickInterval = prop;
+        return this;
+    }
+
+    public AAYAxis minorTicks(Boolean prop) {
+        minorTicks = prop;
+        return this;
+    }
+
+    public AAYAxis minorGridLineColor(String prop) {
+        minorGridLineColor = prop;
+        return this;
+    }
+
+    public AAYAxis minorGridLineDashStyle(String prop) {
+        minorGridLineDashStyle = prop;
+        return this;
+    }
+
+    public AAYAxis minorGridLineWidth(Number prop) {
+        minorGridLineWidth = prop;
+        return this;
+    }
+
+    public AAYAxis minorTickColor(String prop) {
+        minorTickColor = prop;
+        return this;
+    }
+
+    public AAYAxis minorTickInterval(Object prop) {
+        minorTickInterval = prop;
+        return this;
+    }
+
+    public AAYAxis minorTickLength(Number prop) {
+        minorTickLength = prop;
+        return this;
+    }
+
+    public AAYAxis minorTickPosition(String prop) {
+        minorTickPosition = prop;
+        return this;
+    }
+
+    public AAYAxis minorTickWidth(Number prop) {
+        minorTickWidth = prop;
+        return this;
+    }
+
+    public AAYAxis gridLineWidth(Number prop) {
+        gridLineWidth = prop;
+        return this;
+    }
+
+    public AAYAxis gridLineColor(String prop) {
+        gridLineColor = prop;
+        return this;
+    }
+
+    public AAYAxis gridLineDashStyle(String prop) {
+        gridLineDashStyle = prop;
+        return this;
+    }
+
+    public AAYAxis gridLineInterpolation(String prop) {
+        gridLineInterpolation = prop;
+        return this;
+    }
+
+    public AAYAxis offset(Number prop) {
+        offset = prop;
+        return this;
+    }
+
+    public AAYAxis labels(AALabels prop) {
+        labels = prop;
+        return this;
+    }
+
+    public AAYAxis visible(Boolean prop) {
+        visible = prop;
+        return this;
+    }
+
+    public AAYAxis startOnTick(Boolean prop) {
+        startOnTick = prop;
+        return this;
+    }
+
+    public AAYAxis endOnTick(Boolean prop) {
+        endOnTick = prop;
+        return this;
+    }
+
+    public AAYAxis tickColor(String prop) {
+        tickColor = prop;
+        return this;
+    }
+
+    public AAYAxis tickAmount(Integer prop) {
+        tickAmount = prop;
+        return this;
+    }
+
+    public AAYAxis tickInterval(Number prop) {
+        tickInterval = prop;
+        return this;
+    }
+
+    public AAYAxis tickmarkPlacement(String prop) {
+        tickmarkPlacement = prop;
+        return this;
+    }
+
+    public AAYAxis tickWidth(Number prop) {
+        tickWidth = prop;
+        return this;
+    }
+
+    public AAYAxis tickLength(Number prop) {
+        tickLength = prop;
+        return this;
+    }
+
+    public AAYAxis tickPosition(String prop) {
+        tickPosition = prop;
+        return this;
+    }
+
+    public AAYAxis tickPositions(Object[] prop) {
+        tickPositions = prop;
+        return this;
+    }
+
+    public AAYAxis left(Object prop) {
+        left = prop;
+        return this;
+    }
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAZonesElement.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAZonesElement.java
new file mode 100644
index 0000000..ee20752
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AAOptionsModel/AAZonesElement.java
@@ -0,0 +1,28 @@
+package com.github.AAChartModel.AAChartCore.AAOptionsModel;
+
+public class AAZonesElement {
+    public Number value;
+    public Object color;
+    public Object fillColor;
+    public String dashStyle;
+
+    public AAZonesElement value(Number prop) {
+        value = prop;
+        return this;
+    }
+
+    public AAZonesElement color(Object prop) {
+        color = prop;
+        return this;
+    }
+
+    public AAZonesElement fillColor(Object prop) {
+        fillColor = prop;
+        return this;
+    }
+
+    public AAZonesElement dashStyle(String prop) {
+        dashStyle = prop;
+        return this;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAColor.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAColor.java
new file mode 100644
index 0000000..862898a
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAColor.java
@@ -0,0 +1,116 @@
+package com.github.AAChartModel.AAChartCore.AATools;
+
+public class AAColor {
+    public static String Black = blackColor();
+    public static String DarkGray = darkGrayColor();
+    public static String LightGray = lightGrayColor();
+    public static String White = whiteColor();
+    public static String Gray = grayColor();
+    public static String Red = redColor();
+    public static String Green = greenColor();
+    public static String Blue = blueColor();
+    public static String Cyan = cyanColor();
+    public static String Yellow = yellowColor();
+    public static String Magenta = magentaColor();
+    public static String Orange = orangeColor();
+    public static String Purple = purpleColor();
+    public static String Brown = brownColor();
+    public static String Clear = clearColor();
+
+    public static String rgbaColor(
+            Integer red,
+            Integer green,
+            Integer blue,
+            Float alpha
+    ) {
+        return "rgba(" + red +"," + green + "," + blue + "," + alpha + ")";
+    }
+
+    public static String rgbColor(
+            Integer red,
+            Integer green,
+            Integer blue
+    ) {
+        return rgbaColor(red, green, blue, 1.0f);
+    }
+
+    public static String AARgba(
+            Integer red,
+            Integer green,
+            Integer blue,
+            Float alpha
+    ) {
+        return "rgba(" + red +"," + green + "," + blue + "," + alpha + ")";
+    }
+
+    public static String AARgb(
+            Integer red,
+            Integer green,
+            Integer blue
+    ) {
+        return "rgba(" + red +"," + green + "," + blue + "," + 1.0f + ")";
+    }
+
+
+    private static String blackColor() {
+        return "black";
+    }
+
+    private static String darkGrayColor() {
+        return "darkGray";
+    }
+
+    private static String lightGrayColor() {
+        return "lightGray";
+    }
+
+    private static String whiteColor() {
+        return "white";
+    }
+
+    private static String grayColor() {
+        return "gray";
+    }
+
+    private static String redColor() {
+        return "red";
+    }
+
+    private static String greenColor() {
+        return "green";
+    }
+
+    private static String blueColor() {
+        return "blue";
+    }
+
+    private static String cyanColor() {
+        return "cyan";
+    }
+
+    private static String yellowColor() {
+        return "yellow";
+    }
+
+    private static String magentaColor() {
+        return "magenta";
+    }
+
+    private static String orangeColor() {
+        return "orange";
+    }
+
+    private static String purpleColor() {
+        return "purple";
+    }
+
+    private static String brownColor() {
+        return "brown";
+    }
+
+    private static String clearColor() {
+        return "clear";
+    }
+
+
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AADate.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AADate.java
new file mode 100644
index 0000000..a1d1caf
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AADate.java
@@ -0,0 +1,23 @@
+package com.github.AAChartModel.AAChartCore.AATools;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+
+
+public class AADate {
+    //   get UTC number from date
+    public static long AADateUTC(int year, int month, int day) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+        Date date = null;
+        try {
+            date = sdf.parse(year + "-" + month + "-" + day);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return date.getTime();
+    }
+}
\ No newline at end of file
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAGradientColor.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAGradientColor.java
new file mode 100644
index 0000000..bd58a7a
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAGradientColor.java
@@ -0,0 +1,292 @@
+package com.github.AAChartModel.AAChartCore.AATools;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AAGradientColor {
+    public static Map<String, Object> OceanBlue = oceanBlueColor();
+    public static Map<String, Object> Sanguine = sanguineColor();
+    public static Map<String, Object> LusciousLime = lusciousLimeColor();
+    public static Map<String, Object> PurpleLake = purpleLakeColor();
+    public static Map<String, Object> FreshPapaya = freshPapayaColor();
+    public static Map<String, Object> Ultramarine = ultramarineColor();
+    public static Map<String, Object> PinkSugar = pinkSugarColor();
+    public static Map<String, Object> LemonDrizzle = lemonDrizzleColor();
+    public static Map<String, Object> VictoriaPurple = victoriaPurpleColor();
+    public static Map<String, Object> SpringGreens = springGreensColor();
+    public static Map<String, Object> MysticMauve = mysticMauveColor();
+    public static Map<String, Object> ReflexSilver = reflexSilverColor();
+    public static Map<String, Object> NeonGlow = neonGlowColor();
+    public static Map<String, Object> BerrySmoothie = berrySmoothieColor();
+    public static Map<String, Object> NewLeaf = newLeafColor();
+    public static Map<String, Object> CottonCandy = cottonCandyColor();
+    public static Map<String, Object> PixieDust = pixieDustColor();
+    public static Map<String, Object> FizzyPeach = fizzyPeachColor();
+    public static Map<String, Object> SweetDream = sweetDreamColor();
+    public static Map<String, Object> Firebrick = firebrickColor();
+    public static Map<String, Object> WroughtIron = wroughtIronColor();
+    public static Map<String, Object> DeepSea = deepSeaColor();
+    public static Map<String, Object> CoastalBreeze = coastalBreezeColor();
+    public static Map<String, Object> EveningDelight = eveningDelightColor();
+
+
+    private static Map<String, Object> oceanBlueColor() {
+        return oceanBlueColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> sanguineColor() {
+        return sanguineColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> lusciousLimeColor() {
+        return lusciousLimeColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> purpleLakeColor() {
+        return purpleLakeColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> freshPapayaColor() {
+        return freshPapayaColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> ultramarineColor() {
+        return ultramarineColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> pinkSugarColor() {
+        return pinkSugarColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> lemonDrizzleColor() {
+        return lemonDrizzleColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> victoriaPurpleColor() {
+        return victoriaPurpleColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> springGreensColor() {
+        return springGreensColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> mysticMauveColor() {
+        return mysticMauveColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> reflexSilverColor() {
+        return reflexSilverColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> neonGlowColor() {
+        return neonGlowColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> berrySmoothieColor() {
+        return berrySmoothieColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> newLeafColor() {
+        return newLeafColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> cottonCandyColor() {
+        return cottonCandyColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> pixieDustColor() {
+        return pixieDustColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> fizzyPeachColor() {
+        return fizzyPeachColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> sweetDreamColor() {
+        return sweetDreamColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> firebrickColor() {
+        return firebrickColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> wroughtIronColor() {
+        return wroughtIronColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> deepSeaColor() {
+        return deepSeaColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> coastalBreezeColor() {
+        return coastalBreezeColor(AALinearGradientDirection.ToTop);
+    }
+
+    private static Map<String, Object> eveningDelightColor() {
+        return eveningDelightColor(AALinearGradientDirection.ToTop);
+    }
+
+
+    public static Map<String, Object> oceanBlueColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#2E3192", "#1BFFFF");
+    }
+
+    public static Map<String, Object> sanguineColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#D4145A", "#FBB03B");
+    }
+
+    public static Map<String, Object> lusciousLimeColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#009245", "#FCEE21");
+    }
+
+    public static Map<String, Object> purpleLakeColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#662D8C", "#ED1E79");
+    }
+
+    public static Map<String, Object> freshPapayaColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#ED1C24", "#FCEE21");
+    }
+
+    public static Map<String, Object> ultramarineColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#00A8C5", "#FFFF7E");
+    }
+
+    public static Map<String, Object> pinkSugarColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#D74177", "#FFE98A");
+    }
+
+    public static Map<String, Object> lemonDrizzleColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#FB872B", "#D9E021");
+    }
+
+    public static Map<String, Object> victoriaPurpleColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#312A6C", "#852D91");
+    }
+
+    public static Map<String, Object> springGreensColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#009E00", "#FFFF96");
+    }
+
+    public static Map<String, Object> mysticMauveColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#B066FE", "#63E2FF");
+    }
+
+    public static Map<String, Object> reflexSilverColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#808080", "#E6E6E6");
+    }
+
+    public static Map<String, Object> neonGlowColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#00FFA1", "#00FFFF");
+    }
+
+    public static Map<String, Object> berrySmoothieColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#8E78FF", "#FC7D7B");
+    }
+
+    public static Map<String, Object> newLeafColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#00537E", "#3AA17E");
+    }
+
+    public static Map<String, Object> cottonCandyColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#FCA5F1", "#B5FFFF");
+    }
+
+    public static Map<String, Object> pixieDustColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#D585FF", "#00FFEE");
+    }
+
+    public static Map<String, Object> fizzyPeachColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#F24645", "#EBC08D");
+    }
+
+    public static Map<String, Object> sweetDreamColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#3A3897", "#A3A1FF");
+    }
+
+    public static Map<String, Object> firebrickColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#45145A", "#FF5300");
+    }
+
+    public static Map<String, Object> wroughtIronColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#333333", "#5A5454");
+    }
+
+    public static Map<String, Object> deepSeaColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#4F00BC", "#29ABE2");
+    }
+
+    public static Map<String, Object> coastalBreezeColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#00B7FF", "#FFFFC7");
+    }
+
+    public static Map<String, Object> eveningDelightColor(AALinearGradientDirection direction) {
+        return linearGradient(direction, "#93278F", "#00A99D");
+    }
+
+    public static Map<String, Object> linearGradient(String startColor,
+                                                     String endColor) {
+        return linearGradient(AALinearGradientDirection.ToTop, startColor, endColor);
+    }
+
+    public static Map<String, Object> linearGradient(
+            AALinearGradientDirection direction,
+            String startColor,
+            String endColor
+    ) {
+        return linearGradient(direction, new Object[][]{
+                {0, startColor},
+                {1, endColor},
+        });
+    }
+
+    public static Map<String, Object> linearGradient(
+            AALinearGradientDirection direction,
+            Object[][] stopsArr
+    ) {
+        Map<String, Object> linearGradientColorMap = new HashMap<>();
+        linearGradientColorMap.put("linearGradient", linearGradientMap(direction));
+        linearGradientColorMap.put("stops", stopsArr);
+        return linearGradientColorMap;
+    }
+
+    /**
+     * (0,0) ----------- (1,0)
+     * |                   |
+     * |                   |
+     * |                   |
+     * |                   |
+     * |                   |
+     * (0,1) ----------- (1,1)
+     */
+    private static Map<String, Integer> linearGradientMap(AALinearGradientDirection direction) {
+        switch (direction) {
+            case ToTop:
+                return linearGradientMap(0, 1, 0, 0);
+            case ToBottom:
+                return linearGradientMap(0, 0, 0, 1);
+            case ToLeft:
+                return linearGradientMap(1, 0, 0, 0);
+            case ToRight:
+                return linearGradientMap(0, 0, 1, 0);
+            case ToTopLeft:
+                return linearGradientMap(1, 1, 0, 0);
+            case ToTopRight:
+                return linearGradientMap(0, 1, 1, 0);
+            case ToBottomLeft:
+                return linearGradientMap(1, 0, 0, 1);
+            case ToBottomRight:
+                return linearGradientMap(0, 0, 1, 1);
+            default:
+                return null;
+        }
+    }
+
+    private static Map<String, Integer> linearGradientMap(int x1, int y1, int x2, int y2) {
+        Map<String, Integer> linearGradientMap = new HashMap<>();
+        linearGradientMap.put("x1", x1);
+        linearGradientMap.put("y1", y1);
+        linearGradientMap.put("x2", x2);
+        linearGradientMap.put("y2", y2);
+        return linearGradientMap;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAJSStringPurer.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAJSStringPurer.java
new file mode 100644
index 0000000..57b1d44
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AAJSStringPurer.java
@@ -0,0 +1,26 @@
+package com.github.AAChartModel.AAChartCore.AATools;
+
+public class AAJSStringPurer {
+
+    public static String pureJavaScriptFunctionString(String JSStr)  {
+        String pureJSStr = JSStr;
+        pureJSStr = pureJSStr.replace("'", "\"");
+        pureJSStr = pureJSStr.replace("\0", "");
+        pureJSStr = pureJSStr.replace("\n", "");
+        pureJSStr = pureJSStr.replace("\\", "\\\\");
+        pureJSStr = pureJSStr.replace("\"", "\\\"");
+        pureJSStr = pureJSStr.replace("\n", "\\n");
+        pureJSStr = pureJSStr.replace("\r", "\\r");
+        pureJSStr = pureJSStr.replace("\f", "\\f");
+        pureJSStr = pureJSStr.replace("\u2028", "\\u2028");
+        pureJSStr = pureJSStr.replace("\u2029","\\u2029" );
+        return pureJSStr;
+    }
+
+    //https://stackoverflow.com/questions/34334232/why-does-function-not-work-but-function-does-chrome-devtools-node
+    public static String pureAnonymousJSFunctionString(String JSStr)  {
+        String pureJSStr = "(" + JSStr + ")";
+        pureJSStr = pureJavaScriptFunctionString(pureJSStr);
+        return pureJSStr;
+    }
+}
diff --git a/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AALinearGradientDirection.java b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AALinearGradientDirection.java
new file mode 100644
index 0000000..80dd81e
--- /dev/null
+++ b/aa_chart_core/src/main/java/com/github/AAChartModel/AAChartCore/AATools/AALinearGradientDirection.java
@@ -0,0 +1,12 @@
+package com.github.AAChartModel.AAChartCore.AATools;
+
+public enum AALinearGradientDirection {
+    ToTop,           //鈬р嚙鈬р嚙鈬р嚙
+    ToBottom,        //鈬┾嚛鈬┾嚛鈬┾嚛
+    ToLeft,          //鈬︹嚘鈬︹嚘鈬︹嚘
+    ToRight,         //鈬ㄢ嚚鈬ㄢ嚚鈬ㄢ嚚
+    ToTopLeft,       //鈬栤嚃鈬栤嚃鈬栤嚃
+    ToTopRight,      //鈬椻嚄鈬椻嚄鈬椻嚄
+    ToBottomLeft,    //鈬欌嚈鈬欌嚈鈬欌嚈
+    ToBottomRight,   //鈬樷嚇鈬樷嚇鈬樷嚇
+}
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star1.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star1.png
new file mode 100644
index 0000000..76a17b7
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star1.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star2.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star2.png
new file mode 100644
index 0000000..ad253ac
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star2.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star3.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star3.png
new file mode 100644
index 0000000..70359f5
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star3.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star4.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star4.png
new file mode 100644
index 0000000..a4fa290
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star4.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star5.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star5.png
new file mode 100644
index 0000000..6fee053
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star5.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star6.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star6.png
new file mode 100644
index 0000000..c697389
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star6.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star7.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star7.png
new file mode 100644
index 0000000..0697759
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star7.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/drawable-xxhdpi/star8.png b/aa_chart_core/src/main/res/drawable-xxhdpi/star8.png
new file mode 100644
index 0000000..2e468da
--- /dev/null
+++ b/aa_chart_core/src/main/res/drawable-xxhdpi/star8.png
Binary files differ
diff --git a/aa_chart_core/src/main/res/values/attrs.xml b/aa_chart_core/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..ed19e34
--- /dev/null
+++ b/aa_chart_core/src/main/res/values/attrs.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="LyricsView">
+        <attr name="startOfVerseIndicatorPaddingTop" format="dimension" />
+        <attr name="startOfVerseIndicatorRadius" format="dimension" />
+        <attr name="startOfVerseIndicatorColor" format="reference|color" />
+        <attr name="paddingTop" format="dimension" />
+        <attr name="enablePreviousLines" format="boolean" />
+        <attr name="enableUpcomingLines" format="boolean" />
+        <attr name="lineSpacing" format="dimension" />
+        <attr name="textSize" format="dimension" />
+        <attr name="currentLineTextColor" format="reference|color" />
+        <attr name="previousLineTextColor" format="reference|color" />
+        <attr name="upcomingLineTextColor" format="reference|color" />
+        <attr name="currentLineTextSize" format="dimension" />
+        <attr name="currentLineHighlightedTextColor" format="reference|color" />
+        <attr name="labelWhenNoLyrics" format="string" />
+        <attr name="enableDragging" format="boolean" />
+        <attr name="textGravity">
+            <enum name="center" value="0" />
+            <enum name="left" value="1" />
+            <enum name="right" value="2" />
+        </attr>
+    </declare-styleable>
+
+    <declare-styleable name="ScoringView">
+        <attr name="pitchIndicatorColor" format="reference|color" />
+        <attr name="pitchIndicatorRadius" format="dimension" />
+        <attr name="pitchStickHighlightedColor" format="reference|color" />
+        <attr name="pitchStickHeight" format="dimension" />
+        <attr name="initialScore" format="float" />
+        <attr name="movingPixelsPerMs" format="float" />
+        <attr name="hitScoreThreshold" format="float" />
+        <attr name="startPointHorizontalBias" format="float" />
+        <attr name="offProgressTimeThreshold" format="integer" />
+        <attr name="enableParticleEffect" format="boolean" />
+    </declare-styleable>
+</resources>
diff --git a/aa_chart_core/src/main/res/values/colors.xml b/aa_chart_core/src/main/res/values/colors.xml
new file mode 100644
index 0000000..7846b20
--- /dev/null
+++ b/aa_chart_core/src/main/res/values/colors.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="default_popular_color">#99FFFFFF</color>
+
+    <color name="previous_text_color">@color/default_popular_color</color>
+    <color name="upcoming_text_color">@color/default_popular_color</color>
+    <color name="highlighted_text_color">#FFF44336</color>
+
+    <color name="local_pitch_indicator_color">#F0F0F0F0</color>
+    <color name="local_pitch_indicator_emitter_color">#F44336</color>
+    <color name="pitch_stick_highlighted_color">#FFF44336</color>
+
+    <color name="leading_lines_color">#4DFFFFFF</color>
+    <color name="overpast_wall_start_color">#1F24C6FF</color>
+    <color name="overpast_wall_end_color">#00FFFFFF</color>
+</resources>
diff --git a/aa_chart_core/src/main/res/values/dimens.xml b/aa_chart_core/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..2ee2435
--- /dev/null
+++ b/aa_chart_core/src/main/res/values/dimens.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="normal_text_size">14sp</dimen>
+    <dimen name="current_text_size">16sp</dimen>
+    <dimen name="line_spacing">16dp</dimen>
+    <dimen name="padding_top">0dp</dimen>
+    <dimen name="start_of_verse_indicator_padding_top">8dp</dimen>
+    <dimen name="start_of_verse_indicator_radius">6dp</dimen>
+    <dimen name="pitch_stick_height">6dp</dimen>
+    <dimen name="local_pitch_indicator_radius">8dp</dimen>
+</resources>
diff --git a/aa_chart_core/src/main/res/values/strings.xml b/aa_chart_core/src/main/res/values/strings.xml
new file mode 100644
index 0000000..21be8f8
--- /dev/null
+++ b/aa_chart_core/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+    <string name="no_lyrics_label">鏆傛棤姝岃瘝</string>
+</resources>
diff --git a/app/build.gradle b/app/build.gradle
index a889e97..cd070c5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -28,9 +28,9 @@
     defaultConfig {
         applicationId "com.hdl.photovoltaic"
         minSdk 23
-        targetSdk 28
+        targetSdk 30
         versionCode 1
-        versionName "1.3.3"//鐗堟湰瑙勫垯1.3鏄骇鍝佸姛鑳借凯浠g敤鐨�,鏈�鍚庝竴浣�0鏄垜浠慨澶峛ug鐢ㄧ殑
+        versionName "1.4.0"//鐗堟湰瑙勫垯1.3鏄骇鍝佸姛鑳借凯浠g敤鐨�,鏈�鍚庝竴浣�0鏄垜浠慨澶峛ug鐢ㄧ殑
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         multiDexEnabled true
         manifestPlaceholders = mfph
@@ -121,14 +121,17 @@
     implementation 'androidx.navigation:navigation-fragment:2.3.5'
     implementation 'androidx.navigation:navigation-ui:2.3.5'
     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
-
+    //鏃堕棿搴�
+    implementation project(path: ':pickerview')
+    //鍥捐〃搴�
+    implementation project(path: ':aa_chart_core')
     //鍥藉鍒楄〃鍜屾墜鏈哄尯鍙峰簱
     implementation project(path: ':countrypicker')
     //浜岀淮鐮佸簱
     implementation project(path: ':third-zxing')
     //Link鏈湴搴擄紙鍦ㄧ嚎渚濊禆缃戠粶搴擄級
     implementation 'com.hdl.android:pmsdk:1.0.2'
-    implementation 'com.hdl.android:debugsdk:1.0.21'
+    implementation 'com.hdl.android:debugsdk:1.0.22'
 
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
@@ -140,8 +143,9 @@
 
     //Eventbus浜嬩欢鍙戝竷涓庢帴鏀�
     implementation 'org.greenrobot:eventbus:3.3.1'
-    //灞忓箷閫傞厤
+    //灞忓箷閫傞厤搴�
     implementation 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1'
+
 
     //鍥剧墖鍔犺浇搴�
     implementation 'com.github.bumptech.glide:glide:4.13.0'
@@ -176,13 +180,6 @@
     implementation 'cn.jiguang.sdk:jpush-google:5.2.2'
     //鍒嗘瀽鍜岀敤鎴锋爣绛剧瓑鍔熻兘(鍙�夛紝闆嗘垚鏋佸厜鍒嗘瀽SDK鍚庯紝鍗冲彲鏀寔琛屼负瑙﹀彂鎺ㄩ�佹秷鎭�佹帹閫佽浆鍖栫巼缁熻锛岀敤鎴疯涓哄垎)
     implementation 'cn.jiguang.sdk:joperate:2.0.2'
-
-    //PickerView
-    implementation 'com.contrarywind:Android-PickerView:4.1.9'
-
-
-
-
 
 
     //鑻ヤ笉闆嗘垚鍘傚晢閫氶亾锛屽彲鐩存帴璺宠繃浠ヤ笅渚濊禆
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index bdce55a..088a69e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -77,6 +77,21 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.PhotovoltaicDebug">
         <activity
+            android:name=".ui.me.ContactUsActivity"
+            android:exported="false" />
+        <activity
+            android:name=".ui.message.SearchMessageActivity"
+            android:exported="false" />
+        <activity
+            android:name=".ui.powerstation.DeviceSearchActivity"
+            android:exported="false" />
+        <activity
+            android:name=".ui.powerstation.HouseSearchActivity"
+            android:exported="false" />
+        <activity
+            android:name=".ui.home.HomePageFragment"
+            android:exported="false" />
+        <activity
             android:name=".ui.powerstation.HouseListEditActivity"
             android:exported="false" />
         <activity
@@ -143,10 +158,10 @@
             android:name=".ui.device.FastScanActivity"
             android:exported="false" />
         <activity
-            android:name=".ui.MyPowerStationActivity"
+            android:name=".ui.BPowerStationActivity"
             android:exported="false" />
         <activity
-            android:name=".ui.HomeLoginActivity"
+            android:name=".ui.LoginActivity"
             android:exported="false" />
         <activity android:name=".widget.apkwgtupload.AndroidPermissionActivity" />
         <activity
diff --git a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
index 3011dbc..ddf3bd9 100644
--- a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
+++ b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
@@ -1,43 +1,39 @@
 package com.hdl.photovoltaic;
 
+import android.app.Activity;
 import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.os.SystemClock;
 import android.text.TextUtils;
+import android.util.Log;
 
 
 import androidx.multidex.MultiDex;
 
 import com.hdl.hdlhttp.HxHttpConfig;
 import com.hdl.linkpm.sdk.HDLLinkPMSdk;
-import com.hdl.linkpm.sdk.core.exception.HDLException;
-import com.hdl.linkpm.sdk.home.type.HomeType;
 import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
 import com.hdl.linkpm.sdk.user.callback.IOnReloginListener;
 import com.hdl.linkpm.sdk.utils.HDLSDKSPUtils;
-import com.hdl.photovoltaic.bean.MqttInfo;
 import com.hdl.photovoltaic.config.AppConfigManage;
 import com.hdl.photovoltaic.config.ConstantManage;
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.enums.NetworkType;
-import com.hdl.photovoltaic.listener.CloudCallBeak;
 import com.hdl.photovoltaic.other.HdlLogLogic;
 import com.hdl.photovoltaic.other.HdlMessageLogic;
-import com.hdl.photovoltaic.other.HdlMqttLogic;
 import com.hdl.photovoltaic.other.HdlThreadLogic;
-import com.hdl.photovoltaic.ui.HomeLoginActivity;
+import com.hdl.photovoltaic.ui.LoginActivity;
 import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
 import com.hdl.photovoltaic.utils.AppManagerUtils;
 import com.hdl.photovoltaic.utils.LocalManageUtil;
 import com.hdl.photovoltaic.utils.NetworkUtils;
 import com.hdl.photovoltaic.utils.SharedPreUtils;
-import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
 import com.hdl.sdk.link.HDLLinkLocalSdk;
 import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
 import com.hdl.sdk.link.core.connect.HDLUdpConnect;
 import com.hdl.sdk.link.core.utils.QueueUtils;
-import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient;
 
 import org.greenrobot.eventbus.EventBus;
 
@@ -46,6 +42,10 @@
 
 import cn.jpush.android.api.JPushInterface;
 import io.dcloud.common.util.RuningAcitvityUtil;
+import me.jessyan.autosize.AutoSize;
+import me.jessyan.autosize.AutoSizeConfig;
+import me.jessyan.autosize.onAdaptListener;
+import me.jessyan.autosize.utils.ScreenUtils;
 import okhttp3.logging.HttpLoggingInterceptor;
 
 public class HDLApp extends Application {
@@ -68,11 +68,12 @@
     public void onCreate() {
         super.onCreate();
 
+        // 鑾峰彇褰撳墠杩涚▼鐨凱ID
+        Log.d("杩涚▼===", android.os.Process.myPid() + "");
         mHDLApp = this;
         SharedPreUtils.init(this);
         getAppLanguage();
-        initThirdSDK();
-//        appLocationInfo();
+        init();
     }
 
     public void getAppLanguage() {
@@ -117,7 +118,7 @@
     /**
      * 鍒濆鍖栦笁鏂圭浉鍏砈DK
      */
-    public void initThirdSDK() {
+    public void init() {
         // 灏忕▼搴忚繘绋�
         if (RuningAcitvityUtil.getAppName(getBaseContext()).contains(":")) {
             return;
@@ -137,6 +138,7 @@
 //        TypeUtils.compatibleWithFieldName = true;
 //        //9.鍒濆鍖栫綉缁滃伐鍏�
 //        NetWorkUtil.init(this);
+        initAutoSize();
         //鍒濆鍖栨瀬鍏夋帹閫�
         initJPush();
         initHDLLinkPMSdk();
@@ -209,8 +211,8 @@
                 }
                 SystemClock.sleep(200);
                 initDCUniMPSDK();
-                Intent intent = new Intent(getInstance(), HomeLoginActivity.class);
-                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                Intent intent = new Intent(getInstance(), LoginActivity.class);
+                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                 if (type == 1) {
                     intent.putExtra("isJpush", true);
                 }
@@ -299,6 +301,35 @@
 
     }
 
+    /**
+     * 钃濇箹涓� 淇敼瀹藉害 640dp 瀹藉害鎸夌収dp銆乻p鏉ラ�傞厤
+     * 鏃嬭浆鍚庨珮鍙樺,鎸夋棆杞悗楂樺害閫傞厤,鎵�浠ュ搴︿笉鍐欐
+     */
+    private void initAutoSize() {
+        AutoSize.initCompatMultiProcess(this);
+        boolean isBaseOnWidth = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
+        AutoSizeConfig.getInstance()
+                .setBaseOnWidth(true)
+                .setCustomFragment(true)
+                .setDesignWidthInDp(375)
+                .setDesignHeightInDp(812)
+                .setUseDeviceSize(false)
+                .setOnAdaptListener(new onAdaptListener() {
+                    @Override
+                    public void onAdaptBefore(Object target, Activity activity) {
+
+                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
+                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1] +
+                                ScreenUtils.getHeightOfNavigationBar(activity) + ScreenUtils.getStatusBarHeight());
+
+                    }
+
+                    @Override
+                    public void onAdaptAfter(Object target, Activity activity) {
+
+                    }
+                });
+    }
 
     /**
      * 鍒濆鍖杣ni app mqtt
@@ -322,4 +353,6 @@
         MultiDex.install(base);
         super.attachBaseContext(base);
     }
+
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/base/BaseDialog.java b/app/src/main/java/com/hdl/photovoltaic/base/BaseDialog.java
index 082298e..4afe44c 100644
--- a/app/src/main/java/com/hdl/photovoltaic/base/BaseDialog.java
+++ b/app/src/main/java/com/hdl/photovoltaic/base/BaseDialog.java
@@ -1,5 +1,6 @@
 package com.hdl.photovoltaic.base;
 
+import android.app.Activity;
 import android.app.Dialog;
 import android.content.Context;
 import android.graphics.Color;
@@ -8,6 +9,7 @@
 import androidx.annotation.NonNull;
 
 import com.hdl.photovoltaic.R;
+import com.jaeger.library.StatusBarUtil;
 
 public class BaseDialog extends Dialog {
 
@@ -20,6 +22,7 @@
         setNotificationBarBackgroundColor(CustomColor.white);
     }
 
+
     /**
      * 淇敼鐘舵�佹爮瀛椾綋棰滆壊锛堥粦鑹诧級
      */
diff --git a/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java b/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java
index 47d5c03..abecc76 100644
--- a/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java
@@ -9,6 +9,7 @@
 
 import com.hdl.photovoltaic.R;
 import com.hdl.photovoltaic.utils.LocalManageUtil;
+import com.jaeger.library.StatusBarUtil;
 
 import java.util.Locale;
 
@@ -23,6 +24,12 @@
 
 
     }
+    //    灏哠tatusBar璁剧疆涓洪�忔槑
+    public void setStatusBarTranslucent() {
+        StatusBarUtil.setTranslucentForImageViewInFragment(this,
+                0, null);
+        StatusBarUtil.setLightMode(this);
+    }
 
     /**
      * 淇敼鐘舵�佹爮瀛椾綋棰滆壊锛堥粦鑹诧級
diff --git a/app/src/main/java/com/hdl/photovoltaic/bean/PageNumberObject.java b/app/src/main/java/com/hdl/photovoltaic/bean/PageNumberObject.java
new file mode 100644
index 0000000..f73b6c9
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/bean/PageNumberObject.java
@@ -0,0 +1,61 @@
+package com.hdl.photovoltaic.bean;
+
+import com.hdl.photovoltaic.ui.bean.MessageBean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PageNumberObject<T> implements Serializable {
+    //鎬绘潯鏁�
+    private long totalCount;
+    //鎬婚〉鏁�
+    private long totalPage;
+    //褰撳墠椤�
+    private long pageNo;
+    //椤垫暟
+    private long pageSize;
+    //娑堟伅鍒楄〃
+    private List<T> list;
+
+    public long getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(long totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public long getTotalPage() {
+        return totalPage;
+    }
+
+    public void setTotalPage(long totalPage) {
+        this.totalPage = totalPage;
+    }
+
+    public long getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(long pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public long getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(long pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public List<T> getList() {
+        return list == null ? new ArrayList<>() : list;
+    }
+
+    public void setList(List<T> list) {
+        this.list = list;
+    }
+}
+
diff --git a/app/src/main/java/com/hdl/photovoltaic/enums/GridType.java b/app/src/main/java/com/hdl/photovoltaic/enums/GridType.java
new file mode 100644
index 0000000..27cc4b5
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/enums/GridType.java
@@ -0,0 +1,8 @@
+package com.hdl.photovoltaic.enums;
+
+public @interface GridType {
+    String All = "";//鍏ㄩ儴
+    String FULL_GRID = "FULL_GRID";//骞剁綉
+    String OFFLINE = "OFFLINE";//绂荤綉
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/enums/HomepageTitleTabSwitch.java b/app/src/main/java/com/hdl/photovoltaic/enums/HomepageTitleTabSwitch.java
index 21fbf07..9374129 100644
--- a/app/src/main/java/com/hdl/photovoltaic/enums/HomepageTitleTabSwitch.java
+++ b/app/src/main/java/com/hdl/photovoltaic/enums/HomepageTitleTabSwitch.java
@@ -4,6 +4,7 @@
  * App鐨凢ragment鐨則ab
  */
 public enum HomepageTitleTabSwitch {
+    homepage,//棣栭〉
     powerstation,//鐢电珯
     message,//娑堟伅
     me,//鎴戠殑
diff --git a/app/src/main/java/com/hdl/photovoltaic/enums/PowerStationStatus.java b/app/src/main/java/com/hdl/photovoltaic/enums/PowerStationStatus.java
new file mode 100644
index 0000000..9ede726
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/enums/PowerStationStatus.java
@@ -0,0 +1,10 @@
+package com.hdl.photovoltaic.enums;
+
+public @interface PowerStationStatus {
+    String All = "";//鍏ㄩ儴
+    String normal = "1";//姝e父(杩愯)
+    String off = "2";//绂荤嚎
+    String connecting = "3";//杩炴帴涓�(寰呮帴鍏�)
+    String malfunction = "4";//鏁呴殰
+    String off_malfunction = "4";//绂荤嚎鏈夋晠闅�
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/enums/SortType.java b/app/src/main/java/com/hdl/photovoltaic/enums/SortType.java
new file mode 100644
index 0000000..c8dfdce
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/enums/SortType.java
@@ -0,0 +1,45 @@
+package com.hdl.photovoltaic.enums;
+
+/**
+ * 鎺掑簭绫诲瀷
+ */
+public @interface SortType {
+
+    String homeName = "homeName";//
+    /**
+     * 鐢电珯鍚嶇О鎺掑簭
+     */
+    String homeNameSort = "homeNameSort";//鐢电珯鍚嶇О鎺掑簭
+    /**
+     * 鍙戠數鍔熺巼鎺掑簭
+     */
+    String powerSort = "powerSort";//鍙戠數鍔熺巼鎺掑簭
+    /**
+     * 浠婃棩鍙戠數閲忔帓搴�
+     */
+    String todayElectricitySort = "todayElectricitySort";//浠婃棩鍙戠數閲忔帓搴�
+    /**
+     * 褰撴湀鍙戠數閲�
+     */
+    String monthElectricitySort = "monthElectricitySort";//褰撴湀鍙戠數閲�
+    /**
+     * 鍒涘缓鏃堕棿鎺掑簭
+     */
+    String createTimeSort = "createTimeSort";//鍒涘缓鏃堕棿鎺掑簭
+    /**
+     * installedCapacityMin	鏈�灏忕粍涓插閲�(瑁呮満瀹归噺)
+     */
+    String installedCapacityMin = "installedCapacityMin";//installedCapacityMin	鏈�灏忕粍涓插閲�(瑁呮満瀹归噺)
+    /**
+     * 澶х粍涓插閲�(瑁呮満瀹归噺)
+     */
+    String installedCapacityMax = "installedCapacityMax";//澶х粍涓插閲�(瑁呮満瀹归噺)
+    /**
+     * 骞剁綉鐘舵��
+     */
+    String gridType = "gridType";//骞剁綉鐘舵��
+    /**
+     * 鐢电珯鐘舵��
+     */
+    String powerStationStatus = "powerStationStatus";//鐢电珯鐘舵��
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/enums/SortValue.java b/app/src/main/java/com/hdl/photovoltaic/enums/SortValue.java
new file mode 100644
index 0000000..0788e39
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/enums/SortValue.java
@@ -0,0 +1,7 @@
+package com.hdl.photovoltaic.enums;
+
+public @interface SortValue {
+    String all = "";//鍏ㄩ儴
+    String descending = "descending";//闄嶅簭
+    String ascending = "ascending";//鍗囧簭
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/enums/TimeType.java b/app/src/main/java/com/hdl/photovoltaic/enums/TimeType.java
new file mode 100644
index 0000000..689238c
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/enums/TimeType.java
@@ -0,0 +1,16 @@
+package com.hdl.photovoltaic.enums;
+
+import androidx.annotation.StringDef;
+
+@StringDef({TimeType.day, TimeType.month, TimeType.year, TimeType.all})
+public @interface TimeType {
+    //澶�
+    String day = "day";
+    //鏈�
+    String month = "month";
+    //骞�
+    String year = "year";
+    //鐢熷懡鍛ㄦ湡
+    String all = "all";
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/HttpClient.java b/app/src/main/java/com/hdl/photovoltaic/internet/HttpClient.java
index a72776c..a74978c 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/HttpClient.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/HttpClient.java
@@ -72,15 +72,15 @@
      */
     private Disposable requestPost(String api, String body, CloudCallBeak<String> callBack) {
         String requestUrl = HDLCloudUserApi.getRequestUrl(api);
-        HdlLogLogic.print("http->鍙戦��->" + requestUrl + "\r\n" + body, isAddToMemory);
+        HdlLogLogic.print("http---鍙戦��---" + requestUrl + "\r\n" + body, isAddToMemory);
         //寮�鍙戠幆澧冮渶瑕佸姞(鐢ㄦ潵鍖哄垎onpro鍜屽厜浼廰pp浠g爜):HxHttp.builder().headers("x-lbs-version", "hdl-yt")
         return HxHttp.builder().url(requestUrl).raw(body).build().post().subscribeWith(new HDLResponse<String>() {
             @Override
             public void onResponse(String str) {
                 if (callBack != null) {
                     callBack.onSuccess(str);
-//                          System.out.println("http->鍥炲->" + requestUrl + "\r\n" + gson.fromJson(str, JsonObject.class).toString());
-                    HdlLogLogic.print("http->鍥炲->" + requestUrl + "\r\n" + str, isAddToMemory);
+//                          System.out.println("http---鍥炲---" + requestUrl + "\r\n" + gson.fromJson(str, JsonObject.class).toString());
+                    HdlLogLogic.print("http---鍥炲---" + requestUrl + "\r\n" + str, isAddToMemory);
                 }
             }
 
@@ -89,7 +89,7 @@
                 HDLExceptionSubmitUtils.submit(requestUrl, body, e);
                 if (callBack != null) {
                     callBack.onFailure(e);
-                    HdlLogLogic.print("http->鍥炲->" + requestUrl + "\r\n" + "\"{code=\"" + e.getCode() + "," + "\"message=\"" + e.getMsg() + "}", isAddToMemory);
+                    HdlLogLogic.print("http---鍥炲---" + requestUrl + "\r\n" + "\"{code=\"" + e.getCode() + "," + "\"message=\"" + e.getMsg() + "}", isAddToMemory);
                 }
             }
         });
@@ -109,14 +109,14 @@
 
 
         String requestUrl = HDLCloudUserApi.getRequestUrl(api);
-        HdlLogLogic.print("http->鍙戦��->" + requestUrl + "\r\n" + body, isAddToMemory);
+        HdlLogLogic.print("http---鍙戦��---" + requestUrl + "\r\n" + body, isAddToMemory);
         return HxHttp.builder().url(requestUrl).file(body).build().post().subscribeWith(new HDLResponse<String>() {
             @Override
             public void onResponse(String str) {
                 if (callBack != null) {
                     callBack.onSuccess(str);
-//                          System.out.println("http->鍥炲->" + requestUrl + "\r\n" + gson.fromJson(str, JsonObject.class).toString());
-                    HdlLogLogic.print("http->鍥炲->" + requestUrl + "\r\n" + str, isAddToMemory);
+//                          System.out.println("http---鍥炲---" + requestUrl + "\r\n" + gson.fromJson(str, JsonObject.class).toString());
+                    HdlLogLogic.print("http---鍥炲---" + requestUrl + "\r\n" + str, isAddToMemory);
                 }
             }
 
@@ -125,7 +125,7 @@
                 HDLExceptionSubmitUtils.submit(requestUrl, body, e);
                 if (callBack != null) {
                     callBack.onFailure(e);
-                    HdlLogLogic.print("http->鍥炲->" + requestUrl + "\r\n" + "\"{code=\"" + e.getCode() + "," + "\"message=\"" + e.getMsg() + "}", isAddToMemory);
+                    HdlLogLogic.print("http---鍥炲---" + requestUrl + "\r\n" + "\"{code=\"" + e.getCode() + "," + "\"message=\"" + e.getMsg() + "}", isAddToMemory);
                 }
             }
         });
@@ -242,7 +242,7 @@
             @Override
             public void run() {
                 try {
-                    HdlLogLogic.print("http->鍙戦��->" + fullUrl + "\r\n" + json, isAddToMemory);
+                    HdlLogLogic.print("http---鍙戦��---" + fullUrl + "\r\n" + json, isAddToMemory);
                     OkHttpClient okHttpClient = new OkHttpClient();
                     RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), getJson(json));
                     final Request request = new Request.Builder().url(fullUrl)//璇锋眰鐨剈rl
@@ -252,7 +252,7 @@
                         if (response.isSuccessful()) {
                             String s = Objects.requireNonNull(response.body()).string();
                             HttpResponsePack httpResponsePack = new Gson().fromJson(s, HttpResponsePack.class);
-                            HdlLogLogic.print("http->鍥炲->" + response.request().url() + "\r\n" + s, isAddToMemory);
+                            HdlLogLogic.print("http---鍥炲---" + response.request().url() + "\r\n" + s, isAddToMemory);
                             baseSuccessCallBeak.onSuccess(httpResponsePack);
 
                         } else {
@@ -265,7 +265,7 @@
                         call.enqueue(new Callback() {//寮傛
                             @Override
                             public void onFailure(@NonNull Call call, @NonNull IOException e) {
-                                HdlLogLogic.print("http->鍥炲->" + "\r\n" + e.getMessage(), isAddToMemory);
+                                HdlLogLogic.print("http---鍥炲---" + "\r\n" + e.getMessage(), isAddToMemory);
                             }
 
                             @Override
@@ -275,7 +275,7 @@
                                     String s = Objects.requireNonNull(response.body()).string();
                                     HttpResponsePack httpResponsePack = new Gson().fromJson(s, HttpResponsePack.class);
                                     baseSuccessCallBeak.onSuccess(httpResponsePack);
-                                    HdlLogLogic.print("http->鍥炲->" + "\r\n" + s, isAddToMemory);
+                                    HdlLogLogic.print("http---鍥炲---" + "\r\n" + s, isAddToMemory);
                                 } else {
                                     baseSuccessCallBeak.onFailure(new HDLException(response.code(), response.message()));
                                 }
@@ -284,7 +284,7 @@
                     }
                 } catch (Exception e) {
                     baseSuccessCallBeak.onFailure(new HDLException(-100, e.getMessage()));
-                    HdlLogLogic.print("http->鍥炲->" + "\r\n" + e.getMessage(), isAddToMemory);
+                    HdlLogLogic.print("http---鍥炲---" + "\r\n" + e.getMessage(), isAddToMemory);
                 }
 
             }
diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java b/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java
index 208556b..3cc1df8 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpServer.java
@@ -119,7 +119,7 @@
                     //鍝嶅簲瀹㈡埛绔�
                     Response response = newFixedLengthResponse(newByte);
                     response.addHeader("Content-Range", range + "/" + sourceDataByte.length);//浼熷崡闇�瑕佽繖涓瓧娈�
-                    HdlLogLogic.print("http鍥炲鏁版嵁===璇锋眰澶у皬-->" + range + "=====鏂囦欢澶у皬-->" + sourceDataByte.length, true);
+                    HdlLogLogic.print("http鍥炲鏁版嵁===璇锋眰澶у皬--" + range + "=====鏂囦欢澶у皬--" + sourceDataByte.length, true);
                     return response;
                 }
             }
diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpService.java b/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpService.java
index f0a065b..99228dc 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpService.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/HttpServer/MyNanoHttpService.java
@@ -48,7 +48,7 @@
 //                }
 //
 //            }
-            HdlLogLogic.print("鍒濆鍖朒ttp鏈嶅姟鍣ㄥけ璐�--->" + e.getMessage(), true);
+            HdlLogLogic.print("鍒濆鍖朒ttp鏈嶅姟鍣ㄥけ璐�---" + e.getMessage(), true);
             startService(new Intent(this, MyNanoHttpService.class));
         }
     }
diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java b/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
index b7dfcbe..f4a2918 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
@@ -54,7 +54,7 @@
     //娣诲姞閫嗗彉鍣�
     public static final String POST_Device_Add = "/home-wisdom/program/device/independentRegister";
     //鎵归噺娣诲姞閫嗗彉鍣�
-    public static final String POST_Device_Add_All= "/home-wisdom/program/device/batchIndependentRegister";
+    public static final String POST_Device_Add_All = "/home-wisdom/program/device/batchIndependentRegister";
     //鑾峰彇閫嗗彉鍣ㄥ垪琛�
     public static final String POST_Device_List = "/home-wisdom/app/device/inverter/list";
     //鍒犻櫎閫嗗彉鍣�
@@ -93,7 +93,15 @@
     //endregion
 
     //region **********銆怋绔帴鍙c��**********
+    //region -----棣栭〉妯″潡---------
+    //鑾峰彇缁熻姒傝鏁版嵁(鍏徃缁村害)
+    public static final String POST_Home_page_dataOverview = "/home-wisdom/app/powerStation/homePage/dataOverview";
+    //鍙戠數閲忕粺璁�(鍏徃缁村害)
+    public static final String POST_Home_page_statistics = "/home-wisdom/app/powerStation/homePage/statistics";
+    //绀句細璐$尞(鍏徃缁村害)
+    public static final String POST_Home_page_socialContribution = "/home-wisdom/app/powerStation/homePage/socialContribution";
 
+    //endregion
     //region -----鐢ㄦ埛绠$悊---------
     //鑾峰彇璐﹀彿鍖哄煙淇℃伅
     public static final String POST_RegionByUserAccount = "/smart-footstone/region/regionByUserAccount";
@@ -111,11 +119,19 @@
 
     //鑾峰彇鐢ㄦ埛璇︽儏淇℃伅
     public static final String B_POST_GET_USERINFO = "/basis-footstone/mgmt/user/oauth/getUserInfo";
+    //鑱旂郴鎴戜滑
+    public static final String B_POST_GET_UTIL_CONTACT = "/home-wisdom/app/powerStation/util/contact";
 
 
     //閫�鍑虹櫥褰�
     public static final String POST_GET_IMAGE_LOGOUT = "/basis-footstone/mgmt/user/oauth/logout";
     //endregion
+    //鑾峰彇璁惧鍒楄〃(瀹夎鍟�)
+    public static final String POST_deviceList = "/home-wisdom/app/powerStation/deviceList";
+    //鐢电珯鐘舵�佹瑙�(瀹夎鍟�)
+    public static final String POST_statusOverview = "/home-wisdom/app/powerStation/statusOverview";
+
+
     //endregion
 
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/api/TopicApi.java b/app/src/main/java/com/hdl/photovoltaic/internet/api/TopicApi.java
index b26a8f9..ff043d6 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/api/TopicApi.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/api/TopicApi.java
@@ -1,6 +1,40 @@
 package com.hdl.photovoltaic.internet.api;
 
 public class TopicApi {
+
+
+    /*
+     *閫嗗彉鍣ㄧ儹鐐归厤缃�
+     * */
+    public static final String DELETING_GATEWAY_HOTSPOT_EDIT = "/user/%s/custom/hotspot/edit";
+    /*
+     *閫嗗彉鍣ㄧ儹鐐硅幏鍙�
+     * */
+    public static final String DELETING_GATEWAY_HOTSPOT_GET = "/user/%s/custom/hotspot/get";
+
+
+    /*
+     *閫嗗彉鍣╳if閰嶇疆
+     * */
+    public static final String DELETING_GATEWAY_WIFI_EDIT = "/user/%s/custom/wifi/edit";
+    /*
+     *閫嗗彉鍣╳ifi鑾峰彇
+     * */
+    public static final String DELETING_GATEWAY_WIFI_GET = "/user/%s/custom/wifi/get";
+
+    /*
+     *閫嗗彉鍣╳ifi鐘舵�侀�氱煡
+     * */
+    public static final String DELETING_GATEWAY_WIFI_NOTIFY = "/user/%s/custom/wifi/notify";
+    /*
+     *閫嗗彉鍣ㄤ互澶綉閰嶇疆
+     * */
+    public static final String DELETING_GATEWAY_ETHERNET_EDIT = "/user/%s/custom/ethernet/edit";
+    /*
+     *閫嗗彉鍣ㄤ互澶綉鑾峰彇
+     * */
+    public static final String DELETING_GATEWAY_ETHERNET_GET = "/user/%s/custom/ethernet/get";
+
     /*
      *閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧鎷撴墤鍏崇郴
      *鍒犻櫎浠庣綉鍏�
diff --git a/app/src/main/java/com/hdl/photovoltaic/jpush/JPushReceiverService.java b/app/src/main/java/com/hdl/photovoltaic/jpush/JPushReceiverService.java
index 731fb64..aa577c5 100644
--- a/app/src/main/java/com/hdl/photovoltaic/jpush/JPushReceiverService.java
+++ b/app/src/main/java/com/hdl/photovoltaic/jpush/JPushReceiverService.java
@@ -29,7 +29,7 @@
      */
     public void onMessage(Context context, CustomMessage customMessage) {
 
-        HdlLogLogic.print("鏋佸厜--->鑷畾涔夋秷鎭洖璋�--->" + new Gson().toJson(customMessage), false);
+        HdlLogLogic.print("鏋佸厜---鑷畾涔夋秷鎭洖璋�---" + new Gson().toJson(customMessage), false);
     }
 
     /**
@@ -63,7 +63,7 @@
      * @param registrationId 娉ㄥ唽 id
      */
     public void onRegister(Context context, String registrationId) {
-        HdlLogLogic.print("鏋佸厜--->娉ㄥ唽鎴愬姛鍥炶皟Id:" + registrationId, false);
+        HdlLogLogic.print("鏋佸厜---娉ㄥ唽鎴愬姛鍥炶皟Id:" + registrationId, false);
     }
 
     /**
@@ -73,7 +73,7 @@
      * @param isConnected 闀胯繛鎺ョ姸鎬�
      */
     public void onConnected(Context context, boolean isConnected) {
-        HdlLogLogic.print("鏋佸厜--->闀胯繛鎺ョ姸鎬佸洖璋�:" + isConnected, false);
+        HdlLogLogic.print("鏋佸厜---闀胯繛鎺ョ姸鎬佸洖璋�:" + isConnected, false);
     }
 
     /**
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java
index 369ef0d..c866afe 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlCommonLogic.java
@@ -2,17 +2,27 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.os.SystemClock;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.google.gson.JsonObject;
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.EncodeHintType;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
+import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
+import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.utils.GlideUtils;
 
+import org.json.JSONObject;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.util.Hashtable;
 
 /**
@@ -122,4 +132,6 @@
         }
     }
 
+
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
index d364f58..ab8ab79 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -9,6 +9,7 @@
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.photovoltaic.bean.PageNumberObject;
 import com.hdl.photovoltaic.config.AppConfigManage;
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.internet.HttpClient;
@@ -19,9 +20,13 @@
 import com.hdl.photovoltaic.listener.LinkCallBack;
 import com.hdl.photovoltaic.ui.bean.CloudInverterChildDeviceBean;
 import com.hdl.photovoltaic.ui.bean.CloudInverterDeviceBean;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
 import com.hdl.photovoltaic.ui.bean.DeviceRemoteInfo;
 import com.hdl.photovoltaic.ui.bean.DeviceTimeBean;
+import com.hdl.photovoltaic.ui.bean.HouseInfoBean;
+import com.hdl.photovoltaic.ui.bean.MessageBean;
 import com.hdl.photovoltaic.ui.bean.OidBean;
+import com.hdl.photovoltaic.ui.bean.StatusOverviewBean;
 import com.hdl.sdk.link.HDLLinkLocalSdk;
 import com.hdl.sdk.link.common.config.TopicConstant;
 import com.hdl.sdk.link.common.exception.HDLLinkCode;
@@ -67,6 +72,27 @@
         return sHdlDeviceLogic;
     }
 
+    public static final String kWp = "kWp";
+    public static final String kWh = "kW.h";
+
+    public static final String kW = "kW";
+    private List<DeviceBean> mListDevice = new ArrayList<>();
+
+    public void clearDeviceList() {
+        if (mListDevice == null) {
+            return;
+        }
+        if (mListDevice.size() > 0) {
+            mListDevice.clear();
+        }
+    }
+
+    public List<DeviceBean> getDeviceList() {
+        if (mListDevice == null) {
+            return new ArrayList<>();
+        }
+        return mListDevice;
+    }
 
     /**
      * 鑾峰彇褰撳墠浣忓畢鐨勯�嗗彉鍣ㄥ垪琛�(鍖呮嫭浠庣殑閫嗗彉鍣�)
@@ -145,6 +171,129 @@
         }
     }
 
+    /**
+     * 鑾峰彇璁惧鍒楄〃(瀹夎鍟�)
+     *
+     * @param searchTxt 鎼滅储鍐呭
+     * @param pageNo    椤电爜
+     * @param pageSize  椤垫暟
+     */
+    public void getPowerStationDeviceList(String searchTxt, long pageNo, long pageSize, CloudCallBeak<PageNumberObject<DeviceBean>> cloudCallBeak) {
+        String requestUrl = HttpApi.POST_deviceList;
+        JsonObject json = new JsonObject();
+        if (!TextUtils.isEmpty(searchTxt)) {
+            json.addProperty("searchTxt", searchTxt);
+        }
+        json.addProperty("pageNo", pageNo);//椤电爜
+        json.addProperty("pageSize", pageSize);//椤垫暟
+//        json.addProperty("zoneType", zoneType);//鍖哄煙
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String jsonStr) {
+                if (TextUtils.isEmpty(jsonStr)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(new PageNumberObject<>());
+                    }
+                }
+                Gson gson = new Gson();
+                Type type = new TypeToken<PageNumberObject<DeviceBean>>() {
+                }.getType();
+                PageNumberObject<DeviceBean> pageNumberObject = gson.fromJson(jsonStr, type);
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onSuccess(pageNumberObject);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onFailure(e);
+                }
+            }
+        });
+    }
+
+    /**
+     * 鐢电珯鐘舵�佹瑙�(瀹夎鍟�)
+     */
+    public void getStatusOverview(CloudCallBeak<StatusOverviewBean> cloudCallBeak) {
+        String requestUrl = HttpApi.POST_statusOverview;
+        JsonObject json = new JsonObject();
+//        json.addProperty("zoneType", zoneType);//鍖哄煙
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String jsonStr) {
+                if (TextUtils.isEmpty(jsonStr)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(new StatusOverviewBean());
+                    }
+                }
+                Gson gson = new Gson();
+                StatusOverviewBean statusOverviewBean = gson.fromJson(jsonStr, StatusOverviewBean.class);
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onSuccess(statusOverviewBean);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onFailure(e);
+                }
+            }
+        });
+    }
+
+    /**
+     * 娣诲姞銆愯澶囧垪琛ㄣ�戝埌鏈湴缂撳瓨
+     *
+     * @param list -璁惧鍒楄〃
+     */
+    public void setListDevice(List<DeviceBean> list) {
+        try {
+            if (list == null || list.size() == 0) {
+                return;
+            }
+            if (this.mListDevice.size() == 0) {
+                this.mListDevice.addAll(list);
+                return;
+            }
+            for (int i = 0; i < list.size(); i++) {
+                this.setSingleDevice(list.get(i));
+            }
+        } catch (Exception ignored) {
+        }
+    }
+
+    /**
+     * 娣诲姞璁惧鍒板垪琛ㄩ噷闈�
+     *
+     * @param deviceBean -璁惧瀵硅薄
+     */
+    public void setSingleDevice(DeviceBean deviceBean) {
+        try {
+            if (deviceBean == null) {
+                return;
+            }
+            boolean if_boolean = false;
+            for (int i = 0; i < mListDevice.size(); i++) {
+                if (mListDevice.get(i).getOsn().equals(deviceBean.getOsn())) {
+                    //瀛樺湪鏇挎崲
+                    mListDevice.remove(i);
+                    mListDevice.add(i, deviceBean);
+                    if_boolean = true;
+                    break;
+                }
+            }
+            if (!if_boolean) {
+                //娌℃湁娣诲姞
+                this.mListDevice.add(deviceBean);
+            }
+        } catch (Exception e) {
+            String mes = e.getMessage();
+            HdlLogLogic.print("---" + mes);
+        }
+    }
 
     /**
      * 閫嗗彉鍣ㄤ笂浼犳暟鎹埌浜戠(鍖呮嫭:sid锛宱id)
@@ -167,19 +316,19 @@
                     @Override
                     public void onSuccess(List<OidBean> oidBeanList) {
                         if (oidBeanList == null) {
-                            HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "--->鏁版嵁鏄痭ull", true);
+                            HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "---鏁版嵁鏄痭ull", true);
                             return;
                         }
                         //澧為噺娣诲姞oid
                         updateOidAdd(homeId, oidBeanList, new CloudCallBeak<Boolean>() {
                             @Override
                             public void onSuccess(Boolean obj) {
-                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�(澧為噺)--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "--->\r\n鏁版嵁--->" + new Gson().toJson(oidBeanList), true);
+                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�(澧為噺)---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "---\r\n鏁版嵁---" + new Gson().toJson(oidBeanList), true);
                             }
 
                             @Override
                             public void onFailure(HDLException e) {
-                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�(澧為噺)--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
+                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�(澧為噺)---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
                             }
                         });
 
@@ -216,12 +365,12 @@
 //                        updateOidAdd(homeId, oidList, new CloudCallBeak<Boolean>() {
 //                            @Override
 //                            public void onSuccess(Boolean obj) {
-//                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac(), true);
+//                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac(), true);
 //                            }
 //
 //                            @Override
 //                            public void onFailure(HDLException e) {
-//                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
+//                                HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
 //                            }
 //                        });
 
@@ -229,12 +378,12 @@
                             fullUpdateOid(homeId, newOidList, new CloudCallBeak<Boolean>() {
                                 @Override
                                 public void onSuccess(Boolean obj) {
-                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�(鍏ㄩ噺)--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "--->\r\n鏁版嵁--->" + new Gson().toJson(newOidList), true);
+                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�(鍏ㄩ噺)---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "---\r\n鏁版嵁---" + new Gson().toJson(newOidList), true);
                                 }
 
                                 @Override
                                 public void onFailure(HDLException e) {
-                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�(鍏ㄩ噺)--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
+                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�(鍏ㄩ噺)---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
                                 }
                             });
                         }
@@ -245,19 +394,19 @@
                         atomicInteger.set(atomicInteger.get() + 1);
                         if (atomicInteger.get() == list.size()) {
                             if (newOidList.size() == 0) {
-                                HdlLogLogic.print("鑾峰彇閫嗗彉鍣╫id鍒楄〃澶辫触--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
+                                HdlLogLogic.print("鑾峰彇閫嗗彉鍣╫id鍒楄〃澶辫触---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
                                 return;
                             }
                             //澧為噺娣诲姞oid
                             updateOidAdd(homeId, newOidList, new CloudCallBeak<Boolean>() {
                                 @Override
                                 public void onSuccess(Boolean obj) {
-                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�(澧為噺)--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "--->\r\n鏁版嵁--->" + new Gson().toJson(newOidList), true);
+                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔垚鍔�(澧為噺)---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "---\r\n鏁版嵁---" + new Gson().toJson(newOidList), true);
                                 }
 
                                 @Override
                                 public void onFailure(HDLException e) {
-                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�(澧為噺)--->浣忓畢id:" + homeId + "--->mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
+                                    HdlLogLogic.print("涓婁紶oid鍒楄〃鍒颁簯绔け璐�(澧為噺)---浣忓畢id:" + homeId + "---mac:" + gatewayBean.getDevice_mac() + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
                                 }
                             });
                         }
@@ -471,7 +620,7 @@
      */
     public void fullUpdateOid(String homeId, List<OidBean> oidList, CloudCallBeak<Boolean> cloudCallBeak) {
         if (oidList == null || oidList.size() == 0) {
-            HdlLogLogic.print("oid鍒楄〃涓虹┖锛屾棤娉曞叏閲忔洿鏂皁id鍒颁簯绔�--->", true);
+            HdlLogLogic.print("oid鍒楄〃涓虹┖锛屾棤娉曞叏閲忔洿鏂皁id鍒颁簯绔�---", true);
             return;
         }
         String requestUrl = HttpApi.POST_Device_Oid;
@@ -526,7 +675,7 @@
      */
     public void updateOidAdd(String homeId, List<OidBean> oidList, CloudCallBeak<Boolean> cloudCallBeak) {
         if (oidList == null || oidList.size() == 0) {
-            HdlLogLogic.print("oid鍒楄〃涓虹┖锛屾棤娉曞閲忔坊鍔爋id鍒颁簯绔�--->", true);
+            HdlLogLogic.print("oid鍒楄〃涓虹┖锛屾棤娉曞閲忔坊鍔爋id鍒颁簯绔�---", true);
             return;
         }
         String requestUrl = HttpApi.POST_Device_IncrAdd;
@@ -557,7 +706,7 @@
                 if (cloudCallBeak != null) {
                     cloudCallBeak.onSuccess(true);
                 }
-                HdlLogLogic.print("澧為噺娣诲姞oid鍒颁簯绔垚鍔�--->");
+                HdlLogLogic.print("澧為噺娣诲姞oid鍒颁簯绔垚鍔�---");
             }
 
             @Override
@@ -565,7 +714,7 @@
                 if (cloudCallBeak != null) {
                     cloudCallBeak.onFailure(e);
                 }
-                HdlLogLogic.print("澧為噺娣诲姞oid鍒颁簯绔け璐�--->" + e.getMsg() + "(" + e.getCode() + ")", true);
+                HdlLogLogic.print("澧為噺娣诲姞oid鍒颁簯绔け璐�---" + e.getMsg() + "(" + e.getCode() + ")", true);
             }
         });
 
@@ -752,9 +901,9 @@
     /**
      * 鍒濆鍖栭�嗗彉鍣�
      *
-     * @param mac 缃戝叧mac
+     * @param mac 閫嗗彉鍣╩ac
      */
-    public void initializeGateway(String mac, LinkCallBack<Boolean> linkCallBack) {
+    public void initializeInverter(String mac, LinkCallBack<Boolean> linkCallBack) {
         String requestUrl = TopicApi.GATEWAY_INITIALIZE_REMOTE;
         JsonObject jObject = new JsonObject();
         jObject.addProperty("device_mac", mac);
@@ -773,7 +922,7 @@
                 if (linkCallBack != null) {
                     linkCallBack.onError(e);
                 }
-                HdlLogLogic.print("鍒濆鍖栭�嗗彉鍣ㄥけ璐�-->mac:" + mac + "--->" + e.getMsg() + "(" + e.getCode() + ")", true);
+                HdlLogLogic.print("鍒濆鍖栭�嗗彉鍣ㄥけ璐�-->mac:" + mac + "---" + e.getMsg() + "(" + e.getCode() + ")", true);
             }
         });
 
@@ -995,7 +1144,7 @@
                                             cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                                         }
                                     }
-                                    HdlLogLogic.print("鑾峰彇璁惧杩滅▼閫氳淇℃伅澶辫触--->msg--->" + e.getMsg() + "(" + e.getCode() + ")");
+                                    HdlLogLogic.print("鑾峰彇璁惧杩滅▼閫氳淇℃伅澶辫触---msg---" + e.getMsg() + "(" + e.getCode() + ")");
                                 }
                             });
                         }
@@ -1233,6 +1382,9 @@
     }
 
 
+
+
+
     /**
      * 鍒锋柊閫嗗彉鍣ㄧ紦瀛樹俊鎭�(鍖呮嫭璁剧疆mqtt绉橀挜锛�
      * 娉�:
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
index af09611..76133f3 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
@@ -99,6 +99,8 @@
         return getAPPInternalStoreFilesPath() + "/upgrade/firmware";
     }
 
+
+
     /**
      * 鑾峰彇銆愭棩蹇楁枃浠躲�戝叏璺緞
      */
@@ -165,7 +167,7 @@
             File file = new File(fullPath);
             if (!file.isDirectory()) {
                 boolean succeed = file.mkdirs();
-                System.out.println("鍒涘缓鏂囦欢澶硅矾寰�--->" + file.getAbsolutePath() + "===鍒涘缓鏂囦欢澶圭粨鏋�--->" + succeed);
+                System.out.println("鍒涘缓鏂囦欢澶硅矾寰�---" + file.getAbsolutePath() + "===鍒涘缓鏂囦欢澶圭粨鏋�---" + succeed);
                 return succeed;
             }
             return true;
@@ -198,7 +200,7 @@
             }
             // 鍒犻櫎鏂囦欢澶规湰韬�
             boolean succeed = fileRoot.delete();//鏂囦欢澶圭┖杩欎釜鏂规硶鎵嶆湁鏁�
-            System.out.println("鍒犻櫎鏂囦欢澶硅矾寰�--->" + fileRoot.getAbsolutePath() + "===鍒犻櫎缁撴灉--->" + succeed);
+            System.out.println("鍒犻櫎鏂囦欢澶硅矾寰�---" + fileRoot.getAbsolutePath() + "===鍒犻櫎缁撴灉---" + succeed);
         } catch (Exception e) {
             System.out.println("鍒犻櫎鏂囦欢澶规湁寮傚父===" + e.getMessage());
         }
@@ -221,7 +223,7 @@
             File file = new File(fullPath);
             if (!file.exists()) {
                 boolean succeed = file.createNewFile();
-                System.out.println("鍒涘缓鏂囦欢璺緞--->" + file.getAbsolutePath() + "===鍒涘缓鏂囦欢缁撴灉--->" + succeed);
+                System.out.println("鍒涘缓鏂囦欢璺緞---" + file.getAbsolutePath() + "===鍒涘缓鏂囦欢缁撴灉---" + succeed);
                 return succeed;
             }
             return true;
@@ -242,7 +244,7 @@
             File file = new File(fullPath);
             if (file.exists()) {
                 boolean succeed = file.delete();
-                System.out.println("鍒犻櫎鏂囦欢--->" + fullPath + "===缁撴灉--->" + succeed);
+                System.out.println("鍒犻櫎鏂囦欢---" + fullPath + "===缁撴灉---" + succeed);
                 return succeed;
             }
             return true;
@@ -273,9 +275,9 @@
             d.write(data);
             d.flush();
             d.close();
-            System.out.println("鍐欏叆鏂囦欢鎴愬姛--->" + fullPath);
+            System.out.println("鍐欏叆鏂囦欢鎴愬姛---" + fullPath);
         } catch (Exception e) {
-            System.out.println("鍐欏叆鏂囦欢鏈夊紓甯�--->" + e.getMessage());
+            System.out.println("鍐欏叆鏂囦欢鏈夊紓甯�---" + e.getMessage());
         }
 
     }
@@ -317,9 +319,9 @@
                 //鏂囦欢澶т簬1m,鍒犻櫎鏂囦欢鍓�100鏉℃棩蹇�
                 this.delFileLien(fullPath, 100);
             }
-//            System.out.println("鍐欏叆涓�琛屾暟鎹埌鏂囦欢鎴愬姛--->" + dataLine);
+//            System.out.println("鍐欏叆涓�琛屾暟鎹埌鏂囦欢鎴愬姛---" + dataLine);
         } catch (Exception e) {
-//            System.out.println("鍐欏叆涓�琛屾暟鎹埌鏂囦欢鏈夊紓甯�--->" + e.getMessage());
+            System.out.println("鍐欏叆涓�琛屾暟鎹埌鏂囦欢鏈夊紓甯�---" + e.getMessage());
         }
 
     }
@@ -342,10 +344,10 @@
             FileInputStream fis = new FileInputStream(f);
             byte[] bytes = FileUtils.readFileToByteArray(f);//杩欎釜鏂规硶涓嶅吋鐢╝ndroid 6.0
             fis.close();
-            System.out.println("璇诲彇鏂囦欢鎴愬姛--->" + filePath);
+            System.out.println("璇诲彇鏂囦欢鎴愬姛---" + filePath);
             return bytes;
         } catch (Exception e1) {
-            System.out.println("璇诲彇鏂囦欢鏈夊紓甯�--->" + e1.getMessage());
+            System.out.println("璇诲彇鏂囦欢鏈夊紓甯�---" + e1.getMessage());
             return null;
         }
 
@@ -374,10 +376,10 @@
             int len = bis.read(bytes);
             bis.close();
             fis.close();
-            System.out.println("璇诲彇鏂囦欢鎴愬姛--->" + filePath);
+            System.out.println("璇诲彇鏂囦欢鎴愬姛---" + filePath);
             return bytes;
         } catch (Exception e1) {
-            System.out.println("璇诲彇鏂囦欢鏈夊紓甯�--->" + e1.getMessage());
+            System.out.println("璇诲彇鏂囦欢鏈夊紓甯�---" + e1.getMessage());
             return null;
         }
 
@@ -420,7 +422,7 @@
             fileLength = f.length();
             return new FileInputStream(f);
         } catch (Exception e1) {
-            System.out.println("璇诲彇鏂囦欢鏈夊紓甯�--->" + e1.getMessage());
+            System.out.println("璇诲彇鏂囦欢鏈夊紓甯�---" + e1.getMessage());
             return null;
         }
 
@@ -504,7 +506,7 @@
      */
     public boolean isBoolean(String path) {
         if (path.contains("//") || path.contains("\\")) {
-            System.out.println("鏃犳晥鏂囦欢璺緞--->" + path);
+            System.out.println("鏃犳晥鏂囦欢璺緞---" + path);
             return false;
         }
         return true;
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlJpushLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlJpushLogic.java
index d968dc7..1755c8a 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlJpushLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlJpushLogic.java
@@ -9,7 +9,7 @@
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.enums.MessageStateType;
 import com.hdl.photovoltaic.jpush.JPushMessageInfoBean;
-import com.hdl.photovoltaic.ui.MyPowerStationActivity;
+import com.hdl.photovoltaic.ui.BPowerStationActivity;
 import com.hdl.photovoltaic.ui.bean.MessageBean;
 import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
 
@@ -52,7 +52,7 @@
             this.addPushDataToMemoryList(jPushMessageInfoBean);
             if (isOpened) {
                 //瀹夎鍟嗚烦杞晫闈�
-                Intent intent = new Intent(context, MyPowerStationActivity.class);
+                Intent intent = new Intent(context, BPowerStationActivity.class);
                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                 intent.putExtra("skip", "skip");//閲岄潰鍒ゆ柇鏈夎繖涓爣璇嗗氨璺宠浆鍒版秷鎭腑蹇冪晫闈�
                 context.startActivity(intent);
@@ -111,7 +111,7 @@
             messageBean.setTitle(jPushMessageInfoBean.getContent());
             messageBean.setDeviceDesc(jPushMessageInfoBean.getContent());
             HdlMessageLogic.getInstance().setListMessage(messageBean, 0);
-            HdlLogLogic.print("鏋佸厜鎺ㄩ��--->娣诲姞鍦ㄦ帹閫佹暟鎹埌缂撳瓨鍒楄〃涓�--->" + new Gson().toJson(jPushMessageInfoBean));
+            HdlLogLogic.print("鏋佸厜鎺ㄩ��---娣诲姞鍦ㄦ帹閫佹暟鎹埌缂撳瓨鍒楄〃涓�---" + new Gson().toJson(jPushMessageInfoBean));
         } catch (Exception ignored) {
         }
     }
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlLogLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlLogLogic.java
index 26259ec..ff3cde6 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlLogLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlLogLogic.java
@@ -1,6 +1,8 @@
 package com.hdl.photovoltaic.other;
 
 
+import android.util.LruCache;
+
 import com.google.gson.Gson;
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.utils.TimeUtils;
@@ -15,6 +17,8 @@
 
     //榛樿鎵撳嵃鏍囬
     private static String logTitle = "鑷畾涔夎緭鍑烘墦鍗颁俊鎭�";
+
+    private static Gson gson = new Gson();
 
     /**
      * java鎵撳嵃
@@ -55,16 +59,18 @@
      * @param isAddToMemory 鏄惁鍔犲叆鍐呭瓨(鏈湴鏃ュ織鐢ㄥ埌)
      */
     private static void printBase(String msg, String code, boolean isAddToMemory) {
-        CustomLogObject customLogObject = new CustomLogObject();
-        customLogObject.msgOrData = msg;
-        customLogObject.code = code;
-        String json = logTitle + (UserConfigManage.getInstance().isBAccount() ? "(B绔�):" : "(C绔�):");
-        json += customLogObject.getJointMessage();
-        if (isPrintLogcat) {
-            System.out.println(json);
-        }
-        if (isAddToMemory) {
-            writeLog(customLogObject.getJointMessage());
+        try {
+            CustomLogObject customLogObject = new CustomLogObject();
+            customLogObject.setMsgOrData(msg);
+            customLogObject.setCode(code);
+            String json = logTitle + (UserConfigManage.getInstance().isBAccount() ? "(B绔�)==" : "(C绔�)==") + gson.toJson(customLogObject);
+            if (isPrintLogcat) {
+                System.out.println(json);
+            }
+            if (isAddToMemory) {
+                writeLog(json);
+            }
+        } catch (Exception ignored) {
         }
     }
 
@@ -95,19 +101,30 @@
      * 鑷畾涔夋棩蹇楃被
      */
     static class CustomLogObject {
+
         //淇℃伅鎻忚堪
-        public String msgOrData = "";
+        private String msgOrData;
+
         //鐘舵�佺爜
-        public String code = "0";
+        private String code;
 
-        public String getJointMessage() {
-
-            if ("0".equals(code)) {
-                return msgOrData;
-            }
-            return msgOrData + "(" + code + ")";
-
+        public String getMsgOrData() {
+            return msgOrData == null ? "" : msgOrData;
         }
+
+        public void setMsgOrData(String msgOrData) {
+            this.msgOrData = msgOrData;
+        }
+
+        public String getCode() {
+            return code == null ? "0" : code;
+        }
+
+        public void setCode(String code) {
+            this.code = code;
+        }
+
+
     }
 
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlMessageLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlMessageLogic.java
index c3e0a85..8edfab2 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlMessageLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlMessageLogic.java
@@ -11,6 +11,7 @@
 import com.hdl.photovoltaic.internet.api.HttpApi;
 import com.hdl.photovoltaic.listener.CloudCallBeak;
 import com.hdl.photovoltaic.ui.bean.MessageBean;
+import com.hdl.photovoltaic.ui.bean.UnCountBean;
 
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -223,7 +224,7 @@
             }
         } catch (Exception e) {
             String mes = e.getMessage();
-            HdlLogLogic.print("--->" + mes);
+            HdlLogLogic.print("---" + mes);
         }
     }
 
@@ -254,7 +255,7 @@
             }
         } catch (Exception e) {
             String mes = e.getMessage();
-            HdlLogLogic.print("--->" + mes);
+            HdlLogLogic.print("---" + mes);
         }
     }
 
@@ -309,7 +310,7 @@
      *
      * @param cloudCallBeak -
      */
-    public void getMessageUntreatedCount(String homeId, CloudCallBeak<String> cloudCallBeak) {
+    public void getMessageUntreatedCount(String homeId, CloudCallBeak<UnCountBean> cloudCallBeak) {
         String requestUrl = HttpApi.POST_Message_UntreatedCount;
         JsonObject json = new JsonObject();
         if (!TextUtils.isEmpty(homeId)) {
@@ -318,8 +319,16 @@
         HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
             @Override
             public void onSuccess(String str) {
+                if (TextUtils.isEmpty(str)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(new UnCountBean());
+                    }
+                    return;
+                }
+
+                UnCountBean unCountBean = new Gson().fromJson(str, UnCountBean.class);
                 if (cloudCallBeak != null) {
-                    cloudCallBeak.onSuccess(str);
+                    cloudCallBeak.onSuccess(unCountBean);
                 }
             }
 
@@ -490,19 +499,31 @@
 
     }
 
+
     /**
-     * 鑾峰彇鎸囧畾椤电殑鑾峰彇娑堟伅鍒楄〃(鐢ㄤ簬C绔�)
+     * 鑾峰彇鎸囧畾椤电殑鑾峰彇娑堟伅鍒楄〃
      *
-     * @param homeId                  鐢电珯id
+     * @param homeId                  鐢电珯id(濉�""榛樿璐﹀彿涓嬫墍鏈夋秷鎭�)
      * @param pageNo                  椤电爜
      * @param messageStateType        all:鍏ㄩ儴,UNTREATED:鏈鐞�,PROCESSED:宸插鐞�;
      * @param deviceType_filter_key   绫诲瀷锛堣澶囷紝绛夌骇锛屾椂闂达級
      * @param deviceType_filter_value deviceType锛圛NV 锛氶�嗗彉鍣紱BMS 锛欱MS鎺у埗鐩掞紱BATTERY 锛氱數姹犲崟鍏冿級锛�
      *                                type锛團AULT 锛氭晠闅滐紱 WARN 锛氬憡璀︼紱 EVENT 锛氫簨浠�(鎻愮ず)锛夛紱
      *                                timeType锛圱ODAY 锛氫粖澶╋紱LAST_3_DAYS: 杩�3澶╋紱LAST_7_DAYS 锛氳繎7澶╋紱LAST_30_DAYS 锛氳繎30澶╋級锛�
+     * @param search_title            鎶ヨ鍚嶇О
      * @param cloudCallBeak           -
      */
-    public void getPageNoMessageList_C(String homeId, int pageNo, String messageStateType, String deviceType_filter_key, String deviceType_filter_value, String type_filter_key, String type_filter_value, String timeType_filter_key, String timeType_filter_value, CloudCallBeak<MessageListClass> cloudCallBeak) {
+    public void getPageNoMessageList(
+            String homeId,
+            int pageNo,
+            String messageStateType,
+            String deviceType_filter_key,
+            String deviceType_filter_value,
+            String type_filter_key,
+            String type_filter_value,
+            String timeType_filter_key,
+            String timeType_filter_value,
+            String search_title, CloudCallBeak<MessageListClass> cloudCallBeak) {
         String requestUrl = HttpApi.POST_Message_List;
         JsonObject json = new JsonObject();
         if (!TextUtils.isEmpty(homeId)) {
@@ -519,6 +540,9 @@
         }
         if (!TextUtils.isEmpty(timeType_filter_key) && !TextUtils.isEmpty(timeType_filter_value)) {
             json.addProperty(timeType_filter_key, timeType_filter_value);
+        }
+        if (!TextUtils.isEmpty(search_title)) {
+            json.addProperty("title", search_title);
         }
         json.addProperty("pageNo", pageNo);//椤电爜
         json.addProperty("pageSize", pageSize);//椤垫暟
@@ -619,13 +643,15 @@
     /**
      * 娑堟伅鍏ㄩ儴宸茶
      *
-     * @param homeId        娑堟伅id
+     * @param homeId        娑堟伅id(涓嶄紶宸茶鎵�鏈夌數绔欑殑锛屼紶鍊煎凡璇绘寚瀹氱數绔欑殑)
      * @param cloudCallBeak -
      */
     public void messageAllRead(String homeId, CloudCallBeak<Boolean> cloudCallBeak) {
         String requestUrl = HttpApi.POST_Message_AllRead;
         JsonObject json = new JsonObject();
-        json.addProperty("homeId", homeId);
+        if (!TextUtils.isEmpty(homeId)) {
+            json.addProperty("homeId", homeId);
+        }
         HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
             @Override
             public void onSuccess(String str) {
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java
index da664cc..4606be1 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java
@@ -536,12 +536,10 @@
         //-100:娌℃湁鏁版嵁;-101:娌℃湁md5绉橀挜;-102:md5绉橀挜涓嶅;-103:鏈夊紓甯�;
         if (zipData == null) {
             this.eventBusPost(fileFullPath, driver, -100, HDLApp.getInstance().getString(R.string.exception_unable_to_pull_up_the_cloud_upgrade_file_data));
-//            HdlLogLogic.print("鎷変笉鍒颁簯绔崌绾ф枃浠舵暟鎹�(-100)", true);
             return false;
         }
         if (TextUtils.isEmpty(md5)) {
             this.eventBusPost(fileFullPath, driver, -101, HDLApp.getInstance().getString(R.string.exception_failed_to_obtain_the_md5_key_of_the_upgrade_file_on_the_cloud));
-//            HdlLogLogic.print("鎷夸笉鍒颁簯绔笂鍗囩骇鏂囦欢md5绉橀挜(-101)", true);
             return false;
         }
         InputStream is = null;
@@ -555,7 +553,6 @@
             long total = zipData.contentLength();
             if (total == 0) {
                 this.eventBusPost(fileFullPath, driver, -102, HDLApp.getInstance().getString(R.string.exception_unable_to_pull_up_the_cloud_upgrade_file_data));
-//                HdlLogLogic.print("鎷変笉鍒颁簯绔崌绾ф枃浠舵暟鎹�(-102)", true);
                 return false;
             }
             fos = new FileOutputStream(file);
@@ -563,7 +560,6 @@
             while ((len = is.read(buf)) != -1) {
                 if (this.stopDownload) {
                     this.eventBusPost(fileFullPath, driver, -108, HDLApp.getInstance().getString(R.string.exception_the_user_cancels_downloading_the_upgrade_file));
-//                    HdlLogLogic.print("鐢ㄦ埛鍙栨秷涓嬭浇鍗囩骇鏂囦欢(-108)", true);
                     fos.flush();
                     fos.close();
                     is.close();
@@ -576,8 +572,7 @@
                 int progress = (int) (100 * sum * 1.0f / total);
                 if (sum != total) {
                     //涓嶇瓑浜�100閮借鎶�,绛変簬100澶勭悊鏁村潡閫昏緫瀹屼箣鍚庡啀鎶�100;
-                    this.eventBusPost(fileFullPath, driver, progress, "姝e父涓婃姤杩涘害鍊�--->" + progress);
-//                    HdlLogLogic.print("姝e父涓婃姤杩涘害鍊�--->" + progress, true);
+                    this.eventBusPost(fileFullPath, driver, progress, "姝e父涓婃姤杩涘害鍊�---" + progress);
                 }
             }
             fos.flush();
@@ -589,18 +584,15 @@
             byte[] decrypt = AesUtils.decrypt(bytes);
             if (decrypt == null) {
                 this.eventBusPost(fileFullPath, driver, -105, HDLApp.getInstance().getString(R.string.exception_failed_to_decrypt_the_upgrade_aes_file));
-//                HdlLogLogic.print("鍗囩骇鏂囦欢aes瑙e瘑澶辫触(-105)", true);
                 return false;
             }
             String fileMD5 = Md5Utils.encodeMD5(decrypt);
             if (TextUtils.isEmpty(fileMD5)) {
                 this.eventBusPost(fileFullPath, driver, -106, HDLApp.getInstance().getString(R.string.exception_failed_to_generate_md5_for_the_upgrade_file));
-//                HdlLogLogic.print("鍗囩骇鏂囦欢鐢熸垚md5澶辫触澶辫触(-106)", true);
                 return false;
             }
             if (!md5.equals(fileMD5)) {
                 this.eventBusPost(fileFullPath, driver, -107, HDLApp.getInstance().getString(R.string.exception_description_failed_to_compare_the_md5_of_the_upgrade_file));
-//                HdlLogLogic.print("鍗囩骇鏂囦欢md5姣斿澶辫触(-107)", true);
                 return false;
             }
             //todo 娉ㄦ剰:瑙e瘑涔嬪悗锛岃閲嶆柊鍐欐暟鎹�;
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlPowerStationDataStatisticsLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlPowerStationDataStatisticsLogic.java
new file mode 100644
index 0000000..b7475f0
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlPowerStationDataStatisticsLogic.java
@@ -0,0 +1,158 @@
+package com.hdl.photovoltaic.other;
+
+import android.text.TextUtils;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.photovoltaic.enums.TimeType;
+import com.hdl.photovoltaic.internet.HttpClient;
+import com.hdl.photovoltaic.internet.api.HttpApi;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.ui.bean.DataOverBean;
+import com.hdl.photovoltaic.ui.bean.SocialContributionBean;
+import com.hdl.photovoltaic.ui.bean.StatisticsBean;
+
+import java.lang.reflect.Type;
+import java.util.List;
+
+/**
+ * 鐢电珯鏁版嵁缁熻閫昏緫
+ */
+public class HdlPowerStationDataStatisticsLogic {
+    private static volatile HdlPowerStationDataStatisticsLogic sHdlPowerStationDataStatisticsLogic;
+
+    /**
+     * 鑾峰彇褰撳墠瀵硅薄
+     *
+     * @return HdlDeviceLogic
+     */
+    public static synchronized HdlPowerStationDataStatisticsLogic getInstance() {
+        if (sHdlPowerStationDataStatisticsLogic == null) {
+            synchronized (HdlPowerStationDataStatisticsLogic.class) {
+                if (sHdlPowerStationDataStatisticsLogic == null) {
+                    sHdlPowerStationDataStatisticsLogic = new HdlPowerStationDataStatisticsLogic();
+                }
+            }
+
+        }
+        return sHdlPowerStationDataStatisticsLogic;
+    }
+
+    /**
+     * 鑾峰彇缁熻姒傝鏁版嵁(鍏徃缁村害)
+     *
+     * @param cloudCallBeak 鍥炶皟
+     */
+    public void getDataOver(CloudCallBeak<DataOverBean> cloudCallBeak) {
+        String requestUrl = HttpApi.POST_Home_page_dataOverview;
+        JsonObject json = new JsonObject();
+        //json.addProperty("zoneType", "password");//鍖哄煙
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String jsonStr) {
+                if (TextUtils.isEmpty(jsonStr)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(null);
+                    }
+                }
+                Gson gson = new Gson();
+                DataOverBean dataOverBean = gson.fromJson(jsonStr, DataOverBean.class);
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onSuccess(dataOverBean);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onFailure(e);
+                }
+            }
+        });
+
+
+    }
+
+    /**
+     * 鍙戠數閲忕粺璁�(鍏徃缁村害)
+     *
+     * @param type          绫诲瀷(渚嬪:TimeType.day锛氭棩,TimeType.month锛氭湀,TimeType.year 锛� 骞�,TimeType.all 锛� 鐢熷懡鍛ㄦ湡)
+     * @param time          鏃堕棿(type=day(y/M/d),type=month(y/M),type=year(y) ,type = all 鍙笉浼狅紝浼犲�间篃涓嶄娇鐢�)
+     * @param cloudCallBeak 鍥炶皟
+     */
+    public void getStatistics(String type, String time, CloudCallBeak<List<StatisticsBean>> cloudCallBeak) {
+        String requestUrl = HttpApi.POST_Home_page_statistics;
+        JsonObject json = new JsonObject();
+        json.addProperty("dataType", "GE");//鍙戠數閲�
+        json.addProperty("type", type);//绫诲瀷
+        if (!TextUtils.isEmpty(time)) {
+            json.addProperty("time", time);//鏃堕棿
+        }
+        //json.addProperty("zoneType", "password");//鍖哄煙
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String jsonStr) {
+                if (TextUtils.isEmpty(jsonStr)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(null);
+                    }
+                }
+                Gson gson = new Gson();
+                Type typeToken = new TypeToken<List<StatisticsBean>>() {
+                }.getType();
+                List<StatisticsBean> list = gson.fromJson(jsonStr, typeToken);
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onSuccess(list);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onFailure(e);
+                }
+            }
+        });
+
+
+    }
+
+    /**
+     * 绀句細璐$尞(鍏徃缁村害)
+     *
+     * @param cloudCallBeak 鍥炶皟
+     */
+    public void getSocialContribution(CloudCallBeak<SocialContributionBean> cloudCallBeak) {
+        String requestUrl = HttpApi.POST_Home_page_socialContribution;
+        JsonObject json = new JsonObject();
+        //json.addProperty("zoneType", "password");//鍖哄煙
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String jsonStr) {
+                if (TextUtils.isEmpty(jsonStr)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(null);
+                    }
+                }
+                Gson gson = new Gson();
+                SocialContributionBean socialContributionBean = gson.fromJson(jsonStr, SocialContributionBean.class);
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onSuccess(socialContributionBean);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onFailure(e);
+                }
+            }
+        });
+
+
+    }
+
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlResidenceLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlResidenceLogic.java
index a21d962..e404185 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlResidenceLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlResidenceLogic.java
@@ -16,6 +16,8 @@
 import com.hdl.photovoltaic.listener.BaseSuccessFailureCallBeak;
 import com.hdl.photovoltaic.listener.CloudCallBeak;
 import com.hdl.photovoltaic.ui.bean.CloudInverterDeviceBean;
+import com.hdl.photovoltaic.ui.bean.ContactBean;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
 import com.hdl.photovoltaic.ui.bean.HouseInfoBean;
 import com.hdl.photovoltaic.ui.bean.HouseIdBean;
 import com.hdl.photovoltaic.ui.bean.MessageBean;
@@ -74,21 +76,68 @@
         this.houseInfoList = houseInfoList;
     }
 
+    public void clearHouseList() {
+        if (houseInfoList == null) {
+            return;
+        }
+        if (houseInfoList.size() > 0) {
+            houseInfoList.clear();
+        }
+    }
+
+
     /**
      * 鑾峰彇缂撳瓨浣忓畢ID鍒楄〃
      *
      * @return 浣忓畢ID鍒楄〃
      */
     public List<HouseIdBean> getHouseIdList() {
-        return houseIdList;
+        return mHouseIdList;
     }
 
-    public void setHouseIdList(List<HouseIdBean> houseIdList) {
-        if (houseIdList == null) {
-            houseIdList = new ArrayList<>();
+    public void setHouseIdList(List<HouseIdBean> list) {
+        if (list == null || list.size() == 0) {
+            return;
         }
-        this.houseIdList = houseIdList;
+        if (this.mHouseIdList.size() == 0) {
+            this.mHouseIdList.addAll(list);
+            return;
+        }
+        for (int i = 0; i < list.size(); i++) {
+            this.setSingleHouseId(list.get(i));
+        }
     }
+
+    /**
+     * 娣诲姞鐢电珯Id鍒板垪琛ㄩ噷闈�
+     *
+     * @param houseIdBean -鐢电珯Id瀵硅薄
+     */
+    public void setSingleHouseId(HouseIdBean houseIdBean) {
+        try {
+            if (houseIdBean == null) {
+                return;
+            }
+            boolean if_boolean = false;
+            for (int i = 0; i < mHouseIdList.size(); i++) {
+                if (mHouseIdList.get(i).getHomeId().equals(houseIdBean.getHomeId())) {
+                    //瀛樺湪鏇挎崲
+                    mHouseIdList.remove(i);
+                    mHouseIdList.add(i, houseIdBean);
+                    if_boolean = true;
+                    break;
+                }
+            }
+            if (!if_boolean) {
+                //娌℃湁娣诲姞
+                this.mHouseIdList.add(houseIdBean);
+            }
+        } catch (Exception e) {
+            String mes = e.getMessage();
+            HdlLogLogic.print("--->" + mes);
+        }
+    }
+
 
     /**
      * 鍒犻櫎鐢电珯
@@ -99,9 +148,9 @@
         if (TextUtils.isEmpty(houseId)) {
             return;
         }
-        for (int i = 0; i < houseIdList.size(); i++) {
-            if (houseIdList.get(i).getHomeId().equals(houseId)) {
-                houseIdList.remove(i);
+        for (int i = 0; i < mHouseIdList.size(); i++) {
+            if (mHouseIdList.get(i).getHomeId().equals(houseId)) {
+                mHouseIdList.remove(i);
                 break;
             }
         }
@@ -117,8 +166,8 @@
             return;
         }
         int index = -1;
-        for (int i = 0; i < houseIdList.size(); i++) {
-            if (houseIdList.get(i).getHomeId().equals(houseId)) {
+        for (int i = 0; i < mHouseIdList.size(); i++) {
+            if (mHouseIdList.get(i).getHomeId().equals(houseId)) {
                 index = i;
                 break;
             }
@@ -128,12 +177,12 @@
         }
         //index==0琛ㄧず鍙湁涓�涓厓绱犳垨鑰呭湪棣栦綅,涓嶉渶瑕佺Щ鍔ㄤ綅缃�
         if (index > 0) {
-            Collections.swap(houseIdList, index - 1, index);
+            Collections.swap(mHouseIdList, index - 1, index);
         }
     }
 
     //浣忓畢ID鍒楄〃
-    private List<HouseIdBean> houseIdList = new ArrayList<>();
+    private List<HouseIdBean> mHouseIdList = new ArrayList<>();
     //浣忓畢璇︽儏鍒楄〃
     private List<HouseInfoBean> houseInfoList = new ArrayList<>();
 
@@ -149,12 +198,12 @@
             @Override
             public void onSuccess(List<HouseIdBean> houseListBeanIDList) {
                 if (houseListBeanIDList != null && houseListBeanIDList.size() > 0) {
-                    houseIdList.clear();
-                    houseIdList.addAll(houseListBeanIDList);
+                    mHouseIdList.clear();
+                    mHouseIdList.addAll(houseListBeanIDList);
                     //璁板綍璇锋眰鏉℃暟
                     AtomicInteger atomicInteger = new AtomicInteger(0);
-                    for (int i = 0; i < houseIdList.size(); i++) {
-                        HouseIdBean houseIdBean = houseIdList.get(i);
+                    for (int i = 0; i < mHouseIdList.size(); i++) {
+                        HouseIdBean houseIdBean = mHouseIdList.get(i);
                         //鑾峰彇浣忓畢璇︽儏鍒楄〃
                         getResidenceInfo(houseIdBean.getHomeId(), new CloudCallBeak<HouseInfoBean>() {
                             @Override
@@ -169,7 +218,7 @@
                                     //娣诲姞鍒版湰鍦扮紦瀛�
                                     addHouseToLocalMemory(houseInfoBean);
                                 }
-                                if (atomicInteger.get() == houseIdList.size()) {
+                                if (atomicInteger.get() == mHouseIdList.size()) {
                                     //鏈�鍚庝竴鏉¢��鍑�
                                     if (cloudCallBeak != null) {
                                         cloudCallBeak.onSuccess(true);
@@ -181,7 +230,7 @@
                             @Override
                             public void onFailure(HDLException e) {
                                 atomicInteger.set(atomicInteger.get() + 1);
-                                if (atomicInteger.get() == houseIdList.size()) {
+                                if (atomicInteger.get() == mHouseIdList.size()) {
                                     //鏈�鍚庝竴鏉¢��鍑�
                                     if (cloudCallBeak != null) {
                                         cloudCallBeak.onFailure(e);
@@ -279,6 +328,94 @@
                         }
                     });
                 }
+
+            }
+
+            @Override
+            public void onFailure(HDLException exception) {
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onFailure(exception);
+                }
+            }
+        });
+
+
+    }
+
+    /**
+     * 鑾峰彇浣忓畢(鐢电珯)ID鍒楄〃
+     *
+     * @param key                  鍙戠數鍔熺巼鎺掑簭(powerSort);
+     *                             浠婃棩鍙戠數閲忔帓搴�(todayElectricitySort);
+     *                             鍒涘缓鏃堕棿鎺掑簭(createTimeSort);
+     * @param keyValue             (descending:闄嶅簭
+     *                             ascending:鍗囧簭),
+     * @param installedCapacityMin 鏈�灏忕粍涓插閲�(瑁呮満瀹归噺)
+     * @param installedCapacityMax 鏈�澶х粍涓插閲�(瑁呮満瀹归噺)
+     * @param gridType             骞剁綉鐘舵�� (鍏ㄩ儴 锛�"";FULL_GRID 锛� 骞剁綉;OFFLINE 锛氱缃�)
+     * @param powerStationStatus   鐢电珯鐘舵�� (鍏ㄩ儴  锛�"";1 锛� 姝e父;2 锛� 绂荤嚎; 3 锛� 寰呮帴鍏�;4 锛� 鏁呴殰)
+     * @param pageNo               椤电爜
+     * @param pageSize             椤垫暟锛堜竴椤靛灏戞暟鎹級
+     */
+    public void getResidenceIdList(
+            String key,
+            String keyValue,
+            String installedCapacityMin,
+            String installedCapacityMax,
+            String gridType,
+            String powerStationStatus,
+            long pageNo, long pageSize, CloudCallBeak<HouseBeanClass> cloudCallBeak) {
+
+        String requestUrl = HttpApi.POST_PowerStation_List;
+        JsonObject json = new JsonObject();
+        if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(keyValue)) {
+            json.addProperty(key, keyValue);//鍙戠數鍔熺巼鎺掑簭(descending:闄嶅簭ascending:鍗囧簭)
+        }
+        if (!TextUtils.isEmpty(installedCapacityMin)) {
+            try {
+                int value = Integer.parseInt(installedCapacityMin);//鍙兘鏈夊紓甯�,鐢ㄦ埛杈撳叆鍊艰秴鏃秈nt鏈�澶ц嚧瀵艰嚧鐨�
+                json.addProperty("installedCapacityMin", value);
+            } catch (Exception ignored) {
+            }
+        }
+        if (!TextUtils.isEmpty(installedCapacityMax)) {
+            try {
+                int value = Integer.parseInt(installedCapacityMax);//鍙兘鏈夊紓甯�,鐢ㄦ埛杈撳叆鍊艰秴鏃秈nt鏈�澶ц嚧瀵艰嚧鐨�
+                json.addProperty("installedCapacityMax", value);
+            } catch (Exception ignored) {
+            }
+        }
+        if (!TextUtils.isEmpty(gridType)) {
+            try {
+                json.addProperty("gridType", gridType);
+            } catch (Exception ignored) {
+            }
+        }
+        if (!TextUtils.isEmpty(powerStationStatus)) {
+            try {
+                int value = Integer.parseInt(powerStationStatus);
+                json.addProperty("powerStationStatus", value);
+            } catch (Exception ignored) {
+            }
+        }
+//        json.addProperty("zoneType", "password");//鍖哄煙
+        json.addProperty("pageNo", pageNo);//椤电爜
+        json.addProperty("pageSize", pageSize);//椤垫暟
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String jsonStr) {
+                if (TextUtils.isEmpty(jsonStr)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(new HouseBeanClass());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                HouseBeanClass houseInfoBeanClass = gson.fromJson(jsonStr, HouseBeanClass.class);
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onSuccess(houseInfoBeanClass);
+                }
+
 
             }
 
@@ -556,6 +693,41 @@
 
     }
 
+
+    /**
+     * 鑱旂郴鎴戜滑
+     *
+     * @param cloudCallBeak -
+     */
+    public void getResidenceUtilContact(CloudCallBeak<ContactBean> cloudCallBeak) {
+        String requestUrl = HttpApi.B_POST_GET_UTIL_CONTACT;
+        JsonObject json = new JsonObject();
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String jsonStr) {
+                if (TextUtils.isEmpty(jsonStr)) {
+                    if (cloudCallBeak != null) {
+                        cloudCallBeak.onSuccess(new ContactBean());
+                        return;
+                    }
+                }
+                ContactBean contactBean = new Gson().fromJson(jsonStr, ContactBean.class);
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onSuccess(contactBean);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (cloudCallBeak != null) {
+                    cloudCallBeak.onFailure(e);
+                }
+            }
+        });
+
+
+    }
+
     /**
      * 鑾峰彇鐢ㄦ埛鑷畾涔夐厤缃俯搴﹀崟浣嶈鎯�
      *
@@ -566,7 +738,6 @@
         JsonObject json = new JsonObject();
 //        json.addProperty("homeId", homeId);
 
-        List<MessageBean> list = new ArrayList<>();
         HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
             @Override
             public void onSuccess(String jsonStr) {
@@ -655,9 +826,9 @@
      * @return 鍒楄〃绱㈠紩
      */
     public HouseIdBean getHouseId(String homeId) {
-        for (int i = 0; i < houseIdList.size(); i++) {
-            if (houseIdList.get(i).getHomeId().equals(homeId)) {
-                return houseIdList.get(i);
+        for (int i = 0; i < mHouseIdList.size(); i++) {
+            if (mHouseIdList.get(i).getHomeId().equals(homeId)) {
+                return mHouseIdList.get(i);
             }
         }
         return null;
@@ -760,7 +931,7 @@
 
     }
 
-    static class HouseBeanClass {
+    public static class HouseBeanClass {
 
         //鎬绘潯鏁�
         private long totalCount;
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
index 2cd8d7b..f764262 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
@@ -10,13 +10,11 @@
 import android.location.Location;
 import android.location.LocationManager;
 import android.os.IBinder;
+import android.provider.Settings;
 import android.text.TextUtils;
-import android.view.View;
-import android.widget.TextView;
 
 import androidx.core.app.ActivityCompat;
 
-import com.alibaba.fastjson.JSON;
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
@@ -36,6 +34,7 @@
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.internet.HttpServer.MyNanoHttpServer;
 import com.hdl.photovoltaic.internet.TcpClient;
+import com.hdl.photovoltaic.internet.api.HttpApi;
 import com.hdl.photovoltaic.internet.api.TopicApi;
 import com.hdl.photovoltaic.listener.CloudCallBeak;
 import com.hdl.photovoltaic.listener.LinkCallBack;
@@ -45,6 +44,7 @@
 import com.hdl.photovoltaic.ui.bean.Geolocation;
 import com.hdl.photovoltaic.ui.bean.LinkBean;
 import com.hdl.photovoltaic.ui.bean.OidBean;
+import com.hdl.photovoltaic.ui.bean.UnCountBean;
 import com.hdl.photovoltaic.ui.me.AsRegardsActivity;
 import com.hdl.photovoltaic.ui.me.PersonalDataActivity;
 import com.hdl.photovoltaic.ui.me.SetActivity;
@@ -54,7 +54,6 @@
 import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
 import com.hdl.photovoltaic.utils.NetworkUtils;
 import com.hdl.photovoltaic.utils.WifiUtils;
-import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
 import com.hdl.sdk.link.common.exception.HDLLinkCode;
 import com.hdl.sdk.link.common.exception.HDLLinkException;
 import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
@@ -66,17 +65,21 @@
 import com.hdl.sdk.link.core.connect.HDLModBusConnect;
 import com.hdl.sdk.link.core.connect.HDLUdpConnect;
 import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+import com.huawei.hms.api.Api;
 
 import org.greenrobot.eventbus.EventBus;
 import org.json.JSONObject;
 
 
 import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -89,6 +92,8 @@
  */
 public class HdlUniLogic implements HDLUniMPSDKManager.IOnOtherUniMPEventCallBack {
     private static volatile HdlUniLogic sHdlUniLogic;
+
+    public final static String separator="---";
 
     /**
      * 鑾峰彇褰撳墠瀵硅薄
@@ -126,8 +131,8 @@
             }
             String type = getKeyValue("type", data);//灏忕被
             String logTag = getKeyValue("logTag", data);//鏍囪uni鎸囦护
-            String mode_type = "澶х被->" + topic + "--->" + "灏忕被->" + type;//鐢ㄦ潵鎵撳嵃鐨�
-            HdlLogLogic.print(logTag + ":" + "uni--->鍙戦��--->" + mode_type + "\r\n" + data, true);
+            String mode_type = "澶х被-" + topic + "---" + "灏忕被-" + type;//鐢ㄦ潵鎵撳嵃鐨�
+            HdlLogLogic.print(logTag + ":" + "uni---鍙戦��---" + mode_type + "\r\n" + data, true);
             if (HDLUniMP.UNI_EVENT_REPLY_USER_MODEL.equals(topic)) {
                 //鐢ㄦ埛妯″潡
                 switch (type) {
@@ -236,7 +241,6 @@
                     case HDLUniMP.UNI_EVENT_REPLY_DEVICE_TIME: {
                         this.uniGetInverterTime(mode_type, data, callback);
                     }
-
                     break;
                     //閫嗗彉鍣ㄦ椂闂寸紪杈�
                     case HDLUniMP.UNI_EVENT_REPLY_DEVICE_TIME_EDIT: {
@@ -268,6 +272,11 @@
                         this.uniGetMessageNumber(mode_type, data, callback);
                     }
                     break;
+                    //鍒濆鍖栭�嗗彉鍣�
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_INITIALIZEINVERTER: {
+                        this.setInitializeGateway(mode_type, data, callback);
+                    }
+                    break;
 
                 }
 
@@ -275,23 +284,54 @@
                 WifiUtils wifiUtils = WifiUtils.getInstance();
                 //wifi妯″潡
                 switch (type) {
-                    //鑾峰彇wifi鍒楄〃
-                    case HDLUniMP.UNI_EVENT_REPLY_WIFI_LIST: {
+                    //鑾峰彇鎵嬫満wifi鍒楄〃
+                    case HDLUniMP.UNI_EVENT_REPLY_PHONE_WIFI_LIST: {
                         if (callback != null) {
                             uniCallbackData(mode_type, wifiUtils.getScanResult(), callback);
                         }
                     }
                     break;
-                    //褰撳墠wifi璇︽儏
-                    case HDLUniMP.UNI_EVENT_REPLY_WIFI_INFO: {
+                    //鑾峰彇鎵嬫満褰撳墠wifi璇︽儏
+                    case HDLUniMP.UNI_EVENT_REPLY_PHONE_WIFI_INFO: {
                         if (callback != null) {
                             uniCallbackData(mode_type, wifiUtils.getCurrentConnectWifiInfo(), callback);
                         }
                     }
                     break;
-                    //wifi杩炴帴
-                    case HDLUniMP.UNI_EVENT_REPLY_WIFI_CONNECT: {
-
+                    //鎵撳紑鎵嬫満Wifi璁剧疆鐣岄潰
+                    case HDLUniMP.UNI_EVENT_REPLY_PHONE_OPEN_WIFI_SETTINGS: {
+                        Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
+                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                        HDLApp.getInstance().startActivity(intent);
+                    }
+                    //閫嗗彉鍣╓iFi淇℃伅閰嶇疆
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_WIFI_SET: {
+                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_WIFI_EDIT, callback);
+                    }
+                    break;
+                    //閫嗗彉鍣╓iFi淇℃伅鑾峰彇
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_WIFI_GET: {
+                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_WIFI_GET, callback);
+                    }
+                    break;
+                    //閫嗗彉鍣ㄧ儹鐐归厤缃�
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_HOTSPOT_SET: {
+                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_HOTSPOT_EDIT, callback);
+                    }
+                    break;
+                    //閫嗗彉鍣ㄧ儹鐐硅幏鍙�
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_HOTSPOT_GET: {
+                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_HOTSPOT_GET, callback);
+                    }
+                    break;
+                    //閫嗗彉鍣ㄤ互澶綉閰嶇疆
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_ETHERNET_SET: {
+                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_ETHERNET_EDIT, callback);
+                    }
+                    break;
+                    //閫嗗彉鍣ㄤ互澶綉鑾峰彇
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_ETHERNET_GET: {
+                        uniGetAndSetNetwork(mode_type, data, TopicApi.DELETING_GATEWAY_ETHERNET_GET, callback);
                     }
                     break;
 
@@ -376,49 +416,6 @@
                     break;
 
                 }
-            } else if (HDLUniMP.UNI_EVENT_REPLY_OTHER_MODEL.equals(topic)) {
-                //鍏跺畠妯″潡
-                switch (type) {
-                    //鑾峰彇娓╁害鍗曚綅
-                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_UNIT: {
-                        uniCallbackData(mode_type, UserConfigManage.getInstance().getTemperature_unit(), callback);
-                    }
-                    break;
-                    //鑾峰彇褰撳墠app璇█
-                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_APP_LANGUAGE: {
-                        uniCallbackData(mode_type, UserConfigManage.getInstance().getCurrentAppLanguage(), callback);
-                    }
-                    break;
-                    //鑾峰彇浣嶇疆淇℃伅
-                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_LOCATION_INFO: {
-                        this.uniGetLocationInfo(mode_type, data, callback);
-                    }
-                    break;
-                    //搴旂敤鍐茬獊
-                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_APPLICATION_CONFLICT: {
-                        if (callback != null) {
-                            uniCallbackData(type, HDLUdpConnect.getInstance().isBindSuccess(), callback);
-                        }
-                    }
-                    break;
-                    //涓撻棬鏀堕泦uni鏃ュ織
-                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_UNI_LOG: {
-                        String customizeContentFormat = getKeyValue("customizeContentFormat", getKeyValue("data", data));
-                        HdlLogLogic.print("uni--->log--->" + customizeContentFormat, true);
-
-                    }
-                    break;
-                    //uni涓婚〉鐐瑰嚮杩斿洖閫氱煡
-                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_BACK: {
-                        //EventBus浜嬩欢鍒嗗彂
-                        BaseEventBus baseEventBus = new BaseEventBus();
-                        baseEventBus.setTopic(HDLUniMP.UNI_EVENT_REPLY_OTHER_MODEL);
-                        baseEventBus.setType(HDLUniMP.UNI_EVENT_REPLY_OTHER_BACK);
-                        EventBus.getDefault().post(baseEventBus);
-
-                    }
-                    break;
-                }
             } else if (HDLUniMP.UNI_EVENT_REPLY_MINE_MODEL.equals(topic)) {
                 //鎴戠殑妯″潡
                 switch (type) {
@@ -460,15 +457,64 @@
                         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                         intent.setClass(HDLApp.getInstance(), SetActivity.class);
                         HDLApp.getInstance().startActivity(intent);
+
                     }
                     break;
 
 
                 }
+            } else if (HDLUniMP.UNI_EVENT_REPLY_OTHER_MODEL.equals(topic)) {
+                //鍏跺畠妯″潡
+                switch (type) {
+                    //鑾峰彇娓╁害鍗曚綅
+                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_UNIT: {
+                        uniCallbackData(mode_type, UserConfigManage.getInstance().getTemperature_unit(), callback);
+                    }
+                    break;
+                    //鑾峰彇褰撳墠app璇█
+                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_APP_LANGUAGE: {
+                        uniCallbackData(mode_type, UserConfigManage.getInstance().getCurrentAppLanguage(), callback);
+                    }
+                    break;
+                    //鑾峰彇浣嶇疆淇℃伅
+                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_LOCATION_INFO: {
+                        this.uniGetLocationInfo(mode_type, data, callback);
+                    }
+                    break;
+                    //搴旂敤鍐茬獊
+                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_APPLICATION_CONFLICT: {
+                        if (callback != null) {
+                            uniCallbackData(type, HDLUdpConnect.getInstance().isBindSuccess(), callback);
+                        }
+                    }
+                    break;
+                    //涓撻棬鏀堕泦uni鏃ュ織
+                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_UNI_LOG: {
+                        String customizeContentFormat = getKeyValue("customizeContentFormat", getKeyValue("data", data));
+                        HdlLogLogic.print("uni---log---" + customizeContentFormat, true);
+
+                    }
+                    break;
+                    //uni涓婚〉鐐瑰嚮杩斿洖閫氱煡
+                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_BACK: {
+                        //EventBus浜嬩欢鍒嗗彂
+                        BaseEventBus baseEventBus = new BaseEventBus();
+                        baseEventBus.setTopic(HDLUniMP.UNI_EVENT_REPLY_OTHER_MODEL);
+                        baseEventBus.setType(HDLUniMP.UNI_EVENT_REPLY_OTHER_BACK);
+                        EventBus.getDefault().post(baseEventBus);
+
+                    }
+                    break;
+                    //uni閫氱煡鍘熺敓閫�鍑虹櫥褰�
+                    case HDLUniMP.UNI_EVENT_REPLY_OTHER_LOGOUT: {
+                        HDLLinkPMUser.getInstance().logout(0);
+                    }
+                    break;
+                }
             }
 
         } catch (Exception e) {
-            HdlLogLogic.print("uni--->鍙戦��--->" + e.getMessage(), true);
+            HdlLogLogic.print("uni---鍙戦��---" + e.getMessage(), true);
         }
 
     }
@@ -483,7 +529,7 @@
     public void openUniMP(String path, JSONObject jsonObject) {
         JSONObject json = this.createdJSONObject(jsonObject, true);
         HDLUniMPSDKManager.getInstance().openUniMP(HDLUniMP.UNI_APP_ID, path, json, HdlUniLogic.this);
-        HdlLogLogic.print("uni--->缁勮uni鍙戦�佹暟鎹牸寮�--->" + json, false);
+        HdlLogLogic.print("uni---缁勮uni鍙戦�佹暟鎹牸寮�---" + json, false);
     }
 
     /**
@@ -497,7 +543,7 @@
         try {
             HDLUniMPSDKManager.getInstance().sendUniMPEvent(HDLUniMP.UNI_APP_ID, topic, getJSONObject(callBackBaseBean));
         } catch (Exception e) {
-            HdlLogLogic.print("uni--->鍘熺敓涓诲姩鍚戝皬绋嬪簭鍙戦�侀�氱煡浜嬩欢--->" + e.getMessage(), false);
+            HdlLogLogic.print("uni---鍘熺敓涓诲姩鍚戝皬绋嬪簭鍙戦�侀�氱煡浜嬩欢---" + e.getMessage(), false);
         }
     }
 
@@ -510,6 +556,41 @@
     //endregion
 
     //region ******uni鎺ュ彛鏂规硶******
+
+
+    /**
+     * 鑾峰彇鎴栬�呴厤缃�嗗彉鍣ㄧ綉缁滐紙鍖呮嫭閫嗗彉鍣ㄧ儹鐐癸紝wifi锛屼互澶綉锛変俊鎭�
+     */
+    private void uniGetAndSetNetwork(String type, Object data, String TopicApi, DCUniMPJSCallback callback) {
+        String mac = getKeyValue("mac", getKeyValue("data", data));
+        JsonObject jObject = null;
+        String attribute_data = getKeyValue("attribute_data", getKeyValue("data", data));
+        if (!TextUtils.isEmpty(attribute_data)) {
+            try {
+                jObject = new Gson().fromJson(attribute_data, JsonObject.class);
+            } catch (Exception ignored) {
+                jObject = new JsonObject();
+            }
+        }
+        //瑙e瘑璐熻浇鏁版嵁(鍐欏瘑閽ョ粰缃戝叧涓�瀹氭槸鏄庢枃锛屽洜涓洪偅鏃剁綉鍏宠繕娌℃湁瀵嗛挜)
+        TcpClient.getInstance().sendDataToLinkGateway(mac, false, TopicApi, jObject, "", new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                if (callback != null) {
+                    uniCallbackData(type, msg, callback);
+                }
+
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                if (callback != null) {
+                    uniCallbackData(type, null, e.getCode(), e.getMsg(), callback);
+                }
+            }
+        });
+    }
+
 
     /**
      * 鑾峰彇浣嶇疆淇℃伅,鍖呮嫭缁忕含搴�
@@ -640,7 +721,7 @@
                     String[] ary = path.split("/");
                     String[] driverInfoAry = ary[ary.length - 1].split("_");
                     DeviceFirmwareBean deviceFirmwareBean = new DeviceFirmwareBean();
-                    deviceFirmwareBean.setOid(driverInfoAry[0]);
+                    deviceFirmwareBean.setImageId(driverInfoAry[0]);
                     deviceFirmwareBean.setVersion(driverInfoAry[1].replace(".zip", ""));
                     deviceFirmwareBean.setLocalUrl(HdlFileLogic.getInstance().getFirmwarePathFileName(osImageId, deviceFirmwareBean.getVersion()));
                     list.add(deviceFirmwareBean);
@@ -670,7 +751,7 @@
                 HdlThreadLogic.runSubThread(new Runnable() {
                     @Override
                     public void run() {
-                        String firmwarePathFileName = HdlFileLogic.getInstance().getFirmwarePathFileName( imageId, version);
+                        String firmwarePathFileName = HdlFileLogic.getInstance().getFirmwarePathFileName(imageId, version);
                         //涓嶅湪瀛愮嚎绋嬭娴佷細鍗℃涓荤嚎绋�
                         boolean isBoolean = HdlOtaLogic.getInstance().disposeDownLoadFile(firmwarePathFileName, responseBody, md5, HdlOtaLogic.firmware_type);
                         if (isBoolean) {
@@ -680,9 +761,9 @@
                         }
 
                         if (isBoolean) {
-                            uniCallbackData(type, null, 0, "鍐欏叆鏂伴┍鍔ㄦ枃浠跺埌鍐呭瓨鎴愬姛", callback);
+                            uniCallbackData(type, null, 0, HDLApp.getInstance().getString(R.string.writing_firmware_upgrade_memory_succeeded), callback);
                         } else {
-                            uniCallbackData(type, null, -2, "涓嬭浇鍥轰欢鍗囩骇鏂囦欢澶辫触", callback);
+                            uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.download_firmware_upgrade_file_failed), callback);
                         }
                     }
                 });
@@ -715,7 +796,7 @@
             @Override
             public void onSuccess(Boolean b) {
                 if (b) {
-                    HdlLogLogic.print("鏈湴鍗囩骇--->", true);
+                    HdlLogLogic.print("鏈湴鍗囩骇---", true);
                     //鏈湴
                     //1,寤虹珛鏈湴鏈嶅姟锛�
                     //2,鍛婅瘔缃戝叧鎵嬫満ip鍜岀鍙o紱
@@ -727,7 +808,7 @@
                             String firmwarePathFileName = HdlFileLogic.getInstance().getFirmwarePathFileName(imageId, version);
                             byte[] data = HdlFileLogic.getInstance().readFileByte(firmwarePathFileName);
                             if (data == null || data.length == 0) {
-                                uniCallbackData(type, null, -2, "鏈湴鎵句笉鍒板崌绾у浐浠舵枃浠�,璇蜂笅杞藉ソ鍥轰欢鏂囦欢,鍐嶉噸鏂板崌绾�.", callback);
+                                uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.found_locally_firmware_upgrade_file), callback);
                                 return;
                             }
                             String md5 = HDLMD5Utils.encodeMD5(data);//缃戝叧鍥轰欢闇�瑕�
@@ -742,18 +823,18 @@
 
                                 @Override
                                 public void onError(HDLLinkException e) {
-                                    uniCallbackData(type, null, -2, "閫氱煡缁欑綉鍏冲崌绾у浐浠舵枃浠跺湴鍧�澶辫触,鏃犳硶鍗囩骇,", callback);
+                                    uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.notify_gateway_firmware_upgrade_failed), callback);
                                 }
                             });
                         }
 
                         @Override
                         public void onServiceDisconnected(ComponentName name) {
-                            uniCallbackData(type, null, -2, "鏈湴鏈嶅姟鏈夊紓甯稿け璐�,鏃犳硶鍗囩骇,", callback);
+                            uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.local_service_fails), callback);
                         }
                     });
                 } else {
-                    HdlLogLogic.print("鍦ㄧ嚎鍗囩骇--->", true);
+                    HdlLogLogic.print("鍦ㄧ嚎鍗囩骇---", true);
                     //杩滅▼鍗囩骇闇�瑕佹娴嬪湪閫嗗彉鍣ㄦ湁娌℃湁杩炴帴涓婁簯
                     HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                         @Override
@@ -792,7 +873,7 @@
 
             @Override
             public void onFailure(HDLException e) {
-                HdlLogLogic.print("鍦ㄧ嚎鍗囩骇--->", true);
+                HdlLogLogic.print("鍦ㄧ嚎鍗囩骇---", true);
                 //杩滅▼鍗囩骇闇�瑕佹娴嬪湪閫嗗彉鍣ㄦ湁娌℃湁杩炴帴涓婁簯
                 HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                     @Override
@@ -933,9 +1014,9 @@
                             HdlFileLogic.getInstance().deleteFile(drivePathFileName);//涓嬭浇澶辫触锛屽垹闄や笉瀹屾暣椹卞姩鏂囦欢;
                         }
                         if (isBoolean) {
-                            uniCallbackData(type, null, 0, "鍐欏叆鏂伴┍鍔ㄦ枃浠跺埌鍐呭瓨鎴愬姛", callback);
+                            uniCallbackData(type, null, 0, HDLApp.getInstance().getString(R.string.writing_drive_memory_succeeded), callback);
                         } else {
-                            uniCallbackData(type, null, -2, "涓嬭浇椹卞姩鍗囩骇鏂囦欢澶辫触", callback);
+                            uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.download_drive_file_failed), callback);
                         }
                     }
                 });
@@ -967,7 +1048,7 @@
             @Override
             public void onSuccess(Boolean b) {
                 if (b) {
-                    HdlLogLogic.print("鏈湴鍗囩骇--->", true);
+                    HdlLogLogic.print("鏈湴鍗囩骇---", true);
                     //鏈湴
                     //1,寤虹珛鏈湴鏈嶅姟锛�
                     // 2锛屽憡璇夌綉鍏虫墜鏈篿p鍜岀鍙o紱
@@ -979,7 +1060,7 @@
                             String drivePathFileName = HdlFileLogic.getInstance().getDrivePathFileName(driverCode, version);
                             byte[] data = HdlFileLogic.getInstance().readFileByte(drivePathFileName);
                             if (data == null || data.length == 0) {
-                                uniCallbackData(type, null, -2, "鏈湴鎵句笉鍒板崌绾ч┍鍔ㄦ枃浠�,璇蜂笅杞藉ソ椹卞姩鏂囦欢,鍐嶉噸鏂板崌绾�.", callback);
+                                uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.found_locally_drive_file), callback);
                                 return;
                             }
                             String md5 = HDLMD5Utils.encodeMD5(data);//缃戝叧椹卞姩闇�瑕�
@@ -994,18 +1075,18 @@
 
                                 @Override
                                 public void onError(HDLLinkException e) {
-                                    uniCallbackData(type, null, -2, "閫氱煡缁欑綉鍏冲崌绾ч┍鍔ㄦ枃浠跺湴鍧�澶辫触,鏃犳硶鍗囩骇,", callback);
+                                    uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.notify_gateway_drive_failed), callback);
                                 }
                             });
                         }
 
                         @Override
                         public void onServiceDisconnected(ComponentName name) {
-                            uniCallbackData(type, null, -2, "鏈湴鏈嶅姟鏈夊紓甯稿け璐�,鏃犳硶鍗囩骇,", callback);
+                            uniCallbackData(type, null, -2, HDLApp.getInstance().getString(R.string.local_service_fails), callback);
                         }
                     });
                 } else {
-                    HdlLogLogic.print("鍦ㄧ嚎鍗囩骇--->", true);
+                    HdlLogLogic.print("鍦ㄧ嚎鍗囩骇---", true);
                     //杩滅▼鍗囩骇闇�瑕併�愭娴嬨�戝湪閫嗗彉鍣ㄦ湁娌℃湁杩炴帴涓婁簯
                     HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                         @Override
@@ -1044,7 +1125,7 @@
 
             @Override
             public void onFailure(HDLException e) {
-                HdlLogLogic.print("鍦ㄧ嚎鍗囩骇--->", true);
+                HdlLogLogic.print("鍦ㄧ嚎鍗囩骇---", true);
                 //杩滅▼鍗囩骇闇�瑕併�愭娴嬨�戝湪閫嗗彉鍣ㄦ湁娌℃湁杩炴帴涓婁簯
                 HdlDeviceLogic.getInstance().checkInverterConnectedCloud(homeId, deviceMac, new CloudCallBeak<CloudInverterDeviceBean>() {
                     @Override
@@ -1088,7 +1169,7 @@
      */
     private void uniCancelDownloadingUpgradeFile(String type, Object data, DCUniMPJSCallback callback) {
         HdlOtaLogic.getInstance().stopDownloadUpgradeFile();
-        uniCallbackData(type, null, 0, "鍙栨秷涓嬭浇鎴愬姛.", callback);
+        uniCallbackData(type, null, 0, HDLApp.getInstance().getString(R.string.cancel_download_successfully), callback);
     }
 
     /**
@@ -1250,9 +1331,9 @@
      */
     private void uniGetMessageNumber(String type, Object data, DCUniMPJSCallback callback) {
         String homeId = getKeyValue("homeId", getKeyValue("data", data));
-        HdlMessageLogic.getInstance().getMessageUntreatedCount(homeId, new CloudCallBeak<String>() {
+        HdlMessageLogic.getInstance().getMessageUntreatedCount(homeId, new CloudCallBeak<UnCountBean>() {
             @Override
-            public void onSuccess(String data) {
+            public void onSuccess(UnCountBean data) {
                 uniCallbackData(type, data, callback);
             }
 
@@ -1629,6 +1710,106 @@
 
 
     /**
+     * 鍙戦�佽处鍙峰拰瀵嗙爜缁欓�嗗彉鍣�
+     *
+     * @param ssid     璐﹀彿
+     * @param password 瀵嗙爜
+     * @param callback uni鍥炶皟
+     */
+    public void startTcpThreadSendAccountAndPassword(String type, String ssid, String password, DCUniMPJSCallback callback) {
+        new Thread(
+                () -> {
+                    Socket socket = null;
+                    OutputStream outputStreamTcp = null;
+                    InputStream inputStreamTcp = null;
+                    try {
+                        socket = new Socket();
+                        socket.setTcpNoDelay(true);
+                        socket.setSoTimeout(10 * 1000);//10绉掕秴鏃�
+                        socket.connect(new InetSocketAddress("192.168.8.1", 8586));
+                        socket.setKeepAlive(true);
+//                        logMessage("tcp杩炴帴鐘舵�佹垚鍔�", 0, "");
+                        outputStreamTcp = socket.getOutputStream();
+                        JsonObject jsonObject = new JsonObject();
+                        jsonObject.addProperty("id", "102030");
+                        jsonObject.addProperty("ssid", ssid);
+                        jsonObject.addProperty("password", password);
+                        jsonObject.addProperty("server_addr", HDLLinkPMUser.getInstance().getHomeRegionUrl());
+                        jsonObject.addProperty("homeId", UserConfigManage.getInstance().getHomeId());
+                        String sendData = "Topic:/user/id/custom/wifi/set\r\n";
+                        sendData += "Length:" + jsonObject.toString().getBytes().length + "\r\n\r\n";
+                        sendData += jsonObject.toString();
+                        outputStreamTcp.write(sendData.getBytes());
+                        outputStreamTcp.flush();
+                        Thread.sleep(200);
+                        inputStreamTcp = socket.getInputStream();
+                        byte[] bytes = new byte[1204 * 2];
+                        int len = inputStreamTcp.read(bytes);
+                        if (len != -1) {
+                            String str = new String(bytes, 0, bytes.length);
+                            String[] strings = str.split("\r\n\r\n");
+                            String[] topicAndLength = strings[0].split("\r\n");
+                            String topic = topicAndLength[0];
+                            JSONObject json = new JSONObject(strings[1]);
+//                            logMessage("tcp鍥炲鏁版嵁", 0, strings[0] + "\r\n" + json.toString());
+                            if (topic.endsWith("wifi/set_reply") || topic.endsWith("wifi/result/notify")) {
+                                if (callback != null) {
+                                    uniCallbackData(type, json, callback);
+                                }
+                                if (json.has("mac")) { //鍥炲鎴愬姛鍐嶆嬁璁惧mac
+//                                    this.device_mac = json.getString("mac");
+//                                    this.isSucceedTcp = true;//琛ㄧず鎴愬姛
+                                }
+                            }
+                        }
+
+                    } catch (Exception ignored) {
+                    } finally {
+                        try {
+                            if (outputStreamTcp != null) {
+                                outputStreamTcp.close();
+                                outputStreamTcp = null;
+                            }
+                            if (inputStreamTcp != null) {
+                                inputStreamTcp.close();
+                                inputStreamTcp = null;
+                            }
+                            if (socket != null) {
+                                socket.close();
+                                socket = null;
+                            }
+
+                        } catch (Exception ignored) {
+                        }
+                    }
+                }
+        ).start();
+    }
+
+    /**
+     * 鍒濆鍖栦綘閫嗗彉鍣�
+     *
+     * @param type     璐﹀彿
+     * @param data     uni璇锋眰鏁版嵁
+     * @param callback uni鍥炶皟
+     */
+    public void setInitializeGateway(String type, Object data, DCUniMPJSCallback callback) {
+        String mac = getKeyValue("mac", getKeyValue("data", data));
+        HdlDeviceLogic.getInstance().initializeInverter(mac, new LinkCallBack<Boolean>() {
+            @Override
+            public void onSuccess(Boolean obj) {
+                uniCallbackData(type, obj, callback);
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                uniCallbackData(type, null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
+
+
+    /**
      * 鍙戦�乵odbus鍗忚鏁版嵁
      * 閫忎紶鍗忚
      * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
@@ -1646,7 +1827,7 @@
         String tempData = getKeyValue("data", data);
         if (TextUtils.isEmpty(tempData)) {
             uniCallbackData(type, null, -2, "data鍐呭涓虹┖", callback);
-            //HdlLogLogic.print("data鍐呭涓虹┖--->", false);
+            //HdlLogLogic.print("data鍐呭涓虹┖---", false);
             return;
         }
         ModBusBean modBusBean = new Gson().fromJson(tempData, ModBusBean.class);
@@ -1658,24 +1839,24 @@
 //        }
         if (modBusBean.getMac() == null || modBusBean.getData() == null) {
             uniCallbackData(type, null, -2, "鍙戦�佸け璐�,(mac鎴栬�卭id)涓虹┖", callback);
-            //HdlLogLogic.print("uni--->鍙戦��--->ModBus--->鍙戦�佸け璐�,(mac鎴栬�卭id)涓虹┖." + Arrays.toString(modBusBean.getData()), true);
+            //HdlLogLogic.print("uni---鍙戦��---ModBus---鍙戦�佸け璐�,(mac鎴栬�卭id)涓虹┖." + Arrays.toString(modBusBean.getData()), true);
             return;
         }
 
-        //HdlLogLogic.print("uni--->鍙戦��--->ModBus--->" + Arrays.toString(modBusBean.getData()), true);
+        //HdlLogLogic.print("uni---鍙戦��---ModBus---" + Arrays.toString(modBusBean.getData()), true);
         //鍙戦�乵odbus鍗忚
         HDLModBusConnect.getInstance().Send(modBusBean.getMac(), modBusBean.getData(), new ModbusCallBack() {
             @Override
             public void onSuccess(int[] data) {
                 uniCallbackData(type, data, callback);
-//                HdlLogLogic.print("uni--->鎺ユ敹--->ModBus--->" + Arrays.toString(data), true);
+//                HdlLogLogic.print("uni---鎺ユ敹---ModBus---" + Arrays.toString(data), true);
 
             }
 
             @Override
             public void onError(HDLLinkException e) {
                 uniCallbackData(type, null, e.getCode(), e.getMsg(), callback);
-//                HdlLogLogic.print("uni--->鎺ユ敹--->ModBus--->" + e.getMsg() + "(" + e.getCode() + ")", true);
+//                HdlLogLogic.print("uni---鎺ユ敹---ModBus---" + e.getMsg() + "(" + e.getCode() + ")", true);
             }
         });
     }
@@ -1711,7 +1892,7 @@
             uniCallBackBaseBean.setData(data);
             return getJSONObject(uniCallBackBaseBean);
         } catch (Exception e) {
-            HdlLogLogic.print("uni--->缁勮鍙戦�佺粰uni鏁版嵁鏍煎紡鏈夊紓甯�--->" + e.getMessage(), false);
+            HdlLogLogic.print("uni---缁勮鍙戦�佺粰uni鏁版嵁鏍煎紡鏈夊紓甯�---" + e.getMessage(), false);
         }
         return new JSONObject();
     }
@@ -1731,15 +1912,15 @@
         HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
         try {
             uniCallBackBaseBean.setCode(code);
-            uniCallBackBaseBean.setMes(msg);
+            uniCallBackBaseBean.setMsg(msg);
             uniCallBackBaseBean.setData(obj);
             if (callback != null) {
                 callback.invoke(getJSONObject(uniCallBackBaseBean));
 //                callback.invoke(uniCallBackBaseBean);
-                HdlLogLogic.print("uni--->鍥炲--->" + type + "--->" + new Gson().toJson(uniCallBackBaseBean), true);
+                HdlLogLogic.print("uni---鍥炲---" + type + "---" + new Gson().toJson(uniCallBackBaseBean), true);
             }
         } catch (Exception e) {
-            HdlLogLogic.print("uni--->鍥炲--->" + type + "--->" + e.getMessage(), true);
+            HdlLogLogic.print("uni---鍥炲---" + type + "---" + e.getMessage(), true);
         }
 
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/BPowerStationActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/BPowerStationActivity.java
new file mode 100644
index 0000000..6d1618e
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/BPowerStationActivity.java
@@ -0,0 +1,739 @@
+package com.hdl.photovoltaic.ui;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.content.res.AppCompatResources;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.location.LocationManager;
+import android.os.Bundle;
+import android.os.Process;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.View;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.linkpm.sdk.home.type.HomeType;
+import com.hdl.photovoltaic.HDLApp;
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.CustomBaseActivity;
+import com.hdl.photovoltaic.bean.MqttInfo;
+import com.hdl.photovoltaic.config.ConstantManage;
+import com.hdl.photovoltaic.config.UserConfigManage;
+import com.hdl.photovoltaic.databinding.ActivityMyPowerStationBinding;
+import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
+import com.hdl.photovoltaic.enums.NetworkType;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlDeviceLogic;
+import com.hdl.photovoltaic.other.HdlLogLogic;
+import com.hdl.photovoltaic.other.HdlMqttLogic;
+import com.hdl.photovoltaic.other.HdlOtaLogic;
+import com.hdl.photovoltaic.other.HdlResidenceLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.other.HdlUniLogic;
+import com.hdl.photovoltaic.ui.bean.DeviceRemoteInfo;
+import com.hdl.photovoltaic.ui.bean.OidBean;
+import com.hdl.photovoltaic.ui.home.HomePageFragment;
+import com.hdl.photovoltaic.ui.me.MeFragment;
+import com.hdl.photovoltaic.ui.message.MessageFragment;
+import com.hdl.photovoltaic.ui.powerstation.HouseListFragment;
+import com.hdl.photovoltaic.uni.HDLUniMP;
+import com.hdl.photovoltaic.utils.AppManagerUtils;
+import com.hdl.photovoltaic.utils.GPSManagerUtils;
+import com.hdl.photovoltaic.utils.PermissionUtils;
+import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
+import com.hdl.photovoltaic.widget.ConfirmationTipDialog;
+import com.hdl.sdk.link.HDLLinkLocalSdk;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.ModbusResponse;
+import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.connect.HDLUdpConnect;
+import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.jpush.android.api.JPushInterface;
+
+
+/**
+ * B绔�-鐢电珯鐣岄潰
+ */
+public class BPowerStationActivity extends CustomBaseActivity {
+
+    private static final String CURRENT_FRAGMENT = "state_fragment_show";
+    private FragmentManager mFragmentManager;
+    private Fragment currentFragment = new Fragment();
+    private final List<Fragment> fragmentList = new ArrayList<>();
+    private int currentFragmentIndex = 0;
+
+    private ActivityMyPowerStationBinding viewBinding;
+    private EventListener allTopicsListener;
+    private int backPressTimes;
+
+    @Override
+    public Object getContentView() {
+        viewBinding = ActivityMyPowerStationBinding.inflate(getLayoutInflater());
+        return viewBinding.getRoot();
+    }
+
+    @Override
+    public void onBindView(Bundle savedInstanceState) {
+//        setNotificationBarBackgroundColor(CustomColor.blue);
+        setStatusBarTranslucent();
+        //鍒濆鍖栫鐗�
+        initFragment(savedInstanceState);
+        //鍒濆鍖�
+        this.initView();
+        //鍒濆鍖栫晫闈㈢洃鍚櫒
+        this.initEvent();
+        //娉ㄥ唽鐩戝惉
+        this.registerAllTopicsListener();
+        //鍒濆鍖杕qtt瀹㈡埛绔�
+        this.initMqttClient();
+        //涓婁紶鏋佸厜娉ㄥ唽ID鍒颁簯绔�
+        this.pushTokens();
+        //鐐瑰嚮鏋佸厜閫氱煡鏍忔秷鎭繘鏉�
+        this.clickJpushNotificationMessage();
+        //鍒濆鍖栨潈闄�
+        this.requestPermissions();
+
+    }
+
+
+    /**
+     * 鍒濆鍖朏ragment
+     *
+     * @param savedInstanceState -
+     */
+    private void initFragment(Bundle savedInstanceState) {
+        mFragmentManager = getSupportFragmentManager();
+        //纰庣墖鍒濆鍖�
+        HomePageFragment mHomePageFragment = new HomePageFragment();
+        HouseListFragment mHouseListFragment = new HouseListFragment();
+        MessageFragment mMessageFragment = new MessageFragment();
+        MeFragment mMeFragment = new MeFragment();
+        if (savedInstanceState != null) {
+            //鈥滃唴瀛橀噸鍚�濇椂璋冪敤 鑾峰彇鈥滃唴瀛橀噸鍚�濇椂淇濆瓨鐨勭储寮曚笅鏍�
+            currentFragmentIndex = savedInstanceState.getInt(CURRENT_FRAGMENT, 0);
+            if (fragmentList.size() != 0) {
+                fragmentList.clear();
+            }
+            fragmentList.add(mFragmentManager.findFragmentByTag(0 + ""));
+            fragmentList.add(mFragmentManager.findFragmentByTag(1 + ""));
+            fragmentList.add(mFragmentManager.findFragmentByTag(2 + ""));
+            fragmentList.add(mFragmentManager.findFragmentByTag(3 + ""));
+            restoreFragment();//鎭㈠fragment椤甸潰
+        } else {
+            //姝e父鍚姩鏃惰皟鐢�
+            fragmentList.add(mHomePageFragment);
+            fragmentList.add(mHouseListFragment);
+            fragmentList.add(mMessageFragment);
+            fragmentList.add(mMeFragment);
+            showFragment();
+        }
+
+    }
+
+
+    /**
+     * 浣跨敤show() hide()鍒囨崲椤甸潰
+     * 鏄剧ずfragment
+     */
+    private void showFragment() {
+        FragmentTransaction ft = mFragmentManager.beginTransaction();
+        //濡傛灉涔嬪墠娌℃湁娣诲姞杩�
+        if (!fragmentList.get(currentFragmentIndex).isAdded()) {
+            //绗笁涓弬鏁颁负娣诲姞褰撳墠鐨刦ragment鏃剁粦瀹氫竴涓猼ag
+            ft.hide(currentFragment).add(R.id.module_fcv, fragmentList.get(currentFragmentIndex), currentFragmentIndex + "");
+        } else {
+            ft.hide(currentFragment).show(fragmentList.get(currentFragmentIndex));
+        }
+        currentFragment = fragmentList.get(currentFragmentIndex);
+        ft.commit();
+        //鎶婂綋鍓嶆樉绀虹殑fragment璁板綍涓嬫潵
+        currentFragment = fragmentList.get(currentFragmentIndex);
+
+
+    }
+
+    /**
+     * 鎭㈠fragment
+     */
+    private void restoreFragment() {
+        FragmentTransaction ft = mFragmentManager.beginTransaction();
+        for (int i = 0; i < fragmentList.size(); i++) {
+            if (i == currentFragmentIndex) {
+                ft.show(fragmentList.get(i));
+            } else {
+                ft.hide(fragmentList.get(i));
+            }
+        }
+        ft.commit();
+
+    }
+
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        //鍚姩椤典笌mainActivity鏍峰紡涓�鏍凤紝杩欐牱鍚姩椤靛拰mainActivity鐪嬩笂鍘绘槸涓�涓晫闈紝鐩殑鏄负浜唌ainActivity閬綇涓嬩竴椤碉紱
+//        AppManagerUtils.getAppManager().finishActivity(StartActivity.class);
+        portConflictDialog();
+//        Intent intent = new Intent(_mActivity, BPowerStationActivity.class);
+//        intent.setFlags(Intent.Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+//        intent.putExtra("skip", "skip");//閲岄潰鍒ゆ柇鏈夎繖涓爣璇嗗氨璺宠浆鍒版秷鎭腑蹇冪晫闈�
+//        _mActivity.startActivity(intent);
+        //鐐瑰嚮鏋佸厜閫氱煡鏍忔秷鎭繘鏉�
+//        this.clickJpushNotificationMessage();
+    }
+
+
+    /**
+     * 涓婁紶鏋佸厜娉ㄥ唽ID鍒颁簯绔�
+     */
+    private void pushTokens() {
+        String registrationId_tag = "registrationID_" + UserConfigManage.getInstance().getUserId();
+        String is_registrationID = HDLApp.getInstance().getKey(registrationId_tag);
+        if (is_registrationID.equals("true")) {
+            //涓婅繃灏辨病鏈夊繀瑕佸湪涓婁紶鍟�
+            return;
+        }
+
+        HdlThreadLogic.runSubThread(new Runnable() {
+            @Override
+            public void run() {
+                String registrationID = JPushInterface.getRegistrationID(_mActivity);
+                int addCount = 0;
+                while (TextUtils.isEmpty(registrationID)) {
+                    SystemClock.sleep(1000);//1s浼戠湢
+                    registrationID = JPushInterface.getRegistrationID(_mActivity);
+                    addCount++;
+                    if (addCount > 5) {
+                        //5s瓒呮椂
+                        break;
+                    }
+                }
+                if (!TextUtils.isEmpty(registrationID)) {
+                    UserConfigManage.getInstance().setRegistrationID(registrationID);
+                    UserConfigManage.getInstance().Save();
+                    String finalRegistrationID = registrationID;
+                    HdlResidenceLogic.getInstance().pushAdd(new CloudCallBeak<String>() {
+                        @Override
+                        public void onSuccess(String pushId) {
+
+                            if (!TextUtils.isEmpty(pushId)) {
+                                UserConfigManage.getInstance().setPushId(pushId);
+                                UserConfigManage.getInstance().Save();
+                            }
+                            HDLApp.getInstance().setInfoMap(registrationId_tag, "true");//璁板綍涓�涓嬬姸鎬�,鍚庡彴鏉�姝籥pp浼氭竻绌�;
+                            HdlLogLogic.print("娣诲姞鏋佸厜ID鍒颁簯绔�--->registrationID:" + UserConfigManage.getInstance().getUserName() + "--->" + finalRegistrationID, true);
+
+                        }
+
+                        @Override
+                        public void onFailure(HDLException e) {
+                            HDLApp.getInstance().setInfoMap(registrationId_tag, "false");//璁板綍涓�涓嬬姸鎬�,鍚庡彴鏉�姝籥pp浼氭竻绌�;
+                            HdlLogLogic.print("娣诲姞鏋佸厜ID鍒颁簯绔け璐�--->registrationID:" + UserConfigManage.getInstance().getUserName() + "--->" + finalRegistrationID, true);
+                        }
+                    });
+
+                }
+
+
+            }
+        });
+    }
+
+    /**
+     * 寮�鍚�氱煡鏉冮檺
+     */
+    private void notificationSet() {
+        boolean isBoolean = PermissionUtils.isNotificationEnabled(_mActivity);
+        if (!isBoolean) {
+            ConfirmationCancelDialog confirmationCancelDialog = new ConfirmationCancelDialog(_mActivity);
+            confirmationCancelDialog.setTitle(getString(R.string.loading_title_tip));
+            confirmationCancelDialog.setContent(getString(R.string.no_permissions_unable_to_receive_push));
+            confirmationCancelDialog.setConfirmation(getString(R.string.go_to_settings));
+            confirmationCancelDialog.show();
+            confirmationCancelDialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
+                @Override
+                public void Confirm() {
+                    confirmationCancelDialog.dismiss();
+                    PermissionUtils.openNotificationSettings(_mActivity);
+
+                }
+            });
+            confirmationCancelDialog.setNoOnclickListener(new ConfirmationCancelDialog.onNoOnclickListener() {
+                @Override
+                public void Cancel() {
+                    confirmationCancelDialog.dismiss();
+                }
+            });
+
+        }
+    }
+
+
+    private void initEvent() {
+        viewBinding.myPowerStationBottomIl0.clickTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (currentFragmentIndex == 0) {
+                    return;
+                }
+                currentFragmentIndex = 0;
+                bottomViewChangeOfStyle();
+                showFragment();
+                postEventBus(HomepageTitleTabSwitch.homepage);
+            }
+        });
+        viewBinding.myPowerStationBottomIl1.clickTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (currentFragmentIndex == 1) {
+                    return;
+                }
+                currentFragmentIndex = 1;
+                bottomViewChangeOfStyle();
+                showFragment();
+                postEventBus(HomepageTitleTabSwitch.powerstation);
+            }
+        });
+        viewBinding.myMessageBottomIl2.clickTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (currentFragmentIndex == 2) {
+                    return;
+                }
+                currentFragmentIndex = 2;
+                bottomViewChangeOfStyle();
+                showFragment();
+                postEventBus(HomepageTitleTabSwitch.message);
+            }
+        });
+        viewBinding.myMeBottomIl3.clickTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (currentFragmentIndex == 3) {
+                    return;
+                }
+                currentFragmentIndex = 3;
+                bottomViewChangeOfStyle();
+                showFragment();
+                postEventBus(HomepageTitleTabSwitch.me);
+            }
+        });
+
+
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        HdlUniLogic.getInstance().checkRemoveOtherUniMPEventCallBack();
+        //绉婚櫎鐩戝惉
+        HDLLinkLocalSdk.getInstance().removeAllTopicsListener(allTopicsListener);
+    }
+
+    private void initView() {
+        viewBinding.myPowerStationBottomIl0.titleTv.setText(R.string.power_shome_page);
+        viewBinding.myPowerStationBottomIl1.titleTv.setText(R.string.power_station);
+        viewBinding.myMessageBottomIl2.titleTv.setText(R.string.message);
+        viewBinding.myMeBottomIl3.titleTv.setText(R.string.power_station_me);
+        this.bottomViewChangeOfStyle();
+    }
+
+    private void bottomViewChangeOfStyle() {
+        if (this.currentFragmentIndex == 0) {
+            //棣栭〉鐣岄潰
+            viewBinding.myPowerStationBottomIl0.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.home_page_selected));
+            viewBinding.myPowerStationBottomIl0.titleTv.setTextColor(getColor(R.color.text_90000000));
+            viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.power_station_unselected));
+            viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_unselected));
+            viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.me_unselected));
+            viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_65000000));
+        } else if (this.currentFragmentIndex == 1) {
+            //鐢电珯鐣岄潰
+            viewBinding.myPowerStationBottomIl0.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.home_page_unselected));
+            viewBinding.myPowerStationBottomIl0.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.power_station_selected));
+            viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_90000000));
+            viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_unselected));
+            viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.me_unselected));
+            viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_65000000));
+        } else if (this.currentFragmentIndex == 2) {
+            //娑堟伅鐣岄潰
+            viewBinding.myPowerStationBottomIl0.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.home_page_unselected));
+            viewBinding.myPowerStationBottomIl0.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.power_station_unselected));
+            viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_select));
+            viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_90000000));
+            viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.me_unselected));
+            viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_65000000));
+        } else if (this.currentFragmentIndex == 3) {
+            //鎴戠殑鐣岄潰
+            viewBinding.myPowerStationBottomIl0.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.home_page_unselected));
+            viewBinding.myPowerStationBottomIl0.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.power_station_unselected));
+            viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_unselected));
+            viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000));
+            viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.me_selected));
+            viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_90000000));
+        }
+    }
+
+    /**
+     * 鍙戝竷鐐瑰嚮浜嬩欢
+     *
+     * @param tabSwitch -
+     */
+    private void postEventBus(HomepageTitleTabSwitch tabSwitch) {
+        BaseEventBus baseEventBus = new BaseEventBus();
+        baseEventBus.setTopic(ConstantManage.homepage_title_tab_switch);
+        baseEventBus.setType(tabSwitch.toString());
+        EventBus.getDefault().postSticky(baseEventBus);
+    }
+
+    public void requestPermissions() {
+        //娑堟伅閫氱煡闄愭潈
+        this.notificationSet();
+        //ACCESS_FINE_LOCATION	鍏佽浣跨敤GPS瀹氫綅
+        //ACCESS_COARSE_LOCATION	鍏佽浣跨敤WIFI鐑偣鎴栧熀绔欐潵鑾峰彇绮楃暐鐨勫畾浣�
+        String[] ary = PermissionUtils.checkPermission(_mActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION});
+        if (ary.length > 0) {
+            this.requestPermissions(ary, PermissionUtils.STATUS_SUCCESS);
+        } else {
+            locationUpdates();
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        if (requestCode == PermissionUtils.STATUS_SUCCESS) {
+            for (int i = 0; i < permissions.length; i++) {
+                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
+                    switch (permissions[i]) {
+                        case Manifest.permission.ACCESS_FINE_LOCATION: {
+                            locationUpdates();
+                        }
+                        break;
+                    }
+
+                }
+
+            }
+        }
+
+    }
+
+
+    /**
+     * 娉ㄥ唽鎵�鏈変富棰樻暟鎹殑鐩戝惉
+     */
+    private void registerAllTopicsListener() {
+        allTopicsListener = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+
+                if (msg == null) {
+                    return;
+                }
+                if (msg instanceof ModbusResponse) {
+                    ModbusResponse response = (ModbusResponse) msg;
+                    if (response.getTopic() == null) {
+                        return;
+                    }
+                    HdlLogLogic.print("鐩戝惉鍒癕odbus鏁版嵁--->" + new Gson().toJson(response), false);
+//                    if (response.getTopic().endsWith("custom/native/inverter/up")) {
+                    HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
+                    uniCallBackBaseBean.setType(response.getTopic());
+                    uniCallBackBaseBean.setData(response.getData());
+//                    if (com.hdl.photovoltaic.ui.test.UniAppMqtt.getInstance().getUni()) {
+//                        try {
+//                            String t = String.format("AndroidToPC/%s/%s", System.currentTimeMillis(), HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL);
+//                            com.hdl.photovoltaic.ui.test.UniAppMqtt.getInstance().publish(t, JSONObject.toJSON(uniCallBackBaseBean).toString());
+//                        } catch (Exception ignored) {
+//                        }
+//                    } else {
+                    HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL, uniCallBackBaseBean);
+//                    }
+//                    }
+
+                } else if (msg instanceof LinkResponse) {
+                    LinkResponse linkResponse = (LinkResponse) msg;
+                    if (linkResponse.getTopic() == null) {
+                        return;
+                    }
+                    if (linkResponse.getTopic().endsWith("/ota/device/progress/up")) {
+                        HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
+                        uniCallBackBaseBean.setType(linkResponse.getTopic());
+                        uniCallBackBaseBean.setData(linkResponse.getData());
+                        HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_REPLY_OTA_MODEL, uniCallBackBaseBean);
+                        HdlLogLogic.print(linkResponse.getTopic() + new Gson().toJson(linkResponse.getData()), true);
+                    } else if (linkResponse.getTopic().endsWith("/custom/device/list/upload")) {
+                        //閫嗗彉鍣ㄦ湁鏂皁id閫氱煡涓婚
+                        if (linkResponse.getData() == null) {
+                            HdlLogLogic.print("閫嗗彉鍣ㄦ湁鏂皁id閫氱煡--->鏁版嵁涓虹┖", false);
+                            return;
+                        }
+                        try {
+                            Gson gson = new Gson();
+                            Type typeOfT = new TypeToken<List<OidBean>>() {
+                            }.getType();
+                            String json = gson.toJson(linkResponse.getData());
+                            List<OidBean> oidList = gson.fromJson(json, typeOfT);
+                            //澧為噺澧炲姞add
+                            HdlDeviceLogic.getInstance().updateOidAdd(UserConfigManage.getInstance().getHomeId(), oidList, null);
+                        } catch (Exception ignored) {
+                        }
+
+
+                    } else if (linkResponse.getTopic().endsWith("custom/wifi/notify")) {
+                        //閫嗗彉鍣ㄨ繛鎺ヨ矾鐢辩姸鎬侀�氱煡
+                        HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
+                        uniCallBackBaseBean.setType(linkResponse.getTopic());
+                        uniCallBackBaseBean.setData(linkResponse.getData());
+                        HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL, uniCallBackBaseBean);
+                        HdlLogLogic.print(linkResponse.getTopic() + new Gson().toJson(linkResponse.getData()), true);
+                    }
+                }
+            }
+        };
+        HDLLinkLocalSdk.getInstance().registerAllTopicsListener(allTopicsListener);
+    }
+
+    /**
+     * 鍒濆鍖杕qtt瀹㈡埛绔�
+     */
+    public void initMqttClient() {
+        //妫�鏌ユ柇寮�鐘舵��
+        if (!MqttRecvClient.getInstance().isConnected()) {
+            MqttRecvClient.getInstance().reConnect();
+        }
+        if (!MqttRecvClient.getInstance().isInit()) {
+            HdlMqttLogic.getInstance().getMqttRemoteInfo(HomeType.A, new CloudCallBeak<MqttInfo>() {
+                @Override
+                public void onSuccess(MqttInfo info) {
+                    if (info != null) {
+                        MqttRecvClient.getInstance().setConnectParam(info.getUrl(), info.getClientId(), info.getUserName(), info.getPassWord());
+                        MqttRecvClient.getInstance().connect();
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLException e) {
+                    HdlLogLogic.print("璇诲彇mqtt杩滅▼淇℃伅澶辫触--->" + e.getMessage(), e.getCode(), true);
+                }
+            });
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void onEventMessage(BaseEventBus event) {
+
+        if (event == null) {
+            return;
+        }
+        if (TextUtils.isEmpty(event.getTopic())) {
+            return;
+        }
+        //缃戝叧鏇存柊mqtt绉橀挜鏇存柊閫氱煡
+        if (event.getTopic().contains("/custom/mqtt/secret/change")) {
+            String[] topics = event.getTopic().split("/");
+            //涓婚涓嶇鍚堣鍒欎笉澶勭悊
+            if (topics.length < 3) {
+                return;
+            }
+            int index = -1;
+            List<GatewayBean> list = HdlDeviceLogic.getInstance().getCurrentHomeGatewayList(UserConfigManage.getInstance().getHomeId());
+            for (int i = 0; i < list.size(); i++) {
+                GatewayBean gatewayBean = list.get(i);
+                if (gatewayBean.getGatewayId().equals(topics[2])) {
+                    index = i;
+                    break;
+                }
+            }
+            if (index > -1) {
+                GatewayBean gatewayBean = list.get(index);
+                HdlDeviceLogic.getInstance().getDeviceRemoteInfo(UserConfigManage.getInstance().getHomeId(), gatewayBean.getSpk(), gatewayBean.getDevice_mac(), new CloudCallBeak<DeviceRemoteInfo>() {
+                    @Override
+                    public void onSuccess(DeviceRemoteInfo deviceRemoteInfo) {
+                        if (deviceRemoteInfo != null) {
+                            //鏇存柊mqtt閫氳鐨勬柊绉橀挜
+                            gatewayBean.setAesKey(deviceRemoteInfo.getSecret());
+                            //鐢ㄤ箣鍓嶇殑搴�,搴曞眰mqtt璁㈤槄锛屽姞瑙e瘑浼氱敤鍒拌鍙傛暟;
+                            HDLLinkConfig.getInstance().setAesKey(deviceRemoteInfo.getSecret());//璁剧疆mqtt閫氳绉橀挜搴�
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+
+                    }
+                });
+            }
+        } else if (event.getTopic().contains(HdlOtaLogic.localDownloadProgress)) {
+            //涓嬭浇浜戠椹卞姩鎴栬�呭浐浠舵枃浠跺埌鏈湴,鑷繁璁$畻杩涘害鏉′笂鎶ュ埌uni閭h竟
+            HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
+            uniCallBackBaseBean.setType(event.getType());
+            uniCallBackBaseBean.setData(event.getData());
+            HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_REPLY_OTA_MODEL, uniCallBackBaseBean);
+            HdlLogLogic.print(event.getTopic() + new Gson().toJson(event.getData()), true);
+        } else if (event.getTopic().contains(ConstantManage.network_change_post)) {
+//            String wifi_ssid = WifiUtils.getInstance().getCurrentConnectWifiSsid();//鑾峰彇WiFi鐨剆sid闇�瑕佷綅缃潈闄愮殑
+            HdlLogLogic.print("鐩戝惉缃戠粶鐘舵��--->" + event.getData().toString() + "(" + event.getType() + ")", true);
+            //绗竴娆″惎鍔ˋpp,浠ュ強鍒囨崲缃戠粶鐨勬椂鍊欐洿鏂�
+            if (TextUtils.isEmpty(UserConfigManage.getInstance().getHomeId())) {
+                return;
+            }
+            if (!event.getType().equals(NetworkType.no_network.toString())) {
+//                AppManagerUtils.getAppManager().showLoading();
+                HdlThreadLogic.runSubThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        //闃叉app鍚姩鐨勬椂鍊欐病鏈夌綉缁�(app涔熺櫥褰曚笉浜�),瀵艰嚧鑾峰彇涓嶄簡mqtt杩滅▼杩炴帴淇℃伅;
+                        initMqttClient();
+                        HdlDeviceLogic.getInstance().getCurrentHomeLocalAndCloudGatewayList(UserConfigManage.getInstance().getHomeId(), new CloudCallBeak<List<GatewayBean>>() {
+                            @Override
+                            public void onSuccess(List<GatewayBean> obj) {
+//                                AppManagerUtils.getAppManager().hideLoading();
+                            }
+
+                            @Override
+                            public void onFailure(HDLException e) {
+//                                AppManagerUtils.getAppManager().hideLoading();
+                            }
+                        });
+                    }
+                });
+            }
+        }
+    }
+
+    /**
+     * 鐐瑰嚮鏋佸厜閫氱煡鏍忔秷鎭繘鏉�
+     */
+    private void clickJpushNotificationMessage() {
+        Intent intent = getIntent();
+        if (intent != null) {
+            String key = intent.getStringExtra("skip");
+            if (key != null) {
+                //瑙﹀彂娑堟伅鐐瑰嚮浜嬩欢
+                viewBinding.myMessageBottomIl2.clickTv.performClick();
+            }
+        }
+    }
+
+
+    /**
+     * 鐗╃悊鎸夐敭杩斿洖浜嬩欢(鍖呮嫭宸︽粦绉婚櫎浜嬩欢)
+     */
+    @Override
+    public void onBackPressed() {
+        if (AppManagerUtils.getAppManager().getActivitySize() <= 1) {
+            if (backPressTimes == 0) {
+                HdlThreadLogic.toast(_mActivity, R.string.kill_app);
+                backPressTimes = 1;
+                new Thread() {
+                    @Override
+                    public void run() {
+                        try {
+                            Thread.sleep(2000);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        } finally {
+                            backPressTimes = 0;
+                        }
+                    }
+                }.start();
+                return;
+            } else {
+                AppManagerUtils.getAppManager().finishAllActivity();
+                Process.killProcess(Process.myPid());
+            }
+        }
+        super.onBackPressed();
+    }
+
+
+    /**
+     * 鍒濆鍖栥�愬紑鍚畾浣嶃�戝拰銆愪綅缃俊鎭�戞潈闄�
+     */
+    private void locationUpdates() {
+        // 鍒濆鍖朙ocationManager瀵硅薄
+        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
+        GPSManagerUtils.getInstance().getLocation(this);
+        // 鍒ゆ柇璁惧鏄惁鏀寔瀹氫綅鍔熻兘
+        if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
+            // 鎻愮ず鐢ㄦ埛鎵撳紑瀹氫綅鍔熻兘鎴栬�呭紩瀵肩敤鎴峰幓绯荤粺璁剧疆椤甸潰鎵撳紑瀹氫綅鍔熻兘
+            ConfirmationCancelDialog confirmationCancelDialog = new ConfirmationCancelDialog(_mActivity);
+            confirmationCancelDialog.setTitle(getString(R.string.loading_title_tip));
+            confirmationCancelDialog.setContent(getString(R.string.system_positioning_switch));
+            confirmationCancelDialog.setConfirmation(getString(R.string.go_to_settings));
+            confirmationCancelDialog.show();
+            confirmationCancelDialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
+                @Override
+                public void Confirm() {
+                    confirmationCancelDialog.dismiss();
+                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                    HDLApp.getInstance().startActivity(intent);
+
+                }
+            });
+            confirmationCancelDialog.setNoOnclickListener(new ConfirmationCancelDialog.onNoOnclickListener() {
+                @Override
+                public void Cancel() {
+                    confirmationCancelDialog.dismiss();
+                }
+            });
+
+        }
+
+    }
+
+    /**
+     * 绔彛鍐茬獊
+     */
+    private void portConflictDialog() {
+        if (!HDLUdpConnect.getInstance().isBindSuccess()) {
+            ConfirmationTipDialog dialog = new ConfirmationTipDialog(_mActivity);
+            dialog.show();
+            dialog.setTitle(getString(R.string.loading_title_tip));
+            dialog.setContent(getString(R.string.port_conflict));
+            dialog.setConfirmation(getString(R.string.home_login_affirm));
+            dialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
+                @Override
+                public void Confirm() {
+                    dialog.dismiss();
+                }
+            });
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/CPowerStationActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/CPowerStationActivity.java
index b562be2..7ecaa91 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/CPowerStationActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/CPowerStationActivity.java
@@ -5,10 +5,7 @@
 import android.os.Process;
 import android.os.SystemClock;
 import android.text.TextUtils;
-import android.util.Log;
 
-
-import androidx.annotation.Nullable;
 
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
@@ -36,8 +33,6 @@
 import com.hdl.photovoltaic.uni.HDLUniMP;
 import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
 import com.hdl.photovoltaic.utils.AppManagerUtils;
-import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
-import com.hdl.photovoltaic.widget.ConfirmationTipDialog;
 import com.hdl.sdk.link.HDLLinkLocalSdk;
 import com.hdl.sdk.link.common.event.EventListener;
 import com.hdl.sdk.link.core.bean.LinkResponse;
@@ -45,7 +40,6 @@
 import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
 import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
 import com.hdl.sdk.link.core.config.HDLLinkConfig;
-import com.hdl.sdk.link.core.connect.HDLUdpConnect;
 import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient;
 
 import org.greenrobot.eventbus.Subscribe;
@@ -338,6 +332,10 @@
      * 鍒濆鍖杕qtt瀹㈡埛绔�
      */
     public void initMqttClient() {
+        //妫�鏌ユ柇寮�鐘舵��
+        if (!MqttRecvClient.getInstance().isConnected()) {
+            MqttRecvClient.getInstance().reConnect();
+        }
         if (!MqttRecvClient.getInstance().isInit()) {
             HdlMqttLogic.getInstance().getMqttRemoteInfo(HomeType.A, new CloudCallBeak<MqttInfo>() {
                 @Override
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/HomeLoginActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/HomeLoginActivity.java
deleted file mode 100644
index b5a945b..0000000
--- a/app/src/main/java/com/hdl/photovoltaic/ui/HomeLoginActivity.java
+++ /dev/null
@@ -1,577 +0,0 @@
-package com.hdl.photovoltaic.ui;
-
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.method.HideReturnsTransformationMethod;
-import android.text.method.LinkMovementMethod;
-import android.text.method.PasswordTransformationMethod;
-import android.text.style.ClickableSpan;
-import android.view.View;
-import android.widget.TextView;
-
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.content.res.AppCompatResources;
-
-import com.hdl.linkpm.sdk.HDLLinkPMSdk;
-import com.hdl.linkpm.sdk.core.exception.HDLException;
-import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
-import com.hdl.linkpm.sdk.user.bean.HDLLoginBean;
-import com.hdl.linkpm.sdk.user.bean.HDLUserRegionBean;
-import com.hdl.linkpm.sdk.user.callback.ILoginCallBack;
-import com.hdl.photovoltaic.HDLApp;
-import com.hdl.photovoltaic.R;
-import com.hdl.photovoltaic.base.CustomBaseActivity;
-import com.hdl.photovoltaic.config.UserConfigManage;
-import com.hdl.photovoltaic.databinding.ActivityHomeLoginBinding;
-import com.hdl.photovoltaic.other.HdlResidenceLogic;
-import com.hdl.photovoltaic.other.HdlUniLogic;
-import com.hdl.photovoltaic.ui.account.ChangePassword;
-import com.hdl.photovoltaic.ui.account.RegisterAccountActivity;
-import com.hdl.photovoltaic.ui.adapter.LanguageAdapter;
-import com.hdl.photovoltaic.ui.bean.HouseIdBean;
-import com.hdl.photovoltaic.config.AppConfigManage;
-import com.hdl.photovoltaic.listener.CloudCallBeak;
-import com.hdl.photovoltaic.other.HdlAccountLogic;
-import com.hdl.photovoltaic.other.HdlThreadLogic;
-import com.hdl.photovoltaic.ui.me.WebActivity;
-import com.hdl.photovoltaic.uni.HDLUniMP;
-import com.hdl.photovoltaic.utils.AppManagerUtils;
-import com.hdl.photovoltaic.utils.LocalManageUtil;
-import com.hdl.photovoltaic.utils.TimeUtils;
-import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
-import com.hdl.photovoltaic.widget.ConfirmationCancelDialog1;
-import com.hdl.photovoltaic.widget.ListDialog;
-import com.hdl.photovoltaic.widget.adapter.ListDialogAdapter;
-import com.jaeger.library.StatusBarUtil;
-
-import java.util.List;
-
-/**
- * 鐧诲綍鐨勭晫闈�
- */
-public class HomeLoginActivity extends CustomBaseActivity {
-
-    private ActivityHomeLoginBinding viewBinding;
-
-    @Override
-    public Object getContentView() {
-
-        setNotificationBarBackgroundColor(CustomColor.blue);
-        viewBinding = ActivityHomeLoginBinding.inflate(getLayoutInflater());
-        return viewBinding.getRoot();
-    }
-
-    @Override
-    public void onBindView(Bundle savedInstanceState) {
-        setStatusBarTranslucent();
-        //鍒濆鍖�
-        initView();
-        //鍒濆鍖栫晫闈㈢洃鍚櫒
-        initEvent();
-        //鍦ㄧ晫闈腑浣跨敤
-//        KeyboardStateObserverUtils.getKeyboardStateObserver(_mActivity).setKeyboardVisibilityListener(new KeyboardStateObserverUtils.OnKeyboardVisibilityListener() {
-//            @Override
-//            public void onKeyboardShow(int h) {
-//                //Toast.makeText(MainActivity.this,"閿洏寮瑰嚭",Toast.LENGTH_SHORT).show();
-//                ConstraintSet cs = new ConstraintSet();
-//                cs.clone(viewBinding.homeLoginParentCl);
-////                (viewBinding.loadingConfirmationRl.getTop()-dip2px(h))
-//                cs.connect(R.id.home_login_tv, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, h);//
-//                //搴旂敤绾︽潫
-//                cs.applyTo(viewBinding.homeLoginParentCl);
-//            }
-//
-//            @Override
-//
-//            public void onKeyboardHide(int h) {
-//                ConstraintSet cs = new ConstraintSet();
-//                cs.clone(viewBinding.homeLoginParentCl);
-//                cs.connect(R.id.home_login_tv, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, h);//
-//                //搴旂敤绾︽潫
-//                cs.applyTo(viewBinding.homeLoginParentCl);
-//            }
-//
-//        });
-
-
-    }
-
-    /**
-     * 鍒濆鍖朥I
-     */
-    private void initView() {
-        viewBinding.homeLoginCheckBCCl.setSelected(UserConfigManage.getInstance().isBAccount());
-        viewBinding.homeLoginPrivacyCheckIv.setSelected(UserConfigManage.getInstance().isAcceiptPolicy());
-        setStringDifferentColors(viewBinding.homeLoginPrivacyTv);
-        if (UserConfigManage.getInstance().getCurrentAppLanguage().equals(LocalManageUtil.zh)) {
-            viewBinding.homeLoginLanguageTv.setText("绠�浣撲腑鏂�");
-        } else {
-            viewBinding.homeLoginLanguageTv.setText("English");
-        }
-        if (UserConfigManage.getInstance().isBAccount()) {
-            viewBinding.homeLoginRegisterTv.setVisibility(View.GONE);
-        } else {
-            viewBinding.homeLoginRegisterTv.setVisibility(View.VISIBLE);
-        }
-
-        String acc = "13375012441";
-//        String acc = "nuy13368@uzxia.com";
-        String pws = "123456";
-        //娴嬭瘯鐢�
-        viewBinding.homeLoginAccountEt.setText(acc);
-        viewBinding.homeLoginPasswordEt.setText(pws);
-        isLoginTextViewEnabled();
-    }
-
-    /**
-     * 娉ㄥ唽鐩戝惉浜嬩欢
-     */
-    private void initEvent() {
-
-        viewBinding.homeLoginMoreIv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                HdlThreadLogic.toast(_mActivity, getString(R.string.loading_not_supported));
-            }
-        });
-        //璇█閫夋嫨
-        viewBinding.homeLoginLanguageTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                ListDialog listDialog = new ListDialog(_mActivity);
-                listDialog.show();
-                listDialog.setCanceledOnTouchOutside(true);
-                listDialog.setItemOnclickListener(new ListDialogAdapter.OnclickListener() {
-                    @Override
-                    public void onClick(int position, LanguageAdapter.ItemData itemData) {
-                        UserConfigManage.getInstance().setCurrentAppLanguage(itemData.getLanguage());
-                        UserConfigManage.getInstance().Save();
-                        //閰嶇疆鎺ュ彛璇锋眰璇█
-                        HDLLinkPMSdk.setLanguage(UserConfigManage.getInstance().getCurrentAppLanguage());
-                        listDialog.dismiss();
-                        AppManagerUtils.getAppManager().finishAllActivity();
-                        Intent intent = new Intent();
-                        intent.setClass(HDLApp.getInstance(), StartActivity.class);
-                        startActivity(intent);
-                        viewBinding.homeLoginLanguageTv.setText(itemData.getTitle());
-                    }
-                });
-            }
-        });
-
-        viewBinding.homeLoginAccountEt.addTextChangedListener(accountTextWatcher);
-        viewBinding.homeLoginClearContentsIv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                viewBinding.homeLoginAccountEt.setText("");
-            }
-        });
-
-        viewBinding.homeLoginPasswordEt.addTextChangedListener(passwordTextWatcher);
-        viewBinding.homeLoginHideIv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (v.isSelected()) {
-                    v.setSelected(false);
-                    viewBinding.homeLoginHideIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.hide));
-                    viewBinding.homeLoginPasswordEt.setTransformationMethod(PasswordTransformationMethod.getInstance());
-                } else {
-                    v.setSelected(true);
-                    viewBinding.homeLoginHideIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.show));
-                    viewBinding.homeLoginPasswordEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
-
-
-                }
-                if (!TextUtils.isEmpty(viewBinding.homeLoginPasswordEt.getText())) {
-                    viewBinding.homeLoginPasswordEt.setSelection(viewBinding.homeLoginPasswordEt.getText().length());
-                }
-            }
-        });
-        //閫夋嫨b绔紝c绔�
-        viewBinding.homeLoginCheckBCCl.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                v.setSelected(!v.isSelected());
-                UserConfigManage.getInstance().setBAccount(v.isSelected());
-                viewBinding.homeLoginCheckBCIv.setSelected(UserConfigManage.getInstance().isBAccount());
-                if (UserConfigManage.getInstance().isBAccount()) {
-                    viewBinding.homeLoginRegisterTv.setVisibility(View.GONE);
-                } else {
-                    viewBinding.homeLoginRegisterTv.setVisibility(View.VISIBLE);
-                }
-            }
-        });
-        //闅愮鍗忚
-        viewBinding.homeLoginPrivacyCheckIv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                v.setSelected(!v.isSelected());
-                UserConfigManage.getInstance().setAcceiptPolicy(v.isSelected());
-            }
-        });
-        //鐧诲綍
-        viewBinding.homeLoginTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-
-                String account = viewBinding.homeLoginAccountEt.getText().toString().replace(" ", "");
-                String password = viewBinding.homeLoginPasswordEt.getText().toString().replace(" ", "");
-                boolean is_login = isLocalCheckAccountAndPassword(account, password);
-                if (!is_login) {
-                    return;
-                }
-                boolean isSelected = UserConfigManage.getInstance().isAcceiptPolicy();
-                if (!isSelected) {
-                    //闅愮鍗忚鎻愮ず
-                    getDialog();
-                    return;
-                }
-                showLoading(getString(R.string.home_login_be_logging_in));
-                HdlAccountLogic.getInstance().regionByAccount(account, new CloudCallBeak<HDLUserRegionBean>() {
-                    @Override
-                    public void onSuccess(HDLUserRegionBean obj) {
-                        //String APP_REGIONURL_TEST = "http://47.114.131.143:27199";
-                        //AppConfigManage.setUserRegionUrl(APP_REGIONURL_TEST);
-                        //鍒濆鍖栨湇鍔″煙鍚�
-                        AppConfigManage.setUserRegionUrl(obj.getRegionUrl());
-                        HDLLinkPMUser.getInstance().setUserRegionUrl(AppConfigManage.getUserRegionUrl());
-                        HdlAccountLogic.getInstance().loginByPassword(account, password, new ILoginCallBack() {
-                            @Override
-                            public void onSuccess(HDLLoginBean obj) {
-                                HdlResidenceLogic.getInstance().getResidenceIdList("", "", new CloudCallBeak<List<HouseIdBean>>() {
-                                    @Override
-                                    public void onSuccess(List<HouseIdBean> obj) {
-                                        hideLoading();
-                                        HdlResidenceLogic.getInstance().setHouseIdList(obj);
-                                        restoreButtonStyleToInitializeState();
-                                        if (UserConfigManage.getInstance().isBAccount()) {
-                                            //瀹夎鍟嗚烦杞晫闈�
-                                            startActivity(MyPowerStationActivity.class);
-                                        } else {
-                                            //C绔敤鎴疯烦杞晫闈�
-                                            startActivity(CPowerStationActivity.class);
-
-                                        }
-                                        finish();
-                                    }
-
-                                    @Override
-                                    public void onFailure(HDLException e) {
-                                        hideLoading();
-                                        restoreButtonStyleToInitializeState();
-                                        if (UserConfigManage.getInstance().isBAccount()) {
-                                            //瀹夎鍟嗚烦杞晫闈�
-                                            startActivity(MyPowerStationActivity.class);
-                                        } else {
-                                            //C绔敤鎴疯烦杞晫闈�
-                                            startActivity(CPowerStationActivity.class);
-                                        }
-                                        finish();
-                                    }
-                                });
-                            }
-
-                            @Override
-                            public void onFailure(HDLException e) {
-                                hideLoading();
-                                if (e.getCode() == 10019) {
-                                    //鐢ㄦ埛宸茬粡琚攣瀹氶敊璇爜
-                                    try {
-                                        if (e.getmExtra() != null) {
-                                            if (System.currentTimeMillis() < e.getmExtra().getUnlockTime()) {
-                                                long time = e.getmExtra().getUnlockTime() - System.currentTimeMillis();
-                                                int minute = Integer.parseInt(TimeUtils.getMinuteTime(time));
-                                                HdlThreadLogic.toast(_mActivity, e.getMsg() + getString(R.string.residue) + minute + getString(R.string.minute) + "(" + e.getCode() + ")");
-                                            }
-                                        }
-                                    } catch (Exception ee) {
-                                        HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
-                                    }
-
-                                } else {
-                                    HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
-                                }
-                            }
-                        });
-                    }
-
-                    @Override
-                    public void onFailure(HDLException e) {
-                        hideLoading();
-                        HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
-                    }
-                });
-
-
-            }
-        });
-        //浣撻獙鐢电珯
-        viewBinding.homeLoginExperienceTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                v.setSelected(!v.isSelected());
-                UserConfigManage.getInstance().setUserExperience(v.isSelected());
-//                requestPermissions();
-//                startActivity(MyPowerStationActivity.class);
-            }
-        });
-        //娉ㄥ唽
-        viewBinding.homeLoginRegisterTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                Intent intent = new Intent();
-                intent.setClass(HomeLoginActivity.this, RegisterAccountActivity.class);
-                startActivity(intent);
-            }
-        });
-        //蹇樿瀵嗙爜
-        viewBinding.homeLoginForgetPasswordTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                Intent intent = new Intent();
-                intent.setClass(HomeLoginActivity.this, ChangePassword.class);
-                startActivity(intent);
-            }
-        });
-
-    }
-
-    /**
-     * 鏍¢獙鐧诲綍鎸夐挳鏄惁鍚敤
-     */
-    private void isLoginTextViewEnabled() {
-        String account = viewBinding.homeLoginAccountEt.getText().toString().replace(" ", "");
-        String password = viewBinding.homeLoginPasswordEt.getText().toString().replace(" ", "");
-        boolean isEnabled = account.length() > 0 && password.length() > 0;
-        viewBinding.homeLoginTv.setEnabled(isEnabled);
-        if (password.length() < 6 || password.length() > 16) {
-            return;
-        }
-        //绗﹀悎瀵嗙爜瑙勫垯鍚庨殣钘忛敊璇彁绀猴紱
-        viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_E1E1E1));
-        viewBinding.homeLoginPasswordTextErrorTv.setText("");
-
-    }
-
-    /**
-     * 鏈湴鏍¢獙杈撳叆璐﹀彿鎴栬�呭瘑鐮佹槸鍚︽纭�
-     *
-     * @param account  璐﹀彿
-     * @param password 瀵嗙爜
-     *                 姝g‘杩斿洖<true>true</true>
-     *                 涓�鑸柟娉�
-     */
-    private boolean isLocalCheckAccountAndPassword(String account, String password) {
-        if (TextUtils.isEmpty(account)) {
-            viewBinding.homeLoginLine1V.setBackgroundColor(getColor(R.color.text_D34545));
-            viewBinding.homeLoginAccountTextErrorTv.setText(R.string.home_login_error_account_null);
-            return false;
-        }
-        if (TextUtils.isEmpty(password)) {
-            viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_D34545));
-            viewBinding.homeLoginPasswordTextErrorTv.setText(R.string.home_login_error_password_null);
-            return false;
-        }
-
-
-        if (password.length() < 6 || password.length() > 16) {
-            viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_D34545));
-            viewBinding.homeLoginPasswordTextErrorTv.setText(R.string.home_login_error_6_16_str);
-            return false;
-        }
-        return true;
-
-    }
-
-    /**
-     * 鎭㈠缁勪欢鏍峰紡鍒板垵濮嬪寲鐘舵��
-     */
-    private void restoreButtonStyleToInitializeState() {
-        HdlThreadLogic.runMainThread(new Runnable() {
-            @Override
-            public void run() {
-                viewBinding.homeLoginLine1V.setBackgroundColor(getColor(R.color.text_E1E1E1));
-                viewBinding.homeLoginAccountTextErrorTv.setText("");
-                viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_E1E1E1));
-                viewBinding.homeLoginPasswordTextErrorTv.setText("");
-            }
-        }, null, null);
-    }
-
-    /**
-     * 璁剧疆涓�涓插瓧绗﹀绉嶉鑹蹭互鍙婄偣鍑讳簨浠�
-     *
-     * @param textView 褰撳墠缁勪欢
-     */
-    private void setStringDifferentColors(TextView textView) {
-
-        if (textView == null) {
-            return;
-        }
-
-        String s = textView.getText().toString();
-        if (!s.contains("銆�")) {
-            return;
-        }
-        int startIndex1 = s.indexOf("銆�");
-        int endIndex1 = s.indexOf("銆�") + 1;
-
-        int startIndex2 = s.lastIndexOf("銆�");
-        int endIndex2 = s.lastIndexOf("銆�") + 1;
-
-        SpannableStringBuilder spannable = new SpannableStringBuilder(s);
-        //璁剧疆鏂囧瓧鐨勫墠鏅壊
-        if (textView.getTag() != null && textView.getTag().toString().equals("click")) {
-            spannable.setSpan(new ClickableSpan() {
-                @Override
-                public void onClick(@NonNull View widget) {
-                    //todo 闇�瑕佽烦杞埌鏈嶅姟鍗忚鐣岄潰
-                    Intent intent = new Intent();
-                    intent.putExtra("type", WebActivity.ServiceAgreement);
-                    intent.setClass(_mActivity, WebActivity.class);
-                    startActivity(intent);
-                }
-
-                @Override
-                public void updateDrawState(@NonNull TextPaint ds) {
-                    super.updateDrawState(ds);
-                    //璁剧疆瀛椾綋棰滆壊
-                    ds.setColor(getResources().getColor(R.color.text_245EC3, null));
-                    // 鍘绘帀涓嬪垝绾�
-                    ds.setUnderlineText(false);
-                }
-
-
-            }, startIndex1, endIndex1, 0);
-
-            spannable.setSpan(new ClickableSpan() {
-                @Override
-                public void onClick(@NonNull View widget) {
-                    //todo 闇�瑕佽烦杞埌闅愮鐣岄潰
-                    Intent intent = new Intent();
-                    intent.putExtra("type", WebActivity.PrivacyAgreement);
-                    intent.setClass(_mActivity, WebActivity.class);
-                    startActivity(intent);
-                }
-
-                @Override
-                public void updateDrawState(@NonNull TextPaint ds) {
-                    super.updateDrawState(ds);
-                    //璁剧疆瀛椾綋棰滆壊
-                    ds.setColor(getResources().getColor(R.color.text_245EC3, null));
-                    // 鍘绘帀涓嬪垝绾�
-                    ds.setUnderlineText(false);
-                }
-
-
-            }, startIndex2, endIndex2, 0);
-
-
-        }
-        textView.setText(spannable);
-        //涓�旈亣鍒扮偣鍑诲悗瀛椾綋鏄剧ず楂樹寒锛屽彇娑堥珮浜�
-        textView.setHighlightColor(getResources().getColor(R.color.text_00000000, null));
-        //鏈�鍚庤缃彲鐐瑰嚮锛屽繀椤诲疄鐜帮紝鍚﹀垯鍙兘鏄剧ず鏍峰紡锛屾棤娉曞疄鐜扮偣鍑绘晥鏋�
-        textView.setMovementMethod(LinkMovementMethod.getInstance());
-
-    }
-
-
-    /**
-     * 寮圭獥
-     */
-    private void getDialog() {
-        ConfirmationCancelDialog1 dialog = new ConfirmationCancelDialog1(_mActivity);
-        dialog.setTitle(getString(R.string.loading_privacy));
-        dialog.setContent(getString(R.string.loading_privacy_server));
-        dialog.show();
-        setStringDifferentColors(dialog.getContentTextView());
-        dialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
-            @Override
-            public void Confirm() {
-
-                UserConfigManage.getInstance().setAcceiptPolicy(true);
-                viewBinding.homeLoginPrivacyCheckIv.setSelected(true);
-                dialog.dismiss();
-            }
-        });
-        dialog.setNoOnclickListener(new ConfirmationCancelDialog.onNoOnclickListener() {
-            @Override
-            public void Cancel() {
-                UserConfigManage.getInstance().setAcceiptPolicy(false);
-                viewBinding.homeLoginPrivacyCheckIv.setSelected(false);
-                dialog.dismiss();
-            }
-        });
-
-    }
-
-    /**
-     * 杈撳叆璐﹀彿
-     */
-    private final TextWatcher accountTextWatcher = new TextWatcher() {
-        @Override
-        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-
-        }
-
-        @Override
-        public void onTextChanged(CharSequence s, int start, int before, int count) {
-        }
-
-        @Override
-        public void afterTextChanged(Editable s) {
-            if (s.length() > 0) {
-                if (viewBinding.homeLoginClearContentsIv.getVisibility() == View.GONE) {
-                    viewBinding.homeLoginClearContentsIv.setVisibility(View.VISIBLE);
-                }
-            } else {
-                if (viewBinding.homeLoginClearContentsIv.getVisibility() == View.VISIBLE) {
-                    viewBinding.homeLoginClearContentsIv.setVisibility(View.GONE);
-                }
-            }
-            isLoginTextViewEnabled();
-        }
-    };
-    /**
-     * 杈撳叆瀵嗙爜
-     */
-    private final TextWatcher passwordTextWatcher = new TextWatcher() {
-        @Override
-        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-
-        }
-
-        @Override
-        public void onTextChanged(CharSequence s, int start, int before, int count) {
-        }
-
-        @Override
-        public void afterTextChanged(Editable s) {
-            isLoginTextViewEnabled();
-        }
-    };
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        viewBinding.homeLoginAccountEt.removeTextChangedListener(accountTextWatcher);
-        viewBinding.homeLoginPasswordEt.removeTextChangedListener(passwordTextWatcher);
-    }
-
-    //    灏哠tatusBar璁剧疆涓洪�忔槑
-    public void setStatusBarTranslucent() {
-        StatusBarUtil.setTranslucentForImageViewInFragment(this,
-                0, null);
-        StatusBarUtil.setLightMode(this);
-    }
-
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/LoginActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/LoginActivity.java
new file mode 100644
index 0000000..61338b8
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/LoginActivity.java
@@ -0,0 +1,569 @@
+package com.hdl.photovoltaic.ui;
+
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.SpannableStringBuilder;
+import android.text.TextPaint;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.text.method.HideReturnsTransformationMethod;
+import android.text.method.LinkMovementMethod;
+import android.text.method.PasswordTransformationMethod;
+import android.text.style.ClickableSpan;
+import android.view.View;
+import android.widget.TextView;
+
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.content.res.AppCompatResources;
+
+import com.hdl.linkpm.sdk.HDLLinkPMSdk;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
+import com.hdl.linkpm.sdk.user.bean.HDLLoginBean;
+import com.hdl.linkpm.sdk.user.bean.HDLUserRegionBean;
+import com.hdl.linkpm.sdk.user.callback.ILoginCallBack;
+import com.hdl.photovoltaic.HDLApp;
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.CustomBaseActivity;
+import com.hdl.photovoltaic.config.UserConfigManage;
+import com.hdl.photovoltaic.databinding.ActivityHomeLoginBinding;
+import com.hdl.photovoltaic.other.HdlResidenceLogic;
+import com.hdl.photovoltaic.ui.account.ChangePassword;
+import com.hdl.photovoltaic.ui.account.RegisterAccountActivity;
+import com.hdl.photovoltaic.ui.adapter.LanguageAdapter;
+import com.hdl.photovoltaic.ui.bean.HouseIdBean;
+import com.hdl.photovoltaic.config.AppConfigManage;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlAccountLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.me.WebActivity;
+import com.hdl.photovoltaic.utils.AppManagerUtils;
+import com.hdl.photovoltaic.utils.LocalManageUtil;
+import com.hdl.photovoltaic.utils.TimeUtils;
+import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
+import com.hdl.photovoltaic.widget.ConfirmationCancelDialog1;
+import com.hdl.photovoltaic.widget.ListDialog;
+import com.hdl.photovoltaic.widget.adapter.ListDialogAdapter;
+
+import java.util.List;
+
+/**
+ * 鐧诲綍鐨勭晫闈�
+ */
+public class LoginActivity extends CustomBaseActivity {
+
+    private ActivityHomeLoginBinding viewBinding;
+
+    @Override
+    public Object getContentView() {
+
+        setNotificationBarBackgroundColor(CustomColor.blue);
+        viewBinding = ActivityHomeLoginBinding.inflate(getLayoutInflater());
+        return viewBinding.getRoot();
+    }
+
+    @Override
+    public void onBindView(Bundle savedInstanceState) {
+        setStatusBarTranslucent();
+        //鍒濆鍖�
+        initView();
+        //鍒濆鍖栫晫闈㈢洃鍚櫒
+        initEvent();
+        //鍦ㄧ晫闈腑浣跨敤
+//        KeyboardStateObserverUtils.getKeyboardStateObserver(_mActivity).setKeyboardVisibilityListener(new KeyboardStateObserverUtils.OnKeyboardVisibilityListener() {
+//            @Override
+//            public void onKeyboardShow(int h) {
+//                //Toast.makeText(MainActivity.this,"閿洏寮瑰嚭",Toast.LENGTH_SHORT).show();
+//                ConstraintSet cs = new ConstraintSet();
+//                cs.clone(viewBinding.homeLoginParentCl);
+////                (viewBinding.loadingConfirmationRl.getTop()-dip2px(h))
+//                cs.connect(R.id.home_login_tv, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, h);//
+//                //搴旂敤绾︽潫
+//                cs.applyTo(viewBinding.homeLoginParentCl);
+//            }
+//
+//            @Override
+//
+//            public void onKeyboardHide(int h) {
+//                ConstraintSet cs = new ConstraintSet();
+//                cs.clone(viewBinding.homeLoginParentCl);
+//                cs.connect(R.id.home_login_tv, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, h);//
+//                //搴旂敤绾︽潫
+//                cs.applyTo(viewBinding.homeLoginParentCl);
+//            }
+//
+//        });
+
+
+    }
+
+    /**
+     * 鍒濆鍖朥I
+     */
+    private void initView() {
+        viewBinding.homeLoginCheckBCCl.setSelected(UserConfigManage.getInstance().isBAccount());
+        viewBinding.homeLoginPrivacyCheckIv.setSelected(UserConfigManage.getInstance().isAcceiptPolicy());
+        setStringDifferentColors(viewBinding.homeLoginPrivacyTv);
+        if (UserConfigManage.getInstance().getCurrentAppLanguage().equals(LocalManageUtil.zh)) {
+            viewBinding.homeLoginLanguageTv.setText("绠�浣撲腑鏂�");
+        } else {
+            viewBinding.homeLoginLanguageTv.setText("English");
+        }
+        if (UserConfigManage.getInstance().isBAccount()) {
+            viewBinding.homeLoginRegisterTv.setVisibility(View.GONE);
+        } else {
+            viewBinding.homeLoginRegisterTv.setVisibility(View.VISIBLE);
+        }
+
+        String acc = "13375012441";
+//        String acc = "nuy13368@uzxia.com";
+        String pws = "123456";
+        //娴嬭瘯鐢�
+        viewBinding.homeLoginAccountEt.setText(acc);
+        viewBinding.homeLoginPasswordEt.setText(pws);
+        isLoginTextViewEnabled();
+    }
+
+    /**
+     * 娉ㄥ唽鐩戝惉浜嬩欢
+     */
+    private void initEvent() {
+
+        viewBinding.homeLoginMoreIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                HdlThreadLogic.toast(_mActivity, getString(R.string.loading_not_supported));
+            }
+        });
+        //璇█閫夋嫨
+        viewBinding.homeLoginLanguageTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                ListDialog listDialog = new ListDialog(_mActivity);
+                listDialog.show();
+                listDialog.setCanceledOnTouchOutside(true);
+                listDialog.setItemOnclickListener(new ListDialogAdapter.OnclickListener() {
+                    @Override
+                    public void onClick(int position, LanguageAdapter.ItemData itemData) {
+                        UserConfigManage.getInstance().setCurrentAppLanguage(itemData.getLanguage());
+                        UserConfigManage.getInstance().Save();
+                        //閰嶇疆鎺ュ彛璇锋眰璇█
+                        HDLLinkPMSdk.setLanguage(UserConfigManage.getInstance().getCurrentAppLanguage());
+                        listDialog.dismiss();
+                        AppManagerUtils.getAppManager().finishAllActivity();
+                        Intent intent = new Intent();
+                        intent.setClass(HDLApp.getInstance(), StartActivity.class);
+                        startActivity(intent);
+                        viewBinding.homeLoginLanguageTv.setText(itemData.getTitle());
+                    }
+                });
+            }
+        });
+
+        viewBinding.homeLoginAccountEt.addTextChangedListener(accountTextWatcher);
+        viewBinding.homeLoginClearContentsIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                viewBinding.homeLoginAccountEt.setText("");
+            }
+        });
+
+        viewBinding.homeLoginPasswordEt.addTextChangedListener(passwordTextWatcher);
+        viewBinding.homeLoginHideIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (v.isSelected()) {
+                    v.setSelected(false);
+                    viewBinding.homeLoginHideIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.hide));
+                    viewBinding.homeLoginPasswordEt.setTransformationMethod(PasswordTransformationMethod.getInstance());
+                } else {
+                    v.setSelected(true);
+                    viewBinding.homeLoginHideIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.show));
+                    viewBinding.homeLoginPasswordEt.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
+
+
+                }
+                if (!TextUtils.isEmpty(viewBinding.homeLoginPasswordEt.getText())) {
+                    viewBinding.homeLoginPasswordEt.setSelection(viewBinding.homeLoginPasswordEt.getText().length());
+                }
+            }
+        });
+        //閫夋嫨b绔紝c绔�
+        viewBinding.homeLoginCheckBCCl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                v.setSelected(!v.isSelected());
+                UserConfigManage.getInstance().setBAccount(v.isSelected());
+                viewBinding.homeLoginCheckBCIv.setSelected(UserConfigManage.getInstance().isBAccount());
+                if (UserConfigManage.getInstance().isBAccount()) {
+                    viewBinding.homeLoginRegisterTv.setVisibility(View.GONE);
+                } else {
+                    viewBinding.homeLoginRegisterTv.setVisibility(View.VISIBLE);
+                }
+            }
+        });
+        //闅愮鍗忚
+        viewBinding.homeLoginPrivacyCheckIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                v.setSelected(!v.isSelected());
+                UserConfigManage.getInstance().setAcceiptPolicy(v.isSelected());
+            }
+        });
+        //鐧诲綍
+        viewBinding.homeLoginTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+                String account = viewBinding.homeLoginAccountEt.getText().toString().replace(" ", "");
+                String password = viewBinding.homeLoginPasswordEt.getText().toString().replace(" ", "");
+                boolean is_login = isLocalCheckAccountAndPassword(account, password);
+                if (!is_login) {
+                    return;
+                }
+                boolean isSelected = UserConfigManage.getInstance().isAcceiptPolicy();
+                if (!isSelected) {
+                    //闅愮鍗忚鎻愮ず
+                    getDialog();
+                    return;
+                }
+                showLoading(getString(R.string.home_login_be_logging_in));
+                HdlAccountLogic.getInstance().regionByAccount(account, new CloudCallBeak<HDLUserRegionBean>() {
+                    @Override
+                    public void onSuccess(HDLUserRegionBean obj) {
+                        //String APP_REGIONURL_TEST = "http://47.114.131.143:27199";
+                        //AppConfigManage.setUserRegionUrl(APP_REGIONURL_TEST);
+                        //鍒濆鍖栨湇鍔″煙鍚�
+                        AppConfigManage.setUserRegionUrl(obj.getRegionUrl());
+                        HDLLinkPMUser.getInstance().setUserRegionUrl(AppConfigManage.getUserRegionUrl());
+                        HdlAccountLogic.getInstance().loginByPassword(account, password, new ILoginCallBack() {
+                            @Override
+                            public void onSuccess(HDLLoginBean obj) {
+                                HdlResidenceLogic.getInstance().getResidenceIdList("", "", new CloudCallBeak<List<HouseIdBean>>() {
+                                    @Override
+                                    public void onSuccess(List<HouseIdBean> obj) {
+                                        hideLoading();
+                                        HdlResidenceLogic.getInstance().setHouseIdList(obj);
+                                        restoreButtonStyleToInitializeState();
+                                        if (UserConfigManage.getInstance().isBAccount()) {
+                                            //瀹夎鍟嗚烦杞晫闈�
+                                            startActivity(BPowerStationActivity.class);
+                                        } else {
+                                            //C绔敤鎴疯烦杞晫闈�
+                                            startActivity(CPowerStationActivity.class);
+
+                                        }
+                                        finish();
+                                    }
+
+                                    @Override
+                                    public void onFailure(HDLException e) {
+                                        hideLoading();
+                                        restoreButtonStyleToInitializeState();
+                                        if (UserConfigManage.getInstance().isBAccount()) {
+                                            //瀹夎鍟嗚烦杞晫闈�
+                                            startActivity(BPowerStationActivity.class);
+                                        } else {
+                                            //C绔敤鎴疯烦杞晫闈�
+                                            startActivity(CPowerStationActivity.class);
+                                        }
+                                        finish();
+                                    }
+                                });
+                            }
+
+                            @Override
+                            public void onFailure(HDLException e) {
+                                hideLoading();
+                                if (e.getCode() == 10019) {
+                                    //鐢ㄦ埛宸茬粡琚攣瀹氶敊璇爜
+                                    try {
+                                        if (e.getmExtra() != null) {
+                                            if (System.currentTimeMillis() < e.getmExtra().getUnlockTime()) {
+                                                long time = e.getmExtra().getUnlockTime() - System.currentTimeMillis();
+                                                int minute = Integer.parseInt(TimeUtils.getMinuteTime(time));
+                                                HdlThreadLogic.toast(_mActivity, e.getMsg() + getString(R.string.residue) + minute + getString(R.string.minute) + "(" + e.getCode() + ")");
+                                            }
+                                        }
+                                    } catch (Exception ee) {
+                                        HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
+                                    }
+
+                                } else {
+                                    HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
+                                }
+                            }
+                        });
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+                        hideLoading();
+                        HdlThreadLogic.toast(_mActivity, e.getMsg() + "(" + e.getCode() + ")");
+                    }
+                });
+
+
+            }
+        });
+        //浣撻獙鐢电珯
+        viewBinding.homeLoginExperienceTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                v.setSelected(!v.isSelected());
+                UserConfigManage.getInstance().setUserExperience(v.isSelected());
+//                requestPermissions();
+//                startActivity(BPowerStationActivity.class);
+            }
+        });
+        //娉ㄥ唽
+        viewBinding.homeLoginRegisterTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent();
+                intent.setClass(LoginActivity.this, RegisterAccountActivity.class);
+                startActivity(intent);
+            }
+        });
+        //蹇樿瀵嗙爜
+        viewBinding.homeLoginForgetPasswordTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent();
+                intent.setClass(LoginActivity.this, ChangePassword.class);
+                startActivity(intent);
+            }
+        });
+
+    }
+
+    /**
+     * 鏍¢獙鐧诲綍鎸夐挳鏄惁鍚敤
+     */
+    private void isLoginTextViewEnabled() {
+        String account = viewBinding.homeLoginAccountEt.getText().toString().replace(" ", "");
+        String password = viewBinding.homeLoginPasswordEt.getText().toString().replace(" ", "");
+        boolean isEnabled = account.length() > 0 && password.length() > 0;
+        viewBinding.homeLoginTv.setEnabled(isEnabled);
+        if (password.length() < 6 || password.length() > 16) {
+            return;
+        }
+        //绗﹀悎瀵嗙爜瑙勫垯鍚庨殣钘忛敊璇彁绀猴紱
+        viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_E1E1E1));
+        viewBinding.homeLoginPasswordTextErrorTv.setText("");
+
+    }
+
+    /**
+     * 鏈湴鏍¢獙杈撳叆璐﹀彿鎴栬�呭瘑鐮佹槸鍚︽纭�
+     *
+     * @param account  璐﹀彿
+     * @param password 瀵嗙爜
+     *                 姝g‘杩斿洖<true>true</true>
+     *                 涓�鑸柟娉�
+     */
+    private boolean isLocalCheckAccountAndPassword(String account, String password) {
+        if (TextUtils.isEmpty(account)) {
+            viewBinding.homeLoginLine1V.setBackgroundColor(getColor(R.color.text_D34545));
+            viewBinding.homeLoginAccountTextErrorTv.setText(R.string.home_login_error_account_null);
+            return false;
+        }
+        if (TextUtils.isEmpty(password)) {
+            viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_D34545));
+            viewBinding.homeLoginPasswordTextErrorTv.setText(R.string.home_login_error_password_null);
+            return false;
+        }
+
+
+        if (password.length() < 6 || password.length() > 16) {
+            viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_D34545));
+            viewBinding.homeLoginPasswordTextErrorTv.setText(R.string.home_login_error_6_16_str);
+            return false;
+        }
+        return true;
+
+    }
+
+    /**
+     * 鎭㈠缁勪欢鏍峰紡鍒板垵濮嬪寲鐘舵��
+     */
+    private void restoreButtonStyleToInitializeState() {
+        HdlThreadLogic.runMainThread(new Runnable() {
+            @Override
+            public void run() {
+                viewBinding.homeLoginLine1V.setBackgroundColor(getColor(R.color.text_E1E1E1));
+                viewBinding.homeLoginAccountTextErrorTv.setText("");
+                viewBinding.homeLoginLine2V.setBackgroundColor(getColor(R.color.text_E1E1E1));
+                viewBinding.homeLoginPasswordTextErrorTv.setText("");
+            }
+        }, null, null);
+    }
+
+    /**
+     * 璁剧疆涓�涓插瓧绗﹀绉嶉鑹蹭互鍙婄偣鍑讳簨浠�
+     *
+     * @param textView 褰撳墠缁勪欢
+     */
+    private void setStringDifferentColors(TextView textView) {
+
+        if (textView == null) {
+            return;
+        }
+
+        String s = textView.getText().toString();
+        if (!s.contains("銆�")) {
+            return;
+        }
+        int startIndex1 = s.indexOf("銆�");
+        int endIndex1 = s.indexOf("銆�") + 1;
+
+        int startIndex2 = s.lastIndexOf("銆�");
+        int endIndex2 = s.lastIndexOf("銆�") + 1;
+
+        SpannableStringBuilder spannable = new SpannableStringBuilder(s);
+        //璁剧疆鏂囧瓧鐨勫墠鏅壊
+        if (textView.getTag() != null && textView.getTag().toString().equals("click")) {
+            spannable.setSpan(new ClickableSpan() {
+                @Override
+                public void onClick(@NonNull View widget) {
+                    //todo 闇�瑕佽烦杞埌鏈嶅姟鍗忚鐣岄潰
+                    Intent intent = new Intent();
+                    intent.putExtra("type", WebActivity.ServiceAgreement);
+                    intent.setClass(_mActivity, WebActivity.class);
+                    startActivity(intent);
+                }
+
+                @Override
+                public void updateDrawState(@NonNull TextPaint ds) {
+                    super.updateDrawState(ds);
+                    //璁剧疆瀛椾綋棰滆壊
+                    ds.setColor(getResources().getColor(R.color.text_245EC3, null));
+                    // 鍘绘帀涓嬪垝绾�
+                    ds.setUnderlineText(false);
+                }
+
+
+            }, startIndex1, endIndex1, 0);
+
+            spannable.setSpan(new ClickableSpan() {
+                @Override
+                public void onClick(@NonNull View widget) {
+                    //todo 闇�瑕佽烦杞埌闅愮鐣岄潰
+                    Intent intent = new Intent();
+                    intent.putExtra("type", WebActivity.PrivacyAgreement);
+                    intent.setClass(_mActivity, WebActivity.class);
+                    startActivity(intent);
+                }
+
+                @Override
+                public void updateDrawState(@NonNull TextPaint ds) {
+                    super.updateDrawState(ds);
+                    //璁剧疆瀛椾綋棰滆壊
+                    ds.setColor(getResources().getColor(R.color.text_245EC3, null));
+                    // 鍘绘帀涓嬪垝绾�
+                    ds.setUnderlineText(false);
+                }
+
+
+            }, startIndex2, endIndex2, 0);
+
+
+        }
+        textView.setText(spannable);
+        //涓�旈亣鍒扮偣鍑诲悗瀛椾綋鏄剧ず楂樹寒锛屽彇娑堥珮浜�
+        textView.setHighlightColor(getResources().getColor(R.color.text_00000000, null));
+        //鏈�鍚庤缃彲鐐瑰嚮锛屽繀椤诲疄鐜帮紝鍚﹀垯鍙兘鏄剧ず鏍峰紡锛屾棤娉曞疄鐜扮偣鍑绘晥鏋�
+        textView.setMovementMethod(LinkMovementMethod.getInstance());
+
+    }
+
+
+    /**
+     * 寮圭獥
+     */
+    private void getDialog() {
+        ConfirmationCancelDialog1 dialog = new ConfirmationCancelDialog1(_mActivity);
+        dialog.setTitle(getString(R.string.loading_privacy));
+        dialog.setContent(getString(R.string.loading_privacy_server));
+        dialog.show();
+        setStringDifferentColors(dialog.getContentTextView());
+        dialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
+            @Override
+            public void Confirm() {
+
+                UserConfigManage.getInstance().setAcceiptPolicy(true);
+                viewBinding.homeLoginPrivacyCheckIv.setSelected(true);
+                dialog.dismiss();
+            }
+        });
+        dialog.setNoOnclickListener(new ConfirmationCancelDialog.onNoOnclickListener() {
+            @Override
+            public void Cancel() {
+                UserConfigManage.getInstance().setAcceiptPolicy(false);
+                viewBinding.homeLoginPrivacyCheckIv.setSelected(false);
+                dialog.dismiss();
+            }
+        });
+
+    }
+
+    /**
+     * 杈撳叆璐﹀彿
+     */
+    private final TextWatcher accountTextWatcher = new TextWatcher() {
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            if (s.length() > 0) {
+                if (viewBinding.homeLoginClearContentsIv.getVisibility() == View.GONE) {
+                    viewBinding.homeLoginClearContentsIv.setVisibility(View.VISIBLE);
+                }
+            } else {
+                if (viewBinding.homeLoginClearContentsIv.getVisibility() == View.VISIBLE) {
+                    viewBinding.homeLoginClearContentsIv.setVisibility(View.GONE);
+                }
+            }
+            isLoginTextViewEnabled();
+        }
+    };
+    /**
+     * 杈撳叆瀵嗙爜
+     */
+    private final TextWatcher passwordTextWatcher = new TextWatcher() {
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            isLoginTextViewEnabled();
+        }
+    };
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        viewBinding.homeLoginAccountEt.removeTextChangedListener(accountTextWatcher);
+        viewBinding.homeLoginPasswordEt.removeTextChangedListener(passwordTextWatcher);
+    }
+
+
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java
deleted file mode 100644
index 6ba844c..0000000
--- a/app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java
+++ /dev/null
@@ -1,606 +0,0 @@
-package com.hdl.photovoltaic.ui;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.content.res.AppCompatResources;
-
-import android.Manifest;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.location.LocationManager;
-import android.os.Bundle;
-import android.os.Process;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.view.View;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import com.hdl.linkpm.sdk.core.exception.HDLException;
-import com.hdl.linkpm.sdk.home.type.HomeType;
-import com.hdl.photovoltaic.HDLApp;
-import com.hdl.photovoltaic.R;
-import com.hdl.photovoltaic.base.CustomBaseActivity;
-import com.hdl.photovoltaic.bean.MqttInfo;
-import com.hdl.photovoltaic.config.ConstantManage;
-import com.hdl.photovoltaic.config.UserConfigManage;
-import com.hdl.photovoltaic.databinding.ActivityMyPowerStationBinding;
-import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
-import com.hdl.photovoltaic.enums.NetworkType;
-import com.hdl.photovoltaic.listener.CloudCallBeak;
-import com.hdl.photovoltaic.other.HdlDeviceLogic;
-import com.hdl.photovoltaic.other.HdlLogLogic;
-import com.hdl.photovoltaic.other.HdlMqttLogic;
-import com.hdl.photovoltaic.other.HdlOtaLogic;
-import com.hdl.photovoltaic.other.HdlResidenceLogic;
-import com.hdl.photovoltaic.other.HdlThreadLogic;
-import com.hdl.photovoltaic.other.HdlUniLogic;
-import com.hdl.photovoltaic.ui.bean.DeviceRemoteInfo;
-import com.hdl.photovoltaic.ui.bean.OidBean;
-import com.hdl.photovoltaic.uni.HDLUniMP;
-import com.hdl.photovoltaic.utils.AppManagerUtils;
-import com.hdl.photovoltaic.utils.GPSManagerUtils;
-import com.hdl.photovoltaic.utils.PermissionUtils;
-import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
-import com.hdl.photovoltaic.widget.ConfirmationTipDialog;
-import com.hdl.sdk.link.HDLLinkLocalSdk;
-import com.hdl.sdk.link.common.event.EventListener;
-import com.hdl.sdk.link.core.bean.LinkResponse;
-import com.hdl.sdk.link.core.bean.ModbusResponse;
-import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
-import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
-import com.hdl.sdk.link.core.config.HDLLinkConfig;
-import com.hdl.sdk.link.core.connect.HDLUdpConnect;
-import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import java.lang.reflect.Type;
-import java.util.List;
-
-import cn.jpush.android.api.JPushInterface;
-
-
-/**
- * B绔�-鐢电珯鐣岄潰
- */
-public class MyPowerStationActivity extends CustomBaseActivity {
-
-
-    private ActivityMyPowerStationBinding viewBinding;
-    private int currentFragmentIndex = 1;
-    private EventListener allTopicsListener;
-    private int backPressTimes;
-
-    @Override
-    public Object getContentView() {
-        viewBinding = ActivityMyPowerStationBinding.inflate(getLayoutInflater());
-        return viewBinding.getRoot();
-    }
-
-    @Override
-    public void onBindView(Bundle savedInstanceState) {
-        setNotificationBarBackgroundColor(CustomColor.blue);
-        //鍒濆鍖�
-        this.initView();
-        //鍒濆鍖栫晫闈㈢洃鍚櫒
-        this.initEvent();
-        //娉ㄥ唽鐩戝惉
-        this.registerAllTopicsListener();
-        //鍒濆鍖杕qtt瀹㈡埛绔�
-        this.initMqttClient();
-        //涓婁紶鏋佸厜娉ㄥ唽ID鍒颁簯绔�
-        this.pushTokens();
-        //鐐瑰嚮鏋佸厜閫氱煡鏍忔秷鎭繘鏉�
-        this.clickJpushNotificationMessage();
-        //鍒濆鍖栨潈闄�
-        this.requestPermissions();
-
-    }
-
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        //鍚姩椤典笌mainActivity鏍峰紡涓�鏍凤紝杩欐牱鍚姩椤靛拰mainActivity鐪嬩笂鍘绘槸涓�涓晫闈紝鐩殑鏄负浜唌ainActivity閬綇涓嬩竴椤碉紱
-//        AppManagerUtils.getAppManager().finishActivity(StartActivity.class);
-        portConflictDialog();
-//        Intent intent = new Intent(_mActivity, MyPowerStationActivity.class);
-//        intent.setFlags(Intent.Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
-//        intent.putExtra("skip", "skip");//閲岄潰鍒ゆ柇鏈夎繖涓爣璇嗗氨璺宠浆鍒版秷鎭腑蹇冪晫闈�
-//        _mActivity.startActivity(intent);
-        //鐐瑰嚮鏋佸厜閫氱煡鏍忔秷鎭繘鏉�
-//        this.clickJpushNotificationMessage();
-    }
-
-
-    /**
-     * 涓婁紶鏋佸厜娉ㄥ唽ID鍒颁簯绔�
-     */
-    private void pushTokens() {
-        String registrationId_tag = "registrationID_" + UserConfigManage.getInstance().getUserId();
-        String is_registrationID = HDLApp.getInstance().getKey(registrationId_tag);
-        if (is_registrationID.equals("true")) {
-            //涓婅繃灏辨病鏈夊繀瑕佸湪涓婁紶鍟�
-            return;
-        }
-
-        HdlThreadLogic.runSubThread(new Runnable() {
-            @Override
-            public void run() {
-                String registrationID = JPushInterface.getRegistrationID(_mActivity);
-                int addCount = 0;
-                while (TextUtils.isEmpty(registrationID)) {
-                    SystemClock.sleep(1000);//1s浼戠湢
-                    registrationID = JPushInterface.getRegistrationID(_mActivity);
-                    addCount++;
-                    if (addCount > 5) {
-                        //5s瓒呮椂
-                        break;
-                    }
-                }
-                if (!TextUtils.isEmpty(registrationID)) {
-                    UserConfigManage.getInstance().setRegistrationID(registrationID);
-                    UserConfigManage.getInstance().Save();
-                    String finalRegistrationID = registrationID;
-                    HdlResidenceLogic.getInstance().pushAdd(new CloudCallBeak<String>() {
-                        @Override
-                        public void onSuccess(String pushId) {
-
-                            if (!TextUtils.isEmpty(pushId)) {
-                                UserConfigManage.getInstance().setPushId(pushId);
-                                UserConfigManage.getInstance().Save();
-                            }
-                            HDLApp.getInstance().setInfoMap(registrationId_tag, "true");//璁板綍涓�涓嬬姸鎬�,鍚庡彴鏉�姝籥pp浼氭竻绌�;
-                            HdlLogLogic.print("娣诲姞鏋佸厜ID鍒颁簯绔�--->registrationID:" + UserConfigManage.getInstance().getUserName() + "--->" + finalRegistrationID, true);
-
-                        }
-
-                        @Override
-                        public void onFailure(HDLException e) {
-                            HDLApp.getInstance().setInfoMap(registrationId_tag, "false");//璁板綍涓�涓嬬姸鎬�,鍚庡彴鏉�姝籥pp浼氭竻绌�;
-                            HdlLogLogic.print("娣诲姞鏋佸厜ID鍒颁簯绔け璐�--->registrationID:" + UserConfigManage.getInstance().getUserName() + "--->" + finalRegistrationID, true);
-                        }
-                    });
-
-                }
-
-
-            }
-        });
-    }
-
-    /**
-     * 寮�鍚�氱煡鏉冮檺
-     */
-    private void notificationSet() {
-        boolean isBoolean = PermissionUtils.isNotificationEnabled(_mActivity);
-        if (!isBoolean) {
-            ConfirmationCancelDialog confirmationCancelDialog = new ConfirmationCancelDialog(_mActivity);
-            confirmationCancelDialog.setTitle(getString(R.string.loading_title_tip));
-            confirmationCancelDialog.setContent(getString(R.string.no_permissions_unable_to_receive_push));
-            confirmationCancelDialog.setConfirmation(getString(R.string.go_to_settings));
-            confirmationCancelDialog.show();
-            confirmationCancelDialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
-                @Override
-                public void Confirm() {
-                    confirmationCancelDialog.dismiss();
-                    PermissionUtils.openNotificationSettings(_mActivity);
-
-                }
-            });
-            confirmationCancelDialog.setNoOnclickListener(new ConfirmationCancelDialog.onNoOnclickListener() {
-                @Override
-                public void Cancel() {
-                    confirmationCancelDialog.dismiss();
-                }
-            });
-
-        }
-    }
-
-
-    private void initEvent() {
-        viewBinding.myPowerStationBottomIl1.clickTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                currentFragmentIndex = 1;
-                bottomViewChangeOfStyle();
-                postEventBus(HomepageTitleTabSwitch.powerstation);
-            }
-        });
-        viewBinding.myMessageBottomIl2.clickTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                currentFragmentIndex = 2;
-                bottomViewChangeOfStyle();
-                postEventBus(HomepageTitleTabSwitch.message);
-            }
-        });
-        viewBinding.myMeBottomIl3.clickTv.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                currentFragmentIndex = 3;
-                bottomViewChangeOfStyle();
-                postEventBus(HomepageTitleTabSwitch.me);
-            }
-        });
-
-
-    }
-
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        HdlUniLogic.getInstance().checkRemoveOtherUniMPEventCallBack();
-        //绉婚櫎鐩戝惉
-        HDLLinkLocalSdk.getInstance().removeAllTopicsListener(allTopicsListener);
-    }
-
-    private void initView() {
-        viewBinding.myPowerStationBottomIl1.titleTv.setText(R.string.power_shome_page);//
-        viewBinding.myMessageBottomIl2.titleTv.setText(R.string.message);
-        viewBinding.myMeBottomIl3.titleTv.setText(R.string.power_station_me);
-        this.bottomViewChangeOfStyle();
-
-
-    }
-
-    private void bottomViewChangeOfStyle() {
-        if (this.currentFragmentIndex == 1) {
-            viewBinding.myPowerStationFcv1.setVisibility(View.VISIBLE);//鏄剧ず鐢电珯鐣岄潰
-            viewBinding.myMessageFcv2.setVisibility(View.GONE);//闅愯棌娑堟伅鐣岄潰
-            viewBinding.myMeFcv3.setVisibility(View.GONE);//闅愯棌鎴戠殑鐣岄潰
-            viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.selectedpowerstation));
-            viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_90000000));
-            viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_unselected));
-            viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000));
-            viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedme));
-            viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_65000000));
-        } else if (this.currentFragmentIndex == 2) {
-            viewBinding.myPowerStationFcv1.setVisibility(View.GONE);//闅愯棌鐢电珯鐣岄潰
-            viewBinding.myMessageFcv2.setVisibility(View.VISIBLE);//鏄剧ず娑堟伅鐣岄潰
-            viewBinding.myMeFcv3.setVisibility(View.GONE);//闅愯棌鎴戠殑鐣岄潰
-            viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedpowerstation));
-            viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_65000000));
-            viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_select));
-            viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_90000000));
-            viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedme));
-            viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_65000000));
-        } else if (this.currentFragmentIndex == 3) {
-            viewBinding.myPowerStationFcv1.setVisibility(View.GONE);//闅愯棌鐢电珯鐣岄潰
-            viewBinding.myMessageFcv2.setVisibility(View.GONE);//闅愯棌娑堟伅鐣岄潰
-            viewBinding.myMeFcv3.setVisibility(View.VISIBLE);//鏄剧ず鎴戠殑鐣岄潰
-            viewBinding.myPowerStationBottomIl1.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.unselectedpowerstation));
-            viewBinding.myPowerStationBottomIl1.titleTv.setTextColor(getColor(R.color.text_65000000));
-            viewBinding.myMessageBottomIl2.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.message_unselected));
-            viewBinding.myMessageBottomIl2.titleTv.setTextColor(getColor(R.color.text_65000000));
-            viewBinding.myMeBottomIl3.iconIv.setImageDrawable(AppCompatResources.getDrawable(_mActivity, R.drawable.selectedme));
-            viewBinding.myMeBottomIl3.titleTv.setTextColor(getColor(R.color.text_90000000));
-        }
-    }
-
-    /**
-     * 鍙戝竷鐐瑰嚮浜嬩欢
-     *
-     * @param tabSwitch -
-     */
-    private void postEventBus(HomepageTitleTabSwitch tabSwitch) {
-        BaseEventBus baseEventBus = new BaseEventBus();
-        baseEventBus.setTopic(ConstantManage.homepage_title_tab_switch);
-        baseEventBus.setType(tabSwitch.toString());
-        EventBus.getDefault().postSticky(baseEventBus);
-    }
-
-    public void requestPermissions() {
-        //娑堟伅閫氱煡闄愭潈
-        this.notificationSet();
-        //ACCESS_FINE_LOCATION	鍏佽浣跨敤GPS瀹氫綅
-        //ACCESS_COARSE_LOCATION	鍏佽浣跨敤WIFI鐑偣鎴栧熀绔欐潵鑾峰彇绮楃暐鐨勫畾浣�
-        String[] ary = PermissionUtils.checkPermission(_mActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION});
-        if (ary.length > 0) {
-            this.requestPermissions(ary, PermissionUtils.STATUS_SUCCESS);
-        } else {
-            locationUpdates();
-        }
-    }
-
-    @Override
-    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
-        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-        if (requestCode == PermissionUtils.STATUS_SUCCESS) {
-            for (int i = 0; i < permissions.length; i++) {
-                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
-                    switch (permissions[i]) {
-                        case Manifest.permission.ACCESS_FINE_LOCATION: {
-                            locationUpdates();
-                        }
-                        break;
-                    }
-
-                }
-
-            }
-        }
-
-    }
-
-
-    /**
-     * 娉ㄥ唽鎵�鏈変富棰樻暟鎹殑鐩戝惉
-     */
-    private void registerAllTopicsListener() {
-        allTopicsListener = new EventListener() {
-            @Override
-            public void onMessage(Object msg) {
-
-                if (msg == null) {
-                    return;
-                }
-                if (msg instanceof ModbusResponse) {
-                    ModbusResponse response = (ModbusResponse) msg;
-                    if (response.getTopic() == null) {
-                        return;
-                    }
-                    HdlLogLogic.print("鐩戝惉鍒癕odbus鏁版嵁--->" + new Gson().toJson(response), false);
-//                    if (response.getTopic().endsWith("custom/native/inverter/up")) {
-                    HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
-                    uniCallBackBaseBean.setType(response.getTopic());
-                    uniCallBackBaseBean.setData(response.getData());
-//                    if (com.hdl.photovoltaic.ui.test.UniAppMqtt.getInstance().getUni()) {
-//                        try {
-//                            String t = String.format("AndroidToPC/%s/%s", System.currentTimeMillis(), HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL);
-//                            com.hdl.photovoltaic.ui.test.UniAppMqtt.getInstance().publish(t, JSONObject.toJSON(uniCallBackBaseBean).toString());
-//                        } catch (Exception ignored) {
-//                        }
-//                    } else {
-                    HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL, uniCallBackBaseBean);
-//                    }
-//                    }
-
-                } else if (msg instanceof LinkResponse) {
-                    LinkResponse linkResponse = (LinkResponse) msg;
-                    if (linkResponse.getTopic() == null) {
-                        return;
-                    }
-                    if (linkResponse.getTopic().endsWith("/ota/device/progress/up")) {
-                        HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
-                        uniCallBackBaseBean.setType(linkResponse.getTopic());
-                        uniCallBackBaseBean.setData(linkResponse.getData());
-                        HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_REPLY_OTA_MODEL, uniCallBackBaseBean);
-                        HdlLogLogic.print(linkResponse.getTopic() + new Gson().toJson(linkResponse.getData()), true);
-                    } else if (linkResponse.getTopic().endsWith("/custom/device/list/upload")) {
-                        //閫嗗彉鍣ㄦ湁鏂皁id閫氱煡涓婚
-                        if (linkResponse.getData() == null) {
-                            HdlLogLogic.print("閫嗗彉鍣ㄦ湁鏂皁id閫氱煡--->鏁版嵁涓虹┖", false);
-                            return;
-                        }
-                        try {
-                            Gson gson = new Gson();
-                            Type typeOfT = new TypeToken<List<OidBean>>() {
-                            }.getType();
-                            String json = gson.toJson(linkResponse.getData());
-                            List<OidBean> oidList = gson.fromJson(json, typeOfT);
-                            //澧為噺澧炲姞add
-                            HdlDeviceLogic.getInstance().updateOidAdd(UserConfigManage.getInstance().getHomeId(), oidList, null);
-                        } catch (Exception ignored) {
-                        }
-
-
-                    }
-                }
-            }
-        };
-        HDLLinkLocalSdk.getInstance().registerAllTopicsListener(allTopicsListener);
-    }
-
-    /**
-     * 鍒濆鍖杕qtt瀹㈡埛绔�
-     */
-    public void initMqttClient() {
-        if (!MqttRecvClient.getInstance().isInit()) {
-            HdlMqttLogic.getInstance().getMqttRemoteInfo(HomeType.A, new CloudCallBeak<MqttInfo>() {
-                @Override
-                public void onSuccess(MqttInfo info) {
-                    if (info != null) {
-                        MqttRecvClient.getInstance().setConnectParam(info.getUrl(), info.getClientId(), info.getUserName(), info.getPassWord());
-                        MqttRecvClient.getInstance().connect();
-                    }
-                }
-
-                @Override
-                public void onFailure(HDLException e) {
-                    HdlLogLogic.print("璇诲彇mqtt杩滅▼淇℃伅澶辫触--->" + e.getMessage(), e.getCode(), true);
-                }
-            });
-        }
-    }
-
-    @Subscribe(threadMode = ThreadMode.MAIN)
-    public void onEventMessage(BaseEventBus event) {
-
-        if (event == null) {
-            return;
-        }
-        if (TextUtils.isEmpty(event.getTopic())) {
-            return;
-        }
-        //缃戝叧鏇存柊mqtt绉橀挜鏇存柊閫氱煡
-        if (event.getTopic().contains("/custom/mqtt/secret/change")) {
-            String[] topics = event.getTopic().split("/");
-            //涓婚涓嶇鍚堣鍒欎笉澶勭悊
-            if (topics.length < 3) {
-                return;
-            }
-            int index = -1;
-            List<GatewayBean> list = HdlDeviceLogic.getInstance().getCurrentHomeGatewayList(UserConfigManage.getInstance().getHomeId());
-            for (int i = 0; i < list.size(); i++) {
-                GatewayBean gatewayBean = list.get(i);
-                if (gatewayBean.getGatewayId().equals(topics[2])) {
-                    index = i;
-                    break;
-                }
-            }
-            if (index > -1) {
-                GatewayBean gatewayBean = list.get(index);
-                HdlDeviceLogic.getInstance().getDeviceRemoteInfo(UserConfigManage.getInstance().getHomeId(), gatewayBean.getSpk(), gatewayBean.getDevice_mac(), new CloudCallBeak<DeviceRemoteInfo>() {
-                    @Override
-                    public void onSuccess(DeviceRemoteInfo deviceRemoteInfo) {
-                        if (deviceRemoteInfo != null) {
-                            //鏇存柊mqtt閫氳鐨勬柊绉橀挜
-                            gatewayBean.setAesKey(deviceRemoteInfo.getSecret());
-                            //鐢ㄤ箣鍓嶇殑搴�,搴曞眰mqtt璁㈤槄锛屽姞瑙e瘑浼氱敤鍒拌鍙傛暟;
-                            HDLLinkConfig.getInstance().setAesKey(deviceRemoteInfo.getSecret());//璁剧疆mqtt閫氳绉橀挜搴�
-                        }
-                    }
-
-                    @Override
-                    public void onFailure(HDLException e) {
-
-                    }
-                });
-            }
-        } else if (event.getTopic().contains(HdlOtaLogic.localDownloadProgress)) {
-            //涓嬭浇浜戠椹卞姩鎴栬�呭浐浠舵枃浠跺埌鏈湴,鑷繁璁$畻杩涘害鏉′笂鎶ュ埌uni閭h竟
-            HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
-            uniCallBackBaseBean.setType(event.getType());
-            uniCallBackBaseBean.setData(event.getData());
-            HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_REPLY_OTA_MODEL, uniCallBackBaseBean);
-            HdlLogLogic.print(event.getTopic() + new Gson().toJson(event.getData()), true);
-        } else if (event.getTopic().contains(ConstantManage.network_change_post)) {
-//            String wifi_ssid = WifiUtils.getInstance().getCurrentConnectWifiSsid();//鑾峰彇WiFi鐨剆sid闇�瑕佷綅缃潈闄愮殑
-            HdlLogLogic.print("鐩戝惉缃戠粶鐘舵��--->" + event.getData().toString() + "(" + event.getType() + ")", true);
-            //绗竴娆″惎鍔ˋpp,浠ュ強鍒囨崲缃戠粶鐨勬椂鍊欐洿鏂�
-            if (TextUtils.isEmpty(UserConfigManage.getInstance().getHomeId())) {
-                return;
-            }
-            if (!event.getType().equals(NetworkType.no_network.toString())) {
-//                AppManagerUtils.getAppManager().showLoading();
-                HdlThreadLogic.runSubThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        //闃叉app鍚姩鐨勬椂鍊欐病鏈夌綉缁�(app涔熺櫥褰曚笉浜�),瀵艰嚧鑾峰彇涓嶄簡mqtt杩滅▼杩炴帴淇℃伅;
-                        initMqttClient();
-                        HdlDeviceLogic.getInstance().getCurrentHomeLocalAndCloudGatewayList(UserConfigManage.getInstance().getHomeId(), new CloudCallBeak<List<GatewayBean>>() {
-                            @Override
-                            public void onSuccess(List<GatewayBean> obj) {
-//                                AppManagerUtils.getAppManager().hideLoading();
-                            }
-
-                            @Override
-                            public void onFailure(HDLException e) {
-//                                AppManagerUtils.getAppManager().hideLoading();
-                            }
-                        });
-                    }
-                });
-            }
-        }
-    }
-
-    /**
-     * 鐐瑰嚮鏋佸厜閫氱煡鏍忔秷鎭繘鏉�
-     */
-    private void clickJpushNotificationMessage() {
-        Intent intent = getIntent();
-        if (intent != null) {
-            String key = intent.getStringExtra("skip");
-            if (key != null) {
-                //瑙﹀彂娑堟伅鐐瑰嚮浜嬩欢
-                viewBinding.myMessageBottomIl2.clickTv.performClick();
-            }
-        }
-    }
-
-
-    /**
-     * 鐗╃悊鎸夐敭杩斿洖浜嬩欢(鍖呮嫭宸︽粦绉婚櫎浜嬩欢)
-     */
-    @Override
-    public void onBackPressed() {
-        if (AppManagerUtils.getAppManager().getActivitySize() <= 1) {
-            if (backPressTimes == 0) {
-                HdlThreadLogic.toast(_mActivity, R.string.kill_app);
-                backPressTimes = 1;
-                new Thread() {
-                    @Override
-                    public void run() {
-                        try {
-                            Thread.sleep(2000);
-                        } catch (InterruptedException e) {
-                            e.printStackTrace();
-                        } finally {
-                            backPressTimes = 0;
-                        }
-                    }
-                }.start();
-                return;
-            } else {
-                AppManagerUtils.getAppManager().finishAllActivity();
-                Process.killProcess(Process.myPid());
-            }
-        }
-        super.onBackPressed();
-    }
-
-
-    /**
-     * 鍒濆鍖栥�愬紑鍚畾浣嶃�戝拰銆愪綅缃俊鎭�戞潈闄�
-     */
-    private void locationUpdates() {
-        // 鍒濆鍖朙ocationManager瀵硅薄
-        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
-        GPSManagerUtils.getInstance().getLocation(this);
-        // 鍒ゆ柇璁惧鏄惁鏀寔瀹氫綅鍔熻兘
-        if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
-            // 鎻愮ず鐢ㄦ埛鎵撳紑瀹氫綅鍔熻兘鎴栬�呭紩瀵肩敤鎴峰幓绯荤粺璁剧疆椤甸潰鎵撳紑瀹氫綅鍔熻兘
-            ConfirmationCancelDialog confirmationCancelDialog = new ConfirmationCancelDialog(_mActivity);
-            confirmationCancelDialog.setTitle(getString(R.string.loading_title_tip));
-            confirmationCancelDialog.setContent(getString(R.string.system_positioning_switch));
-            confirmationCancelDialog.setConfirmation(getString(R.string.go_to_settings));
-            confirmationCancelDialog.show();
-            confirmationCancelDialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
-                @Override
-                public void Confirm() {
-                    confirmationCancelDialog.dismiss();
-                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
-                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                    HDLApp.getInstance().startActivity(intent);
-
-                }
-            });
-            confirmationCancelDialog.setNoOnclickListener(new ConfirmationCancelDialog.onNoOnclickListener() {
-                @Override
-                public void Cancel() {
-                    confirmationCancelDialog.dismiss();
-                }
-            });
-
-        }
-
-    }
-
-    /**
-     * 绔彛鍐茬獊
-     */
-    private void portConflictDialog() {
-        if (!HDLUdpConnect.getInstance().isBindSuccess()) {
-            ConfirmationTipDialog dialog = new ConfirmationTipDialog(_mActivity);
-            dialog.show();
-            dialog.setTitle(getString(R.string.loading_title_tip));
-            dialog.setContent(getString(R.string.port_conflict));
-            dialog.setConfirmation(getString(R.string.home_login_affirm));
-            dialog.setYesOnclickListener(new ConfirmationCancelDialog.onYesOnclickListener() {
-                @Override
-                public void Confirm() {
-                    dialog.dismiss();
-                }
-            });
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/StartActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/StartActivity.java
index 0fab7ea..a448287 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/StartActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/StartActivity.java
@@ -3,11 +3,7 @@
 
 import android.content.Intent;
 import android.os.Bundle;
-import android.os.SystemClock;
 import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.Nullable;
 
 import com.hdl.linkpm.sdk.core.exception.HDLException;
 import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
@@ -16,14 +12,12 @@
 import com.hdl.photovoltaic.config.AppConfigManage;
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.listener.CloudCallBeak;
-import com.hdl.photovoltaic.other.HdlLogLogic;
 import com.hdl.photovoltaic.other.HdlResidenceLogic;
-import com.hdl.photovoltaic.other.HdlUniLogic;
 import com.hdl.photovoltaic.ui.bean.HouseIdBean;
-import com.hdl.photovoltaic.uni.HDLUniMP;
-import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
 
 import java.util.List;
+
+
 
 /**
  * App鍚姩椤碉紙鐩殑鏄负浜嗚鐢ㄦ埛鐐瑰嚮APP鍥炬爣鐨勬椂鍊欐湁涓�涓灛闂村搷搴旂殑浜や簰浣撻獙銆傦級
@@ -53,7 +47,7 @@
                     Intent intent = new Intent();
                     if (UserConfigManage.getInstance().isBAccount()) {
                         //瀹夎鍟嗚烦杞晫闈�
-                        intent.setClass(StartActivity.this, MyPowerStationActivity.class);
+                        intent.setClass(StartActivity.this, BPowerStationActivity.class);
                     } else {
                         //C绔敤鎴疯烦杞晫闈�
                         intent.setClass(StartActivity.this, CPowerStationActivity.class);
@@ -68,7 +62,7 @@
                     Intent intent = new Intent();
                     if (UserConfigManage.getInstance().isBAccount()) {
                         //瀹夎鍟嗚烦杞晫闈�
-                        intent.setClass(StartActivity.this, MyPowerStationActivity.class);
+                        intent.setClass(StartActivity.this, BPowerStationActivity.class);
                     } else {
                         //C绔敤鎴疯烦杞晫闈�
                         intent.setClass(StartActivity.this, CPowerStationActivity.class);
@@ -79,9 +73,11 @@
 
         } else {
             Intent intent = new Intent();
-            intent.setClass(this, HomeLoginActivity.class);
+            intent.setClass(this, LoginActivity.class);
             openActivity(intent);
         }
+
+
     }
 
     @Override
@@ -100,4 +96,7 @@
         super.onDestroy();
         overridePendingTransition(0, 0);
     }
+
+
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/DeviceInfoAdapter.java b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/DeviceInfoAdapter.java
new file mode 100644
index 0000000..b43aba7
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/DeviceInfoAdapter.java
@@ -0,0 +1,112 @@
+package com.hdl.photovoltaic.ui.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
+import com.hdl.photovoltaic.widget.SwipeLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DeviceInfoAdapter extends RecyclerView.Adapter<DeviceInfoAdapter.MyViewHolder> {
+
+    List<DeviceBean> mList;
+
+    Context mContext;
+
+    OnClickListener mOnclickListener;
+
+    public DeviceInfoAdapter(Context context) {
+
+        this.mContext = context;
+    }
+
+    @NonNull
+    @Override
+    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View contentItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_device_details, parent, false);
+        return new MyViewHolder(contentItem);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
+        DeviceBean deviceBean = this.mList.get(position);
+        holder.itemView.setTag(position);
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    if (mOnclickListener != null) {
+                        mOnclickListener.onClick((int) holder.itemView.getTag(), deviceBean);
+                    }
+                } catch (Exception ignored) {
+                }
+            }
+        });
+
+    }
+
+    @Override
+    public int getItemCount() {
+        return this.mList == null ? 0 : this.mList.size();
+    }
+
+    public void setOnclickListener(OnClickListener onClickListener) {
+        this.mOnclickListener = onClickListener;
+    }
+
+    public void setList(List<DeviceBean> newData) {
+        if (this.mList == null) {
+            this.mList = new ArrayList<>();
+        } else {
+            this.mList.clear();
+        }
+
+        this.mList.addAll(newData);
+        notifyDataSetChanged();
+    }
+
+    /**
+     * 涓�琛屽竷灞�瀹瑰櫒
+     */
+    static class MyViewHolder extends RecyclerView.ViewHolder {
+
+        public ImageView homeIconIv;//浣忓畢鍥剧墖
+        public TextView homeNameTv;//浣忓畢鍚嶇О
+        public TextView capacityTv;//瑁呮満瀹归噺
+        public TextView powerTv;//鍙戠數鍔熺巼
+        public TextView stateTv;//鐢电珯鐘舵��(杩炴帴涓�,杩愯,绂荤嚎,鏁呴殰);
+        public RelativeLayout item_parent_rl;//鏉$洰鐖跺鍣�
+        public ImageView move_home_iv;//绉诲姩鐢电珯浣嶇疆
+        public ImageView del_home_iv;//鍒犻櫎鐢电珯
+        public SwipeLayout item_parent_swipeLayout;//鐖跺鍣�
+
+        public MyViewHolder(@NonNull View itemView) {
+            super(itemView);
+            homeIconIv = itemView.findViewById(R.id.device_details_image_iv);
+            homeNameTv = itemView.findViewById(R.id.device_details_name_tv);
+            capacityTv = itemView.findViewById(R.id.device_details_sn_tv);
+            powerTv = itemView.findViewById(R.id.power_type_tv);
+            stateTv = itemView.findViewById(R.id.fragment_house_list_line_state_tv);
+            item_parent_rl = itemView.findViewById(R.id.item_parent_rl);
+            move_home_iv = itemView.findViewById(R.id.move_home_iv);
+            del_home_iv = itemView.findViewById(R.id.del_home_iv);
+            item_parent_swipeLayout = itemView.findViewById(R.id.item_parent_swipeLayout);
+        }
+    }
+
+    public interface OnClickListener {
+        void onClick(int position, DeviceBean deviceBean);
+
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/HouseInfoAdapter.java b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/HouseInfoAdapter.java
index f8fa28e..fe1bbd6 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/HouseInfoAdapter.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/HouseInfoAdapter.java
@@ -15,6 +15,7 @@
 
 import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
 import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.other.HdlDeviceLogic;
 import com.hdl.photovoltaic.other.HdlLogLogic;
 import com.hdl.photovoltaic.ui.bean.HouseIdBean;
 import com.hdl.photovoltaic.utils.GlideUtils;
@@ -22,6 +23,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 
 public class HouseInfoAdapter extends RecyclerView.Adapter<HouseInfoAdapter.MyViewHolder> {
 
@@ -42,7 +44,7 @@
     @NonNull
     @Override
     public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
-        View contentItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.frgment_house_list_line, parent, false);
+        View contentItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_plant_details, parent, false);
         return new MyViewHolder(contentItem);
     }
 
@@ -53,7 +55,7 @@
         HouseIdBean houseIdBean = this.mList.get(position);
         holder.homeNameTv.setText(houseIdBean.getHomeName().trim());
         //瑁呮満瀹归噺
-        String capacity = mContext.getString(R.string.my_power_station_installed_capacity) + houseIdBean.getInstalledCapacity() + "kW";
+        String capacity = mContext.getString(R.string.my_power_station_installed_capacity) + houseIdBean.getInstalledCapacity() + HdlDeviceLogic.kW;
         holder.capacityTv.setText(capacity);
         String kw = "0";
         try {
@@ -69,13 +71,13 @@
             kw = "0.0";
         }
         //鍙戠數鍔熺巼
-        String power = mContext.getString(R.string.power_station_generated_power) + kw + "kW";
+        String power = mContext.getString(R.string.power_station_generated_power) + kw + HdlDeviceLogic.kW;
         holder.powerTv.setText(power);
         holder.item_parent_rl.setTag(position);
         setTextViewStyle(holder.stateTv, houseIdBean.getPowerStationStatus());
-        GlideUtils.getRoundedCornersImage(mContext, houseIdBean.getPowerStationImage(), holder.homeIconIv, new RoundedCorners(4), false);
+        GlideUtils.getRoundedCornersImage(mContext, houseIdBean.getPowerStationImage(), holder.homeIconIv, new RoundedCorners(6), false);
 
-        HdlLogLogic.print("--->鐢电珯鍚嶇О:" + houseIdBean.getHomeName() + "--->鍥剧墖url:" + houseIdBean.getPowerStationImage(), false);
+        HdlLogLogic.print("---鐢电珯鍚嶇О:" + houseIdBean.getHomeName() + "---鍥剧墖url:" + houseIdBean.getPowerStationImage(), false);
         holder.item_parent_rl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -201,10 +203,10 @@
 
         public MyViewHolder(@NonNull View itemView) {
             super(itemView);
-            homeIconIv = itemView.findViewById(R.id.fragment_house_list_line_left_iv);
-            homeNameTv = itemView.findViewById(R.id.fragment_house_list_line_name_tv);
-            capacityTv = itemView.findViewById(R.id.fragment_house_list_line_capacity_tv);
-            powerTv = itemView.findViewById(R.id.fragment_house_list_line_power_tv);
+            homeIconIv = itemView.findViewById(R.id.device_details_image_iv);
+            homeNameTv = itemView.findViewById(R.id.device_details_name_tv);
+            capacityTv = itemView.findViewById(R.id.device_details_sn_tv);
+            powerTv = itemView.findViewById(R.id.power_type_tv);
             stateTv = itemView.findViewById(R.id.fragment_house_list_line_state_tv);
             item_parent_rl = itemView.findViewById(R.id.item_parent_rl);
             move_home_iv = itemView.findViewById(R.id.move_home_iv);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/MessageAdapter.java b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/MessageAdapter.java
index 3dcd091..00515da 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/MessageAdapter.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/MessageAdapter.java
@@ -12,6 +12,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.enums.DeviceType;
 import com.hdl.photovoltaic.enums.MessageAlarmStateType;
 import com.hdl.photovoltaic.ui.bean.MessageBean;
 import com.hdl.photovoltaic.utils.TimeUtils;
@@ -24,10 +25,9 @@
 
     private List<MessageBean> mList;
     private final Context mContext;
-    private MessageAdapter.OnclickListener noOnclickListener;//鐐瑰嚮浜嗙殑鐩戝惉鍣�
+    private OnClickListener mOnclickListener;//鐐瑰嚮浜嗙殑鐩戝惉鍣�
 
-    public MessageAdapter(List<MessageBean> list, Context context) {
-        mList = list;
+    public MessageAdapter(Context context) {
         this.mContext = context;
     }
 
@@ -41,11 +41,12 @@
     @Override
     public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
         MessageBean messageBean = this.mList.get(position);
+//        String strName = getDeviceTypeStr(messageBean.getDeviceType()) + "(" + messageBean.getTitle() + ")";
         holder.item_content_tv.setText(messageBean.getTitle());
         holder.item_home_name_tv.setText(messageBean.getHomeName());
         String date = TimeUtils.getTimeFromTimestamp(messageBean.getCreateTime());
         holder.item_time_tv.setText(date);
-        String type = "";//FAULT:鏁呴殰,WARN:鍛婅,EVENT:浜嬩欢
+        String type = "";//FAULT:鏁呴殰,WARN:鍛婅,EVENT:鎻愮ず
         Drawable drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_ffb300);
         if (messageBean.getType().equals(MessageAlarmStateType.fault)) {
             type = mContext.getString(R.string.my_power_station_malfunction);
@@ -54,8 +55,8 @@
             type = mContext.getString(R.string.message_alarm);
             drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_ffb300);
         } else if (messageBean.getType().equals(MessageAlarmStateType.event)) {
-            type =mContext.getString(R.string.event);
-            drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_ffb300);
+            type = mContext.getString(R.string.loading_title_tip);
+            drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_b9b9b9);
         }
         holder.item_estate_tv.setText(type);
         holder.item_estate_tv.setBackground(drawable);
@@ -69,8 +70,8 @@
             @Override
             public void onClick(View v) {
                 try {
-                    if (noOnclickListener != null) {
-                        noOnclickListener.onClick((int) holder.itemView.getTag(), messageBean);
+                    if (mOnclickListener != null) {
+                        mOnclickListener.onClick((int) holder.itemView.getTag(), messageBean);
                     }
                 } catch (Exception ignored) {
                 }
@@ -85,12 +86,19 @@
     }
 
 
-    public void setList(List<MessageBean> list) {
-        this.mList = list;
+    public void setList(List<MessageBean> newData) {
+        if (this.mList == null) {
+            this.mList = new ArrayList<>();
+        } else {
+            this.mList.clear();
+        }
+
+        this.mList.addAll(newData);
+        notifyDataSetChanged();
     }
 
-    public void setNoOnclickListener(MessageAdapter.OnclickListener onclickListener) {
-        this.noOnclickListener = onclickListener;
+    public void setOnclickListener(OnClickListener onClickListener) {
+        this.mOnclickListener = onClickListener;
     }
 
     /**
@@ -113,8 +121,27 @@
         }
     }
 
-    public interface OnclickListener {
+    public interface OnClickListener {
         void onClick(int position, MessageBean messageBean);
     }
 
+    /**
+     * 閫氳繃鏋氫妇杞崲璁惧绫诲瀷鐨勫瓧绗�
+     *
+     * @param deviceType //璁惧绫诲瀷(INV 锛� 閫嗗彉鍣�, BMS 锛� BMS鎺у埗鐩�, BATTERY 锛� 鐢垫睜鍗曞厓)
+     * @return 璁惧绫诲瀷
+     */
+    private String getDeviceTypeStr(String deviceType) {
+        switch (deviceType) {
+            case DeviceType.inv:
+                return mContext.getString(R.string.alarm_all_device_inverter);
+            case DeviceType.bms:
+                return mContext.getString(R.string.alarm_all_device_bms);
+            case DeviceType.battery:
+                return mContext.getString(R.string.alarm_all_device_battery_cell);
+            default:
+                return "";
+        }
+    }
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchDeviceAdapter.java b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchDeviceAdapter.java
new file mode 100644
index 0000000..1eda829
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchDeviceAdapter.java
@@ -0,0 +1,99 @@
+package com.hdl.photovoltaic.ui.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SearchDeviceAdapter  extends RecyclerView.Adapter<SearchDeviceAdapter.MyViewHolder> {
+    List<DeviceBean> mList;
+
+    Context mContext;
+
+    DeviceInfoAdapter.OnClickListener mOnclickListener;
+
+    public SearchDeviceAdapter(Context context) {
+
+        this.mContext = context;
+    }
+
+    @NonNull
+    @Override
+    public SearchDeviceAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_search_house, parent, false);
+        return new MyViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull SearchDeviceAdapter.MyViewHolder holder, int position) {
+        DeviceBean deviceBean = this.mList.get(position);
+
+        holder.power_station_name_tv.setText(deviceBean.getHomeName());
+        holder.power_station_location_tv.setText(deviceBean.getAddress());
+        holder.itemView.setTag(position);
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    if (mOnclickListener != null) {
+                        mOnclickListener.onClick((int) holder.itemView.getTag(), deviceBean);
+                    }
+                } catch (Exception ignored) {
+                }
+            }
+        });
+
+    }
+
+    @Override
+    public int getItemCount() {
+        return this.mList == null ? 0 : this.mList.size();
+    }
+
+    public void setOnclickListener(DeviceInfoAdapter.OnClickListener onClickListener) {
+        this.mOnclickListener = onClickListener;
+    }
+
+    public void setList(List<DeviceBean> newData) {
+        if (this.mList == null) {
+            this.mList = new ArrayList<>();
+        } else {
+            this.mList.clear();
+        }
+
+        this.mList.addAll(newData);
+        notifyDataSetChanged();
+    }
+
+    public interface OnClickListener {
+        void onClick(int position, DeviceBean deviceBean);
+
+    }
+
+    /**
+     * 涓�琛屽竷灞�瀹瑰櫒
+     */
+    static class MyViewHolder extends RecyclerView.ViewHolder {
+
+
+        public TextView power_station_name_tv;
+        public TextView power_station_location_tv;
+
+
+        public MyViewHolder(@NonNull View itemView) {
+            super(itemView);
+            power_station_name_tv = itemView.findViewById(R.id.message_name_tv);
+            power_station_location_tv = itemView.findViewById(R.id.power_station_location_tv);
+        }
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHistoryAdapter.java b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHistoryAdapter.java
new file mode 100644
index 0000000..3ee011b
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHistoryAdapter.java
@@ -0,0 +1,97 @@
+package com.hdl.photovoltaic.ui.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.hdl.photovoltaic.R;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鍘嗗彶璁板綍閫傞厤鍣�
+ */
+public class SearchHistoryAdapter extends RecyclerView.Adapter<SearchHistoryAdapter.MyViewHolder> {
+
+    List<String> mList;
+
+    Context mContext;
+
+    OnClickListener mOnclickListener;
+
+    public SearchHistoryAdapter(Context context) {
+
+        this.mContext = context;
+    }
+
+    @NonNull
+    @Override
+    public SearchHistoryAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_history_title, parent, false);
+        return new MyViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull SearchHistoryAdapter.MyViewHolder holder, int position) {
+        String history_title = this.mList.get(position);
+
+        holder.history_title_tv.setText(history_title);
+        holder.itemView.setTag(position);
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    if (mOnclickListener != null) {
+                        mOnclickListener.onClick((int) holder.itemView.getTag(), history_title);
+                    }
+                } catch (Exception ignored) {
+                }
+            }
+        });
+
+    }
+
+    @Override
+    public int getItemCount() {
+        return this.mList == null ? 0 : this.mList.size();
+    }
+
+    public void setOnclickListener(OnClickListener onClickListener) {
+        this.mOnclickListener = onClickListener;
+    }
+
+    public void setList(List<String> newData) {
+        if (this.mList == null) {
+            this.mList = new ArrayList<>();
+        } else {
+            this.mList.clear();
+        }
+
+        this.mList.addAll(newData);
+        notifyDataSetChanged();
+    }
+
+    public interface OnClickListener {
+        void onClick(int position, String title);
+
+    }
+
+    static class MyViewHolder extends RecyclerView.ViewHolder {
+
+
+        public TextView history_title_tv;
+
+
+        public MyViewHolder(@NonNull View itemView) {
+            super(itemView);
+            history_title_tv = itemView.findViewById(R.id.history_title_tv);
+        }
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHouseAdapter.java b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHouseAdapter.java
new file mode 100644
index 0000000..3a0c369
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchHouseAdapter.java
@@ -0,0 +1,102 @@
+package com.hdl.photovoltaic.ui.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.ui.bean.HouseIdBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鎼滅储鐢电珯閫傞厤鍣�
+ */
+public class SearchHouseAdapter extends RecyclerView.Adapter<SearchHouseAdapter.MyViewHolder> {
+    List<HouseIdBean> mList;
+
+    Context mContext;
+
+    OnClickListener mOnclickListener;
+
+    public SearchHouseAdapter(Context context) {
+
+        this.mContext = context;
+    }
+
+    @NonNull
+    @Override
+    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_search_house, parent, false);
+        return new MyViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
+        HouseIdBean houseIdBean = this.mList.get(position);
+
+        holder.power_station_name_tv.setText(houseIdBean.getHomeName());
+        holder.power_station_location_tv.setText(houseIdBean.getAddress());
+        holder.itemView.setTag(position);
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    if (mOnclickListener != null) {
+                        mOnclickListener.onClick((int) holder.itemView.getTag(), houseIdBean);
+                    }
+                } catch (Exception ignored) {
+                }
+            }
+        });
+
+    }
+
+    @Override
+    public int getItemCount() {
+        return this.mList == null ? 0 : this.mList.size();
+    }
+
+    public void setOnclickListener(OnClickListener onClickListener) {
+        this.mOnclickListener = onClickListener;
+    }
+
+    public void setList(List<HouseIdBean> newData) {
+        if (this.mList == null) {
+            this.mList = new ArrayList<>();
+        } else {
+            this.mList.clear();
+        }
+
+        this.mList.addAll(newData);
+        notifyDataSetChanged();
+    }
+
+    public interface OnClickListener {
+        void onClick(int position, HouseIdBean houseIdBean);
+
+    }
+
+    /**
+     * 涓�琛屽竷灞�瀹瑰櫒
+     */
+    static class MyViewHolder extends RecyclerView.ViewHolder {
+
+
+        public TextView power_station_name_tv;
+        public TextView power_station_location_tv;
+
+
+        public MyViewHolder(@NonNull View itemView) {
+            super(itemView);
+            power_station_name_tv = itemView.findViewById(R.id.message_name_tv);
+            power_station_location_tv = itemView.findViewById(R.id.power_station_location_tv);
+        }
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchMessageAdapter.java b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchMessageAdapter.java
new file mode 100644
index 0000000..031a437
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/adapter/SearchMessageAdapter.java
@@ -0,0 +1,128 @@
+package com.hdl.photovoltaic.ui.adapter;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.content.res.AppCompatResources;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.enums.MessageAlarmStateType;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
+import com.hdl.photovoltaic.ui.bean.MessageBean;
+import com.hdl.photovoltaic.utils.TimeUtils;
+import com.hdl.photovoltaic.widget.SwipeLayout;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鎼滅储娑堟伅閫傞厤鍣�
+ */
+public class SearchMessageAdapter extends RecyclerView.Adapter<SearchMessageAdapter.MyViewHolder> {
+
+    List<MessageBean> mList;
+
+    Context mContext;
+
+    OnClickListener mOnclickListener;
+
+    public SearchMessageAdapter(Context context) {
+
+        this.mContext = context;
+    }
+
+    @NonNull
+    @Override
+    public SearchMessageAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View contentItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_search_message, parent, false);
+        return new SearchMessageAdapter.MyViewHolder(contentItem);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull SearchMessageAdapter.MyViewHolder itemHolder, int position) {
+        MessageBean messageBean = this.mList.get(position);
+        itemHolder.message_name_tv.setText(messageBean.getTitle());
+        itemHolder.message_content_tv.setText(messageBean.getHomeName());
+        String date = TimeUtils.getTimeFromTimestamp(messageBean.getCreateTime());
+        itemHolder.message_time_tv.setText(date);
+        String type = "";//FAULT:鏁呴殰,WARN:鍛婅,EVENT:鎻愮ず
+        Drawable drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_ffb300);
+        if (messageBean.getType().equals(MessageAlarmStateType.fault)) {
+            type = mContext.getString(R.string.my_power_station_malfunction);
+            drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_e34343);
+        } else if (messageBean.getType().equals(MessageAlarmStateType.warn)) {
+            type = mContext.getString(R.string.message_alarm);
+            drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_ffb300);
+        } else if (messageBean.getType().equals(MessageAlarmStateType.event)) {
+            type = mContext.getString(R.string.loading_title_tip);
+            drawable = AppCompatResources.getDrawable(mContext, R.drawable.state_b9b9b9);
+        }
+        itemHolder.message_state_tv.setText(type);
+        itemHolder.message_state_tv.setBackground(drawable);
+        itemHolder.itemView.setTag(position);
+        itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    if (mOnclickListener != null) {
+                        mOnclickListener.onClick((int) itemHolder.itemView.getTag(), messageBean);
+                    }
+                } catch (Exception ignored) {
+                }
+            }
+        });
+
+    }
+
+    @Override
+    public int getItemCount() {
+        return this.mList == null ? 0 : this.mList.size();
+    }
+
+    public void setOnclickListener(OnClickListener onClickListener) {
+        this.mOnclickListener = onClickListener;
+    }
+
+    public void setList(List<MessageBean> newData) {
+        if (this.mList == null) {
+            this.mList = new ArrayList<>();
+        } else {
+            this.mList.clear();
+        }
+
+        this.mList.addAll(newData);
+        notifyDataSetChanged();
+    }
+
+    /**
+     * 涓�琛屽竷灞�瀹瑰櫒
+     */
+    static class MyViewHolder extends RecyclerView.ViewHolder {
+        public TextView message_name_tv;
+
+        public TextView message_content_tv;
+        public TextView message_time_tv;
+        public TextView message_state_tv;
+
+        public MyViewHolder(@NonNull View itemView) {
+            super(itemView);
+            message_name_tv = itemView.findViewById(R.id.message_name_tv);
+            message_content_tv = itemView.findViewById(R.id.message_content_tv);
+            message_time_tv = itemView.findViewById(R.id.message_time_tv);
+            message_state_tv = itemView.findViewById(R.id.message_state_tv);
+        }
+    }
+
+    public interface OnClickListener {
+        void onClick(int position, MessageBean messageBean);
+
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/CloudInverterDeviceBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/CloudInverterDeviceBean.java
index 378fd33..0b143be 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/bean/CloudInverterDeviceBean.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/CloudInverterDeviceBean.java
@@ -32,7 +32,7 @@
 
     private String inv;//inv鐘舵��
     private int deviceStatus;//1:寰呮満,2:杩炴帴涓�,3:鏁呴殰,4:杩愯,5:绂荤嚎
-    private String addresses;
+    private String addresses;//瀛愮綉鍙�/璁惧鍙�
     private List<DeviceAttributeBean> status;
 
     private String hwVersion;//杞欢鐗堟湰鍙�
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/ContactBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/ContactBean.java
new file mode 100644
index 0000000..f3d217d
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/ContactBean.java
@@ -0,0 +1,28 @@
+package com.hdl.photovoltaic.ui.bean;
+
+import java.io.Serializable;
+
+/**
+ * 鑱旂郴鎴戜滑瀹炰綋绫�
+ */
+public class ContactBean implements Serializable {
+
+    private String email;
+    private String wechat;
+
+    public String getEmail() {
+        return email == null ? "" : email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getWechat() {
+        return wechat == null ? "" : wechat;
+    }
+
+    public void setWechat(String wechat) {
+        this.wechat = wechat;
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/DataOverBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/DataOverBean.java
new file mode 100644
index 0000000..23fde4d
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/DataOverBean.java
@@ -0,0 +1,75 @@
+package com.hdl.photovoltaic.ui.bean;
+
+import java.io.Serializable;
+
+/**
+ * 缁熻姒傝鏁版嵁瀹炰綋绫�
+ */
+public class DataOverBean implements Serializable {
+
+    private String installedCapacity;//瑁呮満瀹归噺
+    private String power;//鍙戠數鍔熺巼
+    private String powerRatio;//鍙戠數鍔熺巼鍗犳瘮(褰撴棩鍙戠數鍔熺巼/瑁呮満瀹归噺 * 100%	)
+    private String todayElectricity;//褰撴棩鍙戠數閲�
+    private String monthElectricity;//褰撴湀鍙戠數閲�
+    private String yearElectricity;//褰撳勾鍙戠數閲�
+    private String totalElectricity;//绱鍙戠數閲�
+
+    public String getInstalledCapacity() {
+        return installedCapacity == null ? "" : installedCapacity;
+    }
+
+    public void setInstalledCapacity(String installedCapacity) {
+        this.installedCapacity = installedCapacity;
+    }
+
+    public String getPower() {
+        return power == null ? "" : power;
+    }
+
+    public void setPower(String power) {
+        this.power = power;
+    }
+
+    public String getPowerRatio() {
+        return powerRatio == null ? "" : getPowerRatio();
+    }
+
+    public void setPowerRatio(String powerRatio) {
+        this.powerRatio = powerRatio;
+    }
+
+    public String getTodayElectricity() {
+        return todayElectricity == null ? "" : todayElectricity;
+    }
+
+    public void setTodayElectricity(String todayElectricity) {
+        this.todayElectricity = todayElectricity;
+    }
+
+    public String getMonthElectricity() {
+        return monthElectricity == null ? "" : monthElectricity;
+    }
+
+    public void setMonthElectricity(String monthElectricity) {
+        this.monthElectricity = monthElectricity;
+    }
+
+    public String getYearElectricity() {
+        return yearElectricity == null ? "" : yearElectricity;
+    }
+
+    public void setYearElectricity(String yearElectricity) {
+        this.yearElectricity = yearElectricity;
+    }
+
+    public String getTotalElectricity() {
+        return totalElectricity == null ? "" : totalElectricity;
+    }
+
+    public void setTotalElectricity(String totalElectricity) {
+        this.totalElectricity = totalElectricity;
+    }
+
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/DeviceBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/DeviceBean.java
new file mode 100644
index 0000000..72f73f0
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/DeviceBean.java
@@ -0,0 +1,78 @@
+package com.hdl.photovoltaic.ui.bean;
+
+import android.text.TextUtils;
+
+
+/**
+ * 璁惧锛堣处鍙蜂簯绔笂鎵�鏈夎澶囧垪琛級瀹炰綋瀵硅薄
+ */
+public class DeviceBean extends CloudInverterDeviceBean {
+
+
+    private String homeId;
+    private String homeName;
+    private String deviceType;//璁惧绫诲瀷(INV閫嗗彉鍣紝BMS鎺у埗鐩�,BATTERY鐢垫睜鍗曞厓)
+    private String outputActivePower;//閫嗗彉鍣ㄨ緭鍑烘湁鍔熷姛鐜�
+    private String address;//璇︾粏鍦板潃
+    private HouseInfoBean.Location location;//鐢电珯鍦板潃
+
+    public String getHomeId() {
+        return TextUtils.isEmpty(homeId) ? "" : homeId;
+    }
+
+    public void setHomeId(String homeId) {
+        this.homeId = homeId;
+    }
+
+    public String getHomeName() {
+        return TextUtils.isEmpty(homeName) ? "" : homeName;
+    }
+
+    public void setHomeName(String homeName) {
+        this.homeName = homeName;
+    }
+
+    public String getOutputActivePower() {
+        return TextUtils.isEmpty(outputActivePower) ? "" : outputActivePower;
+    }
+
+    public void setOutputActivePower(String outputActivePower) {
+        this.outputActivePower = outputActivePower;
+    }
+
+    public String getAddress() {
+        return TextUtils.isEmpty(address) ? "" : address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public HouseInfoBean.Location getLocation() {
+        return location;
+    }
+
+    public void setLocation(HouseInfoBean.Location location) {
+        this.location = location;
+    }
+
+    public String getDeviceType() {
+        return TextUtils.isEmpty(deviceType) ? "" : deviceType;
+    }
+
+    public void setDeviceType(String deviceType) {
+        this.deviceType = deviceType;
+    }
+    /**
+     * 鎷间綇瀹呭湴鍧�
+     *
+     * @return 浣忓畢鍦板潃
+     */
+    public String getHomeAddress() {
+        if (this.location == null) {
+            return this.address;
+        }
+        return this.location.getNationName() + this.location.getProvinceName() + this.location.getCityName() + this.address;
+    }
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseIdBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseIdBean.java
index 4f54f95..c579118 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseIdBean.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseIdBean.java
@@ -1,5 +1,7 @@
 package com.hdl.photovoltaic.ui.bean;
 
+import android.text.TextUtils;
+
 import com.hdl.photovoltaic.R;
 
 import java.io.Serializable;
@@ -24,6 +26,11 @@
 
 
     private boolean state_select = false;//琛ㄧず鏄惁鏄剧ず閫変腑缁勪欢(true鏄剧ず)
+
+    private HouseInfoBean.Location location;//鐢电珯鍦板潃
+
+
+    private String address;//璇︾粏鍦板潃
 
 
     public boolean isState_select() {
@@ -76,7 +83,7 @@
     }
 
     public String getInstalledCapacity() {
-        return installedCapacity == null ? "0" : installedCapacity;
+        return TextUtils.isEmpty(installedCapacity) ? "0" : installedCapacity;
     }
 
     public void setInstalledCapacity(String installedCapacity) {
@@ -84,7 +91,7 @@
     }
 
     public String getPower() {
-        return power == null ? "0" : power;
+        return TextUtils.isEmpty(power) ? "0" : power;
     }
 
     public void setPower(String power) {
@@ -115,5 +122,31 @@
         this.localSecret = localSecret;
     }
 
+    public HouseInfoBean.Location getLocation() {
+        return location == null ? new HouseInfoBean.Location() : location;
+    }
 
+    public void setLocation(HouseInfoBean.Location location) {
+        this.location = location;
+    }
+
+    public String getAddress() {
+        return address == null ? "" : address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    /**
+     * 鎷间綇瀹呭湴鍧�
+     *
+     * @return 浣忓畢鍦板潃
+     */
+    public String getHomeAddress() {
+        if (this.location == null) {
+            return this.address;
+        }
+        return this.location.getNationName() + this.location.getProvinceName() + this.location.getCityName() + this.address;
+    }
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseInfoBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseInfoBean.java
index eb572d2..aa4a54c 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseInfoBean.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/HouseInfoBean.java
@@ -4,8 +4,7 @@
  * 鐢电珯璇︽儏瀹炰綋绫�
  */
 public class HouseInfoBean extends HouseIdBean {
-    private Location location;//鐢电珯鍦板潃
-    private String address;//璇︾粏鍦板潃
+
     private String latitude;//绾害
     private String longitude;//缁忓害
     private String timezone;//鏃跺尯
@@ -18,22 +17,6 @@
 
     private String zoneType;//鍖哄煙
 
-
-    public Location getLocation() {
-        return location == null ? new Location() : location;
-    }
-
-    public void setLocation(Location location) {
-        this.location = location;
-    }
-
-    public String getAddress() {
-        return address == null ? "" : address;
-    }
-
-    public void setAddress(String address) {
-        this.address = address;
-    }
 
     public String getLatitude() {
         return latitude == null ? "" : latitude;
@@ -177,15 +160,5 @@
     }
 
 
-    /**
-     * 鎷间綇瀹呭湴鍧�
-     *
-     * @return 浣忓畢鍦板潃
-     */
-    public String getHomeAddress() {
-        if (this.location == null) {
-            return this.address;
-        }
-        return this.location.nationName + this.location.provinceName + this.location.cityName + this.address;
-    }
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/SocialContributionBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/SocialContributionBean.java
new file mode 100644
index 0000000..473a94a
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/SocialContributionBean.java
@@ -0,0 +1,37 @@
+package com.hdl.photovoltaic.ui.bean;
+
+/**
+ * 绀句細璐$尞瀹炰綋绫�
+ */
+public class SocialContributionBean {
+
+    private String coal;//鑺傜害鏍囧噯鐓�
+    private String co2;//CO2鍑忔帓閲�
+    private String treePlanting;//绛夋晥妞嶆爲閲�
+
+    public String getCoal() {
+        return coal == null ? "" : coal;
+    }
+
+    public void setCoal(String coal) {
+        this.coal = coal;
+    }
+
+    public String getCo2() {
+        return co2 == null ? "" : co2;
+    }
+
+    public void setCo2(String co2) {
+        this.co2 = co2;
+    }
+
+    public String getTreePlanting() {
+        return treePlanting == null ? "" : treePlanting;
+    }
+
+    public void setTreePlanting(String treePlanting) {
+        this.treePlanting = treePlanting;
+    }
+
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/StatisticsBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/StatisticsBean.java
new file mode 100644
index 0000000..39483f2
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/StatisticsBean.java
@@ -0,0 +1,41 @@
+package com.hdl.photovoltaic.ui.bean;
+
+import android.renderscript.Sampler;
+
+import java.io.Serializable;
+
+/**
+ * 鍙戠數閲忓疄浣撶被
+ */
+public class StatisticsBean implements Serializable {
+
+    private String fieldName;//	鎻忚堪
+    private int fieldValue;//鍊�
+    private String time;//	鏃堕棿
+
+    public String getFieldName() {
+        return fieldName == null ? "" : fieldName;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public int getFieldValue() {
+        return fieldValue;
+    }
+
+    public void setFieldValue(int fieldValue) {
+        this.fieldValue = fieldValue;
+    }
+
+    public String getTime() {
+        return time == null ? "" : time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/StatusOverviewBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/StatusOverviewBean.java
new file mode 100644
index 0000000..7e82ad9
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/StatusOverviewBean.java
@@ -0,0 +1,58 @@
+package com.hdl.photovoltaic.ui.bean;
+
+import java.io.Serializable;
+
+/**
+ * 鐢电珯鐘舵�佸疄浣撶被
+ */
+public class StatusOverviewBean implements Serializable {
+
+    private int total;//鎬荤數绔欐暟
+    private int fault;//鏁呴殰鐢电珯鏁�
+    private int offline;//绂荤嚎鐢电珯鏁�
+    private int connecting;//寰呮帴鍏ョ數绔欐暟
+
+    private Object extra;//闄勫姞鏁版嵁
+
+    public int getTotal() {
+        return total;
+    }
+
+    public void setTotal(int total) {
+        this.total = total;
+    }
+
+    public int getFault() {
+        return fault;
+    }
+
+    public void setFault(int fault) {
+        this.fault = fault;
+    }
+
+    public int getOffline() {
+        return offline;
+    }
+
+    public void setOffline(int offline) {
+        this.offline = offline;
+    }
+
+    public int getConnecting() {
+        return connecting;
+    }
+
+    public void setConnecting(int connecting) {
+        this.connecting = connecting;
+    }
+
+    public Object getExtra() {
+        return extra;
+    }
+
+    public void setExtra(Object extra) {
+        this.extra = extra;
+    }
+
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/bean/UnCountBean.java b/app/src/main/java/com/hdl/photovoltaic/ui/bean/UnCountBean.java
new file mode 100644
index 0000000..d591cd0
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/bean/UnCountBean.java
@@ -0,0 +1,36 @@
+package com.hdl.photovoltaic.ui.bean;
+
+import java.io.Serializable;
+
+public class UnCountBean implements Serializable {
+
+    private int untreatedCount;//鏈鐞嗘暟閲�
+    private int processedCount;//宸插鐞嗘暟
+    private int unreadCount;//鏈鏁伴噺
+
+    public int getUntreatedCount() {
+        return untreatedCount;
+    }
+
+    public void setUntreatedCount(int untreatedCount) {
+        this.untreatedCount = untreatedCount;
+    }
+
+    public int getProcessedCount() {
+        return processedCount;
+    }
+
+    public void setProcessedCount(int processedCount) {
+        this.processedCount = processedCount;
+    }
+
+    public int getUnreadCount() {
+        return unreadCount;
+    }
+
+    public void setUnreadCount(int unreadCount) {
+        this.unreadCount = unreadCount;
+    }
+
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/home/AutoSizeMyAAChart.java b/app/src/main/java/com/hdl/photovoltaic/ui/home/AutoSizeMyAAChart.java
new file mode 100644
index 0000000..05472ca
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/home/AutoSizeMyAAChart.java
@@ -0,0 +1,32 @@
+package com.hdl.photovoltaic.ui.home;
+
+import android.app.Activity;
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AAChartView;
+
+import me.jessyan.autosize.AutoSize;
+
+public class AutoSizeMyAAChart extends AAChartView {
+
+    public AutoSizeMyAAChart(Context context) {
+        super(context);
+    }
+
+    public AutoSizeMyAAChart(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public AutoSizeMyAAChart(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    public void setOverScrollMode(int mode) {
+        super.setOverScrollMode(mode);
+        //鍥捐〃灞忓箷閫傞厤
+        AutoSize.autoConvertDensityOfGlobal((Activity) getContext());
+
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/home/HomePageFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/home/HomePageFragment.java
new file mode 100644
index 0000000..398b0ad
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/home/HomePageFragment.java
@@ -0,0 +1,544 @@
+package com.hdl.photovoltaic.ui.home;
+
+
+import static com.hdl.photovoltaic.ui.home.aachart.CustomStyleChartComposer.configureColorfulColumnChart;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+
+
+import androidx.appcompat.content.res.AppCompatResources;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import com.bigkoo.pickerview.builder.TimePickerBuilder;
+import com.bigkoo.pickerview.listener.OnTimeSelectListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AAChartModel;
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AAChartView;
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AAMoveOverEventMessageModel;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.CustomBaseFragment;
+import com.hdl.photovoltaic.config.ConstantManage;
+import com.hdl.photovoltaic.config.UserConfigManage;
+import com.hdl.photovoltaic.databinding.FragmentHomePageBinding;
+import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
+import com.hdl.photovoltaic.enums.TimeType;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlDeviceLogic;
+import com.hdl.photovoltaic.other.HdlLogLogic;
+import com.hdl.photovoltaic.other.HdlPowerStationDataStatisticsLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.bean.DataOverBean;
+import com.hdl.photovoltaic.ui.bean.SocialContributionBean;
+import com.hdl.photovoltaic.ui.bean.StatisticsBean;
+import com.hdl.photovoltaic.ui.home.aachart.BasicChartComposer;
+import com.hdl.photovoltaic.utils.TimeUtils;
+import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 棣栭〉妯″潡
+ */
+
+public class HomePageFragment extends CustomBaseFragment implements AAChartView.AAChartViewCallBack {
+
+    FragmentHomePageBinding viewBinding;
+
+    AutoSizeMyAAChart aaChartView;
+
+    AAChartModel aaChartModel;
+
+
+    private String[] fieldNames = {"00:00", "02:00", "05:00", "07:00", "09:00", "17:00", "22:00", "23:59"};//鍥炬爣X杞村潗鏍囧�肩殑鏁扮粍
+    private Object[] fieldValues = {35, 70.5, 150.5, 135, 170, 205, 222, 245};//鍥炬爣Y杞村潗鏍囧�肩殑鏁扮粍
+
+
+    private String timeType = TimeType.day;//鏃堕棿绫诲瀷(榛樿锛氬ぉ)
+
+
+    @Override
+    public Object getContentView() {
+        viewBinding = FragmentHomePageBinding.inflate(getLayoutInflater());
+        return viewBinding.getRoot();
+    }
+
+    @Override
+    public void onBindView(Bundle savedInstanceState) {
+
+        //鍒濆鍖�
+        initView();
+        //鍒濆鍖栫晫闈㈢洃鍚櫒
+        initEvent();
+        //璇诲彇鏁版嵁
+        readDate();
+    }
+
+
+    /**
+     * 璇诲彇鏁版嵁
+     */
+    private void readDate() {
+        HdlThreadLogic.runSubThread(new Runnable() {
+            @Override
+            public void run() {
+                getDataOver();
+                getStatistics();
+                getSocialContribution();
+
+            }
+        });
+    }
+
+    private void initEvent() {
+        //鏃堕棿閫夋嫨鍣�
+        viewBinding.yearMonthDayTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                selectedTimePickerBuilder();
+
+            }
+        });
+        //鏃�
+        viewBinding.dayTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (timeType.equals(TimeType.day)) {
+                    //鐐瑰嚮鍚屼竴涓被鍨�
+                    return;
+                }
+                timeType = TimeType.day;
+
+                viewBinding.dayTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.drawable.time_selected_38c494));
+                viewBinding.dayTv.setTextColor(_mActivity.getColor(R.color.text_38C494));
+
+                viewBinding.monthTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.monthTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.yearTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.yearTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.lifeCycleTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.lifeCycleTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.v1.setVisibility(View.GONE);
+                viewBinding.v2.setVisibility(View.VISIBLE);
+                viewBinding.v3.setVisibility(View.VISIBLE);
+                viewBinding.homePageStationSelectTimeLl.setVisibility(View.VISIBLE);
+
+                String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
+                viewBinding.yearMonthDayTv.setText(dataStr);
+                getStatistics();
+
+            }
+        });
+        //鏈�
+        viewBinding.monthTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (timeType.equals(TimeType.month)) {
+                    //鐐瑰嚮鍚屼竴涓被鍨�
+                    return;
+                }
+                timeType = TimeType.month;
+                viewBinding.dayTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.dayTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.monthTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.drawable.time_selected_38c494));
+                viewBinding.monthTv.setTextColor(_mActivity.getColor(R.color.text_38C494));
+
+                viewBinding.yearTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.yearTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.lifeCycleTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.lifeCycleTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.v1.setVisibility(View.GONE);
+                viewBinding.v2.setVisibility(View.GONE);
+                viewBinding.v3.setVisibility(View.VISIBLE);
+                viewBinding.homePageStationSelectTimeLl.setVisibility(View.VISIBLE);
+                String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
+                viewBinding.yearMonthDayTv.setText(dataStr);
+                getStatistics();
+
+
+            }
+        });
+        //骞�
+        viewBinding.yearTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (timeType.equals(TimeType.year)) {
+                    //鐐瑰嚮鍚屼竴涓被鍨�
+                    return;
+                }
+                timeType = TimeType.year;
+                viewBinding.dayTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.dayTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.monthTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.monthTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.yearTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.drawable.time_selected_38c494));
+                viewBinding.yearTv.setTextColor(_mActivity.getColor(R.color.text_38C494));
+
+                viewBinding.lifeCycleTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.lifeCycleTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.v1.setVisibility(View.VISIBLE);
+                viewBinding.v2.setVisibility(View.GONE);
+                viewBinding.v3.setVisibility(View.GONE);
+                viewBinding.homePageStationSelectTimeLl.setVisibility(View.VISIBLE);
+                String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
+                viewBinding.yearMonthDayTv.setText(dataStr);
+                getStatistics();
+            }
+        });
+        //鐢熷懡鏈�
+        viewBinding.lifeCycleTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (timeType.equals(TimeType.all)) {
+                    //鐐瑰嚮鍚屼竴涓被鍨�
+                    return;
+                }
+                timeType = TimeType.all;
+                viewBinding.dayTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.dayTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.monthTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.monthTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.yearTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+                viewBinding.yearTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+
+                viewBinding.lifeCycleTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.drawable.time_selected_38c494));
+                viewBinding.lifeCycleTv.setTextColor(_mActivity.getColor(R.color.text_38C494));
+
+                viewBinding.v1.setVisibility(View.VISIBLE);
+                viewBinding.v2.setVisibility(View.VISIBLE);
+                viewBinding.v3.setVisibility(View.GONE);
+                viewBinding.homePageStationSelectTimeLl.setVisibility(View.GONE);
+                getStatistics();
+
+            }
+        });
+        //涓婁竴姝�
+        viewBinding.lastStepClickLl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String currDate = viewBinding.yearMonthDayTv.getText().toString();
+                if (TextUtils.isEmpty(currDate)) {
+                    return;
+                }
+                String timeDateFormat = getTimeDateFormat();
+                Calendar calendar = TimeUtils.stringToCalendar(currDate, timeDateFormat);
+                String time = TimeUtils.subtractDayMonthYearFromDate(calendar, 1, timeDateFormat, timeType);
+                viewBinding.yearMonthDayTv.setText(time);
+
+
+            }
+        });
+        //涓嬩竴姝�
+        viewBinding.nextStepClickLl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String currDate = viewBinding.yearMonthDayTv.getText().toString();
+                if (TextUtils.isEmpty(currDate)) {
+                    return;
+                }
+                String timeDateFormat = getTimeDateFormat();
+                Calendar calendar = TimeUtils.stringToCalendar(currDate, timeDateFormat);
+                String time = TimeUtils.addDayMonthYearToDate(calendar, 1, timeDateFormat, timeType);
+                if (TimeUtils.stringDateToTimestamp(time, timeDateFormat) > getCurrentTimestamp()) {
+                    HdlThreadLogic.toast(_mActivity, getString(R.string.the_query_date_is_exceeded));
+
+                    return;
+                }
+                viewBinding.yearMonthDayTv.setText(time);
+            }
+        });
+        //璁剧疆涓嬫媺绠ご棰滆壊
+        viewBinding.srl.setColorSchemeResources(R.color.text_FF245EC3);
+        viewBinding.srl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                viewBinding.srl.setRefreshing(false);
+                readDate();
+            }
+        });
+
+
+    }
+
+    /**
+     * 鏃堕棿閫夋嫨鍣�
+     */
+    private void selectedTimePickerBuilder() {
+        String currDate = viewBinding.yearMonthDayTv.getText().toString();
+        //鏃堕棿閫夋嫨鍣�
+        Calendar selectedDate = TimeUtils.stringToCalendar(currDate, getTimeDateFormat());
+        Calendar startDate = Calendar.getInstance();
+        Calendar endDate = TimeUtils.timestampToCalendar(getCurrentTimestamp());
+        //璁剧疆鏃ユ湡銆愬紑濮嬨�戝拰銆愮粨鏉熴��
+        startDate.set(2023, 1, 1);
+        endDate.set(endDate.get(Calendar.YEAR), endDate.get(Calendar.MONTH), endDate.get(Calendar.DAY_OF_MONTH));
+        boolean day = true;
+        boolean month = true;
+        boolean year = true;
+        if (timeType.equals(TimeType.month)) {
+            day = false;
+        } else if (timeType.equals(TimeType.year)) {
+            day = false;
+            month = false;
+        }
+        TimePickerView pvTime = new TimePickerBuilder(_mActivity, new OnTimeSelectListener() {
+            @Override
+            public void onTimeSelect(Date date, View v) {//閫変腑浜嬩欢鍥炶皟
+                String timeDateFormat = getTimeDateFormat();
+                String time = TimeUtils.dateToString(date, timeDateFormat);
+                if (viewBinding.yearMonthDayTv.getText().toString().equals(time)) {
+                    //琛ㄧず鍚屼竴涓椂闂�
+                    return;
+                }
+                viewBinding.yearMonthDayTv.setText(time);
+                getStatistics();
+            }
+        }).setType(new boolean[]{year, month, day, false, false, false})// 榛樿鍏ㄩ儴鏄剧ず
+                .setCancelText(_mActivity.getString(R.string.loading_cancel))//鍙栨秷鎸夐挳鏂囧瓧
+                .setSubmitText(_mActivity.getString(R.string.loading_affirm))//纭鎸夐挳鏂囧瓧
+                .setContentTextSize(18)//婊氳疆鏂囧瓧澶у皬
+                .setTitleSize(18)//鏍囬鏂囧瓧澶у皬
+                .setTitleText(_mActivity.getString(R.string.time_selectd))//鏍囬鏂囧瓧
+                .setOutSideCancelable(true)//鐐瑰嚮灞忓箷锛岀偣鍦ㄦ帶浠跺閮ㄨ寖鍥存椂锛屾槸鍚﹀彇娑堟樉绀�
+                .isCyclic(false)//鏄惁寰幆婊氬姩
+                .setTitleColor(_mActivity.getColor(R.color.text_90000000))//鏍囬鏂囧瓧棰滆壊
+                .setSubmitColor(_mActivity.getColor(R.color.text_38C494))//纭畾鎸夐挳鏂囧瓧棰滆壊
+                .setCancelColor(_mActivity.getColor(R.color.text_40000000))//鍙栨秷鎸夐挳鏂囧瓧棰滆壊
+                .setTitleBgColor(_mActivity.getColor(R.color.text_FFFFFFFF))//鏍囬鑳屾櫙棰滆壊 Night mode
+                .setBgColor(_mActivity.getColor(R.color.text_FFFFFFFF))//婊氳疆鑳屾櫙棰滆壊 Night mode
+                .setTextColorCenter(_mActivity.getColor(R.color.text_90000000)).setDate(selectedDate)// 濡傛灉涓嶈缃殑璇濓紝榛樿鏄郴缁熸椂闂�*/
+                .setRangDate(startDate, endDate)//璧峰缁堟骞存湀鏃ヨ瀹�
+                .setLabel(_mActivity.getString(R.string.year), _mActivity.getString(R.string.month), _mActivity.getString(R.string.day), _mActivity.getString(R.string.hour), _mActivity.getString(R.string.minute), _mActivity.getString(R.string.seconds))//榛樿璁剧疆涓哄勾鏈堟棩鏃跺垎绉�
+                .isCenterLabel(false) //鏄惁鍙樉绀轰腑闂撮�変腑椤圭殑label鏂囧瓧锛宖alse鍒欐瘡椤筰tem鍏ㄩ儴閮藉甫鏈塴abel銆�
+                .isDialog(false)//鏄惁鏄剧ず涓哄璇濇鏍峰紡
+                .setItemVisibleCount(7)//瀵硅瘽妗嗛珮搴�
+                .setDividerColor(_mActivity.getColor(R.color.text_E1E1E1)).setLineSpacingMultiplier(3f)//
+                .build();
+        pvTime.show();
+    }
+
+    /**
+     * 鍥捐〃鍔犺浇
+     */
+    private void setUpAAChartView() {
+        aaChartView = viewBinding.autoSizeMyAAChart;
+        aaChartView.callBack = this;
+        if (TimeType.day.equals(timeType)) {
+            aaChartModel = BasicChartComposer.configureAreaChart("Pv鍙戠數鍔熺巼", fieldNames, fieldValues);
+        } else if (TimeType.month.equals(timeType)
+                || TimeType.year.equals(timeType)
+                || TimeType.all.equals(timeType)) {
+            aaChartModel = configureColorfulColumnChart("Pv鍙戠數鍔熺巼", fieldNames, fieldValues);
+        }
+        aaChartView.aa_drawChartWithChartModel(aaChartModel);
+
+    }
+
+    private void initView() {
+
+        String dataStr = TimeUtils.getDateTimestamp(getCurrentTimestamp(), getTimeDateFormat());
+        viewBinding.yearMonthDayTv.setText(dataStr);
+
+        String installed_capacity = getString(R.string.installed_capacity) + "(" + HdlDeviceLogic.kWp + ")";
+        viewBinding.infoRl1Text2Tv.setText(installed_capacity);
+        String generated_power = getString(R.string.generated_power) + "(" + HdlDeviceLogic.kW + ")";
+        viewBinding.infoRl1Text4Tv.setText(generated_power);
+        String generation = getString(R.string.generation) + "(" + HdlDeviceLogic.kWp + ")";
+        viewBinding.homePageStationInfoRl1TitleTv.setText(generation);
+
+        viewBinding.homePageStationInfoRl2DayIc.dataTypeTv.setText(R.string.day_power_generation);
+        viewBinding.homePageStationInfoRl2MonIc.dataTypeTv.setText(R.string.month_power_generation);
+        viewBinding.homePageStationInfoRl2YearIc.dataTypeTv.setText(R.string.year_power_generation);
+        viewBinding.homePageStationInfoRl2CumulativeIc.dataTypeTv.setText(R.string.cumulative_power_generation);
+
+        viewBinding.unitTv.setText(HdlDeviceLogic.kW);
+        viewBinding.dayTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.drawable.time_selected_38c494));
+        viewBinding.dayTv.setTextColor(_mActivity.getColor(R.color.text_38C494));
+        viewBinding.monthTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+        viewBinding.monthTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+        viewBinding.yearTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+        viewBinding.yearTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+        viewBinding.lifeCycleTv.setBackground(AppCompatResources.getDrawable(_mActivity, R.color.text_00000000));
+        viewBinding.lifeCycleTv.setTextColor(_mActivity.getColor(R.color.text_40000000));
+        viewBinding.v1.setVisibility(View.GONE);
+        viewBinding.v2.setVisibility(View.VISIBLE);
+        viewBinding.v3.setVisibility(View.VISIBLE);
+        viewBinding.homePageStationSelectTimeLl.setVisibility(View.VISIBLE);
+        setUpAAChartView();//鍥捐〃鍔犺浇
+    }
+
+
+    @Override
+    public void chartViewDidFinishLoad(AAChartView aaChartView) {
+
+    }
+
+    @Override
+    public void chartViewMoveOverEventMessage(AAChartView aaChartView, AAMoveOverEventMessageModel messageModel) {
+
+    }
+
+
+    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
+    public void onEventMessage(BaseEventBus eventBus) {
+        super.onEventMessage(eventBus);
+        if (eventBus == null) {
+            return;
+        }
+        //鎺ユ敹澶栭儴鐐瑰嚮浜嬩欢
+        if (eventBus.getTopic().equals(ConstantManage.homepage_title_tab_switch)) {
+            if (eventBus.getType().equals(HomepageTitleTabSwitch.homepage.toString())) {
+                // 鍙栨秷绮樻�т簨浠�
+                EventBus.getDefault().removeStickyEvent(eventBus);
+                HdlLogLogic.print("姝e湪鐐瑰嚮銆愰椤点��");
+
+            }
+        }
+    }
+
+
+    /**
+     * 鑾峰彇缁熻姒傝鏁版嵁(鍏徃缁村害)
+     */
+    private void getDataOver() {
+        HdlPowerStationDataStatisticsLogic.getInstance().getDataOver(new CloudCallBeak<DataOverBean>() {
+            @Override
+            public void onSuccess(DataOverBean dataOverBean) {
+                if (dataOverBean == null) {
+                    return;
+                }
+                viewBinding.infoRl1Text1Tv.setText(dataOverBean.getInstalledCapacity());
+                viewBinding.infoRl1Text3Tv.setText(dataOverBean.getPower());
+                viewBinding.infoRl1FText1Tv.setText(dataOverBean.getPowerRatio());
+
+                viewBinding.homePageStationInfoRl2DayIc.dataTv.setText(dataOverBean.getTodayElectricity());
+                viewBinding.homePageStationInfoRl2MonIc.dataTv.setText(dataOverBean.getMonthElectricity());
+                viewBinding.homePageStationInfoRl2YearIc.dataTv.setText(dataOverBean.getYearElectricity());
+                viewBinding.homePageStationInfoRl2CumulativeIc.dataTv.setText(dataOverBean.getTotalElectricity());
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+
+            }
+        });
+    }
+
+    /**
+     * 鍙戠數閲忕粺璁�(鍏徃缁村害)
+     */
+    private void getStatistics() {
+        String currDate = viewBinding.yearMonthDayTv.getText().toString();
+        HdlPowerStationDataStatisticsLogic.getInstance().getStatistics(currDate, timeType, new CloudCallBeak<List<StatisticsBean>>() {
+            @Override
+            public void onSuccess(List<StatisticsBean> list) {
+                if (list == null || list.size() == 0) {
+                    return;
+                }
+                String[] keys = new String[list.size()];
+                Object[] values = new Object[list.size()];
+                for (int i = 0; i < list.size(); i++) {
+                    keys[i] = list.get(i).getFieldName();
+                    values[i] = list.get(i).getFieldValue();
+                }
+                fieldNames = keys;
+                fieldValues = values;
+                setUpAAChartView();
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+
+            }
+        });
+    }
+
+    /**
+     * 鍙戠數閲忕粺璁�(鍏徃缁村害)
+     */
+    private void getSocialContribution() {
+        HdlPowerStationDataStatisticsLogic.getInstance().getSocialContribution(new CloudCallBeak<SocialContributionBean>() {
+            @Override
+            public void onSuccess(SocialContributionBean socialContributionBean) {
+                if (socialContributionBean == null) {
+                    return;
+                }
+                viewBinding.socialContributionData1Tv.setText(socialContributionBean.getCoal());
+                viewBinding.socialContributionData2Tv.setText(socialContributionBean.getCo2());
+                viewBinding.socialContributionData3Tv.setText(socialContributionBean.getTreePlanting());
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+
+            }
+        });
+    }
+
+
+    /**
+     * 鑾峰彇褰撳墠绯荤粺鏃ユ湡鏃堕棿鎴�
+     *
+     * @return 鏃堕棿鎴�
+     */
+    private long getCurrentTimestamp() {
+        return new Date().getTime();
+    }
+
+    /**
+     * 鑾峰彇鏃ユ湡鏍煎紡 (2024/2/09,yyyy/DD/dd)
+     *
+     * @return 鏃ユ湡鏍煎紡 (2024/2/09,yyyy/DD/dd)
+     */
+    private String getTimeDateFormat() {
+        String timeDateFormat = TimeUtils.zhDateYearMonthDayFormat;
+        switch (timeType) {
+            case TimeType.day: {
+                timeDateFormat = TimeUtils.zhDateYearMonthDayFormat;
+                if (!UserConfigManage.getInstance().isZh()) {
+                    timeDateFormat = TimeUtils.enDateYearMonthDayFormat;
+                }
+            }
+            break;
+            case TimeType.month: {
+                timeDateFormat = TimeUtils.zhDateYearMonthFormat;
+                if (!UserConfigManage.getInstance().isZh()) {
+                    timeDateFormat = TimeUtils.enDateYearMonthFormat;
+                }
+            }
+            break;
+            case TimeType.year:
+            case TimeType.all: {
+                timeDateFormat = TimeUtils.zhDateYearFormat;
+                if (!UserConfigManage.getInstance().isZh()) {
+                    timeDateFormat = TimeUtils.enDateYearFormat;
+                }
+            }
+            break;
+
+        }
+        return timeDateFormat;
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/AAChartSymbolConst.java b/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/AAChartSymbolConst.java
new file mode 100644
index 0000000..2fbca49
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/AAChartSymbolConst.java
@@ -0,0 +1,11 @@
+package com.hdl.photovoltaic.ui.home.aachart;
+
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartSymbolType;
+
+public class AAChartSymbolConst {
+    public static final String predefinedSymbol1 = AAChartSymbolType.Triangle;
+    public static final String predefinedSymbol2 = AAChartSymbolType.Circle;
+    public static final String imageSymbol = "url(https://www.highcharts.com/samples/graphics/sun.png)";
+    public static final String base64Symbol = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5Si +ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVi +pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+ 1dT1gvWd+ 1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx+ 1/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb+ 16EHTh0kX/i +c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAVVJREFUeNpi/P37NwOxYM2pHtm7lw8uYmBgYGAiVtPC3RWh+88vuneT474Dv4DkcUZibJy8PG72le/nkn+zMzAaMhnNyY1clMpCjKbz/86lMLAzMMA0MTAwMOC1Ea6JgYFB9pPwncbMg6owOaY1p3pk15zqkcWnie8j63ddY18nZHmWI2eW3vzN/Jf168c3UfGuHathAXHl+7lkBnYGBtafDP8NVd3jQ8xKHiNrZMyeqPPtE/9vTgYGBgb1H4oHlHXt43ZfWfDwNzsDIwMDA4POX831RXGrg9BdxLhob63VgTurjsAUsv5k+A9jC3/g/NCdfVoQm/+ZIu3qjhnyW3XABJANMNL19cYVcPBQrZpq9eyFwCdJmIT6D8UD5cmbHXFphKccI9Mgc84vTH9goYhPE4rGELOSx0bSjsUMDAwMunJ2FQST0+/fv1Hw5BWJbehi2DBgAHTKsWmiz+rJAAAAAElFTkSuQmCC)";
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/BasicChartComposer.java b/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/BasicChartComposer.java
new file mode 100644
index 0000000..67d941a
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/BasicChartComposer.java
@@ -0,0 +1,229 @@
+package com.hdl.photovoltaic.ui.home.aachart;
+
+import static com.github.AAChartModel.AAChartCore.AATools.AAColor.AARgba;
+
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AAChartModel;
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AASeriesElement;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartAnimationType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartSymbolStyleType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartSymbolType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartZoomType;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAStyle;
+import com.github.AAChartModel.AAChartCore.AATools.AAColor;
+import com.github.AAChartModel.AAChartCore.AATools.AAGradientColor;
+import com.github.AAChartModel.AAChartCore.AATools.AALinearGradientDirection;
+
+import java.util.Map;
+
+public class BasicChartComposer {
+    public static AAChartModel configureBasicOptions() {
+        return new AAChartModel()
+                .backgroundColor("#EDEFF2")
+//                .backgroundColor("#4b2b7f")
+                .dataLabelsEnabled(false)
+                .yAxisGridLineWidth(1)
+                .touchEventEnabled(true);
+    }
+
+    public static AAChartModel configureAreaChart() {
+        Map<String, Object> linearGradientColor = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                "rgba(56,196,148,0.5)",//娣辩矇鑹�, alpha 閫忔槑搴�1
+                "rgba(255,255,255,0)"//鐑儏鐨勭矇绾�, alpha 閫忔槑搴� 0.1
+        );//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+        AASeriesElement element1 = new AASeriesElement()
+                .name("Tokyo")
+//                .colorByPoint(true)
+                .color(AARgba(56, 196, 148, 1.0f))//鐚╃孩鑹�, alpha 閫忔槑搴� 1
+                .lineWidth(1.5)
+//                .borderColor(AARgba(255,255,255,1.0f))
+                .fillColor(linearGradientColor)
+//                .fillOpacity(0.5)//鍖哄煙鑳屾櫙閫忔槑搴︼紝璁剧疆0鐨勮瘽鐪嬩笉鍒板尯鍩熻儗鏅�
+                .data(new Object[]{0, 20, 30, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6});
+//        AASeriesElement element2 = new AASeriesElement()
+//                .name("NewYork")
+//                .data(new Object[]{0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5});
+//        AASeriesElement element3 = new AASeriesElement()
+//                .name("London")
+//                .data(new Object[]{0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0});
+//        AASeriesElement element4 = new AASeriesElement()
+//                .name("Berlin")
+//                .data(new Object[]{3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8});
+
+        return configureBasicOptions()
+                .backgroundColor("#EDEFF2")
+                .legendEnabled(false)
+                .markerRadius(0)
+//                .markerSymbol(AAChartSymbolType.Circle)
+//                .markerSymbolStyle(AAChartSymbolStyleType.Normal)
+                .chartType(AAChartType.Area)
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀", "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .series(new AASeriesElement[]{element1});
+    }
+
+    public static AAChartModel configureAreaChart(String tipSuspendName, String[] categories, Object[] data) {
+        Map<String, Object> linearGradientColor = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                "rgba(56,196,148,0.5)",//娣辩矇鑹�, alpha 閫忔槑搴�1
+                "rgba(255,255,255,0)"//鐑儏鐨勭矇绾�, alpha 閫忔槑搴� 0.1
+        );//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+        AASeriesElement element1 = new AASeriesElement()
+                .name(tipSuspendName)
+//                .colorByPoint(true)
+                .color(AARgba(56, 196, 148, 1.0f))//鐚╃孩鑹�, alpha 閫忔槑搴� 1
+                .lineWidth(1.5)
+//                .borderColor(AARgba(255,255,255,1.0f))
+                .fillColor(linearGradientColor)
+//                .fillOpacity(0.5)//鍖哄煙鑳屾櫙閫忔槑搴︼紝璁剧疆0鐨勮瘽鐪嬩笉鍒板尯鍩熻儗鏅�
+                .data(data);
+//        AASeriesElement element2 = new AASeriesElement()
+//                .name("NewYork")
+//                .data(new Object[]{0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5});
+//        AASeriesElement element3 = new AASeriesElement()
+//                .name("London")
+//                .data(new Object[]{0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0});
+//        AASeriesElement element4 = new AASeriesElement()
+//                .name("Berlin")
+//                .data(new Object[]{3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8});
+
+        return configureBasicOptions()
+                .backgroundColor("#EDEFF2")
+                .legendEnabled(false)
+                .markerRadius(0)
+//                .markerSymbol(AAChartSymbolType.Circle)
+//                .markerSymbolStyle(AAChartSymbolStyleType.Normal)
+                .chartType(AAChartType.Area)
+                .categories(categories)
+//                .zoomType(AAChartZoomType.None)//鎵嬪娍缂╂斁
+//                .yAxisMax(500)
+                .yAxisMin(0)
+                .series(new AASeriesElement[]{element1});
+    }
+
+    public static AAChartModel configureStepAreaChartAndStepLineChart() {
+        AASeriesElement element1 = new AASeriesElement()
+                .name("Tokyo")
+                .step(true)
+                .data(new Object[]{149.9, 171.5, 106.4, 129.2, 144.0, 176.0, 135.6, 188.5, 276.4, 214.1, 95.6, 54.4});
+
+        AASeriesElement element2 = new AASeriesElement()
+                .name("NewYork")
+                .step(true)
+                .data(new Object[]{83.6, 78.8, 188.5, 93.4, 106.0, 84.5, 105.0, 104.3, 131.2, 153.5, 226.6, 192.3});
+
+        AASeriesElement element3 = new AASeriesElement()
+                .name("London")
+                .step(true)
+                .data(new Object[]{48.9, 38.8, 19.3, 41.4, 47.0, 28.3, 59.0, 69.6, 52.4, 65.2, 53.3, 72.2});
+
+        return configureBasicOptions()
+                .chartType(AAChartType.Area)
+                .series(new AASeriesElement[]{element1, element2, element3,});
+    }
+
+    public static AAChartModel configureColumnChartAndBarChart() {
+        return configureAreaChart()
+                .categories(new String[]{
+                        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+                })
+                .legendEnabled(true)
+                .colorsTheme(new String[]{"#fe117c", "#ffc069", "#06caf4", "#7dffc0"})
+                .animationType(AAChartAnimationType.EaseOutCubic)
+                .animationDuration(1200);
+    }
+
+    public static AAChartModel configureAreaChartAndAreasplineChartStyle(String chartType) {
+        String[] colorsArr = {
+                AAColor.Red,
+                AAColor.Orange,
+                AAColor.Red,
+                AAColor.Green,
+                AAColor.Red,
+                AAColor.Blue,
+                AAColor.Red,
+                AAColor.Gray,
+                AAColor.DarkGray,
+                AAColor.LightGray,
+                AAColor.Magenta,
+                AAColor.Brown,
+                AAColor.Black,
+        };
+        AAChartModel aaChartModel = configureAreaChart()
+                .animationType(AAChartAnimationType.EaseOutQuart)
+                .legendEnabled(true)
+                .markerRadius(0)
+                .markerSymbolStyle(AAChartSymbolStyleType.Normal)
+//                .markerSymbol(AAChartSymbolType.Circle)
+                .tooltipValueSuffix("Kw.h")
+//                .colorsTheme(colorsArr)
+                .legendEnabled(false);
+
+
+        if (chartType.equals(AAChartType.Areaspline)) {
+            Map<String, Object> gradientColorDic = AAGradientColor.linearGradient(
+                    AALinearGradientDirection.ToBottomRight,
+                    "rgba(138,43,226,1)",
+                    "rgba(30,144,255,1)" //棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+            );
+
+            AASeriesElement element1 = new AASeriesElement()
+                    .name("Predefined symbol")
+                    .fillColor(gradientColorDic)
+                    .data(new Object[]{0.45, 0.43, 0.50, 0.55, 0.58, 0.62, 0.83, 0.39, 0.56, 0.67, 0.50, 0.34, 0.50, 0.67, 0.58, 0.29, 0.46, 0.23, 0.47, 0.46, 0.38, 0.56, 0.48, 0.36});
+
+            AASeriesElement element2 = new AASeriesElement()
+                    .name("Image symbol")
+                    .data(new Object[]{0.38, 0.31, 0.32, 0.32, 0.64, 0.66, 0.86, 0.47, 0.52, 0.75, 0.52, 0.56, 0.54, 0.60, 0.46, 0.63, 0.54, 0.51, 0.58, 0.64, 0.60, 0.45, 0.36, 0.67});
+
+            AASeriesElement element3 = new AASeriesElement()
+                    .name("Base64 symbol (*)")
+                    .data(new Object[]{0.46, 0.32, 0.53, 0.58, 0.86, 0.68, 0.85, 0.73, 0.69, 0.71, 0.91, 0.74, 0.60, 0.50, 0.39, 0.67, 0.55, 0.49, 0.65, 0.45, 0.64, 0.47, 0.63, 0.64});
+
+            AASeriesElement element4 = new AASeriesElement()
+                    .name("Custom symbol")
+                    .data(new Object[]{0.60, 0.51, 0.52, 0.53, 0.64, 0.84, 0.65, 0.68, 0.63, 0.47, 0.72, 0.60, 0.65, 0.74, 0.66, 0.65, 0.71, 0.59, 0.65, 0.77, 0.52, 0.53, 0.58, 0.53});
+
+            aaChartModel
+                    .animationType(AAChartAnimationType.EaseFrom)//璁剧疆鍥捐〃娓叉煋鍔ㄧ敾绫诲瀷涓� EaseFrom
+                    .series(new AASeriesElement[]{element1, element2, element3, element4});
+        }
+        return aaChartModel;
+    }
+
+
+    public static AAChartModel configureLineChartAndSplineChartStyle(String chartType) {
+        AAChartModel aaChartModel = configureAreaChart()
+                .chartType(chartType)
+                .markerSymbolStyle(AAChartSymbolStyleType.BorderBlank)//璁剧疆鎶樼嚎杩炴帴鐐规牱寮忎负:杈圭紭鐧借壊
+                .markerRadius(6);
+        if (chartType.equals(AAChartType.Spline)) {
+            AASeriesElement element1 = new AASeriesElement()
+                    .name("Tokyo")
+                    .lineWidth(7)
+                    .data(new Object[]{50, 320, 230, 370, 230, 400,});
+
+            AASeriesElement element2 = new AASeriesElement()
+                    .name("Berlin")
+                    .lineWidth(7)
+                    .data(new Object[]{80, 390, 210, 340, 240, 350,});
+
+            AASeriesElement element3 = new AASeriesElement()
+                    .name("New York")
+                    .lineWidth(7)
+                    .data(new Object[]{100, 370, 180, 280, 260, 300,});
+
+            AASeriesElement element4 = new AASeriesElement()
+                    .name("London")
+                    .lineWidth(7)
+                    .data(new Object[]{130, 350, 160, 310, 250, 268,});
+
+            aaChartModel
+                    .animationType(AAChartAnimationType.SwingFromTo)
+                    .series(new AASeriesElement[]{element1, element2, element3, element4});
+
+        }
+        return aaChartModel;
+    }
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/CustomStyleChartComposer.java b/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/CustomStyleChartComposer.java
new file mode 100644
index 0000000..102353a
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/home/aachart/CustomStyleChartComposer.java
@@ -0,0 +1,2100 @@
+package com.hdl.photovoltaic.ui.home.aachart;
+
+import static com.github.AAChartModel.AAChartCore.AATools.AAColor.AARgba;
+
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AAChartModel;
+import com.github.AAChartModel.AAChartCore.AAChartCreator.AASeriesElement;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartAlignType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartAnimationType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartFontWeightType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartStackingType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartSymbolStyleType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartSymbolType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartVerticalAlignType;
+import com.github.AAChartModel.AAChartCore.AAChartEnum.AAChartZoomType;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAColumn;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AADataElement;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AADataLabels;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAHalo;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAHover;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAInactive;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAMarker;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAMarkerHover;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAMarkerStates;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AASVGAttributes;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AASelect;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAShadow;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAStates;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAStyle;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AATooltip;
+import com.github.AAChartModel.AAChartCore.AAOptionsModel.AAZonesElement;
+import com.github.AAChartModel.AAChartCore.AATools.AAColor;
+import com.github.AAChartModel.AAChartCore.AATools.AAGradientColor;
+import com.github.AAChartModel.AAChartCore.AATools.AALinearGradientDirection;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+public class CustomStyleChartComposer {
+
+    public static AAChartModel configureColorfulChart() {
+        String[] colorsNameArr = {
+                "red",
+                "orange",
+                "yellow",
+                "green",
+                "cyan",
+                "blue",
+                "purple",
+                "gray",
+                "darkGray",
+                "lightGray",
+                "magenta",
+                "brown",
+                "black"
+        };
+
+        String[] colorsArr = {
+                AAColor.Red,
+                AAColor.Orange,
+                AAColor.Yellow,
+                AAColor.Green,
+                AAColor.Cyan,
+                AAColor.Blue,
+                AAColor.Purple,
+                AAColor.Gray,
+                AAColor.DarkGray,
+                AAColor.LightGray,
+                AAColor.Magenta,
+                AAColor.Brown,
+                AAColor.Black,
+        };
+
+        return new AAChartModel()
+                .chartType(AAChartType.Bar)
+                .animationType(AAChartAnimationType.Bounce)
+                .title("Colorful Chart")
+                .subtitle("use AAColor to get color string")
+                .dataLabelsEnabled(false)
+                .categories(colorsNameArr)
+                .colorsTheme(colorsArr)
+                .stacking(AAChartStackingType.Percent)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo")
+                                .data(new Object[]{
+                                        149.9, 171.5, 106.4, 129.2, 144.0, 176.0, 135.6, 188.5, 276.4, 214.1, 95.6, 54.4})
+                                .colorByPoint(true)
+                });
+
+    }
+
+    public static AAChartModel configureColorfulGradientColorChart() {
+        String[] gradientColorNamesArr = {
+                "oceanBlue",
+                "sanguine",
+                "lusciousLime",
+                "purpleLake",
+                "freshPapaya",
+                "ultramarine",
+                "pinkSugar",
+                "lemonDrizzle",
+                "victoriaPurple",
+                "springGreens",
+                "mysticMauve",
+                "reflexSilver",
+                "newLeaf",
+                "cottonCandy",
+                "pixieDust",
+                "fizzyPeach",
+                "sweetDream",
+                "firebrick",
+                "wroughtIron",
+                "deepSea",
+                "coastalBreeze",
+                "eveningDelight",
+                "neonGlowColor",
+                "berrySmoothieColor"
+        };
+
+        Map[] gradientColorArr = {
+                AAGradientColor.OceanBlue,
+                AAGradientColor.Sanguine,
+                AAGradientColor.LusciousLime,
+                AAGradientColor.PurpleLake,
+                AAGradientColor.FreshPapaya,
+                AAGradientColor.Ultramarine,
+                AAGradientColor.PinkSugar,
+                AAGradientColor.LemonDrizzle,
+                AAGradientColor.VictoriaPurple,
+                AAGradientColor.SpringGreens,
+                AAGradientColor.MysticMauve,
+                AAGradientColor.ReflexSilver,
+                AAGradientColor.NewLeaf,
+                AAGradientColor.CottonCandy,
+                AAGradientColor.PixieDust,
+                AAGradientColor.FizzyPeach,
+                AAGradientColor.SweetDream,
+                AAGradientColor.Firebrick,
+                AAGradientColor.WroughtIron,
+                AAGradientColor.DeepSea,
+                AAGradientColor.CoastalBreeze,
+                AAGradientColor.EveningDelight,
+                AAGradientColor.NeonGlow,
+                AAGradientColor.BerrySmoothie
+        };
+
+        return new AAChartModel()
+                .chartType(AAChartType.Bar)
+                .title("Colorful Column Chart")
+                .subtitle("single data array colorful column chart")
+                .categories(gradientColorNamesArr)
+                .colorsTheme(gradientColorArr)
+                .yAxisTitle("gradient color")
+                .stacking(AAChartStackingType.Percent)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo")
+                                .data(new Object[]{
+                                        149.9, 171.5, 106.4, 129.2, 144.0, 176.0, 135.6, 188.5, 276.4, 214.1, 95.6, 54.4,
+                                        149.9, 171.5, 106.4, 129.2, 144.0, 176.0, 135.6, 188.5, 276.4, 214.1, 95.6, 54.4})
+                                .colorByPoint(true)
+                });
+
+    }
+
+    public static AAChartModel configureDiscontinuousDataChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .title("Discontinuous Data Chart")
+                .dataLabelsEnabled(true)
+                .tooltipEnabled(true)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo")
+                                .data(new Object[]{6.9, 9.5, 14.5, 18.2, 21.5, null, null, null, null, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6})
+                                .color(AAGradientColor.DeepSea)
+
+                });
+
+    }
+
+    public static AAChartModel configureColorfulColumnChart(String tipSuspendName, String[] categories, Object[] data) {
+        Object[][] stopsArr = {
+                {1.00, "#38C494"},
+        };//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+
+        Map<String, Object> linearGradientColor = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                stopsArr
+        );
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .backgroundColor("#EDEFF2")
+                .colorsTheme(new String[]{"#38C494",})
+                .categories(categories)
+                .xAxisLabelsEnabled(true)
+                .zoomType(AAChartZoomType.XY)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+//                                .color(linearGradientColor)
+                                .name("涓滀含")
+                                .data(data)
+//                                .colorByPoint(true)
+                                .tooltip(new AATooltip().style(new AAStyle().backgroundColor("#FFFFFF").fontSize(25)))
+
+                });
+    }
+
+    public static AAChartModel configureNightingaleRoseChart() {
+        return new AAChartModel()
+                .title("鍗椾竵鏍煎皵鐜懓鍥�")
+                .subtitle("鏋佸湴鍥句腑鐨勪竴绉�")
+                .yAxisTitle("cm")
+                .chartType(AAChartType.Column)
+                .xAxisVisible(false)//鏄惁鏄剧ず鏈�澶栦竴灞傚渾鐜�
+                .yAxisVisible(true)//鏄惁鏄剧ず涓棿鐨勫涓渾鐜�
+                .legendEnabled(false)//闅愯棌鍥句緥(搴曢儴鍙偣鎸夌殑灏忓渾鐐�)
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .dataLabelsEnabled(true)
+                .polar(true)//鏋佸湴鍖栧浘褰�
+                .series(new AASeriesElement[]{
+                                new AASeriesElement()
+                                        .name("涓滀含")
+                                        .data(new Object[]{7.0, 6.9, 9.5, 9.6, 13.9, 14.5, 18.3, 18.2, 21.5, 25.2, 26.5, 23.3}),
+                        }
+                )
+                ;
+    }
+
+    public static AAChartModel configureChartWithShadowStyle() {
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .markerRadius(0)
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo Hot")
+                                .lineWidth(8.0)
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6})
+                                .shadow(new AAShadow()
+                                .offsetX(15.0)
+                                .offsetY(15.0)
+                                .opacity(0.2f)
+                                .width(8.0)
+                                .color(AAColor.Red))
+                });
+    }
+
+    public static AAChartModel configureColorfulGradientAreaChart() {
+        Object[][] stopsArr = {
+                {0.00, "#febc0f"},
+                {0.50, "#FF14d4"},
+                {1.00, "#0bf8f5"},
+        };//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+
+        Map<String, Object> linearGradientColor = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToLeft,
+                stopsArr
+        );//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+
+        return new AAChartModel()
+                .chartType(AAChartType.Areaspline)
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .markerRadius(0)
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                                new AASeriesElement()
+                                        .name("Tokyo Hot")
+                                        .lineWidth(3)
+                                        .color(linearGradientColor)
+                                        .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6}),
+                        }
+                );
+    }
+
+
+    public static AAChartModel configureColorfulGradientSplineChart() {
+        Object[][] stopsArr = {
+                {0.00, "#febc0f"},
+                {0.25, "#FF14d4"},
+                {0.50, "#0bf8f5"},
+                {0.75, "#F33c52"},
+                {1.00, "#1904dd"},
+        };//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+
+        Map<String, Object> linearGradientColor = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToLeft,
+                stopsArr
+        );//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .markerRadius(0)
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                                new AASeriesElement()
+                                        .name("Tokyo Hot")
+                                        .lineWidth(15.0)
+                                        .color(linearGradientColor)
+                                        .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6}),
+                        }
+                );
+    }
+
+
+    public static AAChartModel configureGradientColorAreasplineChart() {
+        Map<String, Object> linearGradientColor = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                "rgba(2255,20,147,1)",//娣辩矇鑹�, alpha 閫忔槑搴� 1
+                "rgba(255,105,180,0.1)"//鐑儏鐨勭矇绾�, alpha 閫忔槑搴� 0.1
+        );//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+
+        return new AAChartModel()
+                .chartType(AAChartType.Areaspline)
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .markerRadius(8)//marker鐐瑰崐寰勪负8涓儚绱�
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)//marker鐐逛负绌哄績鏁堟灉
+                .markerSymbol(AAChartSymbolType.Circle)//marker鐐逛负鍦嗗舰鐐光棆
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                                new AASeriesElement()
+                                        .name("Tokyo Hot")
+                                        .lineWidth(5.0)
+                                        .color(AARgba(220, 20, 60, 1.0f))//鐚╃孩鑹�, alpha 閫忔槑搴� 1
+                                        .fillColor(linearGradientColor)
+                                        .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6}),
+                        }
+                );
+    }
+
+
+    public static AAChartModel configureSpecialStyleMarkerOfSingleDataElementChart() {
+        Object[][] stopsArr = {
+                {0.00, "#febc0f"},
+                {0.25, "#FF14d4"},
+                {0.50, "#0bf8f5"},
+                {0.75, "#F33c52"},
+                {1.00, "#1904dd"},
+        };//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+
+        Map<String, Object> gradientColorDic1 = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToRight,
+                stopsArr
+        );
+
+        AADataElement singleSpecialData = new AADataElement()
+                .marker(new AAMarker()
+                        .radius(8)//鏇茬嚎杩炴帴鐐瑰崐寰�
+                        .symbol(AAChartSymbolType.Circle)//鏇茬嚎鐐圭被鍨嬶細"circle", "square", "diamond", "triangle","triangle-down"锛岄粯璁ゆ槸"circle"
+                        .fillColor("#FFFFFF")//鐐圭殑濉厖鑹�(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑濉厖鑹�)
+                        .lineWidth(5)//澶栨部绾跨殑瀹藉害(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟鐨勫搴�)
+                        .lineColor("#FF0000")//澶栨部绾跨殑棰滆壊(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟棰滆壊锛屽綋鍊间负绌哄瓧绗︿覆鏃讹紝榛樿鍙栨暟鎹偣鎴栨暟鎹垪鐨勯鑹�)
+                )
+                .y(26.5);
+
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .backgroundColor("#4b2b7f")
+                .dataLabelsEnabled(false)//鏄惁鏄剧ず鍊�
+                .tooltipEnabled(true)
+                .markerRadius(0)
+                .xAxisVisible(false)
+                .yAxisVisible(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Virtual Data")
+                                .lineWidth(6)
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, singleSpecialData, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6})
+                                .color(gradientColorDic1)
+                });
+    }
+
+    public static AAChartModel configureSpecialStyleColumnOfSingleDataElementChart() {
+        AADataElement singleSpecialData = new AADataElement()
+                .color(AAGradientColor.FreshPapaya)
+                .y(49.5);
+
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .dataLabelsEnabled(false)//鏄惁鏄剧ず鍊�
+                .tooltipEnabled(false)
+                .markerRadius(0)
+                .xAxisVisible(false)
+                .yAxisVisible(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Virtual Data")
+                                .lineWidth(6)
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, singleSpecialData, 5.2, 26.5, 23.3, 26.5, 13.9, 9.6})
+                                .color(AAGradientColor.OceanBlue)
+                });
+    }
+
+    public static AAChartModel configureAreaChartThreshold() {
+        Map<String, Object> gradientColorDic1 = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                "rgba(30, 144, 255,1)",//DodgerBlue, alpha 閫忔槑搴� 1
+                "rgba(30, 144, 255,0.1)"//DodgerBlue, alpha 閫忔槑搴� 0.1
+        );
+
+        return new AAChartModel()
+                .chartType(AAChartType.Area)
+                .yAxisGridLineWidth(0)
+                .categories(new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "July", "Aug", "Spe", "Oct", "Nov", "Dec"})
+                .dataLabelsEnabled(false)//鏄惁鏄剧ず鍊�
+                .markerRadius(8)
+                .markerSymbol(AAChartSymbolType.Circle)
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .threshold((-200))
+                                .data(new Object[]{106.4, 129.2, 269.9, -100.5, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4})
+                                .lineWidth(6)
+                                .color("rgba(30, 144, 255,1)")
+                                .fillColor(gradientColorDic1)
+                });
+    }
+
+    //refer to online sample https://jshare.com.cn/github/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-marker-symbol/
+    public static AAChartModel customScatterChartMarkerSymbolContent() {
+        AASeriesElement element1 = new AASeriesElement()
+                .name("Predefined symbol")
+                .data(new Object[]{0.45, 0.43, 0.50, 0.55, 0.58, 0.62, 0.83, 0.39, 0.56, 0.67, 0.50, 0.34, 0.50, 0.67, 0.58, 0.29, 0.46, 0.23, 0.47, 0.46, 0.38, 0.56, 0.48, 0.36})
+                .marker(new AAMarker()
+                        .symbol(AAChartSymbolConst.predefinedSymbol1));
+
+        AASeriesElement element2 = new AASeriesElement()
+                .name("Image symbol")
+                .data(new Object[]{0.38, 0.31, 0.32, 0.32, 0.64, 0.66, 0.86, 0.47, 0.52, 0.75, 0.52, 0.56, 0.54, 0.60, 0.46, 0.63, 0.54, 0.51, 0.58, 0.64, 0.60, 0.45, 0.36, 0.67})
+                .marker(new AAMarker()
+                        .symbol(AAChartSymbolConst.imageSymbol));
+
+        AASeriesElement element3 = new AASeriesElement()
+                .name("Base64 symbol (*)")
+                .data(new Object[]{0.46, 0.32, 0.53, 0.58, 0.86, 0.68, 0.85, 0.73, 0.69, 0.71, 0.91, 0.74, 0.60, 0.50, 0.39, 0.67, 0.55, 0.49, 0.65, 0.45, 0.64, 0.47, 0.63, 0.64})
+                .marker(new AAMarker()
+                        .symbol(AAChartSymbolConst.base64Symbol));
+
+        AASeriesElement element4 = new AASeriesElement()
+                .name("Custom symbol")
+                .data(new Object[]{0.60, 0.51, 0.52, 0.53, 0.64, 0.84, 0.65, 0.68, 0.63, 0.47, 0.72, 0.60, 0.65, 0.74, 0.66, 0.65, 0.71, 0.59, 0.65, 0.77, 0.52, 0.53, 0.58, 0.53})
+                .marker(new AAMarker()
+                        .symbol(AAChartSymbolConst.predefinedSymbol2));
+
+        return new AAChartModel()
+                .chartType(AAChartType.Scatter)
+                .yAxisMax(3.5)
+                .yAxisGridLineWidth(0)
+                .stacking(AAChartStackingType.Normal)
+                .markerRadius(8)
+                .series(new AASeriesElement[]{element1, element2, element3, element4});
+    }
+
+    //refer to online sample https://jshare.com.cn/github/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/series-marker-symbol/
+    public static AAChartModel customLineChartMarkerSymbolContent() {
+        AAChartModel aaChartModel = customScatterChartMarkerSymbolContent();
+        aaChartModel.chartType = AAChartType.Line;
+        return aaChartModel;
+    }
+
+    //涓夎褰㈤浄杈惧浘
+    public static AAChartModel configureTriangleRadarChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Area)
+                .yAxisMax(15.0)
+                .yAxisGridLineWidth(0)
+                .xAxisVisible(false)
+                .markerRadius(0)
+                .polar(true)//鏄惁鏋佸寲鍥惧舰
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .data(new Object[]{15.0, 15.0, 15.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{9.0, 9.0, 9.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{6.0, 6.0, 6.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{3.0, 3.0, 3.0,}),
+                });
+    }
+
+    //鍥涜竟褰㈤浄杈惧浘
+    public static AAChartModel configureQuadrangleRadarChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Area)
+                .yAxisMax(15.0)
+                .yAxisGridLineWidth(0)
+                .xAxisVisible(false)
+                .markerRadius(0)
+                .polar(true)//鏄惁鏋佸寲鍥惧舰
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .data(new Object[]{15.0, 15.0, 15.0, 15.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{9.0, 9.0, 9.0, 9.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{6.0, 6.0, 6.0, 6.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{3.0, 3.0, 3.0, 3.0,}),
+                });
+    }
+
+    //浜旇竟褰㈤浄杈惧浘
+    public static AAChartModel configurePentagonRadarChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Area)
+                .yAxisMax(15.0)
+                .yAxisGridLineWidth(0)
+                .xAxisVisible(false)
+                .markerRadius(0)
+                .polar(true)//鏄惁鏋佸寲鍥惧舰
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .data(new Object[]{15.0, 15.0, 15.0, 15.0, 15.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{9.0, 9.0, 9.0, 9.0, 9.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{6.0, 6.0, 6.0, 6.0, 6.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{3.0, 3.0, 3.0, 3.0, 3.0,}),
+                });
+    }
+
+    //鍏竟褰㈤浄杈惧浘
+    public static AAChartModel configureHexagonRadarChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Area)
+                .yAxisMax(15.0)
+                .yAxisGridLineWidth(0)
+                .xAxisVisible(false)
+                .markerRadius(0)
+                .polar(true)//鏄惁鏋佸寲鍥惧舰
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .data(new Object[]{15.0, 15.0, 15.0, 15.0, 15.0, 15.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{9.0, 9.0, 9.0, 9.0, 9.0, 9.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{6.0, 6.0, 6.0, 6.0, 6.0, 6.0,}),
+                        new AASeriesElement()
+                                .data(new Object[]{3.0, 3.0, 3.0, 3.0, 3.0, 3.0,}),
+                });
+    }
+
+    public static AAChartModel adjustYAxisMaxAndMinValues() {
+        String[] categoriesArr = {
+                "瀛ゅ矝鍗辨満",
+                "浣垮懡鍙敜",
+                "鑽h獕鍕嬬珷",
+                "鐙欏嚮绮捐嫳",
+                "绁炵娴峰煙",
+                "鏈�鍚庣敓杩樿��",
+                "宸笀3鐙傜寧",
+                "瀵归┈涔嬮瓊",
+                "铦欒潬渚犻樋鐢橀獞澹�",
+                "鍦扮嫳杈瑰",
+                "闂",
+                "蹇嶈�呬箣鍗�",
+        };
+
+        return new AAChartModel()
+                .chartType(AAChartType.Areaspline)
+                .legendEnabled(false)
+                .yAxisVisible(true)
+                .markerRadius(6)
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
+                .zoomType(AAChartZoomType.XY)
+                .categories(categoriesArr)
+                .yAxisMin(2.0)
+                .yAxisMax(45.4)
+                .xAxisTickInterval(2)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("浣撻噸")
+                                .color("#2494F3")
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6})
+                })
+                ;
+    }
+
+    public static AAChartModel customSpecialStyleDataLabelOfSingleDataElementChart() {
+        Object[][] redStopsArr = new Object[][]{
+                new Object[]{0.0, AARgba(255, 0, 0, 0.6f)},//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+                new Object[]{0.5, AARgba(255, 0, 0, 0.0f)},
+                new Object[]{1.0, AARgba(255, 0, 0, 0.0f)}
+        };
+
+        Map<String, Object> gradientColorDic1 = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToTop,
+                AARgba(255, 215, 0, 0.1f),
+                AARgba(255, 215, 0, 0.6f)
+        );
+
+        String formatStr =
+                "<img src=\"https://www.highcharts.com/samples/graphics/sun.png\">" +
+                        "<span style=\"color:#FFFFFF;font-weight:thin;font-size:25px\">{y}</span>" +
+                        "<span style=\"color:#FFFFFF;font-weight:thin;font-size:17px\"> m</span>";
+
+
+        AADataElement singleSpecialData = new AADataElement()
+                .dataLabels(new AADataLabels()
+                        .enabled(true)
+                        .useHTML(true)
+                        .format(formatStr)
+                        .style(new AAStyle()
+                                .fontWeight(AAChartFontWeightType.Bold)
+                                .color(AAColor.White)
+                                .fontSize(16))
+                        .y((-35))
+                        .align(AAChartAlignType.Center)
+                        .verticalAlign(AAChartVerticalAlignType.Top)
+                        .overflow("none")
+                        .crop(false)
+                )
+                .y(26.5);
+
+        return new AAChartModel()
+                .chartType(AAChartType.Areaspline)
+                .backgroundColor("#4b2b7f")
+                .dataLabelsEnabled(false)//鏄惁鏄剧ず鍊�
+                .tooltipEnabled(true)
+                .markerRadius(0)
+                .xAxisVisible(false)
+                .yAxisVisible(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Virtual Data")
+                                .lineWidth(6)
+                                .color("rgba(255,215,0,1)")
+                                .fillColor(gradientColorDic1)// gold color, alpha: 1.0
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, singleSpecialData, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6})
+                });
+    }
+
+    public static AAChartModel customBarChartHoverColorAndSelectColor() {
+        return new AAChartModel()
+                .chartType(AAChartType.Bar)
+                .title("Custom Bar Chart select color")
+                .yAxisReversed(true)
+                .xAxisReversed(true)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("ElementOne")
+                                .data(new Object[]{211, 183, 157, 133, 111, 91, 73, 57, 43, 31, 21, 13, 7, 3})
+                                .allowPointSelect(true)
+                                .states(
+                                new AAStates()
+                                        .hover(new AAHover()
+                                                .color("rgba(220,20,60,1)"))//鐚╃孩鑹�, alpha 閫忔槑搴� 1
+                                        .select(new AASelect()
+                                                .color(AAColor.Red)))
+                });
+    }
+
+    public static AAChartModel customChartHoverAndSelectHaloStyle() {
+        return new AAChartModel()
+                .chartType(AAChartType.Line)
+                .title("Custom Chart Hover And Select Halo Style")
+                .colorsTheme(new Object[]{AAColor.Red})
+                .yAxisReversed(true)
+                .xAxisReversed(true)
+                .markerRadius(20)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("ElementOne")
+                                .data(new Object[]{211, 183, 157, 133, 111, 91, 73, 57, 43, 31, 21, 13, 7, 3})
+                                .allowPointSelect(true)
+                                .states(
+                                new AAStates()
+                                        .hover(new AAHover()
+                                                .halo(new AAHalo()
+                                                        .size(130)
+                                                        .opacity(0.8)
+                                                        .attributes(new AASVGAttributes()
+                                                                .strokeWidth(50)
+                                                                .fill("#00BFFF")
+                                                                .stroke("#00FA9A"))))
+                                        .select(new AASelect()
+                                                .halo(new AAHalo()
+                                                        .size(130)
+                                                        .opacity(1.0)
+                                                        .attributes(new AASVGAttributes()
+                                                                .strokeWidth(150)
+                                                                .fill(AARgba(138, 43, 226, 1f))
+                                                                .stroke(AARgba(30, 144, 255, 1f)))))
+                        )});
+    }
+
+    public static AAChartModel customSplineChartMarkerStatesHoverStyle() {
+        return new AAChartModel()
+                .chartType(AAChartType.Areaspline)
+                .title("Custom Spline Chart Marker States Hover Style")
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .markerRadius(8.0)//marker鐐瑰崐寰勪负8涓儚绱�
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo Hot")
+                                .lineWidth(5.0)
+                                .color("rgba(220,20,60,1)")//鐚╃孩鑹�, alpha 閫忔槑搴� 1
+                                .marker(new AAMarker()
+                                        .states(new AAMarkerStates()
+                                                .hover(new AAMarkerHover()
+                                                        .fillColor(AAColor.White)
+                                                        .radius(40)
+                                                        .lineColor(AAColor.Green)
+                                                        .lineWidth(20))))
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6}),
+                });
+    }
+
+    //Issue: https://github.com/AAChartModel/AAChartKit/issues/948
+    public static AAChartModel splineChartHoverLineWithNoChangeAndCustomMarkerStatesHoverStyle() {
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .title("Spline Chart Hover Line Width No Change && Custom Marker States Hover Style")
+                .categories(new String[]{"涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .markerRadius(8.0)//marker鐐瑰崐寰勪负8涓儚绱�
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo Hot")
+                                .lineWidth(5.0)
+                                .color(AAColor.Red)
+                                .states(new AAStates()
+                                        .hover(new AAHover()
+                                                .enabled(true)
+                                                //鎵嬫寚鐩樻棆鎴栭�変腑鍥捐〃鏃�,绂佹绾挎潯鍙樼矖
+                                                .lineWidthPlus(0)))
+                                .marker(new AAMarker()
+                                        .states(new AAMarkerStates()
+                                                .hover(new AAMarkerHover()
+                                                        .fillColor(AAColor.Red)//璁剧疆鎵嬫寚閫変腑鐐圭殑棰滆壊涓虹孩鑹�
+                                                        .radius(40))))
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6}),
+                });
+    }
+
+    //Issue: https://github.com/AAChartModel/AAChartKit/issues/827
+    public static AAChartModel customNormalStackingChartDataLabelsContentAndStyle() {
+        String[] categories = {
+                "瀛ゅ矝鍗辨満",
+                "浣垮懡鍙敜",
+                "鑽h獕鍕嬬珷",
+                "鐙欏嚮绮捐嫳",
+                "绁炵娴峰煙",
+                "鏈�鍚庣敓杩樿��",
+                "宸笀3鐙傜寧",
+                "瀵归┈涔嬮瓊",
+                "姝讳骸鎼佹祬",
+                "鍦扮嫳杈瑰",
+                "闂",
+                "蹇嶈�呬箣鍗�"
+        };
+
+        String[] colorsTheme = {
+                "#fe117c",
+                "#ffc069",
+                "#06caf4",
+                "#7dffc0"
+        };
+
+        AASeriesElement element1 = new AASeriesElement()
+                .name("2017")
+                .dataLabels(new AADataLabels()
+                        .enabled(true)
+                        .y(-10)
+                        .format("{total} mm")
+                        .color(AAColor.Red)
+                        .shape("callout")
+                        .backgroundColor(AAColor.White)
+                        .borderColor(AAColor.Red)
+                        .borderRadius(1)
+                        .borderWidth(1)
+                )
+                .data(new Object[]{7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6});
+
+        AASeriesElement element2 = new AASeriesElement()
+                .name("2018")
+                .data(new Object[]{0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5});
+
+        AASeriesElement element3 = new AASeriesElement()
+                .name("2019")
+                .data(new Object[]{0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0});
+
+        AASeriesElement element4 = new AASeriesElement()
+                .name("2020")
+                .data(new Object[]{3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8});
+
+        AASeriesElement[] series = {element1, element2, element3, element4};
+
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .stacking(AAChartStackingType.Normal)
+                .yAxisGridLineWidth(0)
+                .markerRadius(0)
+                .categories(categories)
+                .colorsTheme(colorsTheme)
+                .series(series);
+    }
+
+    //Issue: https://github.com/AAChartModel/AAChartKit-Swift/issues/190
+//API Doc: https://api.highcharts.com.cn/highcharts#series%3Cpyramid%3E.reversed
+    public static AAChartModel upsideDownPyramidChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Pyramid)
+                .yAxisTitle("鎽勬皬搴�")
+                .inverted(true)
+                .legendEnabled(true)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2020")
+                                .reversed(true)
+                                .data(new Object[][]{
+                                {"Swift", 15654},
+                                {"Objective-C", 4064},
+                                {"JavaScript", 1987},
+                                {"GO", 976},
+                                {"Python", 846}
+                        })
+                });
+    }
+
+    //Issue: https://github.com/AAChartModel/AAChartKit/issues/888
+    public static AAChartModel doubleLayerPieChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Pie)
+                .title("娴忚鍣ㄥ競鍦哄崰姣斿巻鍙插姣�")
+                .subtitle("鏃犱换浣曞彲闈犱緷鎹殑铏氭嫙鏁版嵁")
+                .dataLabelsEnabled(true)//鏄惁鐩存帴鏄剧ず鎵囧舰鍥炬暟鎹�
+                .yAxisTitle("鎽勬皬搴�")
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Past")
+                                .size("40%")//灏哄澶у皬
+                                .innerSize("30%")//鍐呴儴鍦嗙幆鍗婂緞澶у皬鍗犳瘮
+                                .borderWidth(0)//鎻忚竟鐨勫搴�
+                                .allowPointSelect(false)//鏄惁鍏佽鍦ㄧ偣鍑绘暟鎹偣鏍囪(鎵囧舰鍥剧偣鍑婚�変腑鐨勫潡鍙戠敓浣嶇Щ)
+                                .data(new Object[][]{
+                                {"Firefox Past", 3336.2},
+                                {"Chrome Past", 26.8},
+                                {"Safari Past", 88.5},
+                                {"Opera Past", 46.0},
+                                {"Others Past", 223.0},
+                        }),
+
+                        new AASeriesElement()
+                                .name("Now")
+                                .size("80%")//灏哄澶у皬
+                                .innerSize("70%")//鍐呴儴鍦嗙幆鍗婂緞澶у皬鍗犳瘮
+                                .borderWidth(0)//鎻忚竟鐨勫搴�
+                                .allowPointSelect(false)//鏄惁鍏佽鍦ㄧ偣鍑绘暟鎹偣鏍囪(鎵囧舰鍥剧偣鍑婚�変腑鐨勫潡鍙戠敓浣嶇Щ)
+                                .data(new Object[][]{
+                                {"Firefox Now", 336.2},
+                                {"Chrome Now", 6926.8},
+                                {"Safari Now", 388.5},
+                                {"Opera Now", 446.0},
+                                {"Others Now", 223.0},
+                        })
+                });
+    }
+
+    //GitHub issue https://github.com/AAChartModel/AAChartKit/issues/903
+    public static AAChartModel disableSomeOfLinesMouseTrackingEffect() {
+        return new AAChartModel()
+                .chartType(AAChartType.Line)//鍥捐〃绫诲瀷
+                .tooltipValueSuffix("涓囧厓")//璁剧疆娴姩鎻愮ず妗嗗崟浣嶅悗缂�
+                .yAxisTitle("涓囧厓")//璁剧疆 Y 杞存爣棰�
+                .categories(new String[]{
+                        "涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"
+                })
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2017")
+                                .data(new Object[]{7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6}),
+                        new AASeriesElement()
+                                .name("2018")
+                                .enableMouseTracking(false)
+                                .data(new Object[]{0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5}),
+                        new AASeriesElement()
+                                .name("2019")
+                                .enableMouseTracking(false)
+                                .data(new Object[]{0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0}),
+                        new AASeriesElement()
+                                .name("2020")
+                                .enableMouseTracking(false)
+                                .data(new Object[]{3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8}),
+                });
+    }
+
+
+    // GitHub issue https://github.com/AAChartModel/AAChartKit/issues/904
+    public static AAChartModel configureColorfulShadowSplineChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .yAxisVisible(false)
+                .stacking(AAChartStackingType.Normal)
+                .colorsTheme(new String[]{"#1e90ff", "#ef476f", "#ffd066", "#04d69f"})
+                .markerSymbol(AAChartSymbolType.Circle)
+                .markerRadius(8.0)
+                .markerSymbolStyle(AAChartSymbolStyleType.BorderBlank)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2017")
+                                .lineWidth(5)
+                                .data(new Object[]{0.45, 0.43, 0.50, 0.55, 0.58, 0.62, 0.83, 0.39, 0.56, 0.67, 0.50, 0.34, 0.50, 0.67, 0.58, 0.29, 0.46, 0.23, 0.47, 0.46, 0.38, 0.56, 0.48, 0.36})
+                                .shadow(
+                                new AAShadow()
+                                        .offsetX(15.0)
+                                        .offsetY(15.0)
+                                        .opacity(0.2f)
+                                        .width(8.0)
+                                        .color("#1e90ff")),
+                        new AASeriesElement()
+                                .name("2018")
+                                .lineWidth(5)
+                                .data(new Object[]{0.38, 0.31, 0.32, 0.32, 0.64, 0.66, 0.86, 0.47, 0.52, 0.75, 0.52, 0.56, 0.54, 0.60, 0.46, 0.63, 0.54, 0.51, 0.58, 0.64, 0.60, 0.45, 0.36, 0.67})
+                                .shadow(
+                                new AAShadow()
+                                        .offsetX(15.0)
+                                        .offsetY(15.0)
+                                        .opacity(0.2f)
+                                        .width(8.0)
+                                        .color("#ef476f")),
+                        new AASeriesElement()
+                                .name("2019")
+                                .lineWidth(5)
+                                .data(new Object[]{0.46, 0.32, 0.53, 0.58, 0.86, 0.68, 0.85, 0.73, 0.69, 0.71, 0.91, 0.74, 0.60, 0.50, 0.39, 0.67, 0.55, 0.49, 0.65, 0.45, 0.64, 0.47, 0.63, 0.64})
+                                .shadow(
+                                new AAShadow()
+                                        .offsetX(15.0)
+                                        .offsetY(15.0)
+                                        .opacity(0.2f)
+                                        .width(8.0)
+                                        .color("#ffd066")),
+                        new AASeriesElement()
+                                .name("2020")
+                                .lineWidth(5)
+                                .data(new Object[]{0.60, 0.51, 0.52, 0.53, 0.64, 0.84, 0.65, 0.68, 0.63, 0.47, 0.72, 0.60, 0.65, 0.74, 0.66, 0.65, 0.71, 0.59, 0.65, 0.77, 0.52, 0.53, 0.58, 0.53})
+                                .shadow(
+                                new AAShadow()
+                                        .offsetX(15.0)
+                                        .offsetY(15.0)
+                                        .opacity(0.2f)
+                                        .width(8.0)
+                                        .color("#04d69f")),
+                });
+    }
+
+    // GitHub issue https://github.com/AAChartModel/AAChartKit/issues/905
+    public static AAChartModel configureColorfulDataLabelsStepLineChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Line)
+                .yAxisVisible(false)
+                .stacking(AAChartStackingType.Normal)
+                .colorsTheme(new String[]{"#1e90ff", "#ef476f", "#ffd066", "#04d69f"})
+                .markerSymbol(AAChartSymbolType.Circle)
+                .markerRadius(8.0)
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2017")
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(new AAStyle()
+                                                .color("#1e90ff")
+                                                .fontSize(11)))
+                                .data(new Object[]{2.10, 2.54, 2.78, 3.62, 4.41, 4.09, 3.83, 4.47, 4.20, 3.94, 3.80, 3.58, 3.19, 4.30, 3.69, 3.52, 3.02, 3.30}),
+                        new AASeriesElement()
+                                .name("2018")
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(new AAStyle()
+                                                .color("#ef476f")
+                                                .fontSize(11)))
+                                .data(new Object[]{1.56, 1.91, 2.45, 3.87, 3.24, 4.90, 4.61, 4.10, 4.17, 3.85, 4.17, 3.46, 3.46, 3.55, 3.50, 4.13, 2.58, 2.28}),
+                        new AASeriesElement()
+                                .name("2019")
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(new AAStyle()
+                                                .color("#ffd066")
+                                                .fontSize(11)))
+                                .data(new Object[]{1.16, 1.67, 2.64, 2.86, 3.00, 3.21, 4.14, 4.07, 3.68, 3.11, 3.41, 3.25, 3.32, 3.07, 3.92, 3.05, 2.18, 3.24}),
+                        new AASeriesElement()
+                                .name("2020")
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(new AAStyle()
+                                                .color("#04d69f")
+                                                .fontSize(11)))
+                                .data(new Object[]{5.59, 3.09, 4.09, 6.14, 5.33, 6.05, 5.71, 6.22, 6.56, 4.75, 5.27, 6.02, 5.22, 5.77, 6.19, 5.68, 4.33, 5.48}),
+                });
+    }
+
+
+    // GitHub issue https://github.com/AAChartModel/AAChartKit-Swift/issues/223
+    public static AAChartModel configureColorfulGradientColorAndColorfulDataLabelsStepAreaChart() {
+        Object[][] blueStopsArr = new Object[][]{
+                {0.0, AARgba(30, 144, 255, 1.0f)},//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+                {0.5, AARgba(30, 144, 255, 0.2f)},
+                {1.0, AARgba(30, 144, 255, 0.0f)}
+        };
+        Map<String, Object> gradientBlueColorDic = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                blueStopsArr
+        );
+
+        Object[][] redStopsArr = new Object[][]{
+                {0.0, AARgba(255, 0, 0, 1.0f)},//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+                {0.5, AARgba(255, 0, 0, 0.2f)},
+                {1.0, AARgba(255, 0, 0, 0.0f)}
+        };
+        Map<String, Object> gradientRedColorDic = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                redStopsArr
+        );
+
+        Object[][] goldStopsArr = new Object[][]{
+                {0.0, AARgba(255, 215, 0, 1.0f)},//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+                {0.5, AARgba(255, 215, 0, 0.2f)},
+                {1.0, AARgba(255, 215, 0, 0.0f)}
+        };
+        Map<String, Object> gradientGoldColorDic = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                goldStopsArr
+        );
+
+        Object[][] greenStopsArr = new Object[][]{
+                {0.0, AARgba(50, 205, 50, 1.0f)},//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+                {0.5, AARgba(50, 205, 50, 0.2f)},
+                {1.0, AARgba(50, 205, 50, 0.0f)}
+        };
+        Map<String, Object> gradientGreenColorDic = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                greenStopsArr
+        );
+
+        return new AAChartModel()
+                .chartType(AAChartType.Area)
+                .yAxisVisible(false)
+                .stacking(AAChartStackingType.Normal)
+                .colorsTheme(new String[]{"#1e90ff", "#ef476f", "#ffd066", "#04d69f"})
+                .markerSymbol(AAChartSymbolType.Circle)
+                .markerRadius(5)
+                .dataLabelsEnabled(true)
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2017")
+                                .fillColor(gradientBlueColorDic)
+                                .lineWidth(6)
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(AAStyle.style("#1e90ff", 11)))
+                                .data(new Object[]{2.10, 2.54, 2.78, 3.62, 4.41, 4.09, 3.83, 4.47, 4.20, 3.94, 3.80, 3.58, 3.19, 4.30, 3.69, 3.52, 3.02, 3.30}),
+                        new AASeriesElement()
+                                .name("2018")
+                                .fillColor(gradientRedColorDic)
+                                .lineWidth(6)
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(AAStyle.style("#ef476f", 11))
+                                )
+                                .data(new Object[]{1.56, 1.91, 2.45, 3.87, 3.24, 4.90, 4.61, 4.10, 4.17, 3.85, 4.17, 3.46, 3.46, 3.55, 3.50, 4.13, 2.58, 2.28}),
+                        new AASeriesElement()
+                                .name("2019")
+                                .fillColor(gradientGoldColorDic)
+                                .lineWidth(6)
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(AAStyle.style("#ffd066", 11)))
+                                .data(new Object[]{1.16, 1.67, 2.64, 2.86, 3.00, 3.21, 4.14, 4.07, 3.68, 3.11, 3.41, 3.25, 3.32, 3.07, 3.92, 3.05, 2.18, 3.24}),
+                        new AASeriesElement()
+                                .name("2020")
+                                .fillColor(gradientGreenColorDic)
+                                .lineWidth(6)
+                                .step((true))
+                                .dataLabels(new AADataLabels()
+                                        .style(AAStyle.style("#04d69f", 11)))
+                                .data(new Object[]{5.59, 3.09, 4.09, 6.14, 5.33, 6.05, 5.71, 6.22, 6.56, 4.75, 5.27, 6.02, 5.22, 5.77, 6.19, 5.68, 4.33, 5.48}),
+                });
+    }
+
+    // Refer to https://api.highcharts.com.cn/highcharts#plotOptions.spline.marker.states.hover.enabled
+    public static AAChartModel disableSplineChartMarkerHoverEffect() {
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .title("Disable Spline Chart Marker Hover Effect")
+                .categories(new String[]{
+                        "涓�鏈�", "浜屾湀", "涓夋湀", "鍥涙湀", "浜旀湀", "鍏湀",
+                        "涓冩湀", "鍏湀", "涔濇湀", "鍗佹湀", "鍗佷竴鏈�", "鍗佷簩鏈�"})
+                .markerRadius(0)//marker鐐瑰崐寰勪负0涓儚绱�
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo Hot")
+                                .lineWidth(5.0)
+                                .color("rgba(220,20,60,1)")//鐚╃孩鑹�, alpha 閫忔槑搴� 1
+                                .marker(new AAMarker()
+                                        .states(new AAMarkerStates()
+                                                .hover(new AAMarkerHover()
+                                                        .enabled(false))))
+                                .data(new Object[]{7.0, 6.9, 2.5, 14.5, 18.2, 21.5, 5.2, 26.5, 23.3, 45.3, 13.9, 9.6}),
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1203
+    public static AAChartModel configureMaxAndMinDataLabelsForChart() {
+        AADataLabels aaDataLabels = new AADataLabels()
+                .enabled(true)
+                .format("{y} 缇庡厓")
+                .shape("callout")
+                .style(AAStyle.style(AAColor.Red, 15f, AAChartFontWeightType.Bold))
+                .backgroundColor(AAColor.White)// white color
+                .borderColor(AAColor.Red)// red color
+                .borderRadius(1.5)
+                .borderWidth(1.3);
+
+        AADataElement minData = new AADataElement()
+                .dataLabels(aaDataLabels)
+                .y(2.5);
+
+        AADataElement maxData = new AADataElement()
+                .dataLabels(aaDataLabels)
+                .y(49.5);
+
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .dataLabelsEnabled(false)//鏄惁鏄剧ず鍊�
+                .tooltipEnabled(false)
+                .markerRadius(0)
+                .xAxisVisible(false)
+                .yAxisVisible(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Show The Max and Min values Data Labels")
+                                .lineWidth(7)
+                                .data(new Object[]{7.0, 6.9, minData, 14.5, 18.2, maxData, 5.2, 26.5, 23.3, 26.5, 13.9, 9.6})
+                                .color(AAGradientColor.OceanBlue)
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1201
+    public static AAChartModel customVerticalXAxisCategoriesLabelsByHTMLBreakLineTag() {
+        return new AAChartModel()
+                .chartType(AAChartType.Area)
+                .categories(new String[]{
+                        "瀛�<br>宀�<br>鍗�<br>鏈�",
+                        "浣�<br>鍛�<br>鍙�<br>鍞�",
+                        "鑽�<br>瑾�<br>鍕�<br>绔�",
+                        "鐙�<br>鍑�<br>绮�<br>鑻�",
+                        "绁�<br>绉�<br>娴�<br>鍩�",
+                        "鏈�<br>鍚�<br>鐢�<br>杩�<br>鑰�",
+                        "宸�<br>甯�<br>3<br>鐙�<br>鐚�",
+                        "瀵�<br>椹�<br>涔�<br>榄�",
+                        "铦�<br>铦�<br>渚�<br>闃�<br>鐢�<br>楠�<br>澹�<br>",
+                        "鍦�<br>鐙�<br>杈�<br>澧�",
+                        "闂�<br>瀹�",
+                        "蹇�<br>鑰�<br>涔�<br>鍗�"
+                })
+                .tooltipEnabled(false)
+                .borderRadius(3)
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2017")
+                                .data(new Object[]{7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6}),
+                        new AASeriesElement()
+                                .name("2018")
+                                .data(new Object[]{0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5}),
+                        new AASeriesElement()
+                                .name("2019")
+                                .data(new Object[]{0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0}),
+                        new AASeriesElement()
+                                .name("2020")
+                                .data(new Object[]{3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8}),
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1269
+    public static AAChartModel noMoreGroupingAndOverlapEachOtherColumnChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .categories(new String[]{"11/23", "11/24", "11/25", "11/26", "11/27", "11/28", "11/29"})
+//            .yAxisTickPositions([0, 10, 20, 30, 40, 50])
+                .yAxisMax(50)
+                .yAxisMin(0)
+                .borderRadius(5)
+                .series(new AAColumn[]{
+                        new AAColumn()
+                                .name("鎬诲仛棰�")
+                                .color("#D8D8D8")
+                                .data(new Object[]{30, 20, 28, 40, 42, 48, 50})
+                                .grouping(false)
+                        ,
+                        new AAColumn()
+                                .name("姝g‘鍋氶")
+                                .color("#00D9CD")
+                                .data(new Object[]{28, 18, 26, 40, 40, 46, 39})
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1271
+    public static AAChartModel noMoreGroupingAndNestedColumnChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .categories(new String[]{"11/23", "11/24", "11/25", "11/26", "11/27", "11/28", "11/29"})
+//            .yAxisTickPositions([0, 10, 20, 30, 40, 50])
+                .yAxisMax(50)
+                .yAxisMin(0)
+                .borderRadius(5)
+                .series(new Object[]{
+                        new AAColumn()
+                                .name("鎬荤洰鏍�")
+                                .color("DeepSkyBlue")
+                                .data(new Object[]{30, 20, 28, 40, 42, 48, 50})
+                                .grouping(false)
+                                .pointPadding(0.05f)
+                        ,
+                        new AAColumn()
+                                .name("瀹屾垚搴�")
+                                .color("#FF3030") //Firebrick1 color
+                                .data(new Object[]{28, 18, 26, 40, 40, 46, 39})
+                                .grouping(false)
+                                .pointPadding(0.2f)
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/842
+    public static AAChartModel topRoundedCornersStackingColumnChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .stacking(AAChartStackingType.Normal)
+                .title("Top Rounded Corners Stacking Column Chart")
+                .colorsTheme(new String[]{"#fe117c", "#ffc069", "#06caf4",})
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo Hot")
+                                .borderRadiusTopLeft("50%")
+                                .borderRadiusTopRight("50%")
+                                .data(new Object[]{2.10, 2.54, 2.78, 3.62, 4.41, 4.09, 3.83, 4.47, 4.20, 3.94, 3.80, 3.58, 3.19, 4.30, 3.69, 3.52, 3.02, 3.30}),
+
+                        new AASeriesElement()
+                                .name("Berlin Hot")
+                                .data(new Object[]{1.56, 1.91, 2.45, 3.87, 3.24, 4.90, 4.61, 4.10, 4.17, 3.85, 4.17, 3.46, 3.46, 3.55, 3.50, 4.13, 2.58, 2.28}),
+
+                        new AASeriesElement()
+                                .name("Beijing Hot")
+                                .data(new Object[]{1.16, 1.67, 2.64, 2.86, 3.00, 3.21, 4.14, 4.07, 3.68, 3.11, 3.41, 3.25, 3.32, 3.07, 3.92, 3.05, 2.18, 3.24}),
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit-Swift/issues/323
+    //https://github.com/AAChartModel/AAChartKit-Swift/issues/346
+    //https://github.com/highcharts/rounded-corners
+    public static AAChartModel freeStyleRoundedCornersStackingColumnChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .stacking(AAChartStackingType.Percent)
+                .title("Free-Style Rounded Corners Stacking Column Chart")
+                .xAxisVisible(false)
+                .yAxisGridLineWidth(0)
+                .colorsTheme(new Object[]{
+                        AAGradientColor.linearGradient(AAColor.rgbColor(128, 255, 165), AAColor.rgbColor(1, 191, 236)),
+                        AAGradientColor.linearGradient(AAColor.rgbColor(0, 221, 255), AAColor.rgbColor(77, 119, 255)),
+                        AAGradientColor.linearGradient(AAColor.rgbColor(55, 162, 255), AAColor.rgbColor(116, 21, 219)),
+                        AAGradientColor.linearGradient(AAColor.rgbColor(255, 0, 135), AAColor.rgbColor(135, 0, 157)),
+                        AAGradientColor.linearGradient(AAColor.rgbColor(255, 191, 0), AAColor.rgbColor(224, 62, 76)),
+                        AAGradientColor.PixieDust,
+                        AAGradientColor.SweetDream,
+                        AAGradientColor.LusciousLime,
+                        AAGradientColor.WroughtIron,
+                })
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .borderRadiusTopLeft("50%")
+                                .borderRadiusTopRight("50%")
+                                .data(new Object[]{2.10, 2.54, 2.78, 3.62, 4.41, 4.09, 3.83, 4.47, 4.20, 3.94, 3.80, 3.58, 3.19, 4.30, 3.69, 3.52, 3.02, 3.30}),
+
+                        new AASeriesElement()
+                                .borderRadiusBottomLeft("50%")
+                                .borderRadiusBottomRight("50%")
+                                .data(new Object[]{1.56, 1.91, 2.45, 3.87, 3.24, 4.90, 4.61, 4.10, 4.17, 3.85, 4.17, 3.46, 3.46, 3.55, 3.50, 4.13, 2.58, 2.28}),
+
+                        new AASeriesElement()
+                                .borderRadiusTopLeft("50%")
+                                .borderRadiusBottomRight("50%")
+                                .data(new Object[]{1.16, 1.67, 2.64, 2.86, 3.00, 3.21, 4.14, 4.07, 3.68, 3.11, 3.41, 3.25, 3.32, 3.07, 3.92, 3.05, 2.18, 3.24}),
+
+                        new AASeriesElement()
+                                .borderRadiusTopRight("50%")
+                                .borderRadiusBottomRight("50%")
+                                .data(new Object[]{5.59, 3.09, 4.09, 6.14, 5.33, 6.05, 5.71, 6.22, 6.56, 4.75, 5.27, 6.02, 5.22, 5.77, 6.19, 5.68, 4.33, 5.48}),
+
+                        new AASeriesElement()
+                                .borderRadius(20)
+                                .data(new Object[]{2.10, 2.54, 2.78, 3.62, 4.41, 4.09, 3.83, 4.47, 4.20, 3.94, 3.80, 3.58, 3.19, 4.30, 3.69, 3.52, 3.02, 3.30}),
+
+                        new AASeriesElement()
+                                .borderRadiusTopLeft("50%")
+                                .borderRadiusBottomLeft("50%")
+                                .data(new Object[]{5.59, 3.09, 4.09, 6.14, 5.33, 6.05, 5.71, 6.22, 6.56, 4.75, 5.27, 6.02, 5.22, 5.77, 6.19, 5.68, 4.33, 5.48}),
+
+                        new AASeriesElement()
+                                .borderRadiusTopRight("50%")
+                                .borderRadiusBottomLeft("50%")
+                                .data(new Object[]{1.16, 1.67, 2.64, 2.86, 3.00, 3.21, 4.14, 4.07, 3.68, 3.11, 3.41, 3.25, 3.32, 3.07, 3.92, 3.05, 2.18, 3.24}),
+
+                        new AASeriesElement()
+                                .borderRadiusBottomLeft("50%")
+                                .borderRadiusBottomRight("50%")
+                                .data(new Object[]{2.10, 2.54, 2.78, 3.62, 4.41, 4.09, 3.83, 4.47, 4.20, 3.94, 3.80, 3.58, 3.19, 4.30, 3.69, 3.52, 3.02, 3.30}),
+
+                        new AASeriesElement()
+                                .borderRadiusTopLeft("50%")
+                                .borderRadiusTopRight("50%")
+                                .data(new Object[]{1.56, 1.91, 2.45, 3.87, 3.24, 4.90, 4.61, 4.10, 4.17, 3.85, 4.17, 3.46, 3.46, 3.55, 3.50, 4.13, 2.58, 2.28}),
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit-Swift/issues/365
+    public static AAChartModel customColumnChartBorderStyleAndStatesHoverColor() {
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .stacking(AAChartStackingType.Normal)
+                .colorsTheme(new Object[]{AAColor.DarkGray, AAColor.LightGray})//Colors theme
+                .categories(new String[]{
+                        "January", "February", "March", "April", "May", "June",
+                        "July", "August", "September", "October", "November", "December"
+                })
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Berlin Hot")
+                                .borderColor(AAColor.White)
+                                .borderWidth(3)
+                                .borderRadius(10)
+                                .states(new AAStates()
+                                        .hover(new AAHover()
+                                                .color(AAColor.Red)))
+                                .data(new Object[]{7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6}),
+
+                        new AASeriesElement()
+                                .name("Beijing Hot")
+                                .borderColor(AAColor.White)
+                                .borderWidth(3)
+                                .borderRadius(10)
+                                .states(new AAStates()
+                                        .hover(new AAHover()
+                                                .color("dodgerblue")))// Dodgerblue锛忛亾濂囪棈锛�#1e90ff鍗佸叚杩涘埗棰滆壊浠g爜
+                                .data(new Object[]{0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5}),
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1291
+    public static AAChartModel customLineChartWithColorfulMarkersAndLines() {
+        return new AAChartModel()
+                .chartType(AAChartType.Line)
+                .title("Custom Line Chart With Colorful Markers And Lines")
+                .markerRadius(18.0)//marker鐐瑰崐寰勪负8涓儚绱�
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Tokyo Hot")
+                                .lineWidth(5.0)
+                                .marker(new AAMarker()
+                                        .states(new AAMarkerStates()
+                                                .hover(new AAMarkerHover()
+                                                        .radius(40)
+                                                        .lineWidth(5))))
+                                .data(new Object[]{
+                                        2, 4, 8, 16, 32, 64, 128,
+                                        new AADataElement()
+                                                .y(256.0)
+                                                .color(AAColor.Red)
+                                })
+                                .zoneAxis("x")
+                                .zones(new AAZonesElement[]{
+                                new AAZonesElement()
+                                        .value(1)
+                                        .color(AAColor.Red),
+                                new AAZonesElement()
+                                        .value(2)
+                                        .color(AAColor.Orange),
+                                new AAZonesElement()
+                                        .value(3)
+                                        .color(AAColor.Yellow),
+                                new AAZonesElement()
+                                        .value(4)
+                                        .color(AAColor.Green),
+                                new AAZonesElement()
+                                        .value(5)
+                                        .color(AAColor.Cyan),
+                                new AAZonesElement()
+                                        .value(6)
+                                        .color(AAColor.Blue),
+                                new AAZonesElement()
+                                        .value(7)
+                                        .color(AAColor.Purple),
+                        })
+                        ,
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1291
+    //https://github.com/AAChartModel/AAChartKit/issues/1293
+    public static AAChartModel customLineChartWithColorfulMarkersAndLines2() {
+        return new AAChartModel()
+                .chartType(AAChartType.Line)
+                .title("Custom Line Chart With Colorful Markers And Lines")
+                .markerRadius(25.0)//marker鐐瑰崐寰勪负8涓儚绱�
+                .markerSymbol(AAChartSymbolType.Circle)
+                .yAxisLineWidth(0)
+                .yAxisGridLineWidth(0)
+                .legendEnabled(true)
+                .stacking(AAChartStackingType.Normal)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name(AAColor.Blue)
+                                .lineWidth(20.0)
+                                .data(new Object[]{
+                                        2048, 1024, 1024, 1024, 1024,
+                                        new AADataElement()
+                                                .y(2048)
+                                                .color(AARgba(30, 144, 255, 1.0f)),
+                                })
+                                .zoneAxis("x")
+                                .zones(new AAZonesElement[]{
+                                new AAZonesElement()
+                                        .value(1)
+                                        .color(AARgba(30, 144, 255, 1.0f)),
+                                new AAZonesElement()
+                                        .value(2)
+                                        .color(AARgba(30, 144, 255, 0.8f)),
+                                new AAZonesElement()
+                                        .value(3)
+                                        .color(AARgba(30, 144, 255, 0.6f)),
+                                new AAZonesElement()
+                                        .value(4)
+                                        .color(AARgba(30, 144, 255, 0.4f)),
+                                new AAZonesElement()
+                                        .value(5)
+                                        .color(AARgba(30, 144, 255, 0.2f)),
+                        })
+                        ,
+                        new AASeriesElement()
+                                .name(AAColor.Red)
+                                .lineWidth(20.0)
+                                .data(new Object[]{
+                                        2048, 1024, 1024, 1024, 1024,
+                                        new AADataElement()
+                                                .y(2048)
+                                                .color(AARgba(255, 0, 0, 1.0f)),
+                                })
+                                .zoneAxis("x")
+                                .zones(new AAZonesElement[]{
+                                new AAZonesElement()
+                                        .value(1)
+                                        .color(AARgba(255, 0, 0, 1.0f)),
+                                new AAZonesElement()
+                                        .value(2)
+                                        .color(AARgba(255, 0, 0, 0.8f)),
+                                new AAZonesElement()
+                                        .value(3)
+                                        .color(AARgba(255, 0, 0, 0.6f)),
+                                new AAZonesElement()
+                                        .value(4)
+                                        .color(AARgba(255, 0, 0, 0.4f)),
+                                new AAZonesElement()
+                                        .value(5)
+                                        .color(AARgba(255, 0, 0, 0.2f)),
+                        })
+                        ,
+                        new AASeriesElement()
+                                .name(AAColor.Yellow)
+                                .lineWidth(20.0)
+                                .data(new Object[]{
+                                        2048, 1024, 1024, 1024, 1024,
+                                        new AADataElement()
+                                                .y(2048)
+                                                .color(AARgba(255, 215, 0, 1.0f)),
+                                })
+                                .zoneAxis("x")
+                                .zones(new AAZonesElement[]{
+                                new AAZonesElement()
+                                        .value(1)
+                                        .color(AARgba(255, 215, 0, 1.0f)),
+                                new AAZonesElement()
+                                        .value(2)
+                                        .color(AARgba(255, 215, 0, 0.8f)),
+                                new AAZonesElement()
+                                        .value(3)
+                                        .color(AARgba(255, 215, 0, 0.6f)),
+                                new AAZonesElement()
+                                        .value(4)
+                                        .color(AARgba(255, 215, 0, 0.4f)),
+                                new AAZonesElement()
+                                        .value(5)
+                                        .color(AARgba(255, 215, 0, 0.2f)),
+                        })
+                        ,
+                        new AASeriesElement()
+                                .name(AAColor.Green)
+                                .lineWidth(20.0)
+                                .data(new Object[]{
+                                        2048, 1024, 1024, 1024, 1024,
+                                        new AADataElement()
+                                                .y(2048)
+                                                .color(AARgba(50, 205, 50, 1.0f)),
+                                })
+                                .zoneAxis("x")
+                                .zones(new AAZonesElement[]{
+                                new AAZonesElement()
+                                        .value(1)
+                                        .color(AARgba(50, 205, 50, 1.0f)),
+                                new AAZonesElement()
+                                        .value(2)
+                                        .color(AARgba(50, 205, 50, 0.8f)),
+                                new AAZonesElement()
+                                        .value(3)
+                                        .color(AARgba(50, 205, 50, 0.6f)),
+                                new AAZonesElement()
+                                        .value(4)
+                                        .color(AARgba(50, 205, 50, 0.4f)),
+                                new AAZonesElement()
+                                        .value(5)
+                                        .color(AARgba(50, 205, 50, 0.2f)),
+                        })
+                        ,
+                        new AASeriesElement()
+                                .name(AAColor.Purple)
+                                .lineWidth(20.0)
+                                .data(new Object[]{
+                                        2048, 1024, 1024, 1024, 1024,
+                                        new AADataElement()
+                                                .y(2048)
+                                                .color(AARgba(138, 43, 226, 1.0f)),
+                                })
+                                .zoneAxis("x")
+                                .zones(new AAZonesElement[]{
+                                new AAZonesElement()
+                                        .value(1)
+                                        .color(AARgba(138, 43, 226, 1.0f)),
+                                new AAZonesElement()
+                                        .value(2)
+                                        .color(AARgba(138, 43, 226, 0.8f)),
+                                new AAZonesElement()
+                                        .value(3)
+                                        .color(AARgba(138, 43, 226, 0.6f)),
+                                new AAZonesElement()
+                                        .value(4)
+                                        .color(AARgba(138, 43, 226, 0.4f)),
+                                new AAZonesElement()
+                                        .value(5)
+                                        .color(AARgba(138, 43, 226, 0.2f)),
+                        })
+                        ,
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1294
+    public static AAChartModel drawLineChartWithPointsCoordinates() {
+        Object[][] dataArr = new Object[][]{
+                {0, 200},
+                {0, 300},
+                {0, 400},
+                {1, 100},
+                {2, 120},
+                {3, 130}
+        };
+
+        return new AAChartModel()
+                .chartType(AAChartType.Scatter)
+                .title("Draw Line Chart With Points Coordinates")
+                .markerSymbol(AAChartSymbolType.Circle)
+                .markerSymbolStyle(AAChartSymbolStyleType.BorderBlank)
+                .markerRadius(8)
+                .colorsTheme(new String[]{AAColor.Red})
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .type(AAChartType.Line)
+                                .enableMouseTracking(false)
+                                .showInLegend(false)
+                                .marker(new AAMarker()
+                                        .enabled(false))
+                                .states(new AAStates()
+                                        .inactive(new AAInactive()
+                                                .enabled(false)))
+                                .data(dataArr),
+                        new AASeriesElement()
+                                .name("Red Dot")
+                                .type(AAChartType.Scatter)
+                                .data(dataArr),
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1351
+    public static AAChartModel configureSpecialStyleColumnForNegativeDataMixedPositiveData() {
+        String[] categoriesArr = new String[]{
+                "绔嬫槬", "闆ㄦ按", "鎯婅洶", "鏄ュ垎", "娓呮槑", "璋烽洦", "绔嬪", "灏忔弧", "鑺掔", "澶忚嚦", "灏忔殤", "澶ф殤",
+                "绔嬬", "澶勬殤", "鐧介湶", "绉嬪垎", "瀵掗湶", "闇滈檷", "绔嬪啲", "灏忛洩", "澶ч洩", "鍐嚦", "灏忓瘨", "澶у瘨"
+        };
+
+        Integer[] dataArr = new Integer[]{
+                -70, -69, -25, -145, -182, -215, -52, -265, -233, -453, -139, -96,
+                +70, +69, +25, +145, +182, +215, +52, +265, +233, +453, +139, +96,
+        };
+        ArrayList<AADataElement> newDataArr = new ArrayList<>();
+
+        for (Integer dataElementValue : dataArr) {
+            AADataLabels aaDataLabels = new AADataLabels()
+                    .enabled(true)
+                    .verticalAlign(AAChartVerticalAlignType.Middle)
+                    .x(0)
+                    .y(-10);
+
+            if (dataElementValue < 0) {
+                AADataElement negativeDataElement = new AADataElement()
+                        .y((-dataElementValue))
+                        .color(AAColor.Green)
+                        .dataLabels(aaDataLabels
+                                .format("-{y} 缇庡厓")
+                                .style(AAStyle.style(AAColor.Green, 11, AAChartFontWeightType.Thin)));
+                newDataArr.add(negativeDataElement);
+            } else {
+                AADataElement positiveDataElement = new AADataElement()
+                        .y((dataElementValue))
+                        .color(AAColor.Red)
+                        .dataLabels(aaDataLabels
+                                .format("+{y} 缇庡厓")
+                                .style(AAStyle.style(AAColor.Red, 11, AAChartFontWeightType.Thin)));
+                newDataArr.add(positiveDataElement);
+            }
+        }
+
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .categories(categoriesArr)
+                .tooltipEnabled(false)
+                .yAxisVisible(false)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("铏氭瀯鏁版嵁")
+                                .data(newDataArr.toArray())
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit-Swift/issues/389
+    public static AAChartModel configureMultiLevelStopsArrGradientColorAreasplineMixedLineChart() {
+        ArrayList<Object> randomNumArrA = new ArrayList<>();
+        ArrayList<Object> randomNumArrB = new ArrayList<>();
+        double y1;
+        double y2;
+        int Q = (int) (Math.random() * 50);
+        int range = 129;
+        for (int x = 0; x < range; x++) {
+            y1 = Math.sin(Q * (x * Math.PI / 180)) + x * 2.0 * 0.01;
+            y2 = Math.cos(Q * (x * Math.PI / 180)) + x * 3.0 * 0.01;
+            randomNumArrA.add(y1);
+            randomNumArrB.add(y2);
+        }
+
+        Object[][] redStopsArr = new Object[][]{
+                {0.0, AARgba(255, 0, 0, 1.0f)},//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+                {0.2, AARgba(255, 0, 0, 0.2f)},
+                {0.4, AARgba(255, 0, 0, 0.1f)},
+                {0.6, AARgba(255, 0, 0, 0.05f)},
+                {0.8, AARgba(255, 0, 0, 0.01f)},
+                {1.0, AAColor.Clear}
+        };
+
+        Map<String, Object> gradientRedColorDic = AAGradientColor.linearGradient(
+                AALinearGradientDirection.ToBottom,
+                redStopsArr
+        );
+
+        return new AAChartModel()
+                .chartType(AAChartType.Areaspline)
+                .stacking(AAChartStackingType.Normal)
+                .backgroundColor(AAColor.Black)
+                .colorsTheme(new String[]{"#1e90ff", "#04d69f", "#ef476f", "#ffd066",})
+                .dataLabelsEnabled(false)
+                .markerSymbol(AAChartSymbolType.Circle)
+                .markerRadius(5)
+                .markerSymbolStyle(AAChartSymbolStyleType.InnerBlank)
+                .yAxisGridLineWidth(0.5f)
+                .xAxisGridLineWidth(0.5f)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2017")
+                                .type(AAChartType.Spline)
+                                .lineWidth(6f)
+                                .data(randomNumArrA.toArray()),
+                        new AASeriesElement()
+                                .name("2018")
+                                .type(AAChartType.Spline)
+                                .lineWidth(6f)
+                                .data(randomNumArrB.toArray()),
+                        new AASeriesElement()
+                                .name("2020")
+                                .fillColor(gradientRedColorDic)
+                                .lineWidth(6f)
+                                .threshold(-4f)
+                                .data(randomNumArrA.toArray()),
+                });
+    }
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1401
+    public static AAChartModel connectNullsForSingleAASeriesElement() {
+        Object[] dataArr = new Object[]{
+                0.45, null, null,
+                0.55, 0.58, 0.62, null, null,
+                0.56, 0.67, 0.50, 0.34, 0.50, null, null, null, null,
+                0.23, 0.47, 0.46, 0.38, 0.56, 0.48, 0.36, null, null, null, null, null, null, null, null,
+                0.74, 0.66, 0.65, 0.71, 0.59, 0.65, 0.77, 0.52, 0.53, 0.58, 0.53,
+        };
+
+        return new AAChartModel()
+                .chartType(AAChartType.Spline)
+                .subtitle("铏氭嫙鏁版嵁")
+                .colorsTheme(new String[]{"#1e90ff", "#ef476f", "#ffd066", "#04d69f"})
+                .yAxisTitle("鎽勬皬搴�")
+                .dataLabelsEnabled(false)
+                .yAxisGridLineWidth(0f)
+                .stacking(AAChartStackingType.Normal)
+                .markerRadius(8f)
+                .markerSymbolStyle(AAChartSymbolStyleType.BorderBlank)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("Do NOT Connect Nulls")
+                                .lineWidth(5f)
+                                .connectNulls(false)
+                                .data(dataArr),
+                        new AASeriesElement()
+                                .name("Connect Nulls")
+                                .lineWidth(5f)
+                                .connectNulls(true)
+                                .data(dataArr),
+                        new AASeriesElement()
+                                .name("Do NOT Connect Nulls")
+                                .lineWidth(5f)
+                                .connectNulls(false)
+                                .data(dataArr),
+                        new AASeriesElement()
+                                .name("Connect Nulls")
+                                .lineWidth(5f)
+                                .connectNulls(true)
+                                .data(dataArr)
+                });
+    }
+
+
+//- (NSArray *)generateRandomNumberArrayWithLength:(NSUInteger)length
+//    randomRange:(NSUInteger)randomRange
+//    minNum:(NSUInteger)minNum {
+//        NSMutableArray *randomNumArrA = [NSMutableArray array];
+//        for (NSUInteger x = 0; x < length; x++) {
+//            NSUInteger randomNum = arc4random() % randomRange + minNum;
+//        [randomNumArrA addObject:@(randomNum)];
+//        }
+//        return randomNumArrA;
+//    }
+
+    public static ArrayList<Object> generateRandomNumberArrayWithLength(int length, int randomRange, int minNum) {
+        ArrayList<Object> randomNumArrA = new ArrayList<>();
+        for (int x = 0; x < length; x++) {
+            int randomNum = (int) (Math.random() * randomRange + minNum);
+            randomNumArrA.add(randomNum);
+        }
+        return randomNumArrA;
+    }
+
+
+//    - (NSArray *)generateRandomNumberMixedNullArrayWithLength:(NSUInteger)length
+//    randomRange:(NSUInteger)randomRange
+//    minNum:(NSUInteger)minNum {
+//        NSMutableArray *randomNumArrA = [NSMutableArray array];
+//        for (NSUInteger x = 0; x < length; x++) {
+//            if ((100 < x && x < 150) || (300 < x && x < 350)) {
+//                NSUInteger randomNum = arc4random() % randomRange + minNum;
+//            [randomNumArrA addObject:@(randomNum)];
+//            } else {
+//            [randomNumArrA addObject:NSNull.null];
+//            }
+//        }
+//        return randomNumArrA;
+//    }
+
+    public static ArrayList<Object> generateRandomNumberMixedNullArrayWithLength(int length, int randomRange, int minNum) {
+        ArrayList<Object> randomNumArrA = new ArrayList<>();
+        for (int x = 0; x < length; x++) {
+            if ((100 < x && x < 150) || (300 < x && x < 350)) {
+                int randomNum = (int) (Math.random() * randomRange + minNum);
+                randomNumArrA.add(randomNum);
+            } else {
+                randomNumArrA.add(null);
+            }
+        }
+        return randomNumArrA;
+    }
+
+
+////https://github.com/AAChartModel/AAChartKit/issues/1419
+//- (AAChartModel *)lineChartsWithLargeDifferencesInTheNumberOfDataInDifferentSeriesElement {
+//    return AAChartModel.new
+//        .chartTypeSet(AAChartTypeLine)
+//        .backgroundColorSet(AAColor.blackColor)
+//        .colorsThemeSet(@[@"#1e90ff",@"#04d69f",@"#ef476f",@"#ffd066",])
+//        .dataLabelsEnabledSet(false)
+//        .markerRadiusSet(@0)
+//        .seriesSet(@[
+//            AASeriesElement.new
+//                .nameSet(@"2017")
+//                .lineWidthSet(@6)
+//                .dataSet([self generateRandomNumberMixedNullArrayWithLength:3550 randomRange:5 minNum:100]),
+//            AASeriesElement.new
+//                .nameSet(@"2018")
+//                .lineWidthSet(@6)
+//                .dataSet([self generateRandomNumberArrayWithLength:3550 randomRange:100 minNum:200]),
+//            AASeriesElement.new
+//                .nameSet(@"2019")
+//                .lineWidthSet(@6)
+//                .dataSet([self generateRandomNumberArrayWithLength:3550 randomRange:150 minNum:400]),
+//            AASeriesElement.new
+//                .nameSet(@"2020")
+//                .lineWidthSet(@6)
+//                .dataSet([self generateRandomNumberArrayWithLength:3550 randomRange:150 minNum:600]),
+//        ]);
+//}
+
+    //https://github.com/AAChartModel/AAChartKit/issues/1419
+    public static AAChartModel lineChartsWithLargeDifferencesInTheNumberOfDataInDifferentSeriesElement() {
+        return new AAChartModel()
+                .chartType(AAChartType.Line)
+                .backgroundColor("#000000")
+                .colorsTheme(new String[]{"#1e90ff", "#04d69f", "#ef476f", "#ffd066"})
+                .dataLabelsEnabled(false)
+                .markerRadius(0f)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2017")
+                                .lineWidth(6f)
+                                .data(generateRandomNumberMixedNullArrayWithLength(3550, 5, 100).toArray()),
+                        new AASeriesElement()
+                                .name("2018")
+                                .lineWidth(6f)
+                                .data(generateRandomNumberArrayWithLength(3550, 100, 200).toArray()),
+                        new AASeriesElement()
+                                .name("2019")
+                                .lineWidth(6f)
+                                .data(generateRandomNumberArrayWithLength(3550, 150, 400).toArray()),
+                        new AASeriesElement()
+                                .name("2020")
+                                .lineWidth(6f)
+                                .data(generateRandomNumberArrayWithLength(3550, 150, 600).toArray()),
+                });
+    }
+
+    public static AAChartModel largeDataStackingColumnChart() {
+        return new AAChartModel()
+                .chartType(AAChartType.Column)
+                .backgroundColor("#000000")
+                .colorsTheme(new String[]{"#1e90ff", "#04d69f", "#ef476f", "#ffd066"})
+                .dataLabelsEnabled(false)
+                .stacking(AAChartStackingType.Normal)
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("2018")
+                                .lineWidth(6f)
+                                .data(generateRandomNumberArrayWithLength(3550, 100, 200).toArray()),
+                        new AASeriesElement()
+                                .name("2019")
+                                .lineWidth(6f)
+                                .data(generateRandomNumberArrayWithLength(3550, 150, 400).toArray()),
+                        new AASeriesElement()
+                                .name("2020")
+                                .lineWidth(6f)
+                                .data(generateRandomNumberArrayWithLength(3550, 150, 600).toArray()),
+                });
+    }
+
+    ////https://github.com/AAChartModel/AAChartCore-Kotlin/issues/149
+    //- (AAChartModel *)customAreasplineChartWithColorfulGradientColorZones {
+    //    NSArray *redStopsArr = @[
+    //        @[@0.0, AARgbaColor(255, 0, 0, 1.0)],//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+    //        @[@1.0, AAColor.clearColor]
+    //    ];
+    //
+    //    NSArray *greenStopsArr = @[
+    //        @[@0.0, AARgbaColor(0, 255, 0, 1.0)],//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+    //        @[@1.0, AAColor.clearColor]
+    //    ];
+    //
+    //    NSArray *blueStopsArr = @[
+    //        @[@0.0, AARgbaColor(0, 0, 255, 1.0)],//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+    //        @[@1.0, AAColor.clearColor]
+    //    ];
+    //
+    //    NSDictionary *redGradientColorDic = [AAGradientColor gradientColorWithDirection:AALinearGradientDirectionToBottom stopsArray:redStopsArr];
+    //    NSDictionary *greenGradientColorDic = [AAGradientColor gradientColorWithDirection:AALinearGradientDirectionToBottom stopsArray:greenStopsArr];
+    //    NSDictionary *blueGradientColorDic = [AAGradientColor gradientColorWithDirection:AALinearGradientDirectionToBottom stopsArray:blueStopsArr];
+    //
+    //    AADataElement *singleSpecialData = AADataElement.new
+    //        .markerSet(AAMarker.new
+    //                   .radiusSet(@8)//鏇茬嚎杩炴帴鐐瑰崐寰�
+    //                   .symbolSet(AAChartSymbolTypeCircle)//鏇茬嚎鐐圭被鍨嬶細"circle", "square", "diamond", "triangle","triangle-down"锛岄粯璁ゆ槸"circle"
+    //                   .fillColorSet(AAColor.whiteColor)//鐐圭殑濉厖鑹�(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑濉厖鑹�)
+    //                   .lineWidthSet(@5)//澶栨部绾跨殑瀹藉害(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟鐨勫搴�)
+    //                   //澶栨部绾跨殑棰滆壊(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟棰滆壊锛屽綋鍊间负绌哄瓧绗︿覆鏃讹紝榛樿鍙栨暟鎹偣鎴栨暟鎹垪鐨勯鑹�)
+    //                   .lineColorSet(@"#1E90FF")//閬撳钃�
+    //                   )
+    //        .dataLabelsSet(AADataLabels.new
+    //                       .enabledSet(true)
+    //                       .allowOverlapSet(true)
+    //                       .useHTMLSet(true)
+    //                       .backgroundColorSet(AARgbaColor(65, 111, 166, 1.0))
+    //                       .borderRadiusSet(@10)
+    //                       .shapeSet(@"callout")
+    //                       .formatSet(@"{point.category}<br>{series.name}: {point.y} %")
+    //                       .styleSet(AAStyleColorSizeWeight(AAColor.whiteColor, 12, AAChartFontWeightTypeBold))
+    //                       .xSet(@-80).ySet(@(5))
+    //                       .alignSet(AAChartAlignTypeCenter)
+    //                       .verticalAlignSet(AAChartVerticalAlignTypeTop)
+    //                       .overflowSet(@"none")
+    //                       .cropSet(false)
+    //                       )
+    //        .ySet(@85.3);
+    //
+    //    AAStyle *axisLabelsStyle = AAStyleColorSizeWeight(AAColor.whiteColor, 12, AAChartFontWeightTypeBold);
+    //
+    //    return AAChartModel.new
+    //        .chartTypeSet(AAChartTypeAreaspline)
+    //        .backgroundColorSet(AAColor.blackColor)
+    //        .categoriesSet(@[
+    //            @"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun",
+    //            @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"
+    //        ])
+    //        .dataLabelsEnabledSet(false)
+    //        .legendEnabledSet(false)
+    //        .markerRadiusSet(@0)
+    //        .xAxisLabelsStyleSet(axisLabelsStyle)
+    //        .yAxisLabelsStyleSet(axisLabelsStyle)
+    //        .xAxisGridLineStyleSet([AALineStyle styleWithColor:AAColor.whiteColor dashStyle:AAChartLineDashStyleTypeLongDashDotDot width:@0.5])
+    //        .yAxisGridLineStyleSet([AALineStyle styleWithWidth:@0])
+    //        .seriesSet(@[
+    //            AASeriesElement.new
+    //                .nameSet(@"绌烘皵婀垮害")
+    //                .lineWidthSet(@6)
+    //                .zoneAxisSet(@"x")
+    //                .zonesSet(@[
+    //                    AAZonesElement.new
+    //                        .valueSet(@2)
+    //                        .colorSet(AAColor.redColor)
+    //                        .fillColorSet((id)redGradientColorDic ),
+    //                    AAZonesElement.new
+    //                        .valueSet(@5)
+    //                        .colorSet(AAColor.greenColor)
+    //                        .fillColorSet((id)greenGradientColorDic),
+    //                    AAZonesElement.new
+    //                        .colorSet(AAColor.blueColor)
+    //                        .fillColorSet((id)blueGradientColorDic),
+    //                ])
+    //                .dataSet(@[@56.5, @33.3, @85.3, @23.9, @29.6, @34.5, @28.2, @26.5, @15.2, @56.5, @33.3, singleSpecialData]),
+    //        ]);
+    //}
+
+    //https://github.com/AAChartModel/AAChartCore-Kotlin/issues/149
+    public static AAChartModel customAreasplineChartWithColorfulGradientColorZones() {
+        Object[][] redStopsArr = new Object[][]{
+                new Object[]{0.0f, AARgba(255, 0, 0, 1.0f)},//棰滆壊瀛楃涓茶缃敮鎸佸崄鍏繘鍒剁被鍨嬪拰 rgba 绫诲瀷
+                new Object[]{1.0f, AAColor.Clear}
+        };
+
+        Object[][] greenStopsArr = new Object[][]{
+                new Object[]{0.0f, AARgba(0, 255, 0, 1.0f)},
+                new Object[]{1.0f, AAColor.Clear}
+        };
+
+        Object[][] blueStopsArr = new Object[][]{
+                new Object[]{0.0f, AARgba(0, 0, 255, 1.0f)},
+                new Object[]{1.0f, AAColor.Clear}
+        };
+
+        Map<String, Object> redGradientColorDic = AAGradientColor.linearGradient(AALinearGradientDirection.ToBottom, redStopsArr);
+        Map<String, Object> greenGradientColorDic = AAGradientColor.linearGradient(AALinearGradientDirection.ToBottom, greenStopsArr);
+        Map<String, Object> blueGradientColorDic = AAGradientColor.linearGradient(AALinearGradientDirection.ToBottom, blueStopsArr);
+
+        AADataElement singleSpecialData = new AADataElement()
+                .marker(new AAMarker()
+                        .radius(8f)//鏇茬嚎杩炴帴鐐瑰崐寰�
+                        .symbol(AAChartSymbolType.Circle)//鏇茬嚎鐐圭被鍨嬶細"circle", "square", "diamond", "triangle","triangle-down"锛岄粯璁ゆ槸"circle"
+                        .fillColor(AAColor.White)//鐐圭殑濉厖鑹�(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑濉厖鑹�)
+                        .lineWidth(5f)//澶栨部绾跨殑瀹藉害(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟鐨勫搴�)
+                        //澶栨部绾跨殑棰滆壊(鐢ㄦ潵璁剧疆鎶樼嚎杩炴帴鐐圭殑杞粨鎻忚竟棰滆壊锛屽綋鍊间负绌哄瓧绗︿覆鏃讹紝榛樿鍙栨暟鎹偣鎴栨暟鎹垪鐨勯鑹�)
+                        .lineColor(AAColor.Red)
+                )
+                .dataLabels(new AADataLabels()
+                        .enabled(true)
+                        .allowOverlap(true)
+                        .useHTML(true)
+                        .backgroundColor(AARgba(65, 111, 166, 1.0f))
+                        .borderRadius(10f)
+                        .shape("callout")
+                        .format("{point.category}<br>{series.name}: {point.y} %")
+                        .style(new AAStyle()
+                                .color(AAColor.White)
+                                .fontSize(12f)
+                                .fontWeight(AAChartFontWeightType.Bold)
+                        )
+                        .x(-80f)
+                        .y(5f)
+                        .align(AAChartAlignType.Center)
+                        .verticalAlign(AAChartVerticalAlignType.Top)
+                        .overflow("none")
+                        .crop(false)
+                )
+                .y(85.3f);
+
+        AAStyle axisLabelsStyle = new AAStyle()
+                .color(AAColor.White)
+                .fontSize(12f)
+                .fontWeight(AAChartFontWeightType.Bold);
+
+        return new AAChartModel()
+                .chartType(AAChartType.Areaspline)
+                .backgroundColor(AAColor.Black)
+                .categories(new String[]{
+                        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+                })
+                .dataLabelsEnabled(false)
+                .legendEnabled(false)
+                .markerRadius(0f)
+//                .xAxisLabelsStyle(axisLabelsStyle)
+//                .yAxisLabelsStyle(axisLabelsStyle)
+//                .xAxisGridLineStyle(new AALineStyle()
+//                        .color(AAColor.White)
+//                        .dashStyle(AAChartLineDashStyleType.LongDashDotDot)
+//                        .width(0.5f)
+//                )
+//                .yAxisGridLineStyle(new AALineStyle()
+//                        .width(0f)
+//                )
+                .series(new AASeriesElement[]{
+                        new AASeriesElement()
+                                .name("绌烘皵婀垮害")
+                                .lineWidth(6f)
+                                .zoneAxis("x")
+                                .zones(new AAZonesElement[]{
+                                        new AAZonesElement()
+                                                .value(2)
+                                                .color(AAColor.Red)
+                                                .fillColor(redGradientColorDic),
+                                        new AAZonesElement()
+                                                .value(5)
+                                                .color(AAColor.Green)
+                                                .fillColor(greenGradientColorDic),
+                                        new AAZonesElement()
+                                                .color(AAColor.Blue)
+                                                .fillColor(blueGradientColorDic),
+                                })
+                                .data(new Object[]{
+                                56.5f, 33.3f, 85.3f, 23.9f, 29.6f, 34.5f, 28.2f, 26.5f, 15.2f, 56.5f, 33.3f, singleSpecialData
+                        }),
+                });
+
+
+    }
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/AccountAndSecurityActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/AccountAndSecurityActivity.java
index 158dc05..a1d53b2 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/AccountAndSecurityActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/AccountAndSecurityActivity.java
@@ -38,7 +38,7 @@
 
     private void initEvent() {
 
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
 
@@ -83,7 +83,7 @@
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.set_account_security);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
 
         if (UserConfigManage.getInstance().isBAccount()) {
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java
index 7981c61..3dbdeaf 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java
@@ -7,10 +7,6 @@
 import android.os.Bundle;
 import android.view.View;
 
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.MultiFormatWriter;
-import com.google.zxing.WriterException;
-import com.google.zxing.common.BitMatrix;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
 import com.hdl.linkpm.sdk.user.bean.NewVersionBean;
 import com.hdl.photovoltaic.R;
@@ -83,7 +79,7 @@
 
 
     private void initEvent() {
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 finish();
@@ -117,13 +113,22 @@
 
             }
         });
+        viewBinding.contactUsRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent();
+                intent.setClass(_mActivity, ContactUsActivity.class);
+                startActivity(intent);
+
+            }
+        });
 
     }
 
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.me_regard);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
         String versionsStr = _mActivity.getResources().getString(R.string.app_version_number) + " " + AppConfigManage.getVersionName();
         viewBinding.asRegardsIconVersionsTv.setText(versionsStr);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/BindMailActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/BindMailActivity.java
index 03df85b..0513ca6 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/BindMailActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/BindMailActivity.java
@@ -3,7 +3,6 @@
 
 import android.os.Bundle;
 import android.os.CountDownTimer;
-import android.os.Process;
 import android.text.TextUtils;
 import android.view.View;
 
@@ -16,10 +15,6 @@
 import com.hdl.photovoltaic.other.HdlAccountLogic;
 import com.hdl.photovoltaic.other.HdlLogLogic;
 import com.hdl.photovoltaic.other.HdlThreadLogic;
-import com.hdl.photovoltaic.utils.AppManagerUtils;
-import com.sahooz.library.countrypicker.Country;
-import com.sahooz.library.countrypicker.CountryPickerFragment;
-import com.sahooz.library.countrypicker.PickCountryCallback;
 
 /**
  * 淇敼缁戝畾閭鐨勭晫闈�
@@ -47,7 +42,7 @@
 
     private void initEvent() {
 
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 setResult(20);
@@ -97,7 +92,7 @@
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.set_change_bind_mail);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
     }
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/BindPhoneActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/BindPhoneActivity.java
index 4316e8c..ae6e205 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/BindPhoneActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/BindPhoneActivity.java
@@ -45,7 +45,7 @@
 
     private void initEvent() {
 
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 setResult(20);
@@ -101,7 +101,7 @@
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.set_change_bind_phone_number);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
         try {
             Country.load(this);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/ContactUsActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/ContactUsActivity.java
new file mode 100644
index 0000000..5cbbb8b
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/ContactUsActivity.java
@@ -0,0 +1,122 @@
+package com.hdl.photovoltaic.ui.me;
+
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.os.Bundle;
+import android.view.View;
+
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.CustomBaseActivity;
+import com.hdl.photovoltaic.databinding.ActivityContactUsBinding;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlResidenceLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.bean.ContactBean;
+
+/**
+ * 鑱旂郴鎴戜滑鐨勭晫闈�
+ */
+public class ContactUsActivity extends CustomBaseActivity {
+
+    ActivityContactUsBinding viewBinding;
+
+
+    @Override
+    public Object getContentView() {
+        viewBinding = ActivityContactUsBinding.inflate(getLayoutInflater());
+        return viewBinding.getRoot();
+    }
+
+    @Override
+    public void onBindView(Bundle savedInstanceState) {
+        setNotificationBarBackgroundColor(CustomColor.white);
+        setStatusBarTextColor();
+        //鍒濆鍖�
+        initView();
+        //鍒濆鍖栫晫闈㈢洃鍚櫒
+        initEvent();
+        //璇诲彇鏁版嵁
+        readData();
+    }
+
+    private void readData() {
+        showLoading();
+        HdlResidenceLogic.getInstance().getResidenceUtilContact(new CloudCallBeak<ContactBean>() {
+            @Override
+            public void onSuccess(ContactBean contactBean) {
+
+                if (contactBean != null) {
+                    viewBinding.wechatIdContentTv.setText(contactBean.getWechat());
+                    viewBinding.emailAddressContentTv.setText(contactBean.getEmail());
+                }
+                hideLoading();
+
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                HdlThreadLogic.toast(_mActivity, e);
+                hideLoading();
+            }
+        });
+    }
+
+    private void initEvent() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+
+        viewBinding.wechatIdContentTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                // 鑾峰彇TextView涓殑鏂囨湰
+                String text = viewBinding.wechatIdContentTv.getText().toString();
+
+                // 鑾峰彇鍓创鏉跨鐞嗗櫒
+                ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
+                if (clipboard != null) {
+                    // 鍒涘缓涓�涓壀璐存暟鎹璞″苟璁剧疆瑕佸鍒剁殑鏂囨湰
+                    ClipData clip = ClipData.newPlainText("label", text);
+                    // 灏嗗壀璐存暟鎹璞″鍒跺埌鍓创鏉�
+                    clipboard.setPrimaryClip(clip);
+                    // 鍙互娣诲姞涓�涓猅oast鎴栬�呭叾浠栨彁绀烘潵鍛婄煡鐢ㄦ埛澶嶅埗鎴愬姛
+                    HdlThreadLogic.toast(_mActivity, getString(R.string.successful_replication));
+                }
+
+//                return true; // 杩斿洖true琛ㄧず宸插鐞嗛暱鎸変簨浠�
+            }
+        });
+        viewBinding.emailAddressContentTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                // 鑾峰彇TextView涓殑鏂囨湰
+                String text = viewBinding.emailAddressContentTv.getText().toString();
+
+                // 鑾峰彇鍓创鏉跨鐞嗗櫒
+                ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
+                if (clipboard != null) {
+                    // 鍒涘缓涓�涓壀璐存暟鎹璞″苟璁剧疆瑕佸鍒剁殑鏂囨湰
+                    ClipData clip = ClipData.newPlainText("label", text);
+                    // 灏嗗壀璐存暟鎹璞″鍒跺埌鍓创鏉�
+                    clipboard.setPrimaryClip(clip);
+                    // 鍙互娣诲姞涓�涓猅oast鎴栬�呭叾浠栨彁绀烘潵鍛婄煡鐢ㄦ埛澶嶅埗鎴愬姛
+                    HdlThreadLogic.toast(_mActivity, getString(R.string.successful_replication));
+                }
+//                return true; // 杩斿洖true琛ㄧず宸插鐞嗛暱鎸変簨浠�
+            }
+        });
+    }
+
+    private void initView() {
+        viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.contact_us);
+        viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/MeChangePasswordActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/MeChangePasswordActivity.java
index 29df611..e0f93c4 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/MeChangePasswordActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/MeChangePasswordActivity.java
@@ -51,7 +51,7 @@
      * 鍒濆鍖栫晫闈㈢洃鍚櫒
      */
     private void initEvent() {
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 finish();
@@ -166,7 +166,7 @@
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.home_login_change_password);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.meChangePasswordOldIc.mePswTitleTv.setText(R.string.home_login_old_pws);
         viewBinding.meChangePasswordOldIc.mePswEt.setHint(R.string.home_login_input_old_pws);
         viewBinding.meChangePasswordOldIc.lineV.setVisibility(View.GONE);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
index 288b43a..cc2e2a5 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
@@ -9,7 +9,6 @@
 import androidx.annotation.Nullable;
 
 import com.alibaba.fastjson.JSONObject;
-import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
 import com.google.gson.Gson;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
 import com.hdl.photovoltaic.R;
@@ -189,7 +188,7 @@
             }
         });
         final int[] count = {0};
-        viewBinding.toolbarTopFragmentMeRl.topTitleTv.setOnClickListener(new View.OnClickListener() {
+        viewBinding.meTitleTv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 count[0] = count[0] + 1;
@@ -207,11 +206,6 @@
      * 鍒濆鍖栫晫闈�
      */
     private void initView() {
-
-
-        viewBinding.toolbarTopFragmentMeRl.topTitleTv.setText(R.string.me);
-//        viewBinding.toolbarTopFragmentMeRl.topMoreIv.setVisibility(View.VISIBLE);
-//        viewBinding.toolbarTopFragmentMeRl.topMoreIv.setImageResource(R.drawable.message);
 
 
         viewBinding.fragmentMeLineSetIl.fragmentMeLineLeftIconIv.setImageResource(R.drawable.set);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java
index 8d0a4d9..8884874 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/PersonalDataActivity.java
@@ -10,7 +10,6 @@
 
 
 import androidx.activity.result.ActivityResultLauncher;
-import androidx.core.app.ActivityCompat;
 
 
 import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
@@ -26,7 +25,6 @@
 import com.hdl.photovoltaic.databinding.ActivityPersonalDataBinding;
 import com.hdl.photovoltaic.listener.CloudCallBeak;
 import com.hdl.photovoltaic.other.HdlAccountLogic;
-import com.hdl.photovoltaic.other.HdlLogLogic;
 import com.hdl.photovoltaic.other.HdlThreadLogic;
 import com.hdl.photovoltaic.other.HdlUniLogic;
 import com.hdl.photovoltaic.uni.HDLUniMP;
@@ -94,7 +92,7 @@
 
     private void initEvent() {
 
-        viewBinding.toolbarTopFragmentMeRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentMeRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
 //                backPressedData();
@@ -134,7 +132,7 @@
 
     private void initView() {
         viewBinding.toolbarTopFragmentMeRl.topTitleTv.setText(R.string.me_personal_data);
-        viewBinding.toolbarTopFragmentMeRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentMeRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentMeRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
         viewBinding.toolbarTopFragmentMeRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
         viewBinding.personalDataUserPortraitIl.sllLlRlNameTv.setText(R.string.me_personal_data_portrait);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/SetActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/SetActivity.java
index 65cbb2d..39447e3 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/SetActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/SetActivity.java
@@ -42,7 +42,7 @@
     }
 
     private void initEvent() {
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 finish();
@@ -89,7 +89,7 @@
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.me_set);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
         viewBinding.setLanguageIl.sllLlRlNameTv.setText(R.string.set_multilingual);
         viewBinding.setAccountSecurityIl.sllLlRlNameTv.setText(R.string.set_account_security);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/TemperatureUnitActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/TemperatureUnitActivity.java
index 4012af1..7550b57 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/TemperatureUnitActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/TemperatureUnitActivity.java
@@ -2,9 +2,7 @@
 
 import androidx.recyclerview.widget.LinearLayoutManager;
 
-import android.content.Intent;
 import android.os.Bundle;
-import android.text.TextUtils;
 import android.view.View;
 
 import com.google.gson.JsonObject;
@@ -80,7 +78,7 @@
 
     private void initEvent() {
 
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 backPressedData();
@@ -115,7 +113,7 @@
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.set_temperature_unit);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
         LinearLayoutManager linearLayout = new LinearLayoutManager(_mActivity);
         languageAdapter = new LanguageAdapter(this.mList, _mActivity);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/WebActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/WebActivity.java
index d4f11f8..de41ee8 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/WebActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/WebActivity.java
@@ -4,7 +4,6 @@
 import android.os.Bundle;
 import android.view.View;
 
-import com.hdl.photovoltaic.HDLApp;
 import com.hdl.photovoltaic.R;
 import com.hdl.photovoltaic.base.CustomBaseActivity;
 import com.hdl.photovoltaic.config.UserConfigManage;
@@ -46,7 +45,7 @@
     }
 
     private void initEvent() {
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 finish();
@@ -61,7 +60,7 @@
             viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.app_privacy_policy);
         }
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
 
         if (UserConfigManage.getInstance().getCurrentAppLanguage().equals(LocalManageUtil.zh)) {
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/me/languageSelectionActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/me/languageSelectionActivity.java
index 85b6e08..e35da67 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/me/languageSelectionActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/me/languageSelectionActivity.java
@@ -21,7 +21,6 @@
 import com.hdl.photovoltaic.utils.LocalManageUtil;
 import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
 
-import java.util.ArrayList;
 import java.util.List;
 
 
@@ -69,7 +68,7 @@
 
     private void initEvent() {
 
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 setResult(30);
@@ -183,7 +182,7 @@
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.set_language_choice);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
         LinearLayoutManager linearLayout = new LinearLayoutManager(_mActivity);
         languageAdapter = new LanguageAdapter(this.list, _mActivity);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/message/AllMessageFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/message/AllMessageFragment.java
deleted file mode 100644
index 8597c39..0000000
--- a/app/src/main/java/com/hdl/photovoltaic/ui/message/AllMessageFragment.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package com.hdl.photovoltaic.ui.message;
-
-import android.content.Intent;
-import android.os.Bundle;
-
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
-import com.hdl.linkpm.sdk.core.exception.HDLException;
-import com.hdl.photovoltaic.R;
-import com.hdl.photovoltaic.base.CustomBaseFragment;
-import com.hdl.photovoltaic.config.ConstantManage;
-import com.hdl.photovoltaic.databinding.FragmentMessageAllBinding;
-import com.hdl.photovoltaic.enums.MessageFunctionTabSwitch;
-import com.hdl.photovoltaic.enums.MessageStateType;
-import com.hdl.photovoltaic.listener.CloudCallBeak;
-import com.hdl.photovoltaic.other.HdlCommonLogic;
-import com.hdl.photovoltaic.other.HdlLogLogic;
-import com.hdl.photovoltaic.other.HdlMessageLogic;
-import com.hdl.photovoltaic.other.HdlThreadLogic;
-import com.hdl.photovoltaic.ui.adapter.MessageAdapter;
-import com.hdl.photovoltaic.ui.bean.MessageBean;
-import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 娑堟伅-鍏ㄩ儴
- */
-public class AllMessageFragment extends CustomBaseFragment {
-
-    private FragmentMessageAllBinding viewBinding;
-
-    private MessageAdapter messageAllAdapter;
-
-    private final List<MessageBean> mList = new ArrayList<>();
-
-    @Override
-    public Object getContentView() {
-        viewBinding = FragmentMessageAllBinding.inflate(getLayoutInflater());
-        return viewBinding.getRoot();
-    }
-
-    @Override
-    public void onBindView(Bundle savedInstanceState) {
-        //鍒濆鍖栨暟鎹�
-        initData();
-        //鍒濆鍖栫晫闈�
-        initView();
-        //鍒濆鍖栫洃鍚櫒
-        initEvent();
-    }
-
-    private void initData() {
-        mList.clear();
-        mList.addAll(HdlMessageLogic.getInstance().getAllMessageList());
-    }
-
-
-    private void initEvent() {
-
-        //璁剧疆涓嬫媺绠ご棰滆壊
-        viewBinding.messageAllSrl.setColorSchemeResources(R.color.text_FF245EC3);
-        viewBinding.messageAllSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
-            @Override
-            public void onRefresh() {
-                mList.clear();//琛ㄧず寮哄埗閲嶆柊璇锋眰娑堟伅鍒楄〃
-                updateListData();//娓呯┖涔嬪墠缂撳瓨,鍥犱负閬囧埌涓�涓棶棰樼寷鎷夌殑鏃跺�欐姤閿�;
-                getAllMessageList(false);
-                HdlLogLogic.print("AllMessageFragment涓嬫媺鍒锋柊", false);
-            }
-        });
-        if (messageAllAdapter != null) {
-            messageAllAdapter.setNoOnclickListener(new MessageAdapter.OnclickListener() {
-                @Override
-                public void onClick(int position, MessageBean item) {
-                    if (position < 0 || position > mList.size()) {
-                        return;
-                    }
-                    Intent intent = new Intent();
-                    intent.putExtra("msgId", item.getMsgId().toString());
-                    intent.setClass(_mActivity, MessageInfoActivity.class);
-                    startActivity(intent);
-                }
-            });
-        }
-
-
-    }
-
-    private void initView() {
-        viewBinding.messageAllRecyclerview.setLayoutManager(new LinearLayoutManager(_mActivity));
-        messageAllAdapter = new MessageAdapter(this.mList, _mActivity);
-        viewBinding.messageAllRecyclerview.setAdapter(messageAllAdapter);
-    }
-
-    /**
-     * 鍒锋柊鍒楄〃鏁版嵁
-     */
-    private void updateListData() {
-        if (this.messageAllAdapter != null) {
-            this.messageAllAdapter.setList(mList);
-            this.messageAllAdapter.notifyDataSetChanged();
-        }
-    }
-
-    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
-    public void onEventMessage(BaseEventBus eventBus) {
-        super.onEventMessage(eventBus);
-        if (eventBus == null) {
-            return;
-        }
-        //鎺ユ敹澶栭儴鐐瑰嚮浜嬩欢
-        if (eventBus.getTopic().equals(ConstantManage.message_function_tab_switch)) {
-            if (eventBus.getType().equals(MessageFunctionTabSwitch.all.toString())) {
-                initData();
-                getAllMessageList(true);
-                // 鍙栨秷绮樻�т簨浠�
-                EventBus.getDefault().removeStickyEvent(eventBus);
-            }
-        } else if (eventBus.getTopic().equals(ConstantManage.message_function_push_post)) {
-            if (eventBus.getType().equals(MessageStateType.all)) {
-                //娑堟伅璇︽儏鍥炶皟
-//                initData();
-//                updateListData();
-            }
-        }
-    }
-
-    /**
-     * 鑾峰彇鍏ㄩ儴涓殑娑堟伅鍒楄〃
-     *
-     * @param isShowLoading 鏄惁鍚姩 true鍚姩
-     */
-    private void getAllMessageList(boolean isShowLoading) {
-        if (mList.size() == 0) {
-            if (isShowLoading) {
-                showLoading();
-            }
-            HdlMessageLogic.getInstance().getAllMessageList(new CloudCallBeak<List<MessageBean>>() {
-                @Override
-                public void onSuccess(List<MessageBean> list) {
-
-                    HdlThreadLogic.runMainThread(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (isShowLoading) {
-                                hideLoading();
-                            }
-                            if (!isShowLoading) {
-                                viewBinding.messageAllSrl.setRefreshing(false);
-                            }
-
-                            if (list != null && list.size() != 0) {
-                                mList.addAll(list);
-                                updateListData();
-                            }
-                        }
-                    });
-                }
-
-                @Override
-                public void onFailure(HDLException e) {
-                    if (isShowLoading) {
-                        hideLoading();
-                    }
-                    if (!isShowLoading) {
-                        viewBinding.messageAllSrl.setRefreshing(false);
-                    }
-                }
-            });
-        }
-    }
-
-
-}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java
index ea34e28..466190d 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java
@@ -1,20 +1,34 @@
 package com.hdl.photovoltaic.ui.message;
 
+import android.annotation.SuppressLint;
+import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
+import android.widget.TextView;
 
 
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
+import com.hdl.linkpm.sdk.core.exception.HDLException;
 import com.hdl.photovoltaic.R;
 import com.hdl.photovoltaic.base.CustomBaseFragment;
 import com.hdl.photovoltaic.config.ConstantManage;
 import com.hdl.photovoltaic.databinding.FragmentMessageBinding;
+import com.hdl.photovoltaic.enums.FilterType;
 import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
-import com.hdl.photovoltaic.enums.MessageFunctionTabSwitch;
+import com.hdl.photovoltaic.enums.MessageStateType;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlCommonLogic;
 import com.hdl.photovoltaic.other.HdlLogLogic;
+import com.hdl.photovoltaic.other.HdlMessageLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.adapter.MessageAdapter;
+import com.hdl.photovoltaic.ui.bean.MessageBean;
+import com.hdl.photovoltaic.ui.bean.UnCountBean;
+import com.hdl.photovoltaic.widget.TypeTitleListDialog;
 import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
 
 import org.greenrobot.eventbus.EventBus;
@@ -22,21 +36,34 @@
 import org.greenrobot.eventbus.ThreadMode;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
- * 娑堟伅
+ * 娑堟伅妯″潡鐣岄潰
  */
 public class MessageFragment extends CustomBaseFragment {
 
     private FragmentMessageBinding viewBinding;
 
-    //褰撳墠鏄剧ず鐨刦ragment
-    private static final String CURRENT_FRAGMENT = "state_fragment_show";
-    private FragmentManager mFragmentManager;
-    private Fragment currentFragment = new Fragment();
-    private final List<Fragment> fragmentList = new ArrayList<>();
-    private int currentIndex = 0;
+    private MessageAdapter mMessageAdapter;
+    private boolean isAlarmDeviceClick = true;//true琛ㄧず鍛婅璁惧琚�変腑,鍒檉alse琛ㄧず鎶ヨ璁板綍琚�変腑
+
+    private final List<MessageBean> mList = new ArrayList<>();
+    private int mCurrentPage = 0; // 褰撳墠椤电爜
+    private int mCurrentTotal = 0; // 鎬婚〉鐮�
+    private String mDeviceTypeFilterKye = FilterType.deviceType;//杩囨护绫诲瀷 deviceType锛圛NV 锛氶�嗗彉鍣紱BMS 锛欱MS鎺у埗鐩掞紱BATTERY 锛氱數姹犲崟鍏冿級
+    private String mDeviceTypeFilterValue = FilterType.all;//杩囨护绫诲瀷鍊� deviceType锛圛NV 锛氶�嗗彉鍣紱BMS 锛欱MS鎺у埗鐩掞紱BATTERY 锛氱數姹犲崟鍏冿級
+
+    private String mTypeFilterKye = FilterType.all;//杩囨护绫诲瀷 type锛團AULT 锛氭晠闅滐紱 WARN 锛氬憡璀︼紱 EVENT 锛氫簨浠�(鎻愮ず)锛夛紱
+    private String mTypeFilterValue = FilterType.all;//杩囨护绫诲瀷鍊� type锛團AULT 锛氭晠闅滐紱 WARN 锛氬憡璀︼紱 EVENT 锛氫簨浠�(鎻愮ず)锛夛紱
+
+    private String mTimeTypeFilterKye = FilterType.all;//杩囨护绫诲瀷  timeType锛圱ODAY 锛氫粖澶╋紱LAST_3_DAYS: 杩�3澶╋紱LAST_7_DAYS 锛氳繎7澶╋紱LAST_30_DAYS 锛氳繎30澶╋級锛�
+    private String mTimeTypeFilterValue = FilterType.all;//杩囨护绫诲瀷鍊�  timeType锛圱ODAY 锛氫粖澶╋紱LAST_3_DAYS: 杩�3澶╋紱LAST_7_DAYS 锛氳繎7澶╋紱LAST_30_DAYS 锛氳繎30澶╋級锛�
+
+
+    private boolean isLoadingMore = false; // 鏍囪姝e湪鍔犺浇鏇村鏁版嵁
 
     @Override
     public Object getContentView() {
@@ -46,165 +73,196 @@
 
     @Override
     public void onBindView(Bundle savedInstanceState) {
-
-        //鍒濆鍖栫鐗�
-        initFragment(savedInstanceState);
         //鍒濆鍖栫晫闈�
         initView();
         //鍒濆鍖栫洃鍚櫒
         initEvent();
         //鍒濆鍖栨暟鎹�
         initData();
+
     }
 
     private void initEvent() {
 
+
         //鍙戠敓涓�
-        viewBinding.messageTabNascentCl.setOnClickListener(new View.OnClickListener() {
+        viewBinding.messageTabNascentTitleTv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                currentIndex = 0;
-                initView();
-                showFragment();
-                postEventBus(MessageFunctionTabSwitch.nascent);
-
+                if (isAlarmDeviceClick) {
+                    return;
+                }
+                isAlarmDeviceClick = true;
+                viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text20Style);
+                viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text16Style);
+                viewBinding.allClearTv.setVisibility(View.VISIBLE);
+                loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true);
             }
         });
-        //宸叉仮澶�
-        viewBinding.messageTabRecoverCl.setOnClickListener(new View.OnClickListener() {
+        //鎶ヨ璁板綍
+        viewBinding.messageTabRecoverTitleTv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                currentIndex = 1;
-                initView();
-                showFragment();
-                postEventBus(MessageFunctionTabSwitch.recover);
-
+                if (!isAlarmDeviceClick) {
+                    return;
+                }
+                isAlarmDeviceClick = false;
+                viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text16Style);
+                viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text20Style);
+                viewBinding.allClearTv.setVisibility(View.GONE);
+                loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true);
+            }
+        });
+        //鎼滅储娑堟伅
+        viewBinding.messageSearchCl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent();
+                intent.setClass(_mActivity, SearchMessageActivity.class);
+                startActivity(intent);
             }
         });
 
-        //鍏ㄩ儴
-        viewBinding.messageTabAllCl.setOnClickListener(new View.OnClickListener() {
+        //娓呯┖鎵�鏈夋湭璇绘寜閽�
+        viewBinding.allClearTv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                currentIndex = 2;
-                initView();
-                showFragment();
-                postEventBus(MessageFunctionTabSwitch.all);
+                showLoading();
+                HdlMessageLogic.getInstance().messageAllRead("", new CloudCallBeak<Boolean>() {
+                    @Override
+                    public void onSuccess(Boolean obj) {
+                        hideLoading();
+                        loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true);
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+                        hideLoading();
+                        HdlThreadLogic.toast(_mActivity, e);
+                    }
+                });
+            }
+        });
+
+        //鍏ㄩ儴璁惧(鍏ㄩ儴璁惧銆侀�嗗彉鍣ㄣ�丅MS鎺у埗鐩掋�佺數姹犲崟鍏�)鎸夐挳
+        viewBinding.messageTabAllDeviceCl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                viewBinding.allDeviceTitleIv.setBackgroundResource(R.drawable.up);
+                viewBinding.allGradeTitleIv.setBackgroundResource(R.drawable.down);
+                viewBinding.allTimeTitleIv.setBackgroundResource(R.drawable.down);
+                setTypeTitleListDialog(viewBinding.allDeviceTitleTv, FilterType.deviceType, getTypeList(FilterType.deviceType));
+
+            }
+        });
+        //鍏ㄩ儴绛夌骇(鏁呴殰銆佽鍛娿�佹彁绀�)鎸夐挳
+        viewBinding.messageTabAllGradeCl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                viewBinding.allDeviceTitleIv.setBackgroundResource(R.drawable.down);
+                viewBinding.allGradeTitleIv.setBackgroundResource(R.drawable.up);
+                viewBinding.allTimeTitleIv.setBackgroundResource(R.drawable.down);
+                setTypeTitleListDialog(viewBinding.allGradeTitleTv, FilterType.type, getTypeList(FilterType.type));
+
+            }
+        });
+        //鍏ㄩ儴鏃堕棿(褰撳ぉ銆佽繎3澶┿�佽繎7澶┿�佽繎30澶�)鎸夐挳
+        viewBinding.messageTabAllTimeCl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                viewBinding.allDeviceTitleIv.setBackgroundResource(R.drawable.down);
+                viewBinding.allGradeTitleIv.setBackgroundResource(R.drawable.down);
+                viewBinding.allTimeTitleIv.setBackgroundResource(R.drawable.up);
+                setTypeTitleListDialog(viewBinding.allTimeTitleTv, FilterType.timeType, getTypeList(FilterType.timeType));
+            }
+        });
+
+        //涓嬫媺鎸夐挳
+        viewBinding.messageSrl.setColorSchemeResources(R.color.text_FF245EC3);
+        viewBinding.messageSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                viewBinding.messageSrl.setRefreshing(false);
+                loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true);
+            }
+        });
+        //涓婃媺鎸夐挳
+        viewBinding.messageRcv.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+//                super.onScrolled(recyclerView, dx, dy);
+
+                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+                if (layoutManager == null) {
+                    return;
+                }
+                int visibleItemCount = layoutManager.getChildCount();
+                int totalItemCount = layoutManager.getItemCount();
+                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
+                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
+                    if (!isLoadingMore) {
+                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
+                        HdlLogLogic.print("--->婊戝姩鍒颁簡搴曢儴");
+                        loadNextPageMessageList(false, ++mCurrentPage, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, false);
+                    }
+                }
+            }
+        });
+        if (mMessageAdapter != null) {
+            mMessageAdapter.setOnclickListener(new MessageAdapter.OnClickListener() {
+                @Override
+                public void onClick(int position, MessageBean messageBean) {
+                    Intent intent = new Intent();
+                    intent.putExtra("msgId", messageBean.getMsgId().toString());
+                    intent.setClass(_mActivity, MessageInfoActivity.class);
+                    startActivity(intent);
+                }
+            });
+
+        }
+    }
+
+    /**
+     * 绫诲瀷绛涢��
+     *
+     * @param textView   缁勪欢鏄剧ず
+     * @param filterType 杩囨护绫诲瀷
+     * @param stringList 杩囨护绫诲瀷鍊艰〃
+     */
+    private void setTypeTitleListDialog(TextView textView, String filterType, List<String> stringList) {
+        TypeTitleListDialog typeTitleListDialog = new TypeTitleListDialog(_mActivity, stringList);
+        typeTitleListDialog.show();
+        typeTitleListDialog.setOnListener(new TypeTitleListDialog.OnClickListener() {
+            @Override
+            public void onClick(int position, String title) {
+                textView.setText(title);
+                mTimeTypeFilterKye = filterType;
+                mTimeTypeFilterValue = findFilterValueString(title);
+                loadNextPageMessageList(true, 1, mDeviceTypeFilterKye, mDeviceTypeFilterValue, mTypeFilterKye, mTypeFilterValue, mTimeTypeFilterKye, mTimeTypeFilterValue, true);
             }
         });
     }
 
 
     private void initView() {
-        if (this.currentIndex == 0) {
-            viewBinding.messageTabNascentTitleTv.setTextColor(getResources().getColor(R.color.text_FFFFFFFF, null));
-            viewBinding.messageTabRecoverTitleTv.setTextColor(getResources().getColor(R.color.text80_FFFFFF, null));
-            viewBinding.messageTabAllTitleTv.setTextColor(getResources().getColor(R.color.text80_FFFFFF, null));
-            viewBinding.line1V.setVisibility(View.VISIBLE);
-            viewBinding.line2V.setVisibility(View.GONE);
-            viewBinding.line3V.setVisibility(View.GONE);
-        } else if (this.currentIndex == 1) {
-            viewBinding.messageTabNascentTitleTv.setTextColor(getResources().getColor(R.color.text80_FFFFFF, null));
-            viewBinding.messageTabRecoverTitleTv.setTextColor(getResources().getColor(R.color.text_FFFFFFFF, null));
-            viewBinding.messageTabAllTitleTv.setTextColor(getResources().getColor(R.color.text80_FFFFFF, null));
-            viewBinding.line1V.setVisibility(View.GONE);
-            viewBinding.line2V.setVisibility(View.VISIBLE);
-            viewBinding.line3V.setVisibility(View.GONE);
-        } else if (this.currentIndex == 2) {
-            viewBinding.messageTabNascentTitleTv.setTextColor(getResources().getColor(R.color.text80_FFFFFF, null));
-            viewBinding.messageTabRecoverTitleTv.setTextColor(getResources().getColor(R.color.text80_FFFFFF, null));
-            viewBinding.messageTabAllTitleTv.setTextColor(getResources().getColor(R.color.text_FFFFFFFF, null));
-            viewBinding.line1V.setVisibility(View.GONE);
-            viewBinding.line2V.setVisibility(View.GONE);
-            viewBinding.line3V.setVisibility(View.VISIBLE);
+        if (isAlarmDeviceClick) {
+            viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text20Style);
+            viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text16Style);
+        } else {
+            viewBinding.messageTabNascentTitleTv.setTextAppearance(R.style.Text16Style);
+            viewBinding.messageTabRecoverTitleTv.setTextAppearance(R.style.Text20Style);
         }
 
+        mMessageAdapter = new MessageAdapter(_mActivity);
+        viewBinding.messageRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.messageRcv.setAdapter(mMessageAdapter);
     }
 
     private void initData() {
+        //杩涙潵璇诲彇涓�娆℃暟鎹�(涓轰簡鏇存柊currentPage锛宑urrentTotal杩欎釜鍊�),app鍚姩鏃跺�欒鍙栵紝涓轰簡鍒锋柊娑堟伅妯″潡鐨勮鏍�
+        loadNextPageMessageList(true, 1, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, FilterType.all, true);
     }
 
-    /**
-     * 鍙戝竷鐐瑰嚮浜嬩欢
-     *
-     * @param tabSwitch -
-     */
-    private void postEventBus(MessageFunctionTabSwitch tabSwitch) {
-        BaseEventBus baseEventBus = new BaseEventBus();
-        baseEventBus.setTopic(ConstantManage.message_function_tab_switch);
-        baseEventBus.setType(tabSwitch.toString());
-        //鍙戦�佺矘鎬т簨浠�(濡傛灉涓嶅彂绮樻�т簨浠朵細閬囧埌涓�涓病鏈夊姞杞藉嚭鏉ョ殑纰庣墖鎺ユ敹涓嶅埌淇℃伅)
-        EventBus.getDefault().postSticky(baseEventBus);
-    }
-
-
-    /**
-     * 鍒濆鍖朏ragment
-     *
-     * @param savedInstanceState -
-     */
-    private void initFragment(Bundle savedInstanceState) {
-        mFragmentManager = _mActivity.getSupportFragmentManager();
-        //纰庣墖鍒濆鍖�
-        NascentMessageFragment mNascentMessageFragment = new NascentMessageFragment();
-        RecoverMessageFragment mRecoverMessageFragment = new RecoverMessageFragment();
-        AllMessageFragment mAllMessageFragment = new AllMessageFragment();
-        if (savedInstanceState != null) {
-            //鈥滃唴瀛橀噸鍚�濇椂璋冪敤 鑾峰彇鈥滃唴瀛橀噸鍚�濇椂淇濆瓨鐨勭储寮曚笅鏍�
-            currentIndex = savedInstanceState.getInt(CURRENT_FRAGMENT, 0);
-            if (fragmentList.size() != 0) {
-                fragmentList.clear();
-            }
-            fragmentList.add(mFragmentManager.findFragmentByTag(0 + ""));
-            fragmentList.add(mFragmentManager.findFragmentByTag(1 + ""));
-            fragmentList.add(mFragmentManager.findFragmentByTag(2 + ""));
-            restoreFragment();//鎭㈠fragment椤甸潰
-        } else {
-            //姝e父鍚姩鏃惰皟鐢�
-            fragmentList.add(mNascentMessageFragment);
-            fragmentList.add(mRecoverMessageFragment);
-            fragmentList.add(mAllMessageFragment);
-            showFragment();
-        }
-
-    }
-
-    /**
-     * 浣跨敤show() hide()鍒囨崲椤甸潰
-     * 鏄剧ずfragment
-     */
-    private void showFragment() {
-        FragmentTransaction ft = mFragmentManager.beginTransaction();
-        //濡傛灉涔嬪墠娌℃湁娣诲姞杩�
-        if (!fragmentList.get(currentIndex).isAdded()) {
-            //绗笁涓弬鏁颁负娣诲姞褰撳墠鐨刦ragment鏃剁粦瀹氫竴涓猼ag
-            ft.hide(currentFragment).add(R.id.message_fcv, fragmentList.get(currentIndex), currentIndex + "");
-        } else {
-            ft.hide(currentFragment).show(fragmentList.get(currentIndex));
-        }
-        currentFragment = fragmentList.get(currentIndex);
-        ft.commit();
-        //鎶婂綋鍓嶆樉绀虹殑fragment璁板綍涓嬫潵
-        currentFragment = fragmentList.get(currentIndex);
-
-
-    }
-
-    /**
-     * 鎭㈠fragment
-     */
-    private void restoreFragment() {
-        FragmentTransaction ft = mFragmentManager.beginTransaction();
-        for (int i = 0; i < fragmentList.size(); i++) {
-            if (i == currentIndex) {
-                ft.show(fragmentList.get(i));
-            } else {
-                ft.hide(fragmentList.get(i));
-            }
-        }
-        ft.commit();
-
-    }
 
     @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
     public void onEventMessage(BaseEventBus eventBus) {
@@ -217,10 +275,304 @@
             if (eventBus.getType().equals(HomepageTitleTabSwitch.message.toString())) {
                 // 鍙栨秷绮樻�т簨浠�
                 EventBus.getDefault().removeStickyEvent(eventBus);
-                postEventBus(MessageFunctionTabSwitch.nascent);
+                //杩涙潵璇诲彇涓�娆℃暟鎹�(涓轰簡鏇存柊currentPage锛宑urrentTotal杩欎釜鍊�)
+                initData();
                 HdlLogLogic.print("姝e湪鐐瑰嚮銆愭秷鎭��");
 
             }
+        } else if (eventBus.getTopic().equals(ConstantManage.message_function_push_post)) {
+            if (eventBus.getType().equals(MessageStateType.untreated)) {
+                updateListData();
+            }/* else if (eventBus.getType().equals(MessageStateType.processed)) {
+                updateListData();
+            }*/
         }
     }
+
+    /**
+     * 鍔犺浇涓�椤垫暟鎹�
+     *
+     * @param pageNo                  椤垫暟
+     * @param isShowLoading           鏄惁鍚姩鍔犺浇妗� true鍚姩
+     * @param deviceType_filter_key   绫诲瀷锛堣澶囷紝绛夌骇锛屾椂闂达級
+     * @param deviceType_filter_value deviceType锛圛NV 锛氶�嗗彉鍣紱BMS 锛欱MS鎺у埗鐩掞紱BATTERY 锛氱數姹犲崟鍏冿級锛�
+     *                                type锛團AULT 锛氭晠闅滐紱 WARN 锛氬憡璀︼紱 EVENT 锛氫簨浠�(鎻愮ず)锛夛紱
+     *                                timeType锛圱ODAY 锛氫粖澶╋紱LAST_3_DAYS: 杩�3澶╋紱LAST_7_DAYS 锛氳繎7澶╋紱LAST_30_DAYS 锛氳繎30澶╋級锛�
+     * @param isClear                 true琛ㄧず娓呯┖缂撳瓨
+     */
+    private void loadNextPageMessageList(
+
+            boolean isShowLoading,
+            int pageNo,
+            String deviceType_filter_key,
+            String deviceType_filter_value,
+            String type_filter_key,
+            String type_filter_value,
+            String timeType_filter_key,
+            String timeType_filter_value,
+            boolean isClear) {
+        if (isClear) {
+            //琛ㄧず浠庣涓�椤靛彲浠ヨ鍙栵紝榛樿娓呯┖鎵�鏈夌紦瀛樻暟鎹�;
+            clearCacheData();
+        }
+        //绗竴椤佃鍙栨暟鎹己鍒惰
+        if (pageNo > 1 && mCurrentPage > mCurrentTotal) {
+            --mCurrentPage;
+            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
+            return;
+        }
+        isLoadingMore = true;//鏍囪璇诲彇鐘舵��
+        if (isShowLoading) {
+            showLoading();
+        }
+        String messageStateType;
+        if (isAlarmDeviceClick) {
+            messageStateType = MessageStateType.untreated;
+        } else {
+            messageStateType = MessageStateType.processed;
+        }
+        HdlMessageLogic.getInstance().getPageNoMessageList("", pageNo, messageStateType, deviceType_filter_key, deviceType_filter_value, type_filter_key, type_filter_value, timeType_filter_key, timeType_filter_value, "", new CloudCallBeak<HdlMessageLogic.MessageListClass>() {
+            @Override
+            public void onSuccess(HdlMessageLogic.MessageListClass messageListClass) {
+                if (messageListClass != null) {
+                    mCurrentTotal = (int) messageListClass.getTotalPage();
+                    mCurrentPage = (int) messageListClass.getPageNo();
+                    updateListData();
+                }
+                isLoadingMore = false;
+                if (isShowLoading) {
+                    hideLoading();
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (mCurrentPage > 1) {
+                    --mCurrentPage;
+                }
+                isLoadingMore = false;
+                if (isShowLoading) {
+                    hideLoading();
+                }
+            }
+        });
+
+
+    }
+
+    /**
+     * 鍒锋柊鍒楄〃鏁版嵁
+     */
+    private void updateListData() {
+        HdlThreadLogic.runMainThread(new Runnable() {
+            @Override
+            public void run() {
+                //璇诲彇缂撳瓨鏁版嵁
+                updateCacheData();
+                //鍒锋柊鍒楄〃
+                updateRecyclerViewList();
+                //鏄剧ず鏈淇℃伅鎬绘暟閲�
+                getUnreadCount();
+                //鏄剧ず娌℃暟鎹甎i鏍峰紡
+                nullDataUpdateUi();
+
+            }
+        });
+    }
+
+    /**
+     * 鍒锋柊淇℃伅鏁伴噺鎬绘暟
+     *
+     * @param nascentTotalCount 鍙戦�佷腑娑堟伅鎬绘暟閲�
+     * @param recoverTotalCount 鎶ヨ璁板綍娑堟伅鎬绘暟閲�
+     */
+    private void refreshAascentAndRecoverTotalCount(int nascentTotalCount, int recoverTotalCount) {
+        HdlThreadLogic.runMainThread(new Runnable() {
+            @Override
+            public void run() {
+                //璁惧鎶ヨ鎬绘暟閲�
+                TextView nascentTv = _mActivity.findViewById(R.id.message_tab_nascent_title_tv);
+                if (nascentTv != null) {
+                    nascentTv.setText(getText(R.string.message_nascent));
+                    if (nascentTotalCount > 0) {
+                        String s = getText(R.string.message_nascent) + "(" + nascentTotalCount + ")";
+                        nascentTv.setText(s);
+                    }
+                }
+                //鎶ヨ璁板綍鎬绘暟閲�
+                TextView recoverTV = _mActivity.findViewById(R.id.message_tab_recover_title_tv);
+                if (recoverTV != null) {
+                    recoverTV.setText(getText(R.string.alarm_record));
+                    if (recoverTotalCount > 0) {
+                        String s = getText(R.string.alarm_record) + "(" + recoverTotalCount + ")";
+                        recoverTV.setText(s);
+                    }
+                }
+            }
+        });
+
+    }
+
+    /**
+     * 鍒锋柊銆愭秷鎭ā鍧椼�戜笅瑙掓爣鏁板��
+     *
+     * @param unreadCount 鏈淇℃伅鏁伴噺鎬绘暟
+     */
+    private void refreshUnreadCount(int unreadCount) {
+        HdlThreadLogic.runMainThread(new Runnable() {
+            @SuppressLint("SetTextI18n")
+            @Override
+            public void run() {
+                TextView textView = _mActivity.findViewById(R.id.my_message_bottom_il2).findViewById(R.id.red_count_tv);
+                if (textView != null) {
+                    if (unreadCount == 0) {
+                        textView.setVisibility(View.GONE);
+                    } else {
+                        textView.setVisibility(View.VISIBLE);
+                        if (unreadCount > 99) {
+                            textView.setText("99+");
+                        } else {
+                            textView.setText(unreadCount + "");
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * 閲嶆柊鏇存柊鍒楄〃鏁版嵁
+     */
+    private void updateRecyclerViewList() {
+        if (mMessageAdapter == null) {
+            return;
+        }
+        mMessageAdapter.setList(mList);
+    }
+
+    /**
+     * 娓呯┖鎵�鏈夌紦瀛樻暟鎹�(鑾峰彇绗竴椤典箣鍓嶈娓呯┖鎵�鏈夌紦瀛樻暟鎹�)
+     */
+    private void clearCacheData() {
+        mList.clear();
+        HdlMessageLogic.getInstance().clearListMessage();//琛ㄧず寮哄埗娓呯┖鎵�鏈夌紦瀛樹俊鎭�
+    }
+
+    /**
+     * 鏇存柊缂撳瓨鏁版嵁
+     */
+    private void updateCacheData() {
+        mList.clear();
+        if (isAlarmDeviceClick) {
+            //璁惧鎶ヨ
+            mList.addAll(HdlMessageLogic.getInstance().getNascentMessageMemoryList());
+        } else {
+            //鎶ヨ璁板綍
+            mList.addAll(HdlMessageLogic.getInstance().getRecoverMessageMemoryList());
+        }
+    }
+
+    /**
+     * 璇诲彇娑堟伅銆愭湭璇绘暟閲�,鏈鐞嗘�绘暟閲忥紝宸插鐞嗘�绘暟閲忋��
+     */
+    private void getUnreadCount() {
+        HdlMessageLogic.getInstance().getMessageUntreatedCount("", new CloudCallBeak<UnCountBean>() {
+            @Override
+            public void onSuccess(UnCountBean unCountBean) {
+
+                HdlThreadLogic.runMainThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (unCountBean == null) {
+                            return;
+                        }
+                        refreshAascentAndRecoverTotalCount(unCountBean.getUntreatedCount(), unCountBean.getProcessedCount());
+                        refreshUnreadCount(unCountBean.getUnreadCount());
+                    }
+
+                });
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                TextView textView = _mActivity.findViewById(R.id.my_message_bottom_il2).findViewById(R.id.red_count_tv);
+                if (textView != null) {
+                    textView.setVisibility(View.GONE);
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 娌℃湁娑堟伅鍒楄〃鐨勬牱寮�
+     */
+    private void nullDataUpdateUi() {
+        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity, viewBinding.nullDataIc.getRoot(), viewBinding.nullDataIc.nullDataGifAnimationIv, viewBinding.nullDataIc.nullDataTv, getString(R.string.message_alarm_data_null), mList.size() > 0);
+    }
+
+    /**
+     * 鏌ユ壘杩囨护鍊�
+     *
+     * @param title 鏍囬
+     * @return 杩囨护鍊�
+     */
+    public String findFilterValueString(String title) {
+        Map<String, String> map = new HashMap<>();
+        map.put(getString(R.string.alarm_all_device), "");//璁惧鍏ㄩ儴
+        map.put(getString(R.string.alarm_all_device_inverter), "INV");
+        map.put(getString(R.string.alarm_all_device_bms), "BMS");
+        map.put(getString(R.string.alarm_all_device_battery_cell), "BATTERY");
+        map.put(getString(R.string.alarm_all_grade), "");//璁剧瓑绾у叏閮�
+        map.put(getString(R.string.alarm_all_grade_malfunction), "FAULT");
+        map.put(getString(R.string.alarm_all_grade_warning), "WARN");
+        map.put(getString(R.string.alarm_all_grade_tip), "EVENT");
+        map.put(getString(R.string.alarm_all_time), "");//鏃堕棿鍏ㄩ儴
+        map.put(getString(R.string.alarm_all_time_same_day), "TODAY");
+        map.put(getString(R.string.alarm_all_time_3), "LAST_3_DAYS");
+        map.put(getString(R.string.alarm_all_time_7), "LAST_7_DAYS");
+        map.put(getString(R.string.alarm_all_time_30), "LAST_30_DAYS");
+
+        for (Map.Entry<String, String> entry : map.entrySet()) {
+            if (title.equals(entry.getKey())) {
+                return entry.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鑾峰彇绫诲瀷鍒楄〃
+     *
+     * @param filterType 杩囨护绫诲瀷
+     * @return 杩斿洖绫诲瀷鍒楄〃
+     */
+    private List<String> getTypeList(String filterType) {
+        List<String> stringList = new ArrayList<>();
+        switch (filterType) {
+            case FilterType.deviceType: {
+                stringList.add(getString(R.string.alarm_all_device));
+                stringList.add(getString(R.string.alarm_all_device_inverter));
+                stringList.add(getString(R.string.alarm_all_device_bms));
+                stringList.add(getString(R.string.alarm_all_device_battery_cell));
+            }
+            break;
+            case FilterType.type: {
+                stringList.add(getString(R.string.alarm_all_grade));
+                stringList.add(getString(R.string.alarm_all_grade_malfunction));
+                stringList.add(getString(R.string.alarm_all_grade_warning));
+                stringList.add(getString(R.string.alarm_all_grade_tip));
+            }
+            break;
+            case FilterType.timeType: {
+                stringList.add(getString(R.string.alarm_all_time));
+                stringList.add(getString(R.string.alarm_all_time_same_day));
+                stringList.add(getString(R.string.alarm_all_time_3));
+                stringList.add(getString(R.string.alarm_all_time_7));
+                stringList.add(getString(R.string.alarm_all_time_30));
+            }
+            break;
+        }
+        return stringList;
+    }
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageInfoActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageInfoActivity.java
index 80d727b..d90e9cf 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageInfoActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/message/MessageInfoActivity.java
@@ -1,7 +1,6 @@
 package com.hdl.photovoltaic.ui.message;
 
 
-import android.annotation.SuppressLint;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.view.View;
@@ -91,8 +90,8 @@
                             type = _mActivity.getString(R.string.message_alarm);
                             drawable = AppCompatResources.getDrawable(_mActivity, R.drawable.alarm_ffb300);
                         } else if (mMessageBean.getType().equals(MessageAlarmStateType.event)) {
-                            type = _mActivity.getString(R.string.event);
-                            drawable = AppCompatResources.getDrawable(_mActivity, R.drawable.alarm_ffb300);
+                            type = _mActivity.getString(R.string.loading_title_tip);
+                            drawable = AppCompatResources.getDrawable(_mActivity, R.drawable.state_b9b9b9);
                         }
                         viewBinding.messageInfoAlarmStateTv.setText(type);
                         viewBinding.messageInfoAlarmStateTv.setBackground(drawable);
@@ -116,7 +115,7 @@
 
     private void initEvent() {
         //鍚庨��鐨勪簨浠�
-        viewBinding.toolbarTopIn.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopIn.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 if (mMessageBean == null) {
@@ -125,18 +124,20 @@
                 }
                 //鏈鐞�
                 if (mMessageBean.getStatus().equals(MessageStateType.untreated)) {
-                    BaseEventBus baseEventBus = new BaseEventBus();
-                    baseEventBus.setTopic(ConstantManage.message_function_push_post);
+
                     //鏀瑰彉缂撳瓨鐘舵��
                     if (mMessageBean.getType().equals(MessageAlarmStateType.fault)) {
                         HdlMessageLogic.getInstance().setMessageState(mMessageBean.getMsgId(), true, MessageStateType.untreated);
+                        BaseEventBus baseEventBus = new BaseEventBus();
+                        baseEventBus.setTopic(ConstantManage.message_function_push_post);
                         baseEventBus.setType(MessageStateType.untreated);
+                        EventBus.getDefault().post(baseEventBus);
                     } else {
                         //闄も�滄晠闅溾�濆锛屽叾浠栫瓑绾т俊鎭�滃凡璇烩�濆悗锛岃嚜鍔ㄧЩ鍑衡�滃彂鐢熶腑鈥濆垪琛ㄥ苟鍔犲叆鈥滃巻鍙茶褰曗�濆垪琛�
                         HdlMessageLogic.getInstance().setMessageState(mMessageBean.getMsgId(), true, MessageStateType.processed);
-                        baseEventBus.setType(MessageStateType.processed);
+                        sendEventBus();
                     }
-                    EventBus.getDefault().post(baseEventBus);
+
                 }
                 finish();
             }
@@ -151,18 +152,18 @@
                 }
                 //鏈鐞�
                 if (mMessageBean.getStatus().equals(MessageStateType.untreated)) {
-                    BaseEventBus baseEventBus = new BaseEventBus();
-                    baseEventBus.setTopic(ConstantManage.message_function_push_post);
                     //鏀瑰彉缂撳瓨鐘舵��
                     if (mMessageBean.getType().equals(MessageAlarmStateType.fault)) {
                         HdlMessageLogic.getInstance().setMessageState(mMessageBean.getMsgId(), true, MessageStateType.untreated);
+                        BaseEventBus baseEventBus = new BaseEventBus();
+                        baseEventBus.setTopic(ConstantManage.message_function_push_post);
                         baseEventBus.setType(MessageStateType.untreated);
+                        EventBus.getDefault().post(baseEventBus);
                     } else {
                         //闄も�滄晠闅溾�濆锛屽叾浠栫瓑绾т俊鎭�滃凡璇烩�濆悗锛岃嚜鍔ㄧЩ鍑衡�滃彂鐢熶腑鈥濆垪琛ㄥ苟鍔犲叆鈥滃巻鍙茶褰曗�濆垪琛�
                         HdlMessageLogic.getInstance().setMessageState(mMessageBean.getMsgId(), true, MessageStateType.processed);
-                        baseEventBus.setType(MessageStateType.processed);
+                        sendEventBus();
                     }
-                    EventBus.getDefault().post(baseEventBus);
                 }
                 finish();
             }
@@ -181,21 +182,9 @@
                         //鏈鐞�
                         if (mMessageBean.getStatus().equals(MessageStateType.untreated)) {
                             HdlMessageLogic.getInstance().setMessageState(mMessageBean.getMsgId(), true, MessageStateType.processed);
-
-                            //閫氱煡宸插鐞嗚鏇存柊鏁版嵁
-                            BaseEventBus processedBus = new BaseEventBus();
-                            processedBus.setTopic(ConstantManage.message_function_push_post);
-                            processedBus.setType(MessageStateType.processed);
-                            EventBus.getDefault().post(processedBus);
-                            //閫氱煡鏈鐞嗚鏇存柊鏁版嵁
-                            BaseEventBus untreatedBus = new BaseEventBus();
-                            untreatedBus.setTopic(ConstantManage.message_function_push_post);
-                            untreatedBus.setType(MessageStateType.untreated);
-                            EventBus.getDefault().post(untreatedBus);
+                            sendEventBus();
                         }
                         finish();
-
-
                     }
 
                     @Override
@@ -210,12 +199,28 @@
 
     }
 
+    /**
+     * 閫氱煡鍑哄幓澶栭潰鏇存柊鏁版嵁
+     */
+    private void sendEventBus() {
+        //閫氱煡宸插鐞嗚鏇存柊鏁版嵁
+        BaseEventBus processedBus = new BaseEventBus();
+        processedBus.setTopic(ConstantManage.message_function_push_post);
+        processedBus.setType(MessageStateType.processed);
+        EventBus.getDefault().post(processedBus);
+        //閫氱煡鏈鐞嗚鏇存柊鏁版嵁
+        BaseEventBus untreatedBus = new BaseEventBus();
+        untreatedBus.setTopic(ConstantManage.message_function_push_post);
+        untreatedBus.setType(MessageStateType.untreated);
+        EventBus.getDefault().post(untreatedBus);
+    }
+
 
     private void initView() {
 
         viewBinding.toolbarTopIn.topTitleTv.setText(R.string.message_alarm_info);
         viewBinding.toolbarTopIn.topTitleTv.setTextColor(getResources().getColor(R.color.text_030D1C, null));
-        viewBinding.toolbarTopIn.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopIn.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopIn.topBarView.setBackgroundColor(getResources().getColor(R.color.text_FFFFFFFF, null));
 
         if (!UserConfigManage.getInstance().isBAccount()) {
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/message/NascentMessageFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/message/NascentMessageFragment.java
deleted file mode 100644
index 1417088..0000000
--- a/app/src/main/java/com/hdl/photovoltaic/ui/message/NascentMessageFragment.java
+++ /dev/null
@@ -1,317 +0,0 @@
-package com.hdl.photovoltaic.ui.message;
-
-
-import android.annotation.SuppressLint;
-import android.content.Intent;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.view.View;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.hdl.linkpm.sdk.core.exception.HDLException;
-import com.hdl.photovoltaic.R;
-import com.hdl.photovoltaic.base.CustomBaseFragment;
-import com.hdl.photovoltaic.config.ConstantManage;
-import com.hdl.photovoltaic.databinding.FragmentNascentMessageBinding;
-import com.hdl.photovoltaic.enums.MessageFunctionTabSwitch;
-import com.hdl.photovoltaic.enums.MessageStateType;
-import com.hdl.photovoltaic.listener.CloudCallBeak;
-import com.hdl.photovoltaic.other.HdlCommonLogic;
-import com.hdl.photovoltaic.other.HdlLogLogic;
-import com.hdl.photovoltaic.other.HdlMessageLogic;
-import com.hdl.photovoltaic.other.HdlThreadLogic;
-import com.hdl.photovoltaic.ui.adapter.MessageAdapter;
-import com.hdl.photovoltaic.ui.bean.MessageBean;
-import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 娑堟伅-鍙戠敓涓�
- */
-public class NascentMessageFragment extends CustomBaseFragment {
-    private FragmentNascentMessageBinding viewBinding;
-
-    private MessageAdapter messageNascentAdapter;
-
-    private final List<MessageBean> mList = new ArrayList<>();
-    private int currentPage = 0; // 褰撳墠椤电爜
-    private int currentTotal = 0; // 鎬婚〉鐮�
-
-
-    private boolean isLoadingMore = false; // 鏍囪姝e湪鍔犺浇鏇村鏁版嵁
-
-    LinearLayoutManager layoutManager;
-
-    @Override
-    public Object getContentView() {
-        viewBinding = FragmentNascentMessageBinding.inflate(getLayoutInflater());
-        return viewBinding.getRoot();
-    }
-
-    @Override
-    public void onBindView(Bundle savedInstanceState) {
-        //鍒濆鍖栫晫闈�
-        initView();
-        //鍒濆鍖栫洃鍚櫒
-        initEvent();
-        //杩涙潵璇诲彇涓�娆℃暟鎹�(涓轰簡鏇存柊currentPage锛宑urrentTotal杩欎釜鍊�)
-        loadNextPageNascentMessageList(1, true);
-    }
-
-
-    private void initEvent() {
-        //璁剧疆涓嬫媺绠ご棰滆壊
-        viewBinding.messageNascentSrl.setColorSchemeResources(R.color.text_FF245EC3);
-        viewBinding.messageNascentSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
-            @Override
-            public void onRefresh() {
-                viewBinding.messageNascentSrl.setRefreshing(false);
-                mList.clear();//琛ㄧず寮哄埗閲嶆柊璇锋眰绗竴椤垫秷鎭垪琛�
-                HdlMessageLogic.getInstance().clearListMessage();//琛ㄧず寮哄埗娓呯┖鎵�鏈夌紦瀛樹俊鎭�
-                loadNextPageNascentMessageList(1, true);
-            }
-        });
-        messageNascentAdapter.setNoOnclickListener(new MessageAdapter.OnclickListener() {
-            @Override
-            public void onClick(int position, MessageBean item) {
-                if (position < 0 || position > mList.size()) {
-                    return;
-                }
-                Intent intent = new Intent();
-                intent.putExtra("msgId", item.getMsgId().toString());
-                intent.setClass(_mActivity, MessageInfoActivity.class);
-                startActivity(intent);
-
-            }
-        });
-
-        viewBinding.messageNascentRecyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
-            @Override
-            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-//                super.onScrolled(recyclerView, dx, dy);
-
-                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
-                if (layoutManager == null) {
-                    return;
-                }
-                int visibleItemCount = layoutManager.getChildCount();
-                int totalItemCount = layoutManager.getItemCount();
-                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
-                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
-                    if (!isLoadingMore) {
-                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
-                        HdlLogLogic.print("--->婊戝姩鍒颁簡搴曢儴");
-                        loadNextPageNascentMessageList(++currentPage, false);
-                    }
-                }
-            }
-        });
-    }
-
-    private void initView() {
-        layoutManager = new LinearLayoutManager(_mActivity);
-        viewBinding.messageNascentRecyclerview.setLayoutManager(layoutManager);
-        messageNascentAdapter = new MessageAdapter(this.mList, _mActivity);
-        viewBinding.messageNascentRecyclerview.setAdapter(messageNascentAdapter);
-    }
-
-    /**
-     * 鍒锋柊鍒楄〃鏁版嵁
-     */
-    private void updateListData() {
-        HdlThreadLogic.runMainThread(new Runnable() {
-            @Override
-            public void run() {
-                //鏇存柊鏈湴缂撳瓨鏁版嵁
-                updatelocalityCacheData();
-                //鍒锋柊鍒楄〃
-                if (messageNascentAdapter != null) {
-                    messageNascentAdapter.setList(mList);
-                    messageNascentAdapter.notifyDataSetChanged();
-                }
-                //鏄剧ず鏈淇℃伅鎬绘暟閲�
-                getUnreadCount();
-                //鏄剧ず娌℃暟鎹甎i鏍峰紡
-                nullDataUpdateUi();
-
-            }
-        });
-    }
-
-    /**
-     * 鍒锋柊銆愬彂鐢熶腑銆戜俊鎭暟閲忔�绘暟
-     */
-    private void refreshNascentCount(String totalCount) {
-        HdlThreadLogic.runMainThread(new Runnable() {
-            @Override
-            public void run() {
-                TextView textView = _mActivity.findViewById(R.id.message_tab_nascent_title_tv);
-                if (textView != null) {
-                    textView.setText(getText(R.string.message_nascent));
-                    if (!TextUtils.isEmpty(totalCount) && !totalCount.equals("0")) {
-                        String s = getText(R.string.message_nascent) + "(" + totalCount + ")";
-                        textView.setText(s);
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * 鍒锋柊瑙掓爣銆愭湭璇汇�戜俊鎭暟閲忔�绘暟
-     */
-    private void refreshUnreadNascentCount(String unreadCount) {
-        HdlThreadLogic.runMainThread(new Runnable() {
-            @SuppressLint("SetTextI18n")
-            @Override
-            public void run() {
-                TextView textView = _mActivity.findViewById(R.id.my_message_bottom_il2).findViewById(R.id.red_count_tv);
-                if (textView != null) {
-                    if (TextUtils.isEmpty(unreadCount) || unreadCount.equals("0")) {
-                        textView.setVisibility(View.GONE);
-                    } else {
-                        textView.setVisibility(View.VISIBLE);
-                        if (unreadCount.length() > 2) {
-                            textView.setText("99+");
-                        } else {
-                            textView.setText(unreadCount);
-                        }
-                    }
-                }
-            }
-        });
-    }
-
-    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
-    public void onEventMessage(BaseEventBus eventBus) {
-        super.onEventMessage(eventBus);
-        if (eventBus == null) {
-            return;
-        }
-        //鎺ユ敹澶栭儴鐐瑰嚮浜嬩欢
-        if (eventBus.getTopic().equals(ConstantManage.message_function_tab_switch)) {
-            if (eventBus.getType().equals(MessageFunctionTabSwitch.nascent.toString())) {
-                // 鍙栨秷绮樻�т簨浠�
-                EventBus.getDefault().removeStickyEvent(eventBus);
-
-            }
-
-        } else if (eventBus.getTopic().equals(ConstantManage.message_function_push_post)) {
-            if (eventBus.getType().equals(MessageStateType.untreated)) {
-                //娑堟伅璇︽儏鍥炶皟
-                updatelocalityCacheData();
-                updateListData();
-            }
-        }
-    }
-
-    /**
-     * 鏇存柊鏈湴缂撳瓨鏁版嵁
-     */
-    private void updatelocalityCacheData() {
-        mList.clear();
-        mList.addAll(HdlMessageLogic.getInstance().getNascentMessageMemoryList());
-    }
-
-    /**
-     * 鍔犺浇涓�椤垫暟鎹�
-     *
-     * @param pageNo        椤垫暟
-     * @param isShowLoading 鏄惁鍚姩鍔犺浇妗� true鍚姩
-     */
-    private void loadNextPageNascentMessageList(int pageNo, boolean isShowLoading) {
-        //绗竴椤佃鍙栨暟鎹己鍒惰
-        if (pageNo > 1 && currentPage > currentTotal) {
-            --currentPage;
-            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
-            return;
-        }
-        isLoadingMore = true;//鏍囪璇诲彇鐘舵��
-        if (isShowLoading) {
-            showLoading();
-        }
-        HdlMessageLogic.getInstance().getPageNoMessageList(pageNo, MessageStateType.untreated, new CloudCallBeak<HdlMessageLogic.MessageListClass>() {
-            @Override
-            public void onSuccess(HdlMessageLogic.MessageListClass messageListClass) {
-                if (messageListClass != null) {
-                    currentTotal = (int) messageListClass.getTotalPage();
-                    currentPage = (int) messageListClass.getPageNo();
-                    updateListData();
-                }
-                isLoadingMore = false;
-                if (isShowLoading) {
-                    hideLoading();
-                }
-            }
-
-            @Override
-            public void onFailure(HDLException e) {
-                if (currentPage > 1) {
-                    --currentPage;
-                }
-                isLoadingMore = false;
-                if (isShowLoading) {
-                    hideLoading();
-                }
-            }
-        });
-    }
-
-    /**
-     * 璇诲彇娑堟伅銆愭湭璇绘暟閲忋��
-     */
-    private void getUnreadCount() {
-        HdlMessageLogic.getInstance().getMessageUntreatedCount("",new CloudCallBeak<String>() {
-            @Override
-            public void onSuccess(String data) {
-
-                HdlThreadLogic.runMainThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        JSONObject jsonObject = JSON.parseObject(data);
-                        if (jsonObject.containsKey("untreatedCount")) {
-                            //鏈鐞嗘暟閲�
-                            String untreatedCount = jsonObject.getString("untreatedCount");
-                            refreshNascentCount(untreatedCount);
-                        }
-                        if (jsonObject.containsKey("unreadCount")) {
-                            //鏈鏁伴噺
-                            String unreadCount = jsonObject.getString("unreadCount");
-                            refreshUnreadNascentCount(unreadCount);
-                        }
-                    }
-                });
-
-            }
-
-            @Override
-            public void onFailure(HDLException e) {
-                TextView textView = _mActivity.findViewById(R.id.my_message_bottom_il2).findViewById(R.id.red_count_tv);
-                if (textView != null) {
-                    textView.setVisibility(View.GONE);
-                }
-            }
-        });
-    }
-
-
-    /**
-     * 娌℃湁鐢电珯鍒楄〃鐨勬牱寮�
-     */
-    private void nullDataUpdateUi() {
-        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity, viewBinding.nullDataIc.getRoot(), viewBinding.nullDataIc.nullDataGifAnimationIv, viewBinding.nullDataIc.nullDataTv, getString(R.string.message_alarm_data_null), mList.size() > 0);
-    }
-}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/message/RecoverMessageFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/message/RecoverMessageFragment.java
deleted file mode 100644
index e42864b..0000000
--- a/app/src/main/java/com/hdl/photovoltaic/ui/message/RecoverMessageFragment.java
+++ /dev/null
@@ -1,259 +0,0 @@
-package com.hdl.photovoltaic.ui.message;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
-import com.google.gson.Gson;
-import com.hdl.linkpm.sdk.core.exception.HDLException;
-import com.hdl.photovoltaic.R;
-import com.hdl.photovoltaic.base.CustomBaseFragment;
-import com.hdl.photovoltaic.config.ConstantManage;
-import com.hdl.photovoltaic.databinding.FragmentRecoverMessageBinding;
-import com.hdl.photovoltaic.enums.MessageFunctionTabSwitch;
-import com.hdl.photovoltaic.enums.MessageStateType;
-import com.hdl.photovoltaic.listener.CloudCallBeak;
-import com.hdl.photovoltaic.other.HdlCommonLogic;
-import com.hdl.photovoltaic.other.HdlLogLogic;
-import com.hdl.photovoltaic.other.HdlMessageLogic;
-import com.hdl.photovoltaic.other.HdlThreadLogic;
-import com.hdl.photovoltaic.ui.adapter.MessageAdapter;
-import com.hdl.photovoltaic.ui.bean.BUserInfo;
-import com.hdl.photovoltaic.ui.bean.MessageBean;
-import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 娑堟伅-宸叉仮澶�
- */
-public class RecoverMessageFragment extends CustomBaseFragment {
-
-    FragmentRecoverMessageBinding viewBinding;
-
-    private MessageAdapter messageRecoverAdapter;
-    private int currentPage = 0; // 褰撳墠椤电爜
-    private int currentTotal = 0; // 鎬婚〉鐮�
-
-    private int totalCount = 0;//娑堟伅鏁伴噺鎬绘暟
-
-    private boolean isLoadingMore = false; // 鏍囪姝e湪鍔犺浇鏇村鏁版嵁
-
-    private final List<MessageBean> mList = new ArrayList<>();
-
-    @Override
-    public Object getContentView() {
-        viewBinding = FragmentRecoverMessageBinding.inflate(getLayoutInflater());
-        return viewBinding.getRoot();
-    }
-
-    @Override
-    public void onBindView(Bundle savedInstanceState) {
-        //鍒濆鍖栫晫闈�
-        initView();
-        //鍒濆鍖栫洃鍚櫒
-        initEvent();
-        //杩涙潵璇诲彇涓�娆℃暟鎹�(涓轰簡鏇存柊currentPage锛宑urrentTotal杩欎釜鍊�)
-        loadNextPageRecoverMessageList(1, true);
-    }
-
-    /**
-     * 鏇存柊鏈湴缂撳瓨鏁版嵁
-     */
-    private void updatelocalityCacheData() {
-        mList.clear();
-        mList.addAll(HdlMessageLogic.getInstance().getRecoverMessageMemoryList());
-
-    }
-
-    private void initEvent() {
-        //璁剧疆涓嬫媺绠ご棰滆壊
-        viewBinding.messageRecoverSrl.setColorSchemeResources(R.color.text_FF245EC3);
-        viewBinding.messageRecoverSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
-            @Override
-            public void onRefresh() {
-                viewBinding.messageRecoverSrl.setRefreshing(false);
-                mList.clear();//琛ㄧず寮哄埗閲嶆柊璇锋眰绗竴椤垫秷鎭垪琛�
-                HdlMessageLogic.getInstance().clearListMessage();//琛ㄧず寮哄埗娓呯┖鎵�鏈夌紦瀛樹俊鎭�
-                loadNextPageRecoverMessageList(1, true);
-            }
-        });
-        messageRecoverAdapter.setNoOnclickListener(new MessageAdapter.OnclickListener() {
-            @Override
-            public void onClick(int position, MessageBean item) {
-                if (position < 0 || position > mList.size()) {
-                    return;
-                }
-                Intent intent = new Intent();
-                intent.putExtra("msgId", item.getMsgId().toString());
-                intent.setClass(_mActivity, MessageInfoActivity.class);
-                startActivity(intent);
-            }
-        });
-
-        viewBinding.messageRecoverRecyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
-            @Override
-            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-//                super.onScrolled(recyclerView, dx, dy);
-
-                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
-                if (layoutManager == null) {
-                    return;
-                }
-                int visibleItemCount = layoutManager.getChildCount();
-                int totalItemCount = layoutManager.getItemCount();
-                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
-                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
-                    if (!isLoadingMore) {
-                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
-                        HdlLogLogic.print("--->婊戝姩鍒颁簡搴曢儴");
-                        loadNextPageRecoverMessageList(++currentPage, false);
-                    }
-                }
-            }
-        });
-    }
-
-
-    private void initView() {
-        viewBinding.messageRecoverRecyclerview.setLayoutManager(new LinearLayoutManager(_mActivity));
-        messageRecoverAdapter = new MessageAdapter(this.mList, _mActivity);
-        viewBinding.messageRecoverRecyclerview.setAdapter(messageRecoverAdapter);
-    }
-
-
-    /**
-     * 鍒锋柊鍒楄〃鏁版嵁
-     */
-    private void updateListData() {
-
-        HdlThreadLogic.runMainThread(new Runnable() {
-            @Override
-            public void run() {
-                //鏇存柊鏈湴缂撳瓨鏁版嵁
-                updatelocalityCacheData();
-                //鍒锋柊鍒楄〃
-                if (messageRecoverAdapter != null) {
-                    messageRecoverAdapter.setList(mList);
-                    messageRecoverAdapter.notifyDataSetChanged();
-                }
-                //鍒锋柊銆愬凡鎭㈠銆戜俊鎭暟閲忔�绘暟
-                refreshRecoverCount();
-                //鏄剧ず娌℃暟鎹甎i鏍峰紡
-                nullDataUpdateUi();
-            }
-        });
-
-    }
-
-
-    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
-    public void onEventMessage(BaseEventBus eventBus) {
-        super.onEventMessage(eventBus);
-        if (eventBus == null) {
-            return;
-        }
-        //鎺ユ敹澶栭儴鐐瑰嚮浜嬩欢
-        if (eventBus.getTopic().equals(ConstantManage.message_function_tab_switch)) {
-            if (eventBus.getType().equals(MessageFunctionTabSwitch.recover.toString())) {
-                // 鍙栨秷绮樻�т簨浠�
-                EventBus.getDefault().removeStickyEvent(eventBus);
-            }
-        } else if (eventBus.getTopic().equals(ConstantManage.message_function_push_post)) {
-            if (eventBus.getType().equals(MessageStateType.processed)) {
-                //娑堟伅璇︽儏鍥炶皟
-                updatelocalityCacheData();
-                ++totalCount;
-                updateListData();
-
-            }
-        }
-    }
-
-    /**
-     * 鍔犺浇涓�椤垫暟鎹�
-     *
-     * @param pageNo        椤垫暟
-     * @param isShowLoading 鏄惁鍚姩鍔犺浇妗� true鍚姩
-     */
-    private void loadNextPageRecoverMessageList(int pageNo, boolean isShowLoading) {
-        //绗竴椤佃鍙栨暟鎹己鍒惰
-        if (pageNo > 1 && currentPage > currentTotal) {
-            --currentPage;
-            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
-            return;
-        }
-        isLoadingMore = true;//鏍囪璇诲彇鐘舵��
-        if (isShowLoading) {
-            showLoading();
-        }
-        HdlMessageLogic.getInstance().getPageNoMessageList(pageNo, MessageStateType.processed, new CloudCallBeak<HdlMessageLogic.MessageListClass>() {
-            @Override
-            public void onSuccess(HdlMessageLogic.MessageListClass messageListClass) {
-                if (messageListClass != null) {
-                    currentTotal = (int) messageListClass.getTotalPage();
-                    currentPage = (int) messageListClass.getPageNo();
-                    totalCount = (int) messageListClass.getTotalCount();
-                    updateListData();
-                }
-                isLoadingMore = false;
-                if (isShowLoading) {
-                    hideLoading();
-                }
-            }
-
-            @Override
-            public void onFailure(HDLException e) {
-                if (currentPage > 1) {
-                    --currentPage;
-                }
-                isLoadingMore = false;
-                if (isShowLoading) {
-                    hideLoading();
-                }
-            }
-        });
-    }
-
-
-    /**
-     * 鍒锋柊銆愬凡鎭㈠銆戜俊鎭暟閲忔�绘暟
-     */
-    private void refreshRecoverCount() {
-        HdlThreadLogic.runMainThread(new Runnable() {
-            @Override
-            public void run() {
-                TextView textView = _mActivity.findViewById(R.id.message_tab_recover_title_tv);
-                if (textView != null) {
-                    textView.setText(getText(R.string.message_recover));
-                    if (mList.size() > 0) {
-                        String s = getText(R.string.message_recover) + "(" + totalCount + ")";
-                        textView.setText(s);
-                    }
-                }
-
-            }
-        });
-    }
-
-    /**
-     * 娌℃湁鐢电珯鍒楄〃鐨勬牱寮�
-     */
-    private void nullDataUpdateUi() {
-        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity,
-                viewBinding.nullDataIc.getRoot(),
-                viewBinding.nullDataIc.nullDataGifAnimationIv,
-                viewBinding.nullDataIc.nullDataTv, getString(R.string.message_alarm_data_null), mList.size() > 0);
-    }
-
-}
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/message/SearchMessageActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/message/SearchMessageActivity.java
new file mode 100644
index 0000000..62986e6
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/message/SearchMessageActivity.java
@@ -0,0 +1,404 @@
+package com.hdl.photovoltaic.ui.message;
+
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.CustomBaseActivity;
+import com.hdl.photovoltaic.bean.PageNumberObject;
+import com.hdl.photovoltaic.databinding.ActivitySearchMessgeBinding;
+import com.hdl.photovoltaic.enums.MessageStateType;
+import com.hdl.photovoltaic.enums.ShowErrorMode;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlDeviceLogic;
+import com.hdl.photovoltaic.other.HdlFileLogic;
+import com.hdl.photovoltaic.other.HdlLogLogic;
+import com.hdl.photovoltaic.other.HdlMessageLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.adapter.SearchHistoryAdapter;
+import com.hdl.photovoltaic.ui.adapter.SearchMessageAdapter;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
+import com.hdl.photovoltaic.ui.bean.MessageBean;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 娑堟伅鎼滅储鐣岄潰
+ */
+public class SearchMessageActivity extends CustomBaseActivity {
+
+    private ActivitySearchMessgeBinding viewBinding;
+
+    SearchMessageAdapter searchMessageAdapter;//璁惧閫傞厤鍣�
+    SearchHistoryAdapter searchHistoryAdapter;//鍘嗗彶璁板綍閫傞厤鍣�
+
+    private final List<MessageBean> mList = new ArrayList<>();
+    private int mCurrentPage = 0; // 褰撳墠椤电爜
+    private int mCurrentTotal = 0; // 鎬婚〉鐮�
+    private boolean isLoadingMore = false; // 鏍囪姝e湪鍔犺浇鏇村鏁版嵁
+
+    private String currSearchText;
+
+    List<String> searchHistoryTitleList = new ArrayList<>();
+
+    @Override
+    public Object getContentView() {
+        viewBinding = ActivitySearchMessgeBinding.inflate(getLayoutInflater());
+        return viewBinding.getRoot();
+    }
+
+    @Override
+    public void onBindView(Bundle savedInstanceState) {
+        setStatusBarTranslucent();
+        //鍘嗗彶璁板綍鏂囦欢澶瑰垱寤�
+        HdlFileLogic.getInstance().createFileDir(HdlFileLogic.getInstance().getCurrentUserRootPath());
+        //鍒濆鍖栨暟鎹�
+        initData();
+        //鍒濆鍖�
+        initView();
+        //鍒濆鍖栫晫闈㈢洃鍚櫒
+        initEvent();
+    }
+
+    private void initData() {
+        try {
+            String json = HdlFileLogic.getInstance().readFile(getHistoryFileNamePath());
+            if (TextUtils.isEmpty(json)) {
+                return;
+            }
+            searchHistoryTitleList = new Gson().fromJson(json, new TypeToken<List<String>>() {
+            }.getType());
+        } catch (Exception ignored) {
+        }
+    }
+
+
+    private void initEvent() {
+
+        //鍚庨��
+        viewBinding.backRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+        viewBinding.messageSearchEt.addTextChangedListener(textWatcher);
+        //鎼滅储
+        viewBinding.powerStationSearchTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //鎼滅储鍏抽敭瀛�
+                currSearchText = viewBinding.messageSearchEt.getText().toString().replace(" ", "");
+                if (TextUtils.isEmpty(currSearchText)) {
+                    HdlThreadLogic.toast(_mActivity, R.string.search_content_null);
+                    return;
+                }
+                viewBinding.historyListParent.setVisibility(View.GONE);
+                viewBinding.listParent.setVisibility(View.VISIBLE);
+                addSearchTextToList();
+                loadNextPageMessageList(true, 1, viewBinding.messageSearchEt.getText().toString(), true);
+            }
+        });
+
+
+        //涓嬫媺绠ご棰滆壊
+        viewBinding.listSrl.setColorSchemeResources(R.color.text_FF245EC3);
+        //涓嬫媺璇诲彇
+        viewBinding.listSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                viewBinding.listSrl.setRefreshing(false);
+                loadNextPageMessageList(true, 1, viewBinding.messageSearchEt.getText().toString(), true);
+            }
+        });
+        //涓婃媺璇诲彇
+        viewBinding.listRcv.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+                if (layoutManager == null) {
+                    return;
+                }
+                int visibleItemCount = layoutManager.getChildCount();
+                int totalItemCount = layoutManager.getItemCount();
+                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
+                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
+                    if (!isLoadingMore) {
+                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
+                        HdlLogLogic.print("--->婊戝姩鍒颁簡搴曢儴");
+                        loadNextPageMessageList(false, ++mCurrentPage, viewBinding.messageSearchEt.getText().toString(), false);
+                    }
+                }
+            }
+        });
+        //娓呴櫎
+        viewBinding.powerStationClearIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                currSearchText = "";
+                viewBinding.messageSearchEt.setText("");
+                viewBinding.historyListParent.setVisibility(View.VISIBLE);
+                viewBinding.listParent.setVisibility(View.GONE);
+                searchHistoryAdapter.setList(searchHistoryTitleList);
+                clearCacheData();
+            }
+        });
+        //鍒犻櫎
+        viewBinding.messageDelIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                searchHistoryTitleList = new ArrayList<>();
+                searchHistoryAdapter.setList(searchHistoryTitleList);
+                HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
+            }
+        });
+        //鍘嗗彶璁板綍鐐瑰嚮浜嬩欢
+        searchHistoryAdapter.setOnclickListener(new SearchHistoryAdapter.OnClickListener() {
+            @Override
+            public void onClick(int position, String title) {
+                viewBinding.messageSearchEt.setText(title);
+            }
+        });
+        //娑堟伅鐐瑰嚮鏄簨浠�
+        searchMessageAdapter.setOnclickListener(new SearchMessageAdapter.OnClickListener() {
+            @Override
+            public void onClick(int position, MessageBean messageBean) {
+                Intent intent = new Intent();
+                intent.putExtra("msgId", messageBean.getMsgId().toString());
+                intent.setClass(_mActivity, MessageInfoActivity.class);
+                startActivity(intent);
+            }
+        });
+
+    }
+
+    private void initView() {
+        viewBinding.historyListParent.setVisibility(View.VISIBLE);
+        viewBinding.listParent.setVisibility(View.GONE);
+        viewBinding.powerStationClearIv.setVisibility(View.GONE);
+        //鍒濆鍖栧巻鍙茶褰曢�傞厤鍣�
+        searchHistoryAdapter = new SearchHistoryAdapter(_mActivity);
+        viewBinding.historyListRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.historyListRcv.setAdapter(searchHistoryAdapter);
+        searchHistoryAdapter.setList(searchHistoryTitleList);
+        //鍒濆鍖栨秷鎭�傞厤鍣�
+        searchMessageAdapter = new SearchMessageAdapter(_mActivity);
+        viewBinding.listRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.listRcv.setAdapter(searchMessageAdapter);
+    }
+
+
+    /**
+     * 杈撳叆鐢电珯鍚嶇О杩涜杩囨护
+     */
+    private final TextWatcher textWatcher = new TextWatcher() {
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            String et = viewBinding.messageSearchEt.getText().toString().replace(" ", "");
+            if (TextUtils.isEmpty(et)) {
+                viewBinding.powerStationClearIv.setVisibility(View.GONE);
+            } else {
+                viewBinding.powerStationClearIv.setVisibility(View.VISIBLE);
+            }
+            viewBinding.messageSearchEt.setSelection(viewBinding.messageSearchEt.length());
+
+        }
+    };
+
+    /**
+     * 鍒锋柊鍒楄〃鏁版嵁
+     */
+    private void updateListData() {
+        HdlThreadLogic.runMainThread(new Runnable() {
+            @Override
+            public void run() {
+                if (searchMessageAdapter != null) {
+                    searchMessageAdapter.setList(mList);
+                }
+            }
+        });
+    }
+
+    /**
+     * 鐗╃悊鎸夐敭杩斿洖浜嬩欢
+     */
+    @Override
+    public void onBackPressed() {
+        super.onBackPressed();
+    }
+
+    @Override
+    protected void onDestroy() {
+        viewBinding.messageSearchEt.removeTextChangedListener(textWatcher);
+        if (searchHistoryTitleList.size() > 0) {
+            HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
+            HdlFileLogic.getInstance().appendFile(getHistoryFileNamePath(), new Gson().toJson(searchHistoryTitleList));
+        }
+        super.onDestroy();
+    }
+
+
+    /**
+     * 鍔犺浇涓�椤垫暟鎹�
+     *
+     * @param isShowLoading 鏄惁鍚姩鍔犺浇妗� true鍚姩
+     * @param pageNo        椤垫暟
+     * @param search_title  鎼滅储鏂囨湰
+     * @param isClear       true琛ㄧず娓呯┖缂撳瓨
+     */
+    private void loadNextPageMessageList(boolean isShowLoading, int pageNo, String search_title, boolean isClear) {
+        if (isClear) {
+            //琛ㄧず浠庣涓�椤靛彲浠ヨ鍙栵紝榛樿娓呯┖鎵�鏈夌紦瀛樻暟鎹�;
+            clearCacheData();
+        }
+        //绗竴椤佃鍙栨暟鎹己鍒惰
+        if (pageNo > 1 && mCurrentPage > mCurrentTotal) {
+            --mCurrentPage;
+            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
+            return;
+        }
+        isLoadingMore = true;//鏍囪璇诲彇鐘舵��
+        if (isShowLoading) {
+            showLoading();
+        }
+        HdlMessageLogic.getInstance().getPageNoMessageList(
+                "",
+                pageNo,
+                "",
+                "",
+                "",
+                "",
+                "",
+                "",
+                "",
+                search_title,
+                new CloudCallBeak<HdlMessageLogic.MessageListClass>() {
+                    @Override
+                    public void onSuccess(HdlMessageLogic.MessageListClass messageListClass) {
+                        if (messageListClass != null) {
+                            mCurrentTotal = (int) messageListClass.getTotalPage();
+                            mCurrentPage = (int) messageListClass.getPageNo();
+                            setMessageList(messageListClass.getList());
+                            updateListData();
+                        }
+                        isLoadingMore = false;
+                        if (isShowLoading) {
+                            hideLoading();
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+                        if (mCurrentPage > 1) {
+                            --mCurrentPage;
+                        }
+                        isLoadingMore = false;
+                        if (isShowLoading) {
+                            hideLoading();
+                        }
+                    }
+                });
+
+
+    }
+
+
+    private void clearCacheData() {
+        if (mList != null && mList.size() > 0) {
+            mList.clear();
+        }
+    }
+
+    public void setMessageList(List<MessageBean> list) {
+        if (list == null || list.size() == 0) {
+            return;
+        }
+        if (this.mList.size() == 0) {
+            this.mList.addAll(list);
+            return;
+        }
+        for (int i = 0; i < list.size(); i++) {
+            this.setSingleDevice(list.get(i));
+        }
+    }
+
+    /**
+     * 娣诲姞璁惧鍒板垪琛ㄩ噷闈�
+     *
+     * @param messageBean -璁惧瀵硅薄
+     */
+    public void setSingleDevice(MessageBean messageBean) {
+        try {
+            if (messageBean == null) {
+                return;
+            }
+            boolean if_boolean = false;
+            for (int i = 0; i < mList.size(); i++) {
+                if (mList.get(i).getHomeId().equals(messageBean.getHomeId())) {
+                    //瀛樺湪鏇挎崲
+                    mList.remove(i);
+                    mList.add(i, messageBean);
+                    if_boolean = true;
+                    break;
+                }
+            }
+            if (!if_boolean) {
+                //娌℃湁娣诲姞
+                this.mList.add(messageBean);
+            }
+        } catch (Exception e) {
+            String mes = e.getMessage();
+            HdlLogLogic.print("--->" + mes);
+        }
+    }
+
+    /**
+     * 娣诲姞鍘嗗彶璁板綍
+     */
+    private void addSearchTextToList() {
+        for (int i = 0; i < searchHistoryTitleList.size(); i++) {
+            if (searchHistoryTitleList.get(i).equals(currSearchText)) {
+                searchHistoryTitleList.remove(searchHistoryTitleList.get(i));
+            }
+        }
+        searchHistoryTitleList.add(currSearchText);
+        // 鍊掑簭鎺掑垪鏁版嵁(鎼滅储鏈�鍚庢帓鍦ㄥ墠闈�)
+        Collections.reverse(searchHistoryTitleList);
+        if (searchHistoryTitleList.size() > 10) {
+            //鍘嗗彶璁板綍涓嶈兘瓒呭嚭10
+            searchHistoryTitleList.remove(searchHistoryTitleList.get(11));
+        }
+
+    }
+
+    /**
+     * 鑾峰彇銆愭悳绱㈠巻鍙茶褰曟枃浠躲�戝叏璺緞
+     */
+    public String getHistoryFileNamePath() {
+        return HdlFileLogic.getInstance().getCurrentUserRootPath() + "/message.txt";
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/newC/MessageCenterList.java b/app/src/main/java/com/hdl/photovoltaic/ui/newC/MessageCenterList.java
index bb187e1..4d65283 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/newC/MessageCenterList.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/newC/MessageCenterList.java
@@ -104,7 +104,7 @@
 
     private void initEvent() {
         //杩斿洖鎸夐挳
-        viewBinding.toolbarTopMessageCenterListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopMessageCenterListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 clearCacheData();
@@ -281,7 +281,7 @@
 
     private void initView() {
         viewBinding.toolbarTopMessageCenterListRl.getRoot().setBackgroundColor(getColor(R.color.text_FFFFFFFF));
-        viewBinding.toolbarTopMessageCenterListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopMessageCenterListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopMessageCenterListRl.topLeftIv.setImageResource(R.drawable.back_c);
         viewBinding.toolbarTopMessageCenterListRl.topTitleTv.setText(R.string.set_message_center);
         viewBinding.toolbarTopMessageCenterListRl.topMoreBtn.setVisibility(View.VISIBLE);
@@ -336,10 +336,11 @@
         } else {
             messageStateType = MessageStateType.processed;
         }
-        HdlMessageLogic.getInstance().getPageNoMessageList_C(UserConfigManage.getInstance().getHomeId(), pageNo, messageStateType,
+        HdlMessageLogic.getInstance().getPageNoMessageList(UserConfigManage.getInstance().getHomeId(), pageNo, messageStateType,
                 deviceType_filter_key, deviceType_filter_value,
                 type_filter_key, type_filter_value,
                 timeType_filter_key, timeType_filter_value,
+                "",
                 new CloudCallBeak<HdlMessageLogic.MessageListClass>() {
                     @Override
                     public void onSuccess(HdlMessageLogic.MessageListClass messageListClass) {
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java b/app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java
index c39a689..329a7f4 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/newC/PowerStationsListEdit.java
@@ -65,7 +65,7 @@
 
     private void initEvent() {
         //杩斿洖鎸夐挳
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 if (!is_edit) {
@@ -158,7 +158,7 @@
 
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.getRoot().setBackgroundColor(getColor(R.color.text_FFFFFFFF));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topLeftIv.setImageResource(R.drawable.back_c);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.power_station_selection);
         viewBinding.toolbarTopFragmentHouseListRl.topMoreBtn.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/DeviceSearchActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/DeviceSearchActivity.java
new file mode 100644
index 0000000..564b02a
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/DeviceSearchActivity.java
@@ -0,0 +1,393 @@
+package com.hdl.photovoltaic.ui.powerstation;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.View;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.CustomBaseActivity;
+import com.hdl.photovoltaic.bean.PageNumberObject;
+import com.hdl.photovoltaic.databinding.ActivityDeviceSearchBinding;
+import com.hdl.photovoltaic.enums.ShowErrorMode;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlDeviceLogic;
+import com.hdl.photovoltaic.other.HdlFileLogic;
+import com.hdl.photovoltaic.other.HdlLogLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.adapter.DeviceInfoAdapter;
+import com.hdl.photovoltaic.ui.adapter.SearchDeviceAdapter;
+import com.hdl.photovoltaic.ui.adapter.SearchHistoryAdapter;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 璁惧鎼滅储鐣岄潰
+ */
+public class DeviceSearchActivity extends CustomBaseActivity {
+
+
+    private ActivityDeviceSearchBinding viewBinding;
+
+    SearchDeviceAdapter searchDeviceAdapter;//璁惧閫傞厤鍣�
+    SearchHistoryAdapter searchHistoryAdapter;//鍘嗗彶璁板綍閫傞厤鍣�
+
+    private List<DeviceBean> deviceList = new ArrayList<>();
+
+    private int currentHouseListPage = 0; // 褰撳墠鐢电珯鍒楄〃椤电爜
+    private int currentHouseListTotal = 0; // 鐢电珯鍒楄〃鎬婚〉鐮�
+    private boolean isHouseLoadingMore = false; // 鏍囪鐢电珯鍒楄〃姝e湪鍔犺浇鏇村鏁版嵁
+
+    private String currSearchText;
+
+    List<String> searchHistoryTitleList = new ArrayList<>();
+
+    @Override
+    public Object getContentView() {
+        viewBinding = ActivityDeviceSearchBinding.inflate(getLayoutInflater());
+        return viewBinding.getRoot();
+    }
+
+    @Override
+    public void onBindView(Bundle savedInstanceState) {
+        setStatusBarTranslucent();
+        //鍘嗗彶璁板綍鏂囦欢澶瑰垱寤�
+        HdlFileLogic.getInstance().createFileDir(HdlFileLogic.getInstance().getCurrentUserRootPath());
+        //鍒濆鍖栨暟鎹�
+        initData();
+        //鍒濆鍖�
+        initView();
+        //鍒濆鍖栫晫闈㈢洃鍚櫒
+        initEvent();
+    }
+
+    private void initData() {
+        try {
+            String json = HdlFileLogic.getInstance().readFile(getHistoryFileNamePath());
+            if (TextUtils.isEmpty(json)) {
+                return;
+            }
+            searchHistoryTitleList = new Gson().fromJson(json, new TypeToken<List<String>>() {
+            }.getType());
+        } catch (Exception ignored) {
+        }
+    }
+
+
+    private void initEvent() {
+
+        //鍚庨��
+        viewBinding.backRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+        viewBinding.powerStationSearchEt.addTextChangedListener(textWatcher);
+
+
+        //鎼滅储
+        viewBinding.powerStationSearchTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //鎼滅储鍏抽敭瀛�
+                currSearchText = viewBinding.powerStationSearchEt.getText().toString().replace(" ", "");
+                if (TextUtils.isEmpty(currSearchText)) {
+                    HdlThreadLogic.toast(_mActivity, R.string.search_content_null);
+                    return;
+                }
+                viewBinding.historyListParent.setVisibility(View.GONE);
+                viewBinding.listParent.setVisibility(View.VISIBLE);
+                addSearchTextToList();
+                loadNextPageHouseList(true, 1, true);
+            }
+        });
+
+
+        //涓嬫媺绠ご棰滆壊
+        viewBinding.listSrl.setColorSchemeResources(R.color.text_FF245EC3);
+        //涓嬫媺璇诲彇
+        viewBinding.listSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                viewBinding.listSrl.setRefreshing(false);
+                loadNextPageHouseList(true, 1, true);
+            }
+        });
+        //涓婃媺璇诲彇
+        viewBinding.listRcv.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+                if (layoutManager == null) {
+                    return;
+                }
+                int visibleItemCount = layoutManager.getChildCount();
+                int totalItemCount = layoutManager.getItemCount();
+                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
+                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
+                    if (!isHouseLoadingMore) {
+                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
+                        HdlLogLogic.print("--->婊戝姩鍒颁簡搴曢儴");
+                        loadNextPageHouseList(false, ++currentHouseListPage, false);
+                    }
+                }
+            }
+        });
+        //娓呴櫎
+        viewBinding.powerStationClearIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                currSearchText = "";
+                viewBinding.powerStationSearchEt.setText("");
+                viewBinding.historyListParent.setVisibility(View.VISIBLE);
+                viewBinding.listParent.setVisibility(View.GONE);
+                searchHistoryAdapter.setList(searchHistoryTitleList);
+                clearData();
+            }
+        });
+        //鍒犻櫎
+        viewBinding.powerStationDelIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                searchHistoryTitleList = new ArrayList<>();
+                searchHistoryAdapter.setList(searchHistoryTitleList);
+                HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
+            }
+        });
+        //鍘嗗彶璁板綍鐐瑰嚮浜嬩欢
+        searchHistoryAdapter.setOnclickListener(new SearchHistoryAdapter.OnClickListener() {
+            @Override
+            public void onClick(int position, String title) {
+                viewBinding.powerStationSearchEt.setText(title);
+            }
+        });
+        //鐢电珯鐐瑰嚮鏄簨浠�
+        searchDeviceAdapter.setOnclickListener(new DeviceInfoAdapter.OnClickListener() {
+            @Override
+            public void onClick(int position, DeviceBean deviceBean) {
+
+            }
+        });
+
+    }
+
+    private void initView() {
+        viewBinding.historyListParent.setVisibility(View.VISIBLE);
+        viewBinding.listParent.setVisibility(View.GONE);
+        viewBinding.powerStationClearIv.setVisibility(View.GONE);
+        //鍒濆鍖栧巻鍙茶褰曢�傞厤鍣�
+        searchHistoryAdapter = new SearchHistoryAdapter(_mActivity);
+        viewBinding.historyListRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.historyListRcv.setAdapter(searchHistoryAdapter);
+        searchHistoryAdapter.setList(searchHistoryTitleList);
+        //鍒濆鍖栫數绔欓�傞厤鍣�
+        searchDeviceAdapter = new SearchDeviceAdapter(_mActivity);
+        viewBinding.listRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.listRcv.setAdapter(searchDeviceAdapter);
+    }
+
+
+    /**
+     * 杈撳叆鐢电珯鍚嶇О杩涜杩囨护
+     */
+    private final TextWatcher textWatcher = new TextWatcher() {
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            String et = viewBinding.powerStationSearchEt.getText().toString().replace(" ", "");
+            if (TextUtils.isEmpty(et)) {
+                viewBinding.powerStationClearIv.setVisibility(View.GONE);
+            } else {
+                viewBinding.powerStationClearIv.setVisibility(View.VISIBLE);
+            }
+            viewBinding.powerStationSearchEt.setSelection(viewBinding.powerStationSearchEt.length());
+
+        }
+    };
+
+    /**
+     * 鐗╃悊鎸夐敭杩斿洖浜嬩欢
+     */
+    @Override
+    public void onBackPressed() {
+        super.onBackPressed();
+    }
+
+    @Override
+    protected void onDestroy() {
+        viewBinding.powerStationSearchEt.removeTextChangedListener(textWatcher);
+        if (searchHistoryTitleList.size() > 0) {
+            HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
+            HdlFileLogic.getInstance().appendFile(getHistoryFileNamePath(), new Gson().toJson(searchHistoryTitleList));
+        }
+        super.onDestroy();
+    }
+
+    /**
+     * 鍒锋柊UI锛堣澶囷級
+     *
+     * @param isRefreshing 琛ㄧず鏄笅鎷夊埛鏂扮殑
+     */
+    private void loadNextPageHouseList(boolean isRefreshing, long pageNo, boolean isClear) {
+
+        //鎼滅储鍏抽敭瀛�
+        if (TextUtils.isEmpty(currSearchText)) {
+            return;
+        }
+
+        if (isClear) {
+            clearData();
+        }
+        //绗竴椤佃鍙栨暟鎹己鍒惰鍙�
+        if (pageNo > 1 && currentHouseListPage > currentHouseListTotal) {
+            --currentHouseListPage;
+            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
+            return;
+        }
+        isHouseLoadingMore = true;//鏍囪璇诲彇鐘舵��
+        if (isRefreshing) {
+            showLoading();
+        }
+
+        //鑾峰彇浜戠涓婅澶囧垪琛�
+        HdlDeviceLogic.getInstance().getPowerStationDeviceList(currSearchText, pageNo, 20, new CloudCallBeak<PageNumberObject<DeviceBean>>() {
+            @Override
+            public void onSuccess(PageNumberObject<DeviceBean> deviceClass) {
+                HdlThreadLogic.runMainThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (isRefreshing) {
+                            hideLoading();
+                        }
+                        isHouseLoadingMore = false;
+                        if (deviceClass != null) {
+                            currentHouseListTotal = (int) deviceClass.getTotalPage();
+                            currentHouseListPage = (int) deviceClass.getPageNo();
+                            //鏇存柊缂撳瓨
+                            setDeviceList(deviceClass.getList());
+                            if (searchDeviceAdapter != null) {
+                                initData();
+                                //鏇存柊UI
+                                searchDeviceAdapter.setList(deviceList);
+                            }
+                        }
+                    }
+                }, _mActivity, ShowErrorMode.YES);
+
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                HdlThreadLogic.runMainThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (currentHouseListPage > 1) {
+                            --currentHouseListPage;
+                        }
+                        isHouseLoadingMore = false;
+                        if (isRefreshing) {
+                            hideLoading();
+                        }
+
+                    }
+                }, _mActivity, ShowErrorMode.YES);
+            }
+        });
+    }
+
+    private void clearData() {
+        if (deviceList != null && deviceList.size() > 0) {
+            deviceList.clear();
+        }
+    }
+
+    public void setDeviceList(List<DeviceBean> list) {
+        if (list == null || list.size() == 0) {
+            return;
+        }
+        if (this.deviceList.size() == 0) {
+            this.deviceList.addAll(list);
+            return;
+        }
+        for (int i = 0; i < list.size(); i++) {
+            this.setSingleDevice(list.get(i));
+        }
+    }
+
+    /**
+     * 娣诲姞璁惧鍒板垪琛ㄩ噷闈�
+     *
+     * @param deviceBean -璁惧瀵硅薄
+     */
+    public void setSingleDevice(DeviceBean deviceBean) {
+        try {
+            if (deviceBean == null) {
+                return;
+            }
+            boolean if_boolean = false;
+            for (int i = 0; i < deviceList.size(); i++) {
+                if (deviceList.get(i).getHomeId().equals(deviceBean.getHomeId())) {
+                    //瀛樺湪鏇挎崲
+                    deviceList.remove(i);
+                    deviceList.add(i, deviceBean);
+                    if_boolean = true;
+                    break;
+                }
+            }
+            if (!if_boolean) {
+                //娌℃湁娣诲姞
+                this.deviceList.add(deviceBean);
+            }
+        } catch (Exception e) {
+            String mes = e.getMessage();
+            HdlLogLogic.print("--->" + mes);
+        }
+    }
+
+    /**
+     * 娣诲姞鍘嗗彶璁板綍
+     */
+    private void addSearchTextToList() {
+        for (int i = 0; i < searchHistoryTitleList.size(); i++) {
+            if (searchHistoryTitleList.get(i).equals(currSearchText)) {
+                searchHistoryTitleList.remove(searchHistoryTitleList.get(i));
+            }
+        }
+        searchHistoryTitleList.add(currSearchText);
+        // 鍊掑簭鎺掑垪鏁版嵁(鎼滅储鏈�鍚庢帓鍦ㄥ墠闈�)
+        Collections.reverse(searchHistoryTitleList);
+        if (searchHistoryTitleList.size() > 10) {
+            //鍘嗗彶璁板綍涓嶈兘瓒呭嚭10
+            searchHistoryTitleList.remove(searchHistoryTitleList.get(11));
+        }
+
+    }
+
+    /**
+     * 鑾峰彇銆愭悳绱㈠巻鍙茶褰曟枃浠躲�戝叏璺緞
+     */
+    public String getHistoryFileNamePath() {
+        return HdlFileLogic.getInstance().getCurrentUserRootPath() + "/house_device.txt";
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListEditActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListEditActivity.java
index b3f65a3..8564260 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListEditActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListEditActivity.java
@@ -75,7 +75,7 @@
 
     private void initEvent() {
         //杩斿洖鎸夐挳
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 BaseEventBus baseEventBus = new BaseEventBus();
@@ -186,7 +186,7 @@
 
     private void initView() {
         viewBinding.toolbarTopFragmentHouseListRl.getRoot().setBackgroundColor(getColor(R.color.text_FFFFFFFF));
-        viewBinding.toolbarTopFragmentHouseListRl.topBackBtn.setVisibility(View.VISIBLE);
+        viewBinding.toolbarTopFragmentHouseListRl.topBackLl.setVisibility(View.VISIBLE);
         viewBinding.toolbarTopFragmentHouseListRl.topLeftIv.setImageResource(R.drawable.back_c);
         viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.power_station_editing);
         LinearLayoutManager linearLayout = new LinearLayoutManager(_mActivity);
@@ -209,7 +209,7 @@
         }
         for (int i = 0; i < list.size(); i++) {
             GatewayBean gatewayBean = list.get(i);
-            HdlDeviceLogic.getInstance().initializeGateway(gatewayBean.getDevice_mac(), new LinkCallBack<Boolean>() {
+            HdlDeviceLogic.getInstance().initializeInverter(gatewayBean.getDevice_mac(), new LinkCallBack<Boolean>() {
                 @Override
                 public void onSuccess(Boolean obj) {
 //                                HdlLogLogic.print("鍒濆鍖栭�嗗彉鍣ㄦ垚鍔�-->mac:" + cloudInverterDeviceBean.getOsn(),true);
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListFragment.java b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListFragment.java
index 5c94e11..691c081 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListFragment.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseListFragment.java
@@ -1,26 +1,27 @@
 package com.hdl.photovoltaic.ui.powerstation;
 
-import android.Manifest;
-import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.hardware.camera2.CameraManager;
 import android.os.Bundle;
 import android.view.View;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
 import com.google.gson.Gson;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
 import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.bean.PageNumberObject;
 import com.hdl.photovoltaic.config.ConstantManage;
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.databinding.FragmentHouseListBinding;
 import com.hdl.photovoltaic.base.CustomBaseFragment;
 import com.hdl.photovoltaic.enums.HomepageTitleTabSwitch;
 import com.hdl.photovoltaic.enums.ShowErrorMode;
+import com.hdl.photovoltaic.enums.SortType;
+import com.hdl.photovoltaic.enums.SortValue;
 import com.hdl.photovoltaic.listener.CloudCallBeak;
 import com.hdl.photovoltaic.listener.LinkCallBack;
 import com.hdl.photovoltaic.other.HdlCommonLogic;
@@ -29,12 +30,13 @@
 import com.hdl.photovoltaic.other.HdlResidenceLogic;
 import com.hdl.photovoltaic.other.HdlThreadLogic;
 import com.hdl.photovoltaic.other.HdlUniLogic;
-import com.hdl.photovoltaic.ui.MyPowerStationActivity;
+import com.hdl.photovoltaic.ui.adapter.DeviceInfoAdapter;
 import com.hdl.photovoltaic.ui.adapter.HouseInfoAdapter;
-import com.hdl.photovoltaic.ui.bean.CloudInverterDeviceBean;
+import com.hdl.photovoltaic.ui.bean.DeviceBean;
 import com.hdl.photovoltaic.ui.bean.HouseIdBean;
 import com.hdl.photovoltaic.uni.HDLUniMP;
 import com.hdl.photovoltaic.utils.PermissionUtils;
+import com.hdl.photovoltaic.widget.DefaultFilteringDialog;
 import com.hdl.photovoltaic.widget.DelayedConfirmationCancelDialog;
 import com.hdl.sdk.link.common.exception.HDLLinkException;
 import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
@@ -45,14 +47,36 @@
 import java.util.List;
 
 /**
- * (浣忓畢)鐢电珯鍒楄〃-鐣岄潰
+ * 鐢电珯鍜岃澶�-鐣岄潰
  */
 public class HouseListFragment extends CustomBaseFragment {
     private FragmentHouseListBinding viewBinding;
     private HouseInfoAdapter houseInfoAdapter;
-    private CameraManager manager;
 
-    private List<HouseIdBean> houseListBeanIDList = null;
+    private DeviceInfoAdapter deviceInfoAdapter;
+
+    private List<HouseIdBean> houseListBeanIDList;
+    private List<DeviceBean> deviceInfoList;
+
+
+    private int currentHouseListPage = 0; // 褰撳墠鐢电珯鍒楄〃椤电爜
+    private int currentHouseListTotal = 0; // 鐢电珯鍒楄〃鎬婚〉鐮�
+    private boolean isHouseLoadingMore = false; // 鏍囪鐢电珯鍒楄〃姝e湪鍔犺浇鏇村鏁版嵁
+
+    private int currentDeviceListPage = 0; // 褰撳墠璁惧鍒楄〃椤电爜
+    private int currentDeviceListTotal = 0; // 璁惧鍒楄〃鎬婚〉鐮�
+    private boolean isDeviceLoadingMore = false; // 鏍囪璁惧鍒楄〃姝e湪鍔犺浇鏇村鏁版嵁
+
+    private boolean isClickPowerStationLabel = true;//(鐢电珯鏍囩=true锛岃澶囨爣绛�=false)
+
+    private String key = SortValue.all;
+    private String value = SortValue.all;//descending:闄嶅簭,ascending:鍗囧簭
+    private String installedCapacityMinValue = "";//鏈�灏忕粍涓插閲�(瑁呮満瀹归噺)
+    private String installedCapacityMaxValue = "";//鏈�澶х粍涓插閲�(瑁呮満瀹归噺)
+    private String gridTypeValue = "";//骞剁綉鐘舵��(鍏ㄩ儴 涓嶄紶璇ヨ繃婊ゅ弬鏁�,FULL_GRID:骞剁綉,OFFLINE:绂荤綉)
+    private String powerStationStatusValue = "";//鐢电珯鐘舵��(鍏ㄩ儴 涓嶄紶璇ヨ繃婊ゅ弬鏁�,1:姝e父(杩愯),2:绂荤嚎,3:寰呮帴鍏�,4:鏁呴殰)
+
+    private final long pageSize = 20;//椤垫暟
 
 
     @Override
@@ -63,7 +87,6 @@
 
     @Override
     public void onBindView(Bundle savedInstanceState) {
-        manager = (CameraManager) _mActivity.getSystemService(Context.CAMERA_SERVICE);
         initData();
         //鍒濆鍖�
         initView();
@@ -73,29 +96,113 @@
 
     private void initEvent() {
 
+        //鐢电珯鏍囩
+        viewBinding.powerStationLabel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (isClickPowerStationLabel) {
+                    return;
+                }
+                isClickPowerStationLabel = true;
+                viewBinding.powerStationLabel.setTextAppearance(R.style.Text20Style);
+                viewBinding.deviceLabel.setTextAppearance(R.style.Text16Style);
+                viewBinding.powerStationLabelParent.setVisibility(View.VISIBLE);//鐢电珯鏍囩銆愮埗瀹瑰櫒銆戞樉绀�
+                viewBinding.deviceLabelParent.setVisibility(View.GONE);//璁惧鏍囩銆愮埗瀹瑰櫒銆戦殣钘�
+                loadNextPageHouseList(true, key, value, installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue, powerStationStatusValue, 1, true);
+            }
+        });
+        //璁惧鏍囩
+        viewBinding.deviceLabel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (!isClickPowerStationLabel) {
+                    return;
+                }
+                isClickPowerStationLabel = false;
+                viewBinding.deviceLabel.setTextAppearance(R.style.Text20Style);
+                viewBinding.powerStationLabel.setTextAppearance(R.style.Text16Style);
+                viewBinding.editIv.setVisibility(View.GONE);//缂栬緫鍥炬爣闅愯棌
+                viewBinding.addIv.setVisibility(View.GONE);//娣诲姞鍥炬爣闅愯棌
+                viewBinding.powerStationLabelParent.setVisibility(View.GONE);//鐢电珯鏍囩銆愮埗瀹瑰櫒銆戦殣钘�
+                viewBinding.deviceLabelParent.setVisibility(View.VISIBLE);//璁惧鏍囩銆愮埗瀹瑰櫒銆戞樉绀�
+                loadNextPageDeviceList(true, 1, true);
+            }
+        });
 
-        //娣诲姞鐢电珯
-        viewBinding.toolbarTopFragmentHouseListRl.topMoreIv.setOnClickListener(new View.OnClickListener() {
+        //鐢电珯娣诲姞
+        viewBinding.addIv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 HdlUniLogic.getInstance().openUniMP(HDLUniMP.UNI_EVENT_OPEN_HOME_CREATION, null);
 
             }
         });
-        //璁剧疆涓嬫媺绠ご棰滆壊
+        //鐢电珯鎼滅储
+        viewBinding.powerStationSearchClickCl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent();
+                intent.setClass(_mActivity, HouseSearchActivity.class);
+                startActivity(intent);
+            }
+        });
+        //榛樿閫夋嫨鍙傛暟鍥炬爣
+        viewBinding.powerStationDefaultConditionIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                DefaultFilteringDialog defaultFilteringDialog = new DefaultFilteringDialog(_mActivity);
+                defaultFilteringDialog.show();
+                defaultFilteringDialog.initState(installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue);
+                defaultFilteringDialog.setOnClickListener(new DefaultFilteringDialog.OnClickListener() {
+                    @Override
+                    public void confirm(String min, String max, String state) {
+                        installedCapacityMinValue = min;//鏈�灏忕粍涓插閲�(瑁呮満瀹归噺)
+                        installedCapacityMaxValue = max;//鏈�澶х粍涓插閲�(瑁呮満瀹归噺)
+                        gridTypeValue = state;//骞剁綉鐘舵��(鍏ㄩ儴 涓嶄紶璇ヨ繃婊ゅ弬鏁�,FULL_GRID:骞剁綉,OFFLINE:绂荤綉)
+                        loadNextPageHouseList(true, key, value, installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue, powerStationStatusValue, 1, true);
+                    }
+                });
+            }
+        });
+
+        //鐢电珯璁剧疆涓嬫媺绠ご棰滆壊
         viewBinding.fragmentHouseSrl.setColorSchemeResources(R.color.text_FF245EC3);
+        //鐢电珯涓嬫媺璇诲彇
         viewBinding.fragmentHouseSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
             @Override
             public void onRefresh() {
-                downReadData(true);
+                viewBinding.fragmentHouseSrl.setRefreshing(false);
+                loadNextPageHouseList(true, key, value, installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue, powerStationStatusValue, 1, true);
             }
         });
-        //杩涘叆鐢电珯璇︽儏,鍒犻櫎鐢电珯,绉诲姩鐢电珯浣嶇疆
+        //鐢电珯涓婃媺璇诲彇
+        viewBinding.fragmentHouseSrlListRc.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+//                super.onScrolled(recyclerView, dx, dy);
+
+                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+                if (layoutManager == null) {
+                    return;
+                }
+                int visibleItemCount = layoutManager.getChildCount();
+                int totalItemCount = layoutManager.getItemCount();
+                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
+                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
+                    if (!isHouseLoadingMore) {
+                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
+                        HdlLogLogic.print("---婊戝姩鍒颁簡搴曢儴");
+                        loadNextPageHouseList(false, key, value, installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue, powerStationStatusValue, ++currentHouseListPage, false);
+                    }
+                }
+            }
+        });
+        //鐢电珯璇︽儏杩涘叆,鍒犻櫎鐢电珯,绉诲姩鐢电珯浣嶇疆
         houseInfoAdapter.setNoOnclickListener(new HouseInfoAdapter.OnclickListener() {
             @Override
             public void onClick(int position, HouseIdBean houseIdBean) {
                 //鐐瑰嚮浣忓畢璇︽儏
-                HdlLogLogic.print("鐐瑰嚮浣忓畢璇︽儏--->" + new Gson().toJson(houseIdBean), false);
+                HdlLogLogic.print("鐐瑰嚮浣忓畢璇︽儏---" + new Gson().toJson(houseIdBean), false);
                 HdlResidenceLogic.getInstance().switchHouse(houseIdBean);
                 String path = HDLUniMP.UNI_EVENT_OPEN_HOME_DETAILS + "?homeId=" + houseIdBean.getHomeId() + "&homeName=" + houseIdBean.getHomeName() + "&powerStationStatus=" + houseIdBean.getPowerStationStatus();
                 HdlUniLogic.getInstance().openUniMP(path, null);
@@ -119,7 +226,7 @@
                         HdlResidenceLogic.getInstance().moveHouseId(houseIdBean.getHomeId());
                         initData();//鍒濆鍖栫紦瀛樻暟鎹�
                         houseInfoAdapter.setList(houseListBeanIDList);//閲嶆柊鍒锋柊鍒楄〃
-                        nullDataUpdateUi(houseListBeanIDList);//妫�娴嬫暟鎹槸鍚︿负绌�
+                        nullDataUpdateUi();//妫�娴嬫暟鎹槸鍚︿负绌�
                     }
 
                     @Override
@@ -186,35 +293,135 @@
 
             }
         });
-
-        //缂栬緫鐢电珯鎸夐挳
-        viewBinding.toolbarTopFragmentHouseListRl.topEditIv.setOnClickListener(new View.OnClickListener() {
+        //鐢电珯缂栬緫鎸夐挳
+        viewBinding.editIv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 startActivity(HouseListEditActivity.class);
             }
         });
+        //鐢电珯鍚嶇О绛涢��
+        viewBinding.stationNameRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                boolean isSelected = !v.isSelected();
+                viewBinding.stationNameRl.setSelected(isSelected);
+                viewBinding.stationNameIv.setSelected(isSelected);
+                key = SortType.homeNameSort;
+                value = isSelected ? SortValue.ascending : SortValue.descending;
+            }
+        });
+        //鐢电珯鍙戠數鍔熺巼绛涢��
+        viewBinding.stationPowerRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                boolean isSelected = !v.isSelected();
+                viewBinding.stationPowerRl.setSelected(isSelected);
+                viewBinding.stationPowerIv.setSelected(isSelected);
+                key = SortType.powerSort;
+                value = isSelected ? SortValue.ascending : SortValue.descending;
+            }
+        });
+        //鐢电珯褰撴棩鍙戠數閲忕瓫閫�
+        viewBinding.stationDayRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                boolean isSelected = !v.isSelected();
+                viewBinding.stationDayRl.setSelected(isSelected);
+                viewBinding.stationDayIv.setSelected(isSelected);
+                key = SortType.todayElectricitySort;
+                value = isSelected ? SortValue.ascending : SortValue.descending;
+            }
+        });
+        //鐢电珯褰撴湀鍙戠數閲忕瓫閫�
+        viewBinding.stationMonthRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                boolean isSelected = !v.isSelected();
+                viewBinding.stationMonthRl.setSelected(isSelected);
+                viewBinding.stationMonthIv.setSelected(isSelected);
+                key = SortType.monthElectricitySort;
+                value = isSelected ? SortValue.ascending : SortValue.descending;
+            }
+        });
+        //璁惧鐐瑰嚮
+        deviceInfoAdapter.setOnclickListener(new DeviceInfoAdapter.OnClickListener() {
+            @Override
+            public void onClick(int position, DeviceBean deviceBean) {
+
+            }
+        });
+        //璁惧璁剧疆涓嬫媺绠ご棰滆壊
+        viewBinding.fragmentDeviceSrl.setColorSchemeResources(R.color.text_FF245EC3);
+        //璁惧涓嬫媺璇诲彇
+        viewBinding.fragmentDeviceSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                viewBinding.fragmentDeviceSrl.setRefreshing(false);
+                loadNextPageDeviceList(false, 1, true);
+            }
+        });
+        //璁惧涓婃媺璇诲彇
+        viewBinding.fragmentDeviceSrlListRc.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+//                super.onScrolled(recyclerView, dx, dy);
+
+                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+                if (layoutManager == null) {
+                    return;
+                }
+                int visibleItemCount = layoutManager.getChildCount();
+                int totalItemCount = layoutManager.getItemCount();
+                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
+                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
+                    if (!isDeviceLoadingMore) {
+                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
+                        HdlLogLogic.print("---婊戝姩鍒颁簡搴曢儴");
+                        loadNextPageDeviceList(false, ++currentDeviceListPage, false);
+                    }
+                }
+            }
+        });
+        //璁惧娣绘悳绱�
+        viewBinding.deviceSearchCl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent();
+                intent.setClass(_mActivity, DeviceSearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
     }
 
     private void initView() {
-        viewBinding.toolbarTopFragmentHouseListRl.topTitleTv.setText(R.string.my_power_station);
-        viewBinding.toolbarTopFragmentHouseListRl.topEditIv.setVisibility(View.VISIBLE);
-        viewBinding.toolbarTopFragmentHouseListRl.topEditIv.setImageResource(R.drawable.editor_house);
-        viewBinding.toolbarTopFragmentHouseListRl.topMoreIv.setVisibility(View.VISIBLE);
-        viewBinding.toolbarTopFragmentHouseListRl.topMoreIv.setImageResource(R.drawable.add);
-        LinearLayoutManager linearLayout = new LinearLayoutManager(_mActivity);
+        viewBinding.powerStationLabelParent.setVisibility(View.VISIBLE);
+        viewBinding.deviceLabelParent.setVisibility(View.GONE);
+        //鐢电珯鏍囩
         houseInfoAdapter = new HouseInfoAdapter(_mActivity);
-        viewBinding.fragmentHouseSrlListRc.setLayoutManager(linearLayout);
+        viewBinding.fragmentHouseSrlListRc.setLayoutManager(new LinearLayoutManager(_mActivity));
         viewBinding.fragmentHouseSrlListRc.setAdapter(houseInfoAdapter);
         houseInfoAdapter.setList(this.houseListBeanIDList);
-        this.nullDataUpdateUi(houseListBeanIDList);
+
+        //璁惧鏍囩
+        deviceInfoAdapter = new DeviceInfoAdapter(_mActivity);
+        viewBinding.fragmentDeviceSrlListRc.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.fragmentDeviceSrlListRc.setAdapter(deviceInfoAdapter);
+        this.nullDataUpdateUi();
 
 
     }
 
     private void initData() {
-        this.houseListBeanIDList = new ArrayList<>();
-        this.houseListBeanIDList.addAll(HdlResidenceLogic.getInstance().getHouseIdList());
+        if (isClickPowerStationLabel) {
+            this.houseListBeanIDList = new ArrayList<>();
+            this.houseListBeanIDList.addAll(HdlResidenceLogic.getInstance().getHouseIdList());
+        } else {
+            this.deviceInfoList = new ArrayList<>();
+            this.deviceInfoList.add(new DeviceBean());
+//            this.deviceInfoList.addAll(HdlDeviceLogic.getInstance().getListDevice());
+        }
     }
 
     /**
@@ -228,7 +435,7 @@
         if (HDLUniMP.UNI_EVENT_REPLY_HOME_MODEL.equals(eventBus.getTopic())) {
             if (HDLUniMP.UNI_EVENT_REPLY_HOME_CREATION.equals(eventBus.getType())) {
                 //uin鍒涘缓鐢电珯鎴愬姛鍚庨�氱煡
-                downReadData(false);
+                loadNextPageHouseList(false, key, value, installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue, powerStationStatusValue, 1, true);
                 if (eventBus.getData() != null) {
                     Gson gson = new Gson();
                     String json = eventBus.getData().toString();
@@ -267,7 +474,7 @@
             if (MqttRecvClient.getInstance() != null) {
                 MqttRecvClient.getInstance().removeAllTopic();
             }
-            downReadData(false);
+            loadNextPageHouseList(false, key, value, installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue, powerStationStatusValue, 1, true);
 
         } else if (HDLUniMP.UNI_EVENT_REPLY_DEVICE_LIST.equals(eventBus.getType())) {
             //杩涘幓浣忓畢璇︽儏uni璇诲彇閫嗗彉鍣ㄥ垪琛ㄦ垚鍔熷悗閫氱煡
@@ -282,41 +489,150 @@
             //鎺ユ敹澶栭儴鐐瑰嚮浜嬩欢
             if (eventBus.getType().equals(HomepageTitleTabSwitch.powerstation.toString())) {
                 HdlLogLogic.print("姝e湪鐐瑰嚮銆愮數绔欍��");
-                initData();//鍒濆鍖栫紦瀛樻暟鎹�
-                houseInfoAdapter.setList(houseListBeanIDList);//閲嶆柊鍒锋柊鍒楄〃
+                loadNextPageHouseList(true, key, value, installedCapacityMinValue, installedCapacityMaxValue, gridTypeValue, powerStationStatusValue, 1, true);
             }
         }
     }
 
 
     /**
-     * 鍒锋柊UI
+     * 鍒锋柊UI锛堢數绔欙級
+     *
+     * @param isRefreshing         琛ㄧず鏄笅鎷夊埛鏂扮殑
+     * @param key                  鍙戠數鍔熺巼鎺掑簭(powerSort);
+     *                             浠婃棩鍙戠數閲忔帓搴�(todayElectricitySort);
+     *                             鍒涘缓鏃堕棿鎺掑簭(createTimeSort);
+     * @param keyValue             (descending:闄嶅簭
+     *                             ascending:鍗囧簭),
+     * @param installedCapacityMin 鏈�灏忕粍涓插閲�(瑁呮満瀹归噺)
+     * @param installedCapacityMax 鏈�澶х粍涓插閲�(瑁呮満瀹归噺)
+     * @param gridType             骞剁綉鐘舵�� (鍏ㄩ儴 锛�"";FULL_GRID 锛� 骞剁綉;OFFLINE 锛氱缃�)
+     * @param powerStationStatus   鐢电珯鐘舵�� (鍏ㄩ儴  锛�"";1 锛� 姝e父;2 锛� 绂荤嚎; 3 锛� 寰呮帴鍏�;4 锛� 鏁呴殰)
+     * @param pageNo               椤电爜
+     * @param isClear              鏄惁娓呴櫎鏁版嵁
+     */
+    private void loadNextPageHouseList(boolean isRefreshing,
+                                       String key,
+                                       String keyValue,
+                                       String installedCapacityMin,
+                                       String installedCapacityMax,
+                                       String gridType,
+                                       String powerStationStatus,
+                                       long pageNo,
+                                       boolean isClear) {
+        if (isClear) {
+            clearData();
+        }
+        //绗竴椤佃鍙栨暟鎹己鍒惰鍙�
+        if (pageNo > 1 && currentHouseListPage > currentHouseListTotal) {
+            --currentHouseListPage;
+            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
+            return;
+        }
+        isHouseLoadingMore = true;//鏍囪璇诲彇鐘舵��
+        if (isRefreshing) {
+            showLoading();
+        }
+
+        //鑾峰彇浣忓畢(鐢电珯)ID鍒楄〃
+        HdlResidenceLogic.getInstance().getResidenceIdList(
+                key,
+                keyValue,
+                installedCapacityMin,
+                installedCapacityMax,
+                gridType,
+                powerStationStatus,
+                pageNo, pageSize, new CloudCallBeak<HdlResidenceLogic.HouseBeanClass>() {
+                    @Override
+                    public void onSuccess(HdlResidenceLogic.HouseBeanClass houseBeanClass) {
+                        HdlThreadLogic.runMainThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (isRefreshing) {
+                                    hideLoading();
+                                }
+                                isHouseLoadingMore = false;
+                                if (houseBeanClass != null) {
+                                    currentHouseListTotal = (int) houseBeanClass.getTotalPage();
+                                    currentHouseListPage = (int) houseBeanClass.getPageNo();
+                                    //鏇存柊缂撳瓨
+                                    HdlResidenceLogic.getInstance().setHouseIdList(houseBeanClass.getList());
+                                    if (houseInfoAdapter != null) {
+                                        initData();
+                                        //鏇存柊UI
+                                        houseInfoAdapter.setList(houseListBeanIDList);
+                                    }
+                                }
+                                nullDataUpdateUi();
+                            }
+                        }, _mActivity, ShowErrorMode.YES);
+
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+                        HdlThreadLogic.runMainThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (currentHouseListPage > 1) {
+                                    --currentHouseListPage;
+                                }
+                                isHouseLoadingMore = false;
+                                if (isRefreshing) {
+                                    hideLoading();
+                                }
+
+                            }
+                        }, _mActivity, ShowErrorMode.YES);
+                    }
+                });
+    }
+
+    /**
+     * 鍒锋柊UI锛堣澶囷級
      *
      * @param isRefreshing 琛ㄧず鏄笅鎷夊埛鏂扮殑
+     * @param pageNo       椤电爜
+     * @param isClear      true琛ㄧず娓呯┖缂撳瓨
      */
-    private void downReadData(boolean isRefreshing) {
+    private void loadNextPageDeviceList(boolean isRefreshing, long pageNo, boolean isClear) {
+        if (isClear) {
+            clearData();
+        }
+        //绗竴椤佃鍙栨暟鎹己鍒惰鍙�
+        if (pageNo > 1 && currentDeviceListPage > currentDeviceListTotal) {
+            --currentDeviceListPage;
+            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
+            return;
+        }
+        isDeviceLoadingMore = true;//鏍囪璇诲彇鐘舵��
+        if (isRefreshing) {
+            showLoading();
+        }
         //鑾峰彇浣忓畢(鐢电珯)ID鍒楄〃
-        HdlResidenceLogic.getInstance().getResidenceIdList("", "", new CloudCallBeak<List<HouseIdBean>>() {
+        HdlDeviceLogic.getInstance().getPowerStationDeviceList("", pageNo, pageSize, new CloudCallBeak<PageNumberObject<DeviceBean>>() {
             @Override
-            public void onSuccess(List<HouseIdBean> list) {
+            public void onSuccess(PageNumberObject<DeviceBean> pageNumberObject) {
                 HdlThreadLogic.runMainThread(new Runnable() {
                     @Override
                     public void run() {
                         if (isRefreshing) {
-                            //鍏抽棴涓嬫媺鍒锋柊鐨勫湀鍦�
-                            viewBinding.fragmentHouseSrl.setRefreshing(false);
+                            hideLoading();
                         }
-                        if (list != null && list.size() > 0) {
+                        isDeviceLoadingMore = false;
+                        if (pageNumberObject != null) {
+                            currentDeviceListTotal = (int) pageNumberObject.getTotalPage();
+                            currentDeviceListPage = (int) pageNumberObject.getPageNo();
                             //鏇存柊缂撳瓨
-                            HdlResidenceLogic.getInstance().setHouseIdList(list);
-                            if (houseInfoAdapter != null) {
+                            HdlDeviceLogic.getInstance().setListDevice(pageNumberObject.getList());
+                            //鏇存柊缂撳瓨
+                            if (deviceInfoAdapter != null) {
                                 initData();
                                 //鏇存柊UI
-                                houseInfoAdapter.setList(houseListBeanIDList);
+                                deviceInfoAdapter.setList(deviceInfoList);
                             }
-
                         }
-                        nullDataUpdateUi(list);
+                        nullDataUpdateUi();
                     }
                 }, _mActivity, ShowErrorMode.YES);
 
@@ -327,11 +643,13 @@
                 HdlThreadLogic.runMainThread(new Runnable() {
                     @Override
                     public void run() {
-                        if (isRefreshing) {
-                            //鍏抽棴涓嬫媺鍒锋柊鐨勫湀鍦�
-                            viewBinding.fragmentHouseSrl.setRefreshing(false);
+                        if (currentDeviceListPage > 1) {
+                            --currentDeviceListPage;
                         }
-
+                        isDeviceLoadingMore = false;
+                        if (isRefreshing) {
+                            hideLoading();
+                        }
                     }
                 }, _mActivity, ShowErrorMode.YES);
             }
@@ -340,23 +658,97 @@
 
 
     /**
-     * 鐢宠鏉冮檺
+     * 娓呯┖缂撳瓨鏁版嵁
      */
-    private void requestPermissions(PermissionsResultCallback permissionsResultCallback) {
-
-
-        mPermissionsResultCallback = permissionsResultCallback;
-
-        String[] s = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA,};
-        String[] ary = PermissionUtils.checkPermission(_mActivity, s);
-        if (ary.length > 0) {
-            requestPermissions(ary, PermissionUtils.STATUS_SUCCESS);
-        } else {
-            if (mPermissionsResultCallback != null) {
-                mPermissionsResultCallback.succeed();
+    private void clearData() {
+        if (isClickPowerStationLabel) {
+            currentHouseListPage = 0;// 閲嶇疆褰撳墠鐢电珯鍒楄〃椤电爜
+            currentHouseListTotal = 0;// 閲嶇疆褰撳墠鐢电珯鍒楄〃鎬婚〉鐮�
+            if (houseListBeanIDList != null) {
+                houseListBeanIDList.clear(); //娓呯┖涓存椂缂撳瓨鍒楄〃
             }
+            HdlResidenceLogic.getInstance().clearHouseList(); //琛ㄧず寮哄埗娓呯┖鎵�鏈夌紦瀛樹俊鎭�
+        } else {
+            currentDeviceListPage = 0; // 閲嶇疆褰撳墠璁惧鍒楄〃椤电爜
+            currentDeviceListTotal = 0; // 閲嶇疆璁惧鍒楄〃鎬婚〉鐮�
+            if (deviceInfoList != null) {
+                deviceInfoList.clear();//娓呯┖涓存椂缂撳瓨鍒楄〃
+            }
+            HdlDeviceLogic.getInstance().clearDeviceList(); //琛ㄧず寮哄埗娓呯┖鎵�鏈夌紦瀛樹俊鎭�
         }
     }
+
+
+    /**
+     * 娌℃湁鐢电珯鍒楄〃鐨勬牱寮�
+     */
+    private void nullDataUpdateUi() {
+        boolean is_data;
+        String tipText = "";
+        if (isClickPowerStationLabel) {
+            is_data = houseListBeanIDList != null && houseListBeanIDList.size() > 0;
+            tipText = getString(R.string.my_power_station_data_null);
+        } else {
+            is_data = deviceInfoList != null && deviceInfoList.size() > 0;
+            tipText = getString(R.string.no_equipment);
+        }
+        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity, viewBinding.nullDataIc.getRoot(), viewBinding.nullDataIc.nullDataGifAnimationIv, viewBinding.nullDataIc.nullDataTv, tipText, is_data);
+    }
+
+    /**
+     * 鍒犻櫎鐢电珯,閫嗗彉鍣�
+     * (寮�濮嬪垹闄ょ數绔欙紝鍚屾椂锛屽悜閫嗗彉鍣ㄥ彂閫佸垵濮嬪寲閫嗗彉鍣ㄦ寚浠�,鏃犻』澶勭悊缁撴灉)
+     *
+     * @param list 璁惧鍒楄〃
+     */
+    private void initializeInverter(List<GatewayBean> list) {
+        if (list == null || list.size() == 0) {
+            return;
+        }
+        for (int i = 0; i < list.size(); i++) {
+            GatewayBean gatewayBean = list.get(i);
+            HdlDeviceLogic.getInstance().initializeInverter(gatewayBean.getDevice_mac(), new LinkCallBack<Boolean>() {
+                @Override
+                public void onSuccess(Boolean obj) {
+//                                HdlLogLogic.print("鍒濆鍖栭�嗗彉鍣ㄦ垚鍔�-->mac:" + cloudInverterDeviceBean.getOsn(),true);
+                }
+
+                @Override
+                public void onError(HDLLinkException e) {
+//                                HdlLogLogic.print("鍒濆鍖栭�嗗彉鍣ㄥけ璐�-->mac:" + cloudInverterDeviceBean.getOsn(),true);
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒犻櫎鐢电珯
+     *
+     * @param homeId 鐢电珯id
+     * @param list   閫嗗彉鍣ㄥ垪琛�
+     */
+    private void deleteResidence(String homeId, List<GatewayBean> list) {
+
+        //鍒犻櫎浣忓畢
+        HdlResidenceLogic.getInstance().delResidence(homeId, new CloudCallBeak<Boolean>() {
+            @Override
+            public void onSuccess(Boolean obj) {
+                hideLoading();
+                initializeInverter(list); //鍙戣捣鍒濆鍖栨寚浠ょ粰閫嗗彉鍣�;锛堟敞鎰�:鍙兘鏄湰鍦板彂閫佷簡(瑕佹悳绱㈠眬鍩熺綉閫嗗彉鍣ㄥ垪琛紝寤虹珛鏈湴閫氳閫氶亾),鍒犻櫎鐢电珯鎴愬姛鍚�,浜戠瑙g粦閫嗗彉鍣ㄧ殑鍏崇郴锛�
+                HdlResidenceLogic.getInstance().delHouseId(homeId);//鍒犻櫎鐢电珯缂撳瓨
+                initData();//鍒濆鍖栫紦瀛樻暟鎹�
+                houseInfoAdapter.setList(houseListBeanIDList);//閲嶆柊鍒锋柊鍒楄〃
+                nullDataUpdateUi();//妫�娴嬫暟鎹槸鍚︿负绌�
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                hideLoading();
+                HdlThreadLogic.toast(_mActivity, e);
+            }
+        });
+    }
+
 
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
@@ -387,69 +779,6 @@
 
         void failing();
 
-    }
-
-    /**
-     * 娌℃湁鐢电珯鍒楄〃鐨勬牱寮�
-     */
-    private void nullDataUpdateUi(List<HouseIdBean> list) {
-        HdlCommonLogic.getInstance().nullDataUpdateUi(_mActivity, viewBinding.nullDataIc.getRoot(), viewBinding.nullDataIc.nullDataGifAnimationIv, viewBinding.nullDataIc.nullDataTv, getString(R.string.my_power_station_data_null), list != null && list.size() > 0);
-    }
-
-    /**
-     * 鍒犻櫎鐢电珯,閫嗗彉鍣�
-     * (寮�濮嬪垹闄ょ數绔欙紝鍚屾椂锛屽悜閫嗗彉鍣ㄥ彂閫佸垵濮嬪寲閫嗗彉鍣ㄦ寚浠�,鏃犻』澶勭悊缁撴灉)
-     *
-     * @param list 璁惧鍒楄〃
-     */
-    private void initializeInverter(List<GatewayBean> list) {
-        if (list == null || list.size() == 0) {
-            return;
-        }
-        for (int i = 0; i < list.size(); i++) {
-            GatewayBean gatewayBean = list.get(i);
-            HdlDeviceLogic.getInstance().initializeGateway(gatewayBean.getDevice_mac(), new LinkCallBack<Boolean>() {
-                @Override
-                public void onSuccess(Boolean obj) {
-//                                HdlLogLogic.print("鍒濆鍖栭�嗗彉鍣ㄦ垚鍔�-->mac:" + cloudInverterDeviceBean.getOsn(),true);
-                }
-
-                @Override
-                public void onError(HDLLinkException e) {
-//                                HdlLogLogic.print("鍒濆鍖栭�嗗彉鍣ㄥけ璐�-->mac:" + cloudInverterDeviceBean.getOsn(),true);
-                }
-            });
-        }
-    }
-
-    /**
-     * 鍒犻櫎鐢电珯
-     *
-     * @param homeId 鐢电珯id
-     * @param list   閫嗗彉鍣ㄥ垪琛�
-     */
-    private void deleteResidence(String homeId, List<GatewayBean> list) {
-
-        //鍒犻櫎浣忓畢
-        HdlResidenceLogic.getInstance().delResidence(homeId, new CloudCallBeak<Boolean>() {
-            @Override
-            public void onSuccess(Boolean obj) {
-                hideLoading();
-                //鍙戣捣鍒濆鍖栨寚浠ょ粰閫嗗彉鍣�;
-                initializeInverter(list);
-                HdlResidenceLogic.getInstance().delHouseId(homeId);
-                initData();//鍒濆鍖栫紦瀛樻暟鎹�
-                houseInfoAdapter.setList(houseListBeanIDList);//閲嶆柊鍒锋柊鍒楄〃
-                nullDataUpdateUi(houseListBeanIDList);//妫�娴嬫暟鎹槸鍚︿负绌�
-            }
-
-            @Override
-            public void onFailure(HDLException e) {
-                hideLoading();
-
-                HdlThreadLogic.toast(_mActivity, e);
-            }
-        });
     }
 
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseSearchActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseSearchActivity.java
new file mode 100644
index 0000000..3e0abe7
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/powerstation/HouseSearchActivity.java
@@ -0,0 +1,394 @@
+package com.hdl.photovoltaic.ui.powerstation;
+
+
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.CustomBaseActivity;
+import com.hdl.photovoltaic.databinding.ActivityHouseSearchBinding;
+import com.hdl.photovoltaic.enums.ShowErrorMode;
+import com.hdl.photovoltaic.enums.SortType;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+import com.hdl.photovoltaic.other.HdlFileLogic;
+import com.hdl.photovoltaic.other.HdlLogLogic;
+import com.hdl.photovoltaic.other.HdlResidenceLogic;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.adapter.SearchHistoryAdapter;
+import com.hdl.photovoltaic.ui.adapter.SearchHouseAdapter;
+import com.hdl.photovoltaic.ui.bean.HouseIdBean;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 鐢电珯鎼滅储鐣岄潰
+ */
+public class HouseSearchActivity extends CustomBaseActivity {
+
+    private ActivityHouseSearchBinding viewBinding;
+
+    SearchHistoryAdapter searchHistoryAdapter;
+    SearchHouseAdapter searchHouseAdapter;
+
+    private List<HouseIdBean> houseListBeanIDList = new ArrayList<>();
+
+    private int currentHouseListPage = 0; // 褰撳墠鐢电珯鍒楄〃椤电爜
+    private int currentHouseListTotal = 0; // 鐢电珯鍒楄〃鎬婚〉鐮�
+    private boolean isHouseLoadingMore = false; // 鏍囪鐢电珯鍒楄〃姝e湪鍔犺浇鏇村鏁版嵁
+
+    private String currSearchText;
+
+    List<String> searchHistoryTitleList = new ArrayList<>();
+
+    @Override
+    public Object getContentView() {
+        viewBinding = ActivityHouseSearchBinding.inflate(getLayoutInflater());
+        return viewBinding.getRoot();
+    }
+
+    @Override
+    public void onBindView(Bundle savedInstanceState) {
+        setStatusBarTranslucent();
+        //鍘嗗彶璁板綍鏂囦欢澶瑰垱寤�
+        HdlFileLogic.getInstance().createFileDir(HdlFileLogic.getInstance().getCurrentUserRootPath());
+        //鍒濆鍖栨暟鎹�
+        initData();
+        //鍒濆鍖�
+        initView();
+        //鍒濆鍖栫晫闈㈢洃鍚櫒
+        initEvent();
+    }
+
+    private void initData() {
+        try {
+            String json = HdlFileLogic.getInstance().readFile(getHistoryFileNamePath());
+            if (TextUtils.isEmpty(json)) {
+                return;
+            }
+            searchHistoryTitleList = new Gson().fromJson(json, new TypeToken<List<String>>() {
+            }.getType());
+        } catch (Exception ignored) {
+        }
+    }
+
+
+    private void initEvent() {
+
+        //鍚庨��
+        viewBinding.backRl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+        viewBinding.powerStationSearchEt.addTextChangedListener(textWatcher);
+
+
+        //鎼滅储
+        viewBinding.powerStationSearchTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //鎼滅储鍏抽敭瀛�
+                currSearchText = viewBinding.powerStationSearchEt.getText().toString().replace(" ", "");
+                if (TextUtils.isEmpty(currSearchText)) {
+                    HdlThreadLogic.toast(_mActivity, R.string.search_content_null);
+                    return;
+                }
+                viewBinding.historyListParent.setVisibility(View.GONE);
+                viewBinding.listParent.setVisibility(View.VISIBLE);
+                addSearchTextToList();
+                loadNextPageHouseList(true, 1, true);
+            }
+        });
+
+
+        //涓嬫媺绠ご棰滆壊
+        viewBinding.listSrl.setColorSchemeResources(R.color.text_FF245EC3);
+        //涓嬫媺璇诲彇
+        viewBinding.listSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                viewBinding.listSrl.setRefreshing(false);
+                loadNextPageHouseList(true, 1, true);
+            }
+        });
+        //涓婃媺璇诲彇
+        viewBinding.listRcv.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+                if (layoutManager == null) {
+                    return;
+                }
+                int visibleItemCount = layoutManager.getChildCount();
+                int totalItemCount = layoutManager.getItemCount();
+                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
+                if (visibleItemCount > 0 && visibleItemCount + firstVisibleItemPosition == totalItemCount) {
+                    if (!isHouseLoadingMore) {
+                        // 婊戝姩鍒颁簡搴曢儴锛屾墽琛岀浉搴旂殑鎿嶄綔
+                        HdlLogLogic.print("---婊戝姩鍒颁簡搴曢儴");
+                        loadNextPageHouseList(false, ++currentHouseListPage, false);
+                    }
+                }
+            }
+        });
+        //娓呴櫎
+        viewBinding.powerStationClearIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                currSearchText = "";
+                viewBinding.powerStationSearchEt.setText("");
+                viewBinding.historyListParent.setVisibility(View.VISIBLE);
+                viewBinding.listParent.setVisibility(View.GONE);
+                searchHistoryAdapter.setList(searchHistoryTitleList);
+                clearData();
+            }
+        });
+        //鍒犻櫎
+        viewBinding.powerStationDelIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                searchHistoryTitleList = new ArrayList<>();
+                searchHistoryAdapter.setList(searchHistoryTitleList);
+                HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
+            }
+        });
+        //鍘嗗彶璁板綍鐐瑰嚮浜嬩欢
+        searchHistoryAdapter.setOnclickListener(new SearchHistoryAdapter.OnClickListener() {
+            @Override
+            public void onClick(int position, String title) {
+                viewBinding.powerStationSearchEt.setText(title);
+            }
+        });
+        //鐢电珯鐐瑰嚮鏄簨浠�
+        searchHouseAdapter.setOnclickListener(new SearchHouseAdapter.OnClickListener() {
+            @Override
+            public void onClick(int position, HouseIdBean houseIdBean) {
+
+            }
+        });
+
+    }
+
+    private void initView() {
+        viewBinding.historyListParent.setVisibility(View.VISIBLE);
+        viewBinding.listParent.setVisibility(View.GONE);
+        viewBinding.powerStationClearIv.setVisibility(View.GONE);
+        //鍒濆鍖栧巻鍙茶褰曢�傞厤鍣�
+        searchHistoryAdapter = new SearchHistoryAdapter(_mActivity);
+        viewBinding.historyListRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.historyListRcv.setAdapter(searchHistoryAdapter);
+        searchHistoryAdapter.setList(searchHistoryTitleList);
+        //鍒濆鍖栫數绔欓�傞厤鍣�
+        searchHouseAdapter = new SearchHouseAdapter(_mActivity);
+        viewBinding.listRcv.setLayoutManager(new LinearLayoutManager(_mActivity));
+        viewBinding.listRcv.setAdapter(searchHouseAdapter);
+    }
+
+
+    /**
+     * 杈撳叆鐢电珯鍚嶇О杩涜杩囨护
+     */
+    private final TextWatcher textWatcher = new TextWatcher() {
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+        }
+
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            String et = viewBinding.powerStationSearchEt.getText().toString().replace(" ", "");
+            if (TextUtils.isEmpty(et)) {
+                viewBinding.powerStationClearIv.setVisibility(View.GONE);
+            } else {
+                viewBinding.powerStationClearIv.setVisibility(View.VISIBLE);
+            }
+            viewBinding.powerStationSearchEt.setSelection(viewBinding.powerStationSearchEt.length());
+
+        }
+    };
+
+    /**
+     * 鐗╃悊鎸夐敭杩斿洖浜嬩欢
+     */
+    @Override
+    public void onBackPressed() {
+        super.onBackPressed();
+    }
+
+    @Override
+    protected void onDestroy() {
+        viewBinding.powerStationSearchEt.removeTextChangedListener(textWatcher);
+        if (searchHistoryTitleList.size() > 0) {
+            HdlFileLogic.getInstance().deleteFile(getHistoryFileNamePath());
+            HdlFileLogic.getInstance().appendFile(getHistoryFileNamePath(), new Gson().toJson(searchHistoryTitleList));
+        }
+        super.onDestroy();
+    }
+
+    /**
+     * 鍒锋柊UI锛堢數绔欙級
+     *
+     * @param isRefreshing 琛ㄧず鏄笅鎷夊埛鏂扮殑
+     */
+    private void loadNextPageHouseList(boolean isRefreshing, long pageNo, boolean isClear) {
+
+        //鎼滅储鍏抽敭瀛�
+        if (TextUtils.isEmpty(currSearchText)) {
+            return;
+        }
+
+        if (isClear) {
+            clearData();
+        }
+        //绗竴椤佃鍙栨暟鎹己鍒惰鍙�
+        if (pageNo > 1 && currentHouseListPage > currentHouseListTotal) {
+            --currentHouseListPage;
+            //褰撳墠椤典笉鑳藉ぇ浜庢�婚〉鏁�
+            return;
+        }
+        isHouseLoadingMore = true;//鏍囪璇诲彇鐘舵��
+        if (isRefreshing) {
+            showLoading();
+        }
+
+        //鑾峰彇浣忓畢(鐢电珯)ID鍒楄〃
+        HdlResidenceLogic.getInstance().getResidenceIdList(SortType.homeName, currSearchText,
+                "", "", "", "",
+                pageNo, 20, new CloudCallBeak<HdlResidenceLogic.HouseBeanClass>() {
+                    @Override
+                    public void onSuccess(HdlResidenceLogic.HouseBeanClass houseBeanClass) {
+                        HdlThreadLogic.runMainThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (isRefreshing) {
+                                    hideLoading();
+                                }
+                                isHouseLoadingMore = false;
+                                if (houseBeanClass != null) {
+                                    currentHouseListTotal = (int) houseBeanClass.getTotalPage();
+                                    currentHouseListPage = (int) houseBeanClass.getPageNo();
+                                    //鏇存柊缂撳瓨
+                                    setHouseIdList(houseBeanClass.getList());
+                                    if (searchHouseAdapter != null) {
+                                        initData();
+                                        //鏇存柊UI
+                                        searchHouseAdapter.setList(houseListBeanIDList);
+                                    }
+                                }
+                            }
+                        }, _mActivity, ShowErrorMode.YES);
+
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+                        HdlThreadLogic.runMainThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (currentHouseListPage > 1) {
+                                    --currentHouseListPage;
+                                }
+                                isHouseLoadingMore = false;
+                                if (isRefreshing) {
+                                    hideLoading();
+                                }
+
+                            }
+                        }, _mActivity, ShowErrorMode.YES);
+                    }
+                });
+    }
+
+    private void clearData() {
+        if (houseListBeanIDList != null && houseListBeanIDList.size() > 0) {
+            houseListBeanIDList.clear();
+        }
+    }
+
+    public void setHouseIdList(List<HouseIdBean> list) {
+        if (list == null || list.size() == 0) {
+            return;
+        }
+        if (this.houseListBeanIDList.size() == 0) {
+            this.houseListBeanIDList.addAll(list);
+            return;
+        }
+        for (int i = 0; i < list.size(); i++) {
+            this.setSingleHouseId(list.get(i));
+        }
+    }
+
+    /**
+     * 娣诲姞鐢电珯Id鍒板垪琛ㄩ噷闈�
+     *
+     * @param houseIdBean -鐢电珯Id瀵硅薄
+     */
+    public void setSingleHouseId(HouseIdBean houseIdBean) {
+        try {
+            if (houseIdBean == null) {
+                return;
+            }
+            boolean if_boolean = false;
+            for (int i = 0; i < houseListBeanIDList.size(); i++) {
+                if (houseListBeanIDList.get(i).getHomeId().equals(houseIdBean.getHomeId())) {
+                    //瀛樺湪鏇挎崲
+                    houseListBeanIDList.remove(i);
+                    houseListBeanIDList.add(i, houseIdBean);
+                    if_boolean = true;
+                    break;
+                }
+            }
+            if (!if_boolean) {
+                //娌℃湁娣诲姞
+                this.houseListBeanIDList.add(houseIdBean);
+            }
+        } catch (Exception e) {
+            String mes = e.getMessage();
+            HdlLogLogic.print("---" + mes);
+        }
+    }
+
+    /**
+     * 娣诲姞鍘嗗彶璁板綍
+     */
+    private void addSearchTextToList() {
+        for (int i = 0; i < searchHistoryTitleList.size(); i++) {
+            if (searchHistoryTitleList.get(i).equals(currSearchText)) {
+                searchHistoryTitleList.remove(searchHistoryTitleList.get(i));
+            }
+        }
+        searchHistoryTitleList.add(currSearchText);
+        // 鍊掑簭鎺掑垪鏁版嵁(鎼滅储鏈�鍚庢帓鍦ㄥ墠闈�)
+        Collections.reverse(searchHistoryTitleList);
+        if (searchHistoryTitleList.size() > 10) {
+            //鍘嗗彶璁板綍涓嶈兘瓒呭嚭10
+            searchHistoryTitleList.remove(searchHistoryTitleList.get(11));
+        }
+
+    }
+
+    /**
+     * 鑾峰彇銆愭悳绱㈠巻鍙茶褰曟枃浠躲�戝叏璺緞
+     */
+    public String getHistoryFileNamePath() {
+        return HdlFileLogic.getInstance().getCurrentUserRootPath() + "/house_history.txt";
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/test/TestLogActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/test/TestLogActivity.java
index 81f8933..bbe5ee5 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/test/TestLogActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/test/TestLogActivity.java
@@ -44,7 +44,7 @@
      * 鐩戝惉鍣ㄥ垵濮嬪寲
      */
     private void initEvent() {
-        viewBinding.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 finish();
diff --git a/app/src/main/java/com/hdl/photovoltaic/ui/test/TestMainActivity.java b/app/src/main/java/com/hdl/photovoltaic/ui/test/TestMainActivity.java
index 2a3c3a3..ff0771b 100644
--- a/app/src/main/java/com/hdl/photovoltaic/ui/test/TestMainActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/ui/test/TestMainActivity.java
@@ -74,7 +74,7 @@
     }
 
     private void initEvent() {
-        viewBinding.topBackBtn.setOnClickListener(this);
+        viewBinding.topBackLl.setOnClickListener(this);
         viewBinding.topLogBtn.setOnClickListener(this);
         viewBinding.clickCommandTv.setOnClickListener(this);
         viewBinding.clickSelectDeviceTv.setOnClickListener(this);
@@ -101,7 +101,7 @@
     @Override
     public void onClick(View v) {
         int id = v.getId();
-        if (id == viewBinding.topBackBtn.getId()) {
+        if (id == viewBinding.topBackLl.getId()) {
             finish();
         } else if (id == viewBinding.topLogBtn.getId()) {
             startActivity(TestLogActivity.class);
@@ -291,7 +291,7 @@
                     public void Confirm() {
                         confirmationCancelDialog.dismiss();
                         showLoading("瑙g粦涓�...");
-                        HdlDeviceLogic.getInstance().initializeGateway(gatewayBean.getDevice_mac(), new LinkCallBack<Boolean>() {
+                        HdlDeviceLogic.getInstance().initializeInverter(gatewayBean.getDevice_mac(), new LinkCallBack<Boolean>() {
                             @Override
                             public void onSuccess(Boolean obj) {
                                 hideLoading();
diff --git a/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java b/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
index af95a5a..dfe7121 100644
--- a/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
+++ b/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
@@ -51,6 +51,7 @@
     public final static String UNI_EVENT_REPLY_DEVICE_Link_read_SEND = "link_property_read";//link鍗忚灞炴�ц鍙�
     public final static String UNI_EVENT_REPLY_DEVICE_MESSAGE_NUMBER = "message_number";//娑堟伅鎬绘暟閲�
     public final static String UNI_EVENT_REPLY_DEVICE_DELETE_OID = "delete_Oid";//鍒犻櫎璁惧oid
+    public final static String UNI_EVENT_REPLY_DEVICE_INITIALIZEINVERTER = "initializeInverter";//閲嶇疆閫嗗彉鍣�
 
 
     /*********OTA妯″潡*********/
@@ -79,7 +80,7 @@
     public final static String UNI_EVENT_REPLY_OTHER_UNI_LOG = "uni_log";//鏀堕泦uni鏃ュ織
     public final static String UNI_EVENT_REPLY_OTHER_BACK = "back";//棣栭〉杩斿洖
     public final static String UNI_EVENT_REPLY_OTHER_APPLICATION_CONFLICT = "application_conflict";//搴旂敤鍐茬獊
-
+    public final static String UNI_EVENT_REPLY_OTHER_LOGOUT = "uni_logout";//閫�鍑虹櫥褰�
 
 
     /*********C绔�愭垜鐨勩�戞ā鍧�*********/
@@ -94,11 +95,18 @@
     public final static String UNI_EVENT_REPLY_MINE_SETTING = "setting";//璁剧疆
 
 
-    /*********Wifi妯″潡*********/ //鍗敠瀹氫箟
+    /*********Wifi妯″潡*********/
     public final static String UNI_EVENT_REPLY_WIFI_MODEL = "uni_wifi_model";//wifi妯″潡(澶х被)
-    public final static String UNI_EVENT_REPLY_WIFI_LIST = "list";//鑾峰彇wifi鍒楄〃
-    public final static String UNI_EVENT_REPLY_WIFI_INFO = "info";//鑾峰彇褰撳墠wifi淇℃伅
-    public final static String UNI_EVENT_REPLY_WIFI_CONNECT = "connect";//杩炴帴wifi
+    public final static String UNI_EVENT_REPLY_PHONE_WIFI_LIST = "phone_wifi_list";//鎵嬫満鑾峰彇wifi鍒楄〃
+    public final static String UNI_EVENT_REPLY_PHONE_WIFI_INFO = "phone_wifi_info";//鎵嬫満鑾峰彇褰撳墠wifi淇℃伅
+    public final static String UNI_EVENT_REPLY_PHONE_OPEN_WIFI_SETTINGS = "phone_open_wifi_settings";//璋冪敤鎵撳紑鎵嬫満Wifi璁剧疆鐣岄潰
+    public final static String UNI_EVENT_REPLY_DEVICE_WIFI_SET = "device_wifi_set";//閫嗗彉鍣╓iFi淇℃伅閰嶇疆
+    public final static String UNI_EVENT_REPLY_DEVICE_WIFI_GET = "device_wifi_get";//閫嗗彉鍣╓iFi淇℃伅鑾峰彇
+    public final static String UNI_EVENT_REPLY_DEVICE_HOTSPOT_SET = "device_hotspot_set";//閫嗗彉鍣ㄧ儹鐐归厤缃�
+    public final static String UNI_EVENT_REPLY_DEVICE_HOTSPOT_GET = "device_hotspot_get";//閫嗗彉鍣ㄧ儹鐐硅幏鍙�
+    public final static String UNI_EVENT_REPLY_DEVICE_ETHERNET_SET = "device_ethernet_set";//閫嗗彉鍣ㄤ互澶綉閰嶇疆
+    public final static String UNI_EVENT_REPLY_DEVICE_ETHERNET_GET = "device_ethernet_get";//閫嗗彉鍣ㄤ互澶綉鑾峰彇
+
     //endregion
 
     //region --------銆愬師鐢熴�戜富鍔ㄥ彂閫佸埌銆愬皬绋嬪簭銆�--------
@@ -107,10 +115,12 @@
     public final static String UNI_EVENT_NOTIFICATION_DEVICE_REFRESH_USERINFO = "refresh_userinfo";//鍒锋柊鐢ㄦ埛淇℃伅
     public final static String UNI_EVENT_NOTIFICATION_DEVICE_REFRESH_TEMPERATURE = "temperature_format_changed";//鍒锋柊鍗曚綅娓╁害
     public final static String UNI_EVENT_NOTIFICATION_DEVICE_REFRESH_REFRESH_UNREAD_NUMBER = "refresh_unread_messages_number";//鍒锋柊鏈娑堟伅鏁伴噺
+    public final static String UNI_EVENT_NOTIFICATION_MQTT_CONNECT_SUCCESS = "mqtt_connect_success";//閫氱煡mqtt杩炴帴鎴愬姛
     public final static String UNI_EVENT_NOTIFICATION_REMOVE_VIEW = "remove_view";//閫氱煡uni绉婚櫎鐣岄潰
     public final static String UNI_EVENT_NOTIFICATION_DEVICE_ADD = "add";//璁惧娣诲姞
     public final static String UNI_EVENT_NOTIFICATION_DEVICE_DEL = "del";//璁惧鍒犻櫎
     public final static String UNI_EVENT_NOTIFICATION_DEVICE_OID = "oid";//璁惧銆愬寘鎷笅鎸傝澶囥�憃id鍒楄〃Remove interface
+    public final static String UNI_EVENT_NOTIFICATION_DEVICE_CONNECTION_STATUS = "connection_status";//閫嗗彉鍣ㄨ繛鎺ヨ矾鐢卞櫒鐘舵��
     //endregion
 
     //region --------銆愬師鐢熴�戞墦寮�銆愬皬绋嬪簭銆�--------
@@ -135,18 +145,18 @@
     public static class UniCallBackBaseBean implements Serializable {
 
         private int code;//鐘舵�佺爜
-        private String mes;//淇℃伅鎻忚堪
+        private String msg;//淇℃伅鎻忚堪
         private String type;//鍔熻兘绫诲瀷
         private Object data;//闄勫姞json鏁版嵁
 
-        public UniCallBackBaseBean(int code, String mes) {
+        public UniCallBackBaseBean(int code, String msg) {
             this.code = code;
-            this.mes = mes;
+            this.msg = msg;
         }
 
         public UniCallBackBaseBean() {
             this.code = 0;
-            this.mes = "鎴愬姛";
+            this.msg = "鎴愬姛";
         }
 
 
@@ -158,12 +168,12 @@
             this.code = code;
         }
 
-        public String getMes() {
-            return mes == null ? "" : mes;
+        public String getMsg() {
+            return msg == null ? "" : msg;
         }
 
-        public void setMes(String mes) {
-            this.mes = mes;
+        public void setMsg(String msg) {
+            this.msg = msg;
         }
 
         public Object getData() {
diff --git a/app/src/main/java/com/hdl/photovoltaic/utils/TimeUtils.java b/app/src/main/java/com/hdl/photovoltaic/utils/TimeUtils.java
index b7d267e..3d5578d 100644
--- a/app/src/main/java/com/hdl/photovoltaic/utils/TimeUtils.java
+++ b/app/src/main/java/com/hdl/photovoltaic/utils/TimeUtils.java
@@ -1,9 +1,12 @@
 package com.hdl.photovoltaic.utils;
 
 import android.annotation.SuppressLint;
+import android.text.TextUtils;
 
 import com.hdl.photovoltaic.config.UserConfigManage;
+import com.hdl.photovoltaic.enums.TimeType;
 import com.hdl.photovoltaic.other.HdlThreadLogic;
+import com.hdl.photovoltaic.ui.home.HomePageFragment;
 import com.hdl.sdk.link.core.utils.LanguageUtils;
 
 import java.text.SimpleDateFormat;
@@ -15,6 +18,14 @@
  * 鏃堕棿宸ュ叿绫�
  */
 public class TimeUtils {
+
+    public static final String zhDateYearMonthDayFormat = "yyyy/MM/dd";
+    public static final String zhDateYearMonthFormat = "yyyy/MM";
+    public static final String zhDateYearFormat = "yyyy";
+
+    public static final String enDateYearMonthDayFormat = "dd/MM/yyyy";
+    public static final String enDateYearMonthFormat = "/MM/yyyy";
+    public static final String enDateYearFormat = "yyyy";
 
     /**
      * 鑾峰彇鍒嗛挓
@@ -36,12 +47,13 @@
     /**
      * 鏃堕棿鎴宠浆鏃堕棿(鏍煎紡:yyyy-MM-dd)
      *
-     * @param timestamp 鏃堕棿鎴�
+     * @param timestamp   鏃堕棿鎴�
+     * @param date_format 鏃堕棿鏍煎紡(渚嬪"yyyy/MM/dd")
      * @return -
      */
-    public static String getDateTimestamp(long timestamp) {
+    public static String getDateTimestamp(long timestamp, String date_format) {
         try {
-            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd ", Locale.ENGLISH);
+            SimpleDateFormat dateFormat = new SimpleDateFormat(date_format, Locale.ENGLISH);
             Date date = new Date(timestamp);
             return dateFormat.format(date);
         } catch (Exception e) {
@@ -95,4 +107,135 @@
         return "";
     }
 
+    /**
+     * 鍔狅紙鏃ワ紝鏈堬紝骞达級璁$畻
+     *
+     * @param date              鏃ュ巻
+     * @param dayMonthYearToAdd 澶╂暟锛堟棩锛屾湀锛屽勾锛�
+     * @return 鏃ュ巻
+     */
+    public static String addDayMonthYearToDate(Calendar date, int dayMonthYearToAdd, String dateFormat, String timeType) {
+        Calendar newDate = (Calendar) date.clone();
+        switch (timeType) {
+            case TimeType.day: {
+                newDate.add(Calendar.DAY_OF_MONTH, dayMonthYearToAdd);
+            }
+            break;
+            case TimeType.month: {
+                newDate.add(Calendar.MONTH, dayMonthYearToAdd);
+            }
+            break;
+            case TimeType.year:
+            case TimeType.all: {
+                newDate.add(Calendar.YEAR, dayMonthYearToAdd);
+            }
+            break;
+        }
+        return calendarToString(newDate, dateFormat);
+    }
+
+    /**
+     * 鍑忥紙鏃ワ紝鏈堬紝骞达級璁$畻
+     *
+     * @param date                   鏃ュ巻
+     * @param dayMonthYearToSubtract 澶╂暟
+     * @return 鏃ュ巻
+     */
+    public static String subtractDayMonthYearFromDate(Calendar date, int dayMonthYearToSubtract, String dateFormat, String timeType) {
+        Calendar newDate = (Calendar) date.clone();
+        switch (timeType) {
+            case TimeType.day: {
+                newDate.add(Calendar.DAY_OF_MONTH, -dayMonthYearToSubtract);
+            }
+            break;
+            case TimeType.month: {
+                newDate.add(Calendar.MONTH, -dayMonthYearToSubtract);
+            }
+            break;
+            case TimeType.year:
+            case TimeType.all: {
+                newDate.add(Calendar.YEAR, -dayMonthYearToSubtract);
+            }
+            break;
+        }
+        return calendarToString(newDate, dateFormat);
+    }
+
+    /**
+     * 鏃堕棿鎴宠浆Calendar
+     *
+     * @param timestamp 鏃堕棿鎴�
+     * @return Calendar瀵硅薄
+     */
+    public static Calendar timestampToCalendar(long timestamp) {
+        // 灏嗘椂闂存埑杞崲涓烘棩鏈�
+        Date date = new Date(timestamp);
+        // 浣跨敤Calendar绫昏缃棩鏈�
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar;
+    }
+
+    /**
+     * 瀛楃涓叉棩鏈熸牸寮忚浆Calendar
+     *
+     * @param dateString (2023/04/01)
+     * @param dateFormat (yyyy/MM/dd)
+     * @return Calendar瀵硅薄
+     */
+    public static Calendar stringToCalendar(String dateString, String dateFormat) {
+        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
+        Calendar calendar = Calendar.getInstance();
+        try {
+            Date date = sdf.parse(dateString);
+            if (date != null) {
+                calendar.setTime(date);
+            }
+        } catch (Exception ignored) {
+        }
+        return calendar;
+    }
+
+    /**
+     * Calendar杞瓧绗︿覆鏃ユ湡鏍煎紡
+     *
+     * @param dateFormat (yyyy/MM/dd)
+     * @return Calendar瀵硅薄
+     */
+    public static String calendarToString(Calendar calendar, String dateFormat) {
+        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
+        return sdf.format(calendar.getTime());
+    }
+
+    /**
+     * Date杞瓧绗︿覆鏃ユ湡鏍煎紡
+     *
+     * @param dateFormat (yyyy/MM/dd)
+     * @return Calendar瀵硅薄
+     */
+    public static String dateToString(Date date, String dateFormat) {
+        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
+        return sdf.format(date.getTime());
+    }
+
+    /**
+     * 瀛楃涓叉棩鏈熸牸寮忚浆鏃堕棿鎴�
+     *
+     * @param dateString (2024/06/01)
+     * @param dateFormat (yyyy/MM/dd)
+     * @return 鏃堕棿鎴�
+     */
+    public static long stringDateToTimestamp(String dateString, String dateFormat) {
+        try {
+            SimpleDateFormat slf = new SimpleDateFormat(dateFormat, Locale.getDefault());
+            Date date = slf.parse(dateString);
+            if (date == null) {
+                return 0;
+            }
+            return date.getTime(); // 鑾峰彇鏃堕棿鎴�
+        } catch (Exception ignored) {
+        }
+        return 0;
+    }
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/widget/ConfirmationExceptionDialog.java b/app/src/main/java/com/hdl/photovoltaic/widget/ConfirmationExceptionDialog.java
index ae198d6..0eb90a3 100644
--- a/app/src/main/java/com/hdl/photovoltaic/widget/ConfirmationExceptionDialog.java
+++ b/app/src/main/java/com/hdl/photovoltaic/widget/ConfirmationExceptionDialog.java
@@ -73,7 +73,7 @@
     }
 
     private void initEvent() {
-        viewBinding.toolbarTopExceptionRl.topBackBtn.setOnClickListener(new View.OnClickListener() {
+        viewBinding.toolbarTopExceptionRl.topBackLl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 dismiss();
diff --git a/app/src/main/java/com/hdl/photovoltaic/widget/DefaultFilteringDialog.java b/app/src/main/java/com/hdl/photovoltaic/widget/DefaultFilteringDialog.java
new file mode 100644
index 0000000..82614bd
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/widget/DefaultFilteringDialog.java
@@ -0,0 +1,345 @@
+package com.hdl.photovoltaic.widget;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.content.res.AppCompatResources;
+
+import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.base.BaseDialog;
+import com.hdl.photovoltaic.databinding.DialogDefaultFilteringBinding;
+import com.hdl.photovoltaic.enums.GridType;
+import com.hdl.photovoltaic.other.HdlThreadLogic;
+
+public class DefaultFilteringDialog extends BaseDialog {
+    private final Context mContext;
+
+    DialogDefaultFilteringBinding viewBinding;
+
+    OnClickListener mOnClickListener;
+
+    final String text1 = "0-5";
+    final String text2 = "5-10";
+    final String text3 = "10-15";
+    final String text4 = "15-30";
+    final String text5 = "30-100";
+    final String text6 = "100-300";
+    final String text7 = "300-500";
+    final String text8 = "500+";
+
+
+    private String mStateValue = GridType.All;
+
+    public DefaultFilteringDialog(@NonNull Context context) {
+        super(context, R.style.Custom_Dialog);
+        this.mContext = context;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        viewBinding = DialogDefaultFilteringBinding.inflate(getLayoutInflater());
+        setContentView(viewBinding.getRoot());
+        //绌虹櫧澶勪笉鑳藉彇娑堝姩鐢�
+        setCanceledOnTouchOutside(false);
+        //鍒濆鍖栫晫闈㈡帶浠�
+        initView();
+        //鍒濆鍖栫晫闈㈡暟鎹�
+//        initData(mMinValue, mMaxValue, mStateValue);
+        //鍒濆鍖栫晫闈㈡帶浠剁殑浜嬩欢
+        initEvent();
+
+
+    }
+
+    private void initEvent() {
+
+        viewBinding.affirmLl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String minValue = viewBinding.minEt.getText().toString();
+                String maxValue = viewBinding.maxEt.getText().toString();
+                if (!TextUtils.isEmpty(minValue) && !TextUtils.isEmpty(maxValue)) {
+                    try {
+                        if (Integer.parseInt(minValue) > Integer.parseInt(maxValue)) {
+                            //鏈�灏忓�煎湪鍓嶉潰
+                            if (mOnClickListener != null) {
+                                mOnClickListener.confirm(maxValue, minValue, mStateValue);
+                            }
+                        } else {
+                            if (mOnClickListener != null) {
+                                mOnClickListener.confirm(minValue, maxValue, mStateValue);
+                            }
+                        }
+                    } catch (Exception e) {
+                        //寮哄埗杞崲鍥犺緭鍏ュ�艰秴鍑篿nt鍊煎煙鑼冨洿鎶ュ嚭寮傚父
+                        int maxValueInt = Integer.MAX_VALUE;
+                        HdlThreadLogic.toast(mContext, mContext.getString(R.string.the_input_value_has_been_exceeded) + "(" + maxValueInt + ").");
+                        return;
+                    }
+
+                } else {
+                    if (mOnClickListener != null) {
+                        mOnClickListener.confirm(minValue, maxValue, mStateValue);
+                    }
+                }
+                dismiss();
+            }
+        });
+
+
+        viewBinding.cancelLl.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismiss();
+            }
+        });
+
+        viewBinding.resetTv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(null, TitleType.string_capacity);
+                setSelectedText("");
+            }
+        });
+        viewBinding.text1Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text1Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text1Tv.getTag().toString());
+            }
+        });
+        viewBinding.text2Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text2Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text2Tv.getTag().toString());
+            }
+        });
+        viewBinding.text3Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text3Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text3Tv.getTag().toString());
+            }
+        });
+        viewBinding.text4Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text4Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text4Tv.getTag().toString());
+            }
+        });
+
+        viewBinding.text5Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text5Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text5Tv.getTag().toString());
+            }
+        });
+        viewBinding.text6Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text6Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text6Tv.getTag().toString());
+            }
+        });
+        viewBinding.text7Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text7Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text7Tv.getTag().toString());
+            }
+        });
+        viewBinding.text8Tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.text8Tv, TitleType.string_capacity);
+                setSelectedText(viewBinding.text8Tv.getTag().toString());
+            }
+        });
+
+        viewBinding.allTv.setOnClickListener(new View.OnClickListener() {
+
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.allTv, TitleType.GridConnectedState);
+                setSelectedText(viewBinding.allTv.getTag().toString());
+            }
+        });
+        viewBinding.gridConnectedTv.setOnClickListener(new View.OnClickListener() {
+
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.gridConnectedTv, TitleType.GridConnectedState);
+                setSelectedText(viewBinding.gridConnectedTv.getTag().toString());
+            }
+        });
+        viewBinding.offNetworkTv.setOnClickListener(new View.OnClickListener() {
+
+            @Override
+            public void onClick(View v) {
+                setBackgroundColor(viewBinding.offNetworkTv, TitleType.GridConnectedState);
+                setSelectedText(viewBinding.offNetworkTv.getTag().toString());
+            }
+        });
+
+    }
+
+    /**
+     * @param value 閫変腑鐨勫��
+     */
+    private void setSelectedText(String value) {
+
+        String minValue = "", maxValue = "";
+        if (TextUtils.isEmpty(value)) {
+            minValue = "";
+            maxValue = "";
+        } else if (value.contains("+")) {
+            minValue = "500";
+            maxValue = "";
+        } else if (value.contains("-")) {
+            String[] min_max = value.split("-");
+            if (min_max.length == 2) {
+                minValue = min_max[0];
+                maxValue = min_max[1];
+            }
+        } else {
+            mStateValue = value;
+        }
+
+        viewBinding.minEt.setText(minValue);
+        viewBinding.maxEt.setText(maxValue);
+
+    }
+
+    /**
+     * 鏀瑰彉缁勪欢鑳屾櫙锛屽瓧浣撻鑹叉牸寮�
+     *
+     * @param textView  缁勪欢鍙互锛堣缃负null,娌℃湁閫変腑鐘舵��)
+     * @param titleType 淇敼绫诲瀷
+     */
+    private void setBackgroundColor(TextView textView, TitleType titleType) {
+        if (titleType == TitleType.string_capacity) {
+            viewBinding.text1Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text1Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.text2Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text2Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.text3Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text3Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.text4Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text4Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.text5Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text5Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.text6Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text6Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.text7Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text7Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.text8Tv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.text8Tv.setTextColor(mContext.getColor(R.color.text_90000000));
+        } else {
+            viewBinding.allTv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.allTv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.gridConnectedTv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.gridConnectedTv.setTextColor(mContext.getColor(R.color.text_90000000));
+            viewBinding.offNetworkTv.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.search_bj_ff05000000));
+            viewBinding.offNetworkTv.setTextColor(mContext.getColor(R.color.text_90000000));
+        }
+        if (textView != null) {
+            textView.setBackground(AppCompatResources.getDrawable(mContext, R.drawable.selected_38c494));
+            textView.setTextColor(mContext.getColor(R.color.text_FFFFFFFF));
+        }
+
+    }
+
+    public void initState(String min, String max, String stateValue) {
+        try {
+            mStateValue = stateValue;
+            viewBinding.minEt.setText(min);
+            viewBinding.maxEt.setText(max);
+
+            if (!TextUtils.isEmpty(min) || !TextUtils.isEmpty(max)) {
+                String str = min + "-" + max;
+                switch (str) {
+                    case text1:
+                        setBackgroundColor(viewBinding.text1Tv, TitleType.string_capacity);
+                        break;
+                    case text2:
+                        setBackgroundColor(viewBinding.text2Tv, TitleType.string_capacity);
+                        break;
+                    case text3:
+                        setBackgroundColor(viewBinding.text3Tv, TitleType.string_capacity);
+                        break;
+                    case text4:
+                        setBackgroundColor(viewBinding.text4Tv, TitleType.string_capacity);
+                        break;
+                    case text5:
+                        setBackgroundColor(viewBinding.text5Tv, TitleType.string_capacity);
+                        break;
+                    case text6:
+                        setBackgroundColor(viewBinding.text6Tv, TitleType.string_capacity);
+                        break;
+                    case text7:
+                        setBackgroundColor(viewBinding.text7Tv, TitleType.string_capacity);
+                        break;
+                    case text8:
+                        setBackgroundColor(viewBinding.text8Tv, TitleType.string_capacity);
+                        break;
+                }
+            }
+            if (TextUtils.isEmpty(stateValue)) {
+                setBackgroundColor(viewBinding.allTv, TitleType.GridConnectedState);
+            } else if (stateValue.equals(GridType.FULL_GRID)) {
+                setBackgroundColor(viewBinding.gridConnectedTv, TitleType.GridConnectedState);
+            } else {
+                setBackgroundColor(viewBinding.offNetworkTv, TitleType.GridConnectedState);
+            }
+        } catch (Exception ignored) {
+        }
+
+    }
+
+    private void initView() {
+
+        viewBinding.text1Tv.setTag(text1);
+        viewBinding.text2Tv.setTag(text2);
+        viewBinding.text3Tv.setTag(text3);
+        viewBinding.text4Tv.setTag(text4);
+        viewBinding.text5Tv.setTag(text5);
+        viewBinding.text6Tv.setTag(text6);
+        viewBinding.text7Tv.setTag(text7);
+        viewBinding.text8Tv.setTag(text8);
+
+        viewBinding.allTv.setTag(GridType.All);
+        viewBinding.gridConnectedTv.setTag(GridType.FULL_GRID);
+        viewBinding.offNetworkTv.setTag(GridType.OFFLINE);
+        setBackgroundColor(null, TitleType.string_capacity);
+        setBackgroundColor(viewBinding.allTv, TitleType.GridConnectedState);
+    }
+
+    public void setOnClickListener(OnClickListener onClickListener) {
+        if (onClickListener != null) {
+            mOnClickListener = onClickListener;
+        }
+    }
+
+
+    public interface OnClickListener {
+        void confirm(String min, String max, String state);
+    }
+
+    public enum TitleType {
+        string_capacity,//缁勪覆瀹归噺
+        GridConnectedState//骞剁綉鐘舵��
+
+    }
+
+
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/widget/TypeTitleListDialog.java b/app/src/main/java/com/hdl/photovoltaic/widget/TypeTitleListDialog.java
index 60bace3..c0f7fed 100644
--- a/app/src/main/java/com/hdl/photovoltaic/widget/TypeTitleListDialog.java
+++ b/app/src/main/java/com/hdl/photovoltaic/widget/TypeTitleListDialog.java
@@ -3,8 +3,16 @@
 import android.annotation.SuppressLint;
 import android.app.Dialog;
 import android.content.Context;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
 import android.os.Bundle;
+import android.view.Gravity;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.LinearLayoutManager;
@@ -15,6 +23,8 @@
 import com.hdl.photovoltaic.widget.adapter.TypeListDialogAdapter;
 
 import java.util.List;
+
+import io.dcloud.common.util.DensityUtils;
 
 public class TypeTitleListDialog extends BaseDialog {
 
@@ -52,18 +62,44 @@
                 }
             }
         });
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+//        // 鑾峰彇绐楀彛瀵硅薄
+//        Window dialogWindow = this.getWindow();
+//        if (dialogWindow != null) {
+//            // 鑾峰彇瀵硅瘽妗嗗綋鍓嶇殑鍙傛暟鍊�
+//            WindowManager.LayoutParams p = dialogWindow.getAttributes();
+//            p.width = LinearLayout.LayoutParams.MATCH_PARENT;
+//            p.height = LinearLayout.LayoutParams.WRAP_CONTENT;
+////            p.dimAmount = 0.6f;
+//            dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+//            p.gravity = Gravity.BOTTOM;
+//            p.y = DensityUtils.dip2px(mContext, 352);
+////            //杩欓噷璁剧疆鐨勫楂樹紭鍏堢骇楂樹簬XML涓殑甯冨眬璁剧疆
+////            if (this.enumBoxType == BoxType.PhotoAlbumBox) {
+////                p.gravity = Gravity.BOTTOM;
+////            } else if (this.enumBoxType == BoxType.FlashingBox) {
+////                p.dimAmount = 0f;
+////            }
+//            // 璁剧疆鍒板睘鎬ч厤缃腑
+//            dialogWindow.setAttributes(p);
+//        }
+//        setDialogTouchOutsideCloseable(this);
 
     }
 
     @SuppressLint("ClickableViewAccessibility")
     public void setDialogTouchOutsideCloseable(Dialog dialog) {
-        viewBinding.getRoot().setOnClickListener(new View.OnClickListener() {
+        viewBinding.typeParentCl.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                int top = viewBinding.typeParentCl.getTop();
-                int left = viewBinding.typeParentCl.getLeft();
-                int bottom = viewBinding.typeParentCl.getBottom();
-                int right = viewBinding.typeParentCl.getRight();
+                int top = viewBinding.dialogParentCl.getTop();
+                int left = viewBinding.dialogParentCl.getLeft();
+                int bottom = viewBinding.dialogParentCl.getBottom();
+                int right = viewBinding.dialogParentCl.getRight();
                 int y = (int) v.getY();
                 int x = (int) v.getX();
                 if (top < y && y < bottom) {
diff --git a/app/src/main/res/drawable/add.png b/app/src/main/res/drawable/add.png
index 2ab7acb..5e82768 100644
--- a/app/src/main/res/drawable/add.png
+++ b/app/src/main/res/drawable/add.png
Binary files differ
diff --git a/app/src/main/res/drawable/ascending_descending_order_select.xml b/app/src/main/res/drawable/ascending_descending_order_select.xml
new file mode 100644
index 0000000..8b259f2
--- /dev/null
+++ b/app/src/main/res/drawable/ascending_descending_order_select.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/ascending_sort" android:state_selected="true" />
+    <item android:drawable="@drawable/descending_order" android:state_selected="false" />
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ascending_sort.png b/app/src/main/res/drawable/ascending_sort.png
new file mode 100644
index 0000000..cb82fc7
--- /dev/null
+++ b/app/src/main/res/drawable/ascending_sort.png
Binary files differ
diff --git a/app/src/main/res/drawable/bj.png b/app/src/main/res/drawable/bj.png
new file mode 100644
index 0000000..4b2f787
--- /dev/null
+++ b/app/src/main/res/drawable/bj.png
Binary files differ
diff --git a/app/src/main/res/drawable/bj_13_ffffff.xml b/app/src/main/res/drawable/bj_13_ffffff.xml
new file mode 100644
index 0000000..f71ebe0
--- /dev/null
+++ b/app/src/main/res/drawable/bj_13_ffffff.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item>
+        <shape android:shape="rectangle">
+            <corners android:radius="@dimen/dp_13" />
+            <solid android:color="#CCFFFFFF" />
+        </shape>
+    </item>
+
+    <item >
+        <shape>
+            <corners android:radius="@dimen/dp_13" />
+            <gradient
+                android:angle="315"
+                android:endColor="#00FFECD9"
+                android:startColor="#66FFE2C6" />
+
+        </shape>
+    </item>
+
+
+
+</layer-list>
+
diff --git a/app/src/main/res/drawable/bj_13fffffff.xml b/app/src/main/res/drawable/bj_13fffffff.xml
new file mode 100644
index 0000000..7b0d815
--- /dev/null
+++ b/app/src/main/res/drawable/bj_13fffffff.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/dp_13" />
+    <solid android:color="@color/text_FFFFFFFF" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/clear.png b/app/src/main/res/drawable/clear.png
index 44d80ae..8eb2f8d 100644
--- a/app/src/main/res/drawable/clear.png
+++ b/app/src/main/res/drawable/clear.png
Binary files differ
diff --git a/app/src/main/res/drawable/default_condition.png b/app/src/main/res/drawable/default_condition.png
new file mode 100644
index 0000000..aea9459
--- /dev/null
+++ b/app/src/main/res/drawable/default_condition.png
Binary files differ
diff --git a/app/src/main/res/drawable/descending_order.png b/app/src/main/res/drawable/descending_order.png
new file mode 100644
index 0000000..3084f4d
--- /dev/null
+++ b/app/src/main/res/drawable/descending_order.png
Binary files differ
diff --git a/app/src/main/res/drawable/device_image.png b/app/src/main/res/drawable/device_image.png
new file mode 100644
index 0000000..24446dc
--- /dev/null
+++ b/app/src/main/res/drawable/device_image.png
Binary files differ
diff --git a/app/src/main/res/drawable/disc.png b/app/src/main/res/drawable/disc.png
new file mode 100644
index 0000000..fd23fba
--- /dev/null
+++ b/app/src/main/res/drawable/disc.png
Binary files differ
diff --git a/app/src/main/res/drawable/edit.png b/app/src/main/res/drawable/edit.png
new file mode 100644
index 0000000..ebbe686
--- /dev/null
+++ b/app/src/main/res/drawable/edit.png
Binary files differ
diff --git a/app/src/main/res/drawable/ffffff_13.xml b/app/src/main/res/drawable/ffffff_13.xml
new file mode 100644
index 0000000..fd9e1af
--- /dev/null
+++ b/app/src/main/res/drawable/ffffff_13.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/dp_13" />
+    <solid android:color="@color/text_FFFFFFFF" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/history_del.png b/app/src/main/res/drawable/history_del.png
new file mode 100644
index 0000000..6dcdb6a
--- /dev/null
+++ b/app/src/main/res/drawable/history_del.png
Binary files differ
diff --git a/app/src/main/res/drawable/home_page_selected.png b/app/src/main/res/drawable/home_page_selected.png
new file mode 100644
index 0000000..63c8549
--- /dev/null
+++ b/app/src/main/res/drawable/home_page_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable/home_page_unselected.png b/app/src/main/res/drawable/home_page_unselected.png
new file mode 100644
index 0000000..ddf808d
--- /dev/null
+++ b/app/src/main/res/drawable/home_page_unselected.png
Binary files differ
diff --git a/app/src/main/res/drawable/house_list_line_parent_bg.xml b/app/src/main/res/drawable/house_list_line_parent_bg.xml
index 7a5233d..8e4af38 100644
--- a/app/src/main/res/drawable/house_list_line_parent_bg.xml
+++ b/app/src/main/res/drawable/house_list_line_parent_bg.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/text_FFFFFFFF" />
-    <corners android:radius="@dimen/dp_4" />
+    <corners android:radius="@dimen/dp_13" />
 </shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/info_1.png b/app/src/main/res/drawable/info_1.png
new file mode 100644
index 0000000..31d4755
--- /dev/null
+++ b/app/src/main/res/drawable/info_1.png
Binary files differ
diff --git a/app/src/main/res/drawable/last_step.png b/app/src/main/res/drawable/last_step.png
new file mode 100644
index 0000000..76e89c7
--- /dev/null
+++ b/app/src/main/res/drawable/last_step.png
Binary files differ
diff --git a/app/src/main/res/drawable/line_c1c1c1.xml b/app/src/main/res/drawable/line_c1c1c1.xml
new file mode 100644
index 0000000..fab5ec0
--- /dev/null
+++ b/app/src/main/res/drawable/line_c1c1c1.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke
+        android:width="1dp"
+        android:color="@color/text_C1C1C1" />
+    <corners android:radius="@dimen/dp_6" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/location.png b/app/src/main/res/drawable/location.png
new file mode 100644
index 0000000..4078192
--- /dev/null
+++ b/app/src/main/res/drawable/location.png
Binary files differ
diff --git a/app/src/main/res/drawable/me_selected.png b/app/src/main/res/drawable/me_selected.png
new file mode 100644
index 0000000..373d160
--- /dev/null
+++ b/app/src/main/res/drawable/me_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable/me_unselected.png b/app/src/main/res/drawable/me_unselected.png
new file mode 100644
index 0000000..2832896
--- /dev/null
+++ b/app/src/main/res/drawable/me_unselected.png
Binary files differ
diff --git a/app/src/main/res/drawable/message_select.png b/app/src/main/res/drawable/message_select.png
index a3d6cd4..ace4cee 100644
--- a/app/src/main/res/drawable/message_select.png
+++ b/app/src/main/res/drawable/message_select.png
Binary files differ
diff --git a/app/src/main/res/drawable/message_selected.png b/app/src/main/res/drawable/message_selected.png
new file mode 100644
index 0000000..baabed1
--- /dev/null
+++ b/app/src/main/res/drawable/message_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable/message_unselected.png b/app/src/main/res/drawable/message_unselected.png
index f79a0d2..773462a 100644
--- a/app/src/main/res/drawable/message_unselected.png
+++ b/app/src/main/res/drawable/message_unselected.png
Binary files differ
diff --git a/app/src/main/res/drawable/next_step.png b/app/src/main/res/drawable/next_step.png
new file mode 100644
index 0000000..62d6974
--- /dev/null
+++ b/app/src/main/res/drawable/next_step.png
Binary files differ
diff --git a/app/src/main/res/drawable/point_38c494.xml b/app/src/main/res/drawable/point_38c494.xml
new file mode 100644
index 0000000..bd87081
--- /dev/null
+++ b/app/src/main/res/drawable/point_38c494.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="5.5dp" />
+    <solid android:color="@color/text_38C494" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/power_station_selected.png b/app/src/main/res/drawable/power_station_selected.png
new file mode 100644
index 0000000..4d12406
--- /dev/null
+++ b/app/src/main/res/drawable/power_station_selected.png
Binary files differ
diff --git a/app/src/main/res/drawable/power_station_unselected.png b/app/src/main/res/drawable/power_station_unselected.png
new file mode 100644
index 0000000..3331876
--- /dev/null
+++ b/app/src/main/res/drawable/power_station_unselected.png
Binary files differ
diff --git a/app/src/main/res/drawable/reset.png b/app/src/main/res/drawable/reset.png
new file mode 100644
index 0000000..203ef8e
--- /dev/null
+++ b/app/src/main/res/drawable/reset.png
Binary files differ
diff --git a/app/src/main/res/drawable/search_back.png b/app/src/main/res/drawable/search_back.png
new file mode 100644
index 0000000..12a6346
--- /dev/null
+++ b/app/src/main/res/drawable/search_back.png
Binary files differ
diff --git a/app/src/main/res/drawable/search_bj_ff05000000.xml b/app/src/main/res/drawable/search_bj_ff05000000.xml
new file mode 100644
index 0000000..64685ec
--- /dev/null
+++ b/app/src/main/res/drawable/search_bj_ff05000000.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/dp_17" />
+    <solid android:color="#05000000" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/search_path.png b/app/src/main/res/drawable/search_path.png
new file mode 100644
index 0000000..e221c53
--- /dev/null
+++ b/app/src/main/res/drawable/search_path.png
Binary files differ
diff --git a/app/src/main/res/drawable/selected_38c494.xml b/app/src/main/res/drawable/selected_38c494.xml
new file mode 100644
index 0000000..af2abeb
--- /dev/null
+++ b/app/src/main/res/drawable/selected_38c494.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/dp_17" />
+    <solid android:color="@color/text_38C494" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/social_contribution_1.png b/app/src/main/res/drawable/social_contribution_1.png
new file mode 100644
index 0000000..223f452
--- /dev/null
+++ b/app/src/main/res/drawable/social_contribution_1.png
Binary files differ
diff --git a/app/src/main/res/drawable/social_contribution_2.png b/app/src/main/res/drawable/social_contribution_2.png
new file mode 100644
index 0000000..91c0264
--- /dev/null
+++ b/app/src/main/res/drawable/social_contribution_2.png
Binary files differ
diff --git a/app/src/main/res/drawable/social_contribution_3.png b/app/src/main/res/drawable/social_contribution_3.png
new file mode 100644
index 0000000..31351a5
--- /dev/null
+++ b/app/src/main/res/drawable/social_contribution_3.png
Binary files differ
diff --git a/app/src/main/res/drawable/state_06b92a.xml b/app/src/main/res/drawable/state_06b92a.xml
index d4505e4..441aaad 100644
--- a/app/src/main/res/drawable/state_06b92a.xml
+++ b/app/src/main/res/drawable/state_06b92a.xml
@@ -2,6 +2,6 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/text_06B92A" />
     <corners
-        android:bottomLeftRadius="@dimen/dp_4"
-        android:topRightRadius="@dimen/dp_4" />
+        android:bottomLeftRadius="@dimen/dp_13"
+        android:topRightRadius="@dimen/dp_13" />
 </shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/state_b9b9b9.xml b/app/src/main/res/drawable/state_b9b9b9.xml
index f5f4a8b..629430a 100644
--- a/app/src/main/res/drawable/state_b9b9b9.xml
+++ b/app/src/main/res/drawable/state_b9b9b9.xml
@@ -2,6 +2,6 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/text_B9B9B9" />
     <corners
-        android:bottomLeftRadius="@dimen/dp_4"
-        android:topRightRadius="@dimen/dp_4" />
+        android:bottomLeftRadius="@dimen/dp_13"
+        android:topRightRadius="@dimen/dp_13" />
 </shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/state_e34343.xml b/app/src/main/res/drawable/state_e34343.xml
index ec2b056..9b7e68c 100644
--- a/app/src/main/res/drawable/state_e34343.xml
+++ b/app/src/main/res/drawable/state_e34343.xml
@@ -2,6 +2,6 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/text_E34343" />
     <corners
-        android:bottomLeftRadius="@dimen/dp_4"
-        android:topRightRadius="@dimen/dp_4" />
+        android:bottomLeftRadius="@dimen/dp_13"
+        android:topRightRadius="@dimen/dp_13" />
 </shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/state_ffb300.xml b/app/src/main/res/drawable/state_ffb300.xml
index 2f120fb..81321b9 100644
--- a/app/src/main/res/drawable/state_ffb300.xml
+++ b/app/src/main/res/drawable/state_ffb300.xml
@@ -2,6 +2,6 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <solid android:color="@color/text_FFB300" />
     <corners
-        android:bottomLeftRadius="@dimen/dp_4"
-        android:topRightRadius="@dimen/dp_4" />
+        android:bottomLeftRadius="@dimen/dp_13"
+        android:topRightRadius="@dimen/dp_13" />
 </shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/station_status_no_ffffff.xml b/app/src/main/res/drawable/station_status_no_ffffff.xml
new file mode 100644
index 0000000..64bcd73
--- /dev/null
+++ b/app/src/main/res/drawable/station_status_no_ffffff.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/dp_8" />
+    <solid android:color="#FFFFFF" />
+</shape>
diff --git a/app/src/main/res/drawable/station_status_sele_38c494.xml b/app/src/main/res/drawable/station_status_sele_38c494.xml
new file mode 100644
index 0000000..889a8bc
--- /dev/null
+++ b/app/src/main/res/drawable/station_status_sele_38c494.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="@dimen/dp_8" />
+    <solid android:color="#38c494" />
+</shape>
diff --git a/app/src/main/res/drawable/time_selected_38c494.xml b/app/src/main/res/drawable/time_selected_38c494.xml
new file mode 100644
index 0000000..4d80ef2
--- /dev/null
+++ b/app/src/main/res/drawable/time_selected_38c494.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/text_1238C494" />
+    <corners android:radius="@dimen/dp_6" />
+    <stroke
+        android:width="@dimen/dp_1"
+        android:color="@color/text_38C494" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_as_regards.xml b/app/src/main/res/layout/activity_as_regards.xml
index babe0ed..4668c36 100644
--- a/app/src/main/res/layout/activity_as_regards.xml
+++ b/app/src/main/res/layout/activity_as_regards.xml
@@ -15,8 +15,8 @@
         android:id="@+id/as_regards_icon_iv"
         android:layout_width="53.5dp"
         android:layout_height="53.5dp"
-        android:src="@drawable/logo"
         android:layout_marginTop="@dimen/dp_29"
+        android:src="@drawable/logo"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/toolbar_top_fragment_house_list_rl" />
@@ -53,7 +53,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/as_regards_qr_code_iv" />
-
+    <!--鐗堟湰鏇存柊-->
     <RelativeLayout
         android:id="@+id/as_regards_version_updating_rl"
         android:layout_width="match_parent"
@@ -103,7 +103,7 @@
             android:textSize="@dimen/text_15" />
 
     </RelativeLayout>
-
+    <!--鏈嶅姟鍗忚-->
     <RelativeLayout
         android:id="@+id/service_agreement_rl"
         android:layout_width="match_parent"
@@ -142,7 +142,7 @@
 
 
     </RelativeLayout>
-
+    <!--闅愮鏀跨瓥-->
     <RelativeLayout
         android:id="@+id/privacy_policy_rl"
         android:layout_width="match_parent"
@@ -181,6 +181,45 @@
 
 
     </RelativeLayout>
+    <!--鑱旂郴鎴戜滑-->
+    <RelativeLayout
+        android:id="@+id/contact_us_rl"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_57"
+        android:background="@color/text_FFFFFFFF"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/service_agreement_rl">
+
+        <TextView
+            android:id="@+id/contact_us_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_21"
+            android:layout_centerVertical="true"
+            android:layout_marginStart="@dimen/dp_16"
+            android:text="@string/contact_us"
+            android:textColor="@color/text_030D1C"
+            android:textSize="@dimen/text_15"
+
+            />
+
+        <LinearLayout
+            android:id="@+id/contact_us_ll"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="@dimen/dp_13">
+            <!--鏍囧噯鍥炬爣-->
+            <ImageView
+                android:id="@+id/contact_us_ll_right_next_iv"
+                android:layout_width="@dimen/dp_16"
+                android:layout_height="@dimen/dp_16"
+                android:src="@drawable/next" />
+        </LinearLayout>
+
+
+    </RelativeLayout>
 
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_contact_us.xml b/app/src/main/res/layout/activity_contact_us.xml
new file mode 100644
index 0000000..1a935b7
--- /dev/null
+++ b/app/src/main/res/layout/activity_contact_us.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/text_F5F7FA"
+    tools:context=".ui.me.ContactUsActivity">
+
+    <include
+        android:id="@+id/toolbar_top_fragment_house_list_rl"
+        layout="@layout/toolbar_top_view_52" />
+
+    <RelativeLayout
+        android:id="@+id/wechat_id_rl"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_57"
+        android:layout_marginTop="@dimen/dp_12"
+        android:background="@color/text_FFFFFFFF"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/toolbar_top_fragment_house_list_rl">
+
+        <TextView
+            android:id="@+id/wechat_id_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_centerVertical="true"
+            android:layout_marginStart="@dimen/dp_16"
+            android:text="@string/wechat_id"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+
+            />
+
+        <TextView
+            android:id="@+id/wechat_id_content_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="@dimen/dp_16"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16" />
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:id="@+id/idemail_address_rl"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_57"
+        android:background="@color/text_FFFFFFFF"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/wechat_id_rl">
+
+        <TextView
+            android:id="@+id/email_address_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_centerVertical="true"
+            android:layout_marginStart="@dimen/dp_16"
+            android:text="@string/email_address"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16" />
+
+        <TextView
+            android:id="@+id/email_address_content_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="@dimen/dp_16"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16" />
+
+    </RelativeLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_device_search.xml b/app/src/main/res/layout/activity_device_search.xml
new file mode 100644
index 0000000..9ee799d
--- /dev/null
+++ b/app/src/main/res/layout/activity_device_search.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/text_F5F7FA"
+    tools:context=".ui.powerstation.DeviceSearchActivity">
+
+    <!--鎼滅储-->
+    <RelativeLayout
+        android:id="@+id/power_station_search_cl"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_35"
+        android:layout_marginTop="@dimen/dp_48"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <RelativeLayout
+            android:id="@+id/back_rl"
+            android:layout_width="@dimen/dp_50"
+            android:layout_height="match_parent">
+
+            <ImageView
+                android:id="@+id/power_station_back_iv"
+                android:layout_width="@dimen/dp_10"
+                android:layout_height="@dimen/dp_17"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_16"
+                android:src="@drawable/search_back" />
+        </RelativeLayout>
+
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginStart="@dimen/dp_7"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:layout_toStartOf="@+id/power_station_search_tv"
+            android:layout_toEndOf="@+id/back_rl"
+            android:background="@drawable/search_bj_ff05000000">
+
+            <ImageView
+                android:id="@+id/power_station_search_iv"
+                android:layout_width="@dimen/dp_18"
+                android:layout_height="@dimen/dp_18"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_13"
+                android:src="@drawable/search_path" />
+
+            <EditText
+                android:id="@+id/power_station_search_et"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_11"
+                android:layout_marginEnd="@dimen/dp_40"
+                android:layout_toEndOf="@+id/power_station_search_iv"
+                android:background="@null"
+                android:gravity="start|center_vertical"
+                android:hint="Search the power station"
+                android:textColor="@color/text_90000000"
+                android:textColorHint="@color/text_40000000"
+                android:textSize="@dimen/text_14" />
+
+            <ImageView
+                android:id="@+id/power_station_clear_iv"
+                android:layout_width="@dimen/dp_20"
+                android:layout_height="@dimen/dp_20"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true"
+                android:layout_marginEnd="@dimen/dp_13"
+                android:src="@drawable/clear" />
+        </RelativeLayout>
+
+        <TextView
+            android:id="@+id/power_station_search_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:gravity="center"
+            android:text="@string/search"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16" />
+
+
+    </RelativeLayout>
+    <!--鍘嗗彶璁板綍-->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/history_list_parent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/power_station_search_cl">
+
+        <TextView
+            android:id="@+id/history_list_title_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_marginStart="@dimen/dp_16"
+            android:layout_marginTop="@dimen/dp_23"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:text="@string/history_search"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <ImageView
+            android:id="@+id/power_station_del_iv"
+            android:layout_width="@dimen/dp_26"
+            android:layout_height="@dimen/dp_26"
+            android:layout_marginTop="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_16"
+            android:src="@drawable/history_del"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/history_list_rcv"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_marginTop="67dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+    <!--鎼滅储鏁版嵁-->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/list_parent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="@dimen/dp_30"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/power_station_search_cl">
+
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/list_srl"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/list_rcv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_home_login.xml b/app/src/main/res/layout/activity_home_login.xml
index 21e841a..2589605 100644
--- a/app/src/main/res/layout/activity_home_login.xml
+++ b/app/src/main/res/layout/activity_home_login.xml
@@ -7,7 +7,7 @@
     android:layout_height="match_parent"
     android:background="@drawable/logo_bj"
 
-    tools:context="com.hdl.photovoltaic.ui.HomeLoginActivity">
+    tools:context="com.hdl.photovoltaic.ui.LoginActivity">
 
     <ImageView
         android:id="@+id/home_login_server_iv"
diff --git a/app/src/main/res/layout/activity_house_search.xml b/app/src/main/res/layout/activity_house_search.xml
new file mode 100644
index 0000000..f404390
--- /dev/null
+++ b/app/src/main/res/layout/activity_house_search.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/text_F5F7FA"
+    tools:context=".ui.powerstation.HouseSearchActivity">
+    <!--鎼滅储-->
+    <RelativeLayout
+        android:id="@+id/power_station_search_cl"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_35"
+        android:layout_marginTop="@dimen/dp_48"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <RelativeLayout
+            android:id="@+id/back_rl"
+            android:layout_width="@dimen/dp_50"
+            android:layout_height="match_parent">
+
+            <ImageView
+                android:id="@+id/power_station_back_iv"
+                android:layout_width="@dimen/dp_10"
+                android:layout_height="@dimen/dp_17"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_16"
+                android:src="@drawable/search_back" />
+        </RelativeLayout>
+
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginStart="@dimen/dp_7"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:layout_toStartOf="@+id/power_station_search_tv"
+            android:layout_toEndOf="@+id/back_rl"
+            android:background="@drawable/search_bj_ff05000000">
+
+            <ImageView
+                android:id="@+id/power_station_search_iv"
+                android:layout_width="@dimen/dp_18"
+                android:layout_height="@dimen/dp_18"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_13"
+                android:src="@drawable/search_path" />
+
+            <EditText
+                android:id="@+id/power_station_search_et"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_11"
+                android:layout_marginEnd="@dimen/dp_40"
+                android:layout_toEndOf="@+id/power_station_search_iv"
+                android:background="@null"
+                android:gravity="start|center_vertical"
+                android:hint="Search the power station"
+                android:textColor="@color/text_90000000"
+                android:textColorHint="@color/text_40000000"
+                android:textSize="@dimen/text_14" />
+
+            <ImageView
+                android:id="@+id/power_station_clear_iv"
+                android:layout_width="@dimen/dp_20"
+                android:layout_height="@dimen/dp_20"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true"
+                android:layout_marginEnd="@dimen/dp_13"
+                android:src="@drawable/clear" />
+        </RelativeLayout>
+
+        <TextView
+            android:id="@+id/power_station_search_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:gravity="center"
+            android:text="@string/search"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16" />
+
+
+    </RelativeLayout>
+    <!--鍘嗗彶璁板綍-->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/history_list_parent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/power_station_search_cl">
+
+        <TextView
+            android:id="@+id/history_list_title_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_marginStart="@dimen/dp_16"
+            android:layout_marginTop="@dimen/dp_23"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:text="@string/history_search"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <ImageView
+            android:id="@+id/power_station_del_iv"
+            android:layout_width="@dimen/dp_26"
+            android:layout_height="@dimen/dp_26"
+            android:layout_marginTop="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_16"
+            android:src="@drawable/history_del"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/history_list_rcv"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_marginTop="67dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+    <!--鎼滅储鏁版嵁-->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/list_parent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="@dimen/dp_30"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/power_station_search_cl">
+
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/list_srl"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/list_rcv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_my_power_station.xml b/app/src/main/res/layout/activity_my_power_station.xml
index 50ed6b0..20a2b11 100644
--- a/app/src/main/res/layout/activity_my_power_station.xml
+++ b/app/src/main/res/layout/activity_my_power_station.xml
@@ -4,43 +4,19 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/text_F9FAFB"
-    tools:context="com.hdl.photovoltaic.ui.MyPowerStationActivity">
+    android:background="@drawable/bj"
+    tools:context="com.hdl.photovoltaic.ui.BPowerStationActivity">
 
-    <!--鐢电珯鍒楄〃-Fragment-->
+    <!--锛堥椤�-鐢电珯-娑堟伅-鎴戠殑锛�-Fragment-->
     <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/module_fcv"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toTopOf="@+id/my_power_station_bottom_ll"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
 
-        android:id="@+id/my_power_station_fcv1"
-        android:name="com.hdl.photovoltaic.ui.powerstation.HouseListFragment"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:visibility="gone"
-        app:layout_constraintBottom_toTopOf="@+id/my_power_station_bottom_ll"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-    <!--娑堟伅-Fragment-->
-    <androidx.fragment.app.FragmentContainerView
-        android:id="@+id/my_message_fcv2"
-        android:name="com.hdl.photovoltaic.ui.message.MessageFragment"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:visibility="gone"
-        app:layout_constraintBottom_toTopOf="@+id/my_power_station_bottom_ll"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-    <!--鎴戠殑-Fragment-->
-    <androidx.fragment.app.FragmentContainerView
-        android:id="@+id/my_me_fcv3"
-        android:name="com.hdl.photovoltaic.ui.me.MeFragment"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:visibility="gone"
-        app:layout_constraintBottom_toTopOf="@+id/my_power_station_bottom_ll"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
 
     <LinearLayout
         android:id="@+id/my_power_station_bottom_ll"
@@ -51,13 +27,19 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent">
-        <!--鐢电珯-鏍囩-->
+        <!--棣栭〉-妯″潡-->
+        <include
+            android:id="@+id/my_power_station_bottom_il0"
+            layout="@layout/home_bottom_line"
+
+            />
+        <!--鐢电珯-妯″潡-->
         <include
             android:id="@+id/my_power_station_bottom_il1"
             layout="@layout/home_bottom_line"
 
             />
-        <!--娑堟伅-->
+        <!--鎶ヨ-妯″潡-->
         <include
             android:id="@+id/my_message_bottom_il2"
             layout="@layout/home_bottom_line" />
@@ -66,7 +48,7 @@
         <!--            android:layout_width="@dimen/dp_1"-->
         <!--            android:layout_height="@dimen/dp_17"-->
         <!--            android:background="@color/text_CBCDD1" />-->
-        <!--鎴戠殑-鏍囩-->
+        <!--鎴戠殑-妯″潡-->
         <include
             android:id="@+id/my_me_bottom_il3"
             layout="@layout/home_bottom_line" />
diff --git a/app/src/main/res/layout/activity_search_messge.xml b/app/src/main/res/layout/activity_search_messge.xml
new file mode 100644
index 0000000..9377c5d
--- /dev/null
+++ b/app/src/main/res/layout/activity_search_messge.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/text_F5F7FA"
+    tools:context=".ui.message.SearchMessageActivity">
+    <!--鎼滅储-->
+    <RelativeLayout
+        android:id="@+id/message_search_cl"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_35"
+        android:layout_marginTop="@dimen/dp_48"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <RelativeLayout
+            android:id="@+id/back_rl"
+            android:layout_width="@dimen/dp_50"
+            android:layout_height="match_parent">
+
+            <ImageView
+                android:id="@+id/message_back_iv"
+                android:layout_width="@dimen/dp_10"
+                android:layout_height="@dimen/dp_17"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_16"
+                android:src="@drawable/search_back" />
+        </RelativeLayout>
+
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginStart="@dimen/dp_7"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:layout_toStartOf="@+id/power_station_search_tv"
+            android:layout_toEndOf="@+id/back_rl"
+            android:background="@drawable/search_bj_ff05000000">
+
+            <ImageView
+                android:id="@+id/message_search_iv"
+                android:layout_width="@dimen/dp_18"
+                android:layout_height="@dimen/dp_18"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_13"
+                android:src="@drawable/search_path" />
+
+            <EditText
+                android:id="@+id/message_search_et"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true"
+                android:layout_marginStart="@dimen/dp_11"
+                android:layout_marginEnd="@dimen/dp_40"
+                android:layout_toEndOf="@+id/message_search_iv"
+                android:background="@null"
+                android:gravity="start|center_vertical"
+                android:hint="Search the power station"
+                android:textColor="@color/text_90000000"
+                android:textColorHint="@color/text_40000000"
+                android:textSize="@dimen/text_14" />
+
+            <ImageView
+                android:id="@+id/power_station_clear_iv"
+                android:layout_width="@dimen/dp_20"
+                android:layout_height="@dimen/dp_20"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true"
+                android:layout_marginEnd="@dimen/dp_13"
+                android:src="@drawable/clear" />
+        </RelativeLayout>
+
+        <TextView
+            android:id="@+id/power_station_search_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:gravity="center"
+            android:text="@string/search"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16" />
+
+
+    </RelativeLayout>
+    <!--鍘嗗彶璁板綍-->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/history_list_parent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/message_search_cl">
+
+        <TextView
+            android:id="@+id/history_list_title_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_marginStart="@dimen/dp_16"
+            android:layout_marginTop="@dimen/dp_23"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:text="@string/history_search"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <ImageView
+            android:id="@+id/message_del_iv"
+            android:layout_width="@dimen/dp_26"
+            android:layout_height="@dimen/dp_26"
+            android:layout_marginTop="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_16"
+            android:src="@drawable/history_del"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/history_list_rcv"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_marginTop="67dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+    <!--鎼滅储鏁版嵁-->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/list_parent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="@dimen/dp_30"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/message_search_cl">
+
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/list_srl"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/list_rcv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_test_log.xml b/app/src/main/res/layout/activity_test_log.xml
index a592164..84a7c50 100644
--- a/app/src/main/res/layout/activity_test_log.xml
+++ b/app/src/main/res/layout/activity_test_log.xml
@@ -17,7 +17,7 @@
         app:layout_constraintTop_toTopOf="parent">
         <!--1.杩斿洖鎸夐挳 澧炲ぇ鐐瑰嚮鍖哄煙-->
         <LinearLayout
-            android:id="@+id/top_back_btn"
+            android:id="@+id/top_back_ll"
             android:layout_width="@dimen/dp_56"
             android:layout_height="match_parent"
             android:gravity="center_vertical"
diff --git a/app/src/main/res/layout/activity_test_main.xml b/app/src/main/res/layout/activity_test_main.xml
index c07dc5d..4b87208 100644
--- a/app/src/main/res/layout/activity_test_main.xml
+++ b/app/src/main/res/layout/activity_test_main.xml
@@ -18,7 +18,7 @@
         app:layout_constraintTop_toTopOf="parent">
         <!--1.杩斿洖鎸夐挳 澧炲ぇ鐐瑰嚮鍖哄煙-->
         <LinearLayout
-            android:id="@+id/top_back_btn"
+            android:id="@+id/top_back_ll"
             android:layout_width="@dimen/dp_56"
             android:layout_height="match_parent"
             android:gravity="center_vertical"
diff --git a/app/src/main/res/layout/dialog_default_filtering.xml b/app/src/main/res/layout/dialog_default_filtering.xml
new file mode 100644
index 0000000..a2dd503
--- /dev/null
+++ b/app/src/main/res/layout/dialog_default_filtering.xml
@@ -0,0 +1,331 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/default_filtering_cl"
+        android:layout_width="match_parent"
+        android:layout_height="405dp"
+        android:background="@color/ffffff"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <RelativeLayout
+            android:id="@+id/cancel_affirm_cl"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_52"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <LinearLayout
+                android:id="@+id/cancel_ll"
+                android:layout_width="@dimen/dp_51"
+                android:layout_height="match_parent"
+                android:layout_alignParentStart="true"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:gravity="center_vertical|end"
+                    android:text="@string/loading_cancel"
+                    android:textColor="@color/text_40000000"
+                    android:textSize="@dimen/text_18" />
+            </LinearLayout>
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginStart="@dimen/dp_10"
+                android:layout_marginEnd="@dimen/dp_10"
+                android:layout_toStartOf="@+id/affirm_ll"
+                android:layout_toEndOf="@+id/cancel_ll"
+                android:gravity="center"
+                android:text="@string/filtering"
+                android:textColor="@color/text_90000000"
+                android:textSize="@dimen/dp_18" />
+
+            <LinearLayout
+                android:id="@+id/affirm_ll"
+                android:layout_width="@dimen/dp_51"
+                android:layout_height="match_parent"
+                android:layout_alignParentEnd="true"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:gravity="center_vertical|start"
+                    android:text="@string/loading_affirm"
+                    android:textColor="@color/text_38C494"
+                    android:textSize="@dimen/text_18" />
+            </LinearLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_1"
+                android:layout_alignParentBottom="true"
+                android:background="@color/text_E1E1E1" />
+
+        </RelativeLayout>
+
+
+        <TextView
+
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="@dimen/dp_18"
+            android:text="@string/string_capacity"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/cancel_affirm_cl" />
+
+        <ImageView
+            android:layout_width="@dimen/dp_19"
+            android:layout_height="@dimen/dp_17"
+            android:layout_marginTop="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_5"
+            android:src="@drawable/reset"
+            app:layout_constraintEnd_toStartOf="@+id/reset_tv"
+            app:layout_constraintTop_toBottomOf="@+id/cancel_affirm_cl" />
+
+        <TextView
+            android:id="@+id/reset_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_marginTop="@dimen/dp_18"
+            android:layout_marginEnd="@dimen/dp_20"
+            android:text="@string/reset"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/cancel_affirm_cl" />
+
+        <RelativeLayout
+            android:id="@+id/min_max_rl"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginTop="@dimen/dp_54"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/cancel_affirm_cl">
+
+            <EditText
+                android:id="@+id/min_et"
+                android:layout_width="@dimen/dp_135"
+                android:layout_height="@dimen/dp_35"
+                android:layout_marginStart="@dimen/dp_20"
+                android:background="@drawable/search_bj_ff05000000"
+                android:gravity="center"
+                android:inputType="number"
+                android:textColor="@color/text_90000000"
+                android:textColorHint="@color/text_40000000"
+                android:textSize="@dimen/text_14" />
+
+            <View
+                android:layout_width="@dimen/dp_16"
+                android:layout_height="1dp"
+                android:layout_alignParentStart="true"
+                android:layout_marginStart="@dimen/dp_180"
+                android:layout_marginTop="@dimen/dp_19"
+                android:background="@color/text_E1E1E1" />
+
+            <EditText
+                android:id="@+id/max_et"
+                android:layout_width="@dimen/dp_135"
+                android:layout_height="@dimen/dp_35"
+                android:layout_alignParentEnd="true"
+                android:layout_marginStart="@dimen/dp_20"
+                android:layout_marginEnd="@dimen/dp_20"
+                android:background="@drawable/search_bj_ff05000000"
+                android:gravity="center"
+                android:inputType="number"
+                android:textColor="@color/text_90000000"
+                android:textColorHint="@color/text_40000000"
+                android:textSize="@dimen/text_14" />
+        </RelativeLayout>
+
+        <TextView
+            android:id="@+id/text1_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="@dimen/dp_18"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="0-5"
+            android:text="0 ~ 5"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/text2_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_15"
+            android:layout_marginTop="@dimen/dp_18"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="5-10"
+            android:text="5 ~ 10"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toEndOf="@+id/text1_tv"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/text3_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_15"
+            android:layout_marginTop="@dimen/dp_18"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="10-15"
+            android:text="10 ~ 15"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toEndOf="@+id/text2_tv"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/text4_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="@dimen/dp_66"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="15-30"
+            android:text="15 ~ 30"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/text5_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_15"
+            android:layout_marginTop="@dimen/dp_66"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="30-100"
+            android:text="30 ~ 100"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toEndOf="@+id/text4_tv"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/text6_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_15"
+            android:layout_marginTop="@dimen/dp_66"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="100-300"
+            android:text="100 ~ 300"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toEndOf="@+id/text5_tv"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/text7_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="114dp"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="300-500"
+            android:text="300 ~ 500"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/text8_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_15"
+            android:layout_marginTop="114dp"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:tag="500+"
+            android:text="500+"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toEndOf="@+id/text7_tv"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+
+        <TextView
+            android:id="@+id/grid_connected_state_title_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="167dp"
+            android:text="@string/grid_connected_state"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/min_max_rl" />
+        <!--鍏ㄩ儴-->
+        <TextView
+            android:id="@+id/all_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="13dp"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:text="@string/message_all"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toStartOf="@+id/min_max_rl"
+            app:layout_constraintTop_toBottomOf="@+id/grid_connected_state_title_tv" />
+        <!--骞剁綉-->
+        <TextView
+            android:id="@+id/grid_connected_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="13dp"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:text="@string/grid_connected"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toEndOf="@+id/all_tv"
+            app:layout_constraintTop_toBottomOf="@+id/grid_connected_state_title_tv" />
+        <!--绂荤綉-->
+        <TextView
+            android:id="@+id/off_network_tv"
+            android:layout_width="102dp"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="13dp"
+            android:background="@drawable/search_bj_ff05000000"
+            android:gravity="center"
+            android:text="@string/off_network"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_14"
+            app:layout_constraintStart_toEndOf="@+id/grid_connected_tv"
+            app:layout_constraintTop_toBottomOf="@+id/grid_connected_state_title_tv" />
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home_page.xml b/app/src/main/res/layout/fragment_home_page.xml
new file mode 100644
index 0000000..8436240
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home_page.xml
@@ -0,0 +1,760 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ui.home.HomePageFragment">
+
+    <TextView
+        android:id="@+id/home_page_title_tv"
+        style="@style/Text20Style"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_24"
+        android:layout_marginStart="@dimen/dp_16"
+        android:layout_marginTop="58dp"
+        android:text="@string/power_shome_page"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/home_page_station_add_iv"
+        android:layout_width="@dimen/dp_31"
+        android:layout_height="@dimen/dp_31"
+        android:layout_marginTop="53dp"
+        android:layout_marginEnd="@dimen/dp_24"
+        android:src="@drawable/add"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/srl"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="@dimen/dp_26"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/home_page_title_tv">
+
+        <ScrollView
+            android:id="@+id/sl"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginTop="@dimen/dp_26">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginEnd="@dimen/dp_16">
+
+                <RelativeLayout
+                    android:id="@+id/home_page_station_ll"
+                    android:layout_width="0dp"
+                    android:layout_height="@dimen/dp_56"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <RelativeLayout
+                        android:id="@+id/station_status_all_rl"
+                        android:layout_width="74dp"
+                        android:layout_height="match_parent"
+                        android:background="@drawable/station_status_no_ffffff">
+
+                        <TextView
+                            android:id="@+id/station_status_all_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_25"
+                            android:layout_marginTop="7dp"
+                            android:gravity="center"
+                            android:text="999"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_21"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/station_status_number_all_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_17"
+                            android:layout_below="@+id/station_status_all_tv"
+                            android:layout_marginTop="1dp"
+                            android:gravity="center"
+                            android:text="state"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_14" />
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/station_status_faults_rl"
+                        android:layout_width="74dp"
+                        android:layout_height="match_parent"
+                        android:layout_marginStart="@dimen/dp_16"
+                        android:layout_toEndOf="@+id/station_status_all_rl"
+                        android:background="@drawable/station_status_no_ffffff">
+
+                        <TextView
+                            android:id="@+id/station_status_faults_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_25"
+                            android:layout_marginTop="7dp"
+                            android:gravity="center"
+                            android:text="999"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_21"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/station_status_number_faults_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_17"
+                            android:layout_below="@+id/station_status_faults_tv"
+                            android:layout_marginTop="1dp"
+                            android:gravity="center"
+                            android:text="state"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_14" />
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/station_status_off_rl"
+                        android:layout_width="74dp"
+                        android:layout_height="match_parent"
+                        android:layout_marginStart="@dimen/dp_16"
+                        android:layout_toEndOf="@+id/station_status_faults_rl"
+                        android:background="@drawable/station_status_no_ffffff">
+
+                        <TextView
+                            android:id="@+id/station_status_off_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_25"
+                            android:layout_marginTop="7dp"
+                            android:gravity="center"
+                            android:text="999"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_21"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/station_status_number_off_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_17"
+                            android:layout_below="@+id/station_status_off_tv"
+                            android:layout_marginTop="1dp"
+                            android:gravity="center"
+                            android:text="state"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_14" />
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/station_status_connected_rl"
+                        android:layout_width="74dp"
+                        android:layout_height="match_parent"
+                        android:layout_marginStart="@dimen/dp_16"
+                        android:layout_toEndOf="@+id/station_status_off_rl"
+                        android:background="@drawable/station_status_no_ffffff">
+
+                        <TextView
+                            android:id="@+id/station_status_connected_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_25"
+                            android:layout_marginTop="7dp"
+                            android:gravity="center"
+                            android:text="999"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_21"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/station_status_number_connected_tv"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_17"
+                            android:layout_below="@+id/station_status_connected_tv"
+                            android:layout_marginTop="1dp"
+                            android:gravity="center"
+                            android:text="state"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_14" />
+                    </RelativeLayout>
+
+
+                </RelativeLayout>
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/home_page_station_info_cl"
+                    android:layout_width="0dp"
+                    android:layout_height="312dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@+id/home_page_station_ll">
+
+                    <RelativeLayout
+                        android:id="@+id/home_page_station_info_rl1"
+                        android:layout_width="0dp"
+                        android:layout_height="146dp"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent">
+
+                        <RelativeLayout
+                            android:id="@+id/home_page_station_info_rl1_f"
+                            android:layout_width="102dp"
+                            android:layout_height="102dp"
+                            android:layout_marginTop="@dimen/dp_22"
+                            android:background="@drawable/disc">
+
+                            <TextView
+                                android:id="@+id/info_rl1_f_text1_tv"
+                                android:layout_width="56dp"
+                                android:layout_height="wrap_content"
+                                android:layout_centerVertical="true"
+                                android:gravity="end|center_vertical"
+                                android:text="88"
+                                android:textSize="@dimen/text_26"
+                                android:textStyle="bold" />
+
+                            <TextView
+                                android:id="@+id/home_page_station_info_rl1_f_text2_tv"
+                                android:layout_width="9dp"
+                                android:layout_height="14.5dp"
+                                android:layout_alignBottom="@+id/info_rl1_f_text1_tv"
+                                android:layout_marginStart="2.5dp"
+                                android:layout_marginBottom="4.5dp"
+                                android:layout_toEndOf="@+id/info_rl1_f_text1_tv"
+                                android:text="%"
+                                android:textColor="@color/text_191919"
+                                android:textSize="@dimen/text_12" />
+                        </RelativeLayout>
+
+
+                        <TextView
+                            android:id="@+id/info_rl1_text1_tv"
+                            style="@style/Text20Style"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_24"
+                            android:layout_marginStart="@dimen/dp_16"
+                            android:layout_marginTop="@dimen/dp_21"
+                            android:layout_toEndOf="@+id/home_page_station_info_rl1_f"
+                            android:text="33333333" />
+
+                        <TextView
+                            android:id="@+id/info_rl1_text2_tv"
+                            style="@style/Text14Style"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_17"
+                            android:layout_below="@+id/info_rl1_text1_tv"
+                            android:layout_alignStart="@+id/info_rl1_text1_tv"
+                            android:layout_marginTop="3dp"
+                            android:text="@string/installed_capacity" />
+
+                        <TextView
+                            android:id="@+id/info_rl1_text3_tv"
+                            style="@style/Text20Style"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_24"
+                            android:layout_below="@+id/info_rl1_text2_tv"
+                            android:layout_alignStart="@+id/info_rl1_text1_tv"
+                            android:layout_marginTop="@dimen/dp_16"
+                            android:text="33333" />
+
+                        <TextView
+                            android:id="@+id/info_rl1_text4_tv"
+                            style="@style/Text14Style"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_17"
+                            android:layout_below="@+id/info_rl1_text3_tv"
+                            android:layout_alignStart="@+id/info_rl1_text1_tv"
+                            android:layout_marginTop="3dp"
+                            android:text="@string/generated_power" />
+
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/home_page_station_info_rl2"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_166"
+                        android:background="@drawable/bj_13_ffffff"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/home_page_station_info_rl1">
+
+                        <ImageView
+                            android:layout_width="25dp"
+                            android:layout_height="22dp"
+                            android:layout_marginStart="15.5dp"
+                            android:layout_marginTop="10.5dp"
+                            android:src="@drawable/info_1" />
+
+                        <TextView
+                            android:id="@+id/home_page_station_info_rl1_title_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="14.5dp"
+                            android:layout_marginStart="@dimen/dp_47"
+                            android:layout_marginTop="17dp"
+                            android:text="@string/generation"
+                            android:textColor="@color/text_191919"
+                            android:textSize="@dimen/text_12" />
+
+                        <include
+                            android:id="@+id/home_page_station_info_rl2_day_ic"
+                            layout="@layout/item_data"
+                            android:layout_width="@dimen/dp_171"
+                            android:layout_height="@dimen/dp_44"
+                            android:layout_marginTop="47.5dp" />
+
+                        <View
+                            android:id="@+id/line1_v"
+                            android:layout_width="0.5dp"
+                            android:layout_height="37.5dp"
+                            android:layout_marginTop="53dp"
+                            android:layout_toEndOf="@+id/home_page_station_info_rl2_day_ic"
+                            android:background="@color/text_E1E1E1" />
+
+                        <include
+                            android:id="@+id/home_page_station_info_rl2_mon_ic"
+                            layout="@layout/item_data"
+                            android:layout_width="@dimen/dp_171"
+                            android:layout_height="@dimen/dp_44"
+                            android:layout_marginTop="47.5dp"
+                            android:layout_toEndOf="@+id/line1_v" />
+
+                        <include
+                            android:id="@+id/home_page_station_info_rl2_year_ic"
+                            layout="@layout/item_data"
+                            android:layout_width="@dimen/dp_171"
+                            android:layout_height="@dimen/dp_44"
+                            android:layout_marginTop="106dp" />
+
+                        <View
+                            android:id="@+id/line2_v"
+                            android:layout_width="0.5dp"
+                            android:layout_height="37.5dp"
+                            android:layout_marginTop="109.5dp"
+                            android:layout_toEndOf="@+id/home_page_station_info_rl2_year_ic"
+                            android:background="@color/text_E1E1E1" />
+
+                        <include
+                            android:id="@+id/home_page_station_info_rl2_cumulative_ic"
+                            layout="@layout/item_data"
+                            android:layout_width="@dimen/dp_171"
+                            android:layout_height="@dimen/dp_44"
+                            android:layout_marginTop="106dp"
+                            android:layout_toEndOf="@+id/line2_v" />
+
+                    </RelativeLayout>
+                </androidx.constraintlayout.widget.ConstraintLayout>
+                <!--鏃ユ湡-->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/home_page_station_data_cl"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@+id/home_page_station_info_cl">
+
+                    <TextView
+                        android:id="@+id/home_page_station_data_title_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="18dp"
+                        android:layout_marginTop="@dimen/dp_25"
+                        android:text="@string/energy_generation_statistics"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_14"
+                        android:textStyle="bold"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+                    <!--鏃堕棿绫诲瀷-->
+                    <LinearLayout
+                        android:id="@+id/home_page_station_select_time_type_ll"
+                        android:layout_width="match_parent"
+                        android:layout_height="30.5dp"
+                        android:layout_marginTop="@dimen/dp_13"
+                        android:background="@drawable/line_c1c1c1"
+                        android:orientation="horizontal"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/home_page_station_data_title_tv">
+
+                        <TextView
+                            android:id="@+id/day_tv"
+                            style="@style/Text14Style"
+                            android:layout_width="86dp"
+                            android:layout_height="match_parent"
+                            android:gravity="center"
+                            android:text="@string/day" />
+
+                        <View
+                            android:id="@+id/v_1"
+                            android:layout_width="1dp"
+                            android:layout_height="match_parent"
+                            android:background="@color/text_C1C1C1" />
+
+                        <TextView
+                            android:id="@+id/month_tv"
+                            style="@style/Text14Style"
+                            android:layout_width="86dp"
+                            android:layout_height="match_parent"
+                            android:gravity="center"
+                            android:text="@string/month" />
+
+                        <View
+                            android:id="@+id/v_2"
+                            android:layout_width="1dp"
+                            android:layout_height="match_parent"
+                            android:background="@color/text_C1C1C1" />
+
+                        <TextView
+                            android:id="@+id/year_tv"
+                            style="@style/Text14Style"
+                            android:layout_width="86dp"
+                            android:layout_height="match_parent"
+                            android:gravity="center"
+                            android:text="@string/year" />
+
+                        <View
+                            android:id="@+id/v_3"
+                            android:layout_width="1dp"
+                            android:layout_height="match_parent"
+                            android:background="@color/text_C1C1C1" />
+
+                        <TextView
+                            android:id="@+id/lifeCycle_tv"
+                            style="@style/Text14Style"
+                            android:layout_width="86dp"
+                            android:layout_height="match_parent"
+                            android:gravity="center"
+                            android:text="@string/life_cycle" />
+
+                    </LinearLayout>
+                    <!--鏃堕棿鍒囨崲鎺т欢-->
+                    <LinearLayout
+                        android:id="@+id/home_page_station_select_time_ll"
+                        android:layout_width="match_parent"
+                        android:layout_height="30.5dp"
+                        android:layout_marginTop="@dimen/dp_23"
+                        android:gravity="center"
+                        android:orientation="horizontal"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/home_page_station_select_time_type_ll">
+                        <!--鍔犲ぇ鐐瑰嚮鐑尯-->
+                        <LinearLayout
+                            android:id="@+id/last_step_click_ll"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:orientation="horizontal">
+
+                            <View
+                                android:layout_width="@dimen/dp_16"
+                                android:layout_height="match_parent" />
+
+                            <ImageView
+                                android:id="@+id/last_step_iv"
+                                android:layout_width="9dp"
+                                android:layout_height="15dp"
+                                android:scaleType="fitCenter"
+                                android:src="@drawable/last_step" />
+
+                            <View
+                                android:layout_width="@dimen/dp_16"
+                                android:layout_height="match_parent" />
+                        </LinearLayout>
+
+                        <View
+                            android:layout_width="@dimen/dp_16"
+                            android:layout_height="match_parent" />
+
+
+                        <TextView
+                            android:id="@+id/year_month_day_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:gravity="center"
+                            android:text="2024/03/07"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_16"
+                            android:textStyle="bold" />
+
+                        <View
+                            android:layout_width="@dimen/dp_16"
+                            android:layout_height="match_parent" />
+                        <!--鍔犲ぇ鐐瑰嚮鐑尯-->
+                        <LinearLayout
+                            android:id="@+id/next_step_click_ll"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:orientation="horizontal">
+
+                            <View
+                                android:layout_width="@dimen/dp_16"
+                                android:layout_height="match_parent" />
+
+                            <ImageView
+                                android:id="@+id/next_step_iv"
+                                android:layout_width="9dp"
+                                android:layout_height="15dp"
+                                android:scaleType="fitCenter"
+                                android:src="@drawable/next_step" />
+
+                            <View
+                                android:layout_width="@dimen/dp_16"
+                                android:layout_height="match_parent" />
+
+                        </LinearLayout>
+
+                    </LinearLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/chart_title_rl"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_15"
+                        android:layout_marginTop="@dimen/dp_36"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/home_page_station_select_time_ll">
+
+                        <TextView
+                            android:id="@+id/unit_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:layout_alignParentStart="true"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_12" />
+
+                        <TextView
+                            android:id="@+id/unit_icon_tv"
+                            android:layout_width="@dimen/dp_11"
+                            android:layout_height="@dimen/dp_11"
+                            android:layout_marginTop="@dimen/dp_3"
+                            android:layout_marginEnd="@dimen/dp_3"
+                            android:layout_toStartOf="@+id/unit_text_tv"
+                            android:background="@drawable/point_38c494" />
+
+                        <TextView
+                            android:id="@+id/unit_text_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:layout_alignParentEnd="true"
+                            android:text="PV power generation"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_12" />
+
+                    </RelativeLayout>
+
+                    <FrameLayout
+                        android:layout_width="0dp"
+                        android:layout_height="284dp"
+                        android:layout_marginTop="@dimen/dp_18"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/chart_title_rl">
+
+                        <com.hdl.photovoltaic.ui.home.AutoSizeMyAAChart
+                            android:id="@+id/autoSizeMyAAChart"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+
+                            />
+                    </FrameLayout>
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/home_page_station_statistics_cl"
+                    android:layout_width="match_parent"
+                    android:layout_height="186dp"
+                    android:layout_marginTop="@dimen/dp_26"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@+id/home_page_station_data_cl">
+
+                    <TextView
+                        android:id="@+id/social_contribution_title_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="17dp"
+                        android:text="@string/social_contribution"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_14"
+                        android:textStyle="bold"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent" />
+
+                    <RelativeLayout
+                        android:id="@+id/social_contribution_1_rl"
+                        android:layout_width="@dimen/dp_104"
+                        android:layout_height="@dimen/dp_126"
+                        android:layout_marginTop="@dimen/dp_13"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toBottomOf="@+id/social_contribution_title_tv">
+
+                        <ImageView
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:scaleType="fitCenter"
+                            android:src="@drawable/social_contribution_1" />
+
+                        <TextView
+                            android:id="@+id/social_contribution_data_1_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="22dp"
+                            android:layout_alignParentStart="true"
+                            android:layout_alignParentTop="true"
+                            android:layout_marginStart="@dimen/dp_10"
+                            android:layout_marginTop="@dimen/dp_16"
+                            android:text="13.14"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_18"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/social_contribution_unit_1_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="15dp"
+                            android:layout_alignBottom="@+id/social_contribution_data_1_tv"
+                            android:layout_marginStart="@dimen/dp_2"
+                            android:layout_toEndOf="@+id/social_contribution_data_1_tv"
+                            android:text="(T)"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_12"
+
+
+                            />
+
+                        <TextView
+                            android:id="@+id/social_contribution_des_1_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="15dp"
+                            android:layout_alignParentStart="true"
+                            android:layout_alignParentTop="true"
+                            android:layout_marginStart="@dimen/dp_10"
+                            android:layout_marginTop="@dimen/dp_35"
+                            android:text="ssss"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_12" />
+
+
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/social_contribution_2_rl"
+                        android:layout_width="@dimen/dp_104"
+                        android:layout_height="@dimen/dp_126"
+                        android:layout_marginStart="@dimen/dp_16"
+                        android:layout_marginTop="@dimen/dp_13"
+                        app:layout_constraintStart_toEndOf="@+id/social_contribution_1_rl"
+                        app:layout_constraintTop_toBottomOf="@+id/social_contribution_title_tv">
+
+                        <ImageView
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:scaleType="fitCenter"
+                            android:src="@drawable/social_contribution_2" />
+
+                        <TextView
+                            android:id="@+id/social_contribution_data_2_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="22dp"
+                            android:layout_alignParentStart="true"
+                            android:layout_alignParentTop="true"
+                            android:layout_marginStart="@dimen/dp_10"
+                            android:layout_marginTop="@dimen/dp_16"
+                            android:text="13.14"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_18"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/social_contribution_unit_2_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="15dp"
+                            android:layout_alignBottom="@+id/social_contribution_data_2_tv"
+                            android:layout_marginStart="@dimen/dp_2"
+                            android:layout_toEndOf="@+id/social_contribution_data_2_tv"
+                            android:text="(T)"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_12"
+
+                            />
+
+                        <TextView
+                            android:id="@+id/social_contribution_des_2_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="15dp"
+                            android:layout_alignParentStart="true"
+                            android:layout_alignParentTop="true"
+                            android:layout_marginStart="@dimen/dp_10"
+                            android:layout_marginTop="@dimen/dp_35"
+                            android:text="ssss"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_12" />
+
+
+                    </RelativeLayout>
+
+                    <RelativeLayout
+                        android:id="@+id/social_contribution_3_rl"
+                        android:layout_width="@dimen/dp_104"
+                        android:layout_height="@dimen/dp_126"
+                        android:layout_marginStart="@dimen/dp_16"
+                        android:layout_marginTop="@dimen/dp_13"
+                        app:layout_constraintStart_toEndOf="@+id/social_contribution_2_rl"
+                        app:layout_constraintTop_toBottomOf="@+id/social_contribution_title_tv">
+
+                        <ImageView
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:scaleType="fitCenter"
+                            android:src="@drawable/social_contribution_3" />
+
+                        <TextView
+                            android:id="@+id/social_contribution_data_3_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="22dp"
+                            android:layout_alignParentTop="true"
+                            android:layout_marginStart="@dimen/dp_10"
+                            android:layout_marginTop="@dimen/dp_16"
+                            android:text="13.14"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_18"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/social_contribution_unit_3_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="15dp"
+                            android:layout_alignBottom="@+id/social_contribution_data_3_tv"
+                            android:layout_marginStart="@dimen/dp_2"
+                            android:layout_toEndOf="@+id/social_contribution_data_3_tv"
+                            android:text="(T)"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_12"
+
+                            />
+
+                        <TextView
+                            android:id="@+id/social_contribution_des_3_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="15dp"
+                            android:layout_alignParentStart="true"
+                            android:layout_alignParentTop="true"
+                            android:layout_marginStart="@dimen/dp_10"
+                            android:layout_marginTop="@dimen/dp_35"
+                            android:text="ssss"
+                            android:textColor="@color/text_40000000"
+                            android:textSize="@dimen/text_12" />
+
+
+                    </RelativeLayout>
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+        </ScrollView>
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_house_list.xml b/app/src/main/res/layout/fragment_house_list.xml
index 0722160..4308a14 100644
--- a/app/src/main/res/layout/fragment_house_list.xml
+++ b/app/src/main/res/layout/fragment_house_list.xml
@@ -5,130 +5,493 @@
     android:id="@+id/house_list_parent"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
-
-    <include
-        android:id="@+id/toolbar_top_fragment_house_list_rl"
-        layout="@layout/toolbar_top_view_52" />
-
+    <!--澶撮儴鏍囩-->
     <RelativeLayout
-        android:id="@+id/fragment_house_list_head_rl"
+        android:id="@+id/title_cl"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_64"
-        android:background="@color/text_F9FAFB"
-        android:visibility="gone"
+        android:layout_height="@dimen/dp_31"
+        android:layout_marginStart="@dimen/dp_16"
+        android:layout_marginTop="@dimen/dp_44"
+        android:layout_marginEnd="@dimen/dp_16"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/toolbar_top_fragment_house_list_rl">
+        app:layout_constraintTop_toTopOf="parent">
 
-        <LinearLayout
-            android:id="@+id/fragment_house_list_content_ll"
-            android:layout_width="match_parent"
+        <TextView
+            android:id="@+id/power_station_label"
+            android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:layout_marginStart="@dimen/dp_20"
-            android:layout_marginEnd="@dimen/dp_20"
-            android:orientation="horizontal">
+            android:layout_centerVertical="true"
+            android:gravity="center_vertical"
+            android:text="Power Station"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_20"
+            android:textStyle="bold" />
 
-            <RelativeLayout
-                android:id="@+id/fragment_house_list_content_title1_rl"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="3"
-                android:gravity="center"
-                android:orientation="horizontal">
+        <TextView
+            android:id="@+id/device_label"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_centerVertical="true"
+            android:layout_marginStart="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_4"
+            android:layout_toStartOf="@+id/edit_iv"
+            android:layout_toEndOf="@+id/power_station_label"
+            android:gravity="start|center_vertical"
+            android:text="Equipment"
+            android:textColor="@color/text_40000000"
+            android:textSize="@dimen/text_16"
 
-                <TextView
-                    android:id="@+id/fragment_house_list_content_title1_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="@dimen/dp_20"
-                    android:text="@string/power_station_generated_power"
-                    android:textColor="@color/text_90000000"
-                    android:textSize="@dimen/text_14" />
+            />
 
-                <ImageView
-                    android:id="@+id/fragment_house_list_content_title1_iv"
-                    android:layout_width="@dimen/dp_10"
-                    android:layout_height="@dimen/dp_6"
-                    android:layout_alignTop="@+id/fragment_house_list_content_title1_tv"
-                    android:layout_alignBottom="@+id/fragment_house_list_content_title1_tv"
-                    android:layout_marginStart="@dimen/dp_7"
-                    android:layout_toEndOf="@+id/fragment_house_list_content_title1_tv"
-                    android:src="@drawable/down" />
-            </RelativeLayout>
+        <ImageView
+            android:id="@+id/edit_iv"
+            android:layout_width="@dimen/dp_31"
+            android:layout_height="@dimen/dp_31"
+            android:layout_marginEnd="@dimen/dp_13"
+            android:layout_toStartOf="@+id/add_iv"
+            android:src="@drawable/edit"
 
-            <RelativeLayout
-                android:id="@+id/fragment_house_list_content_title2_rl"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="3"
-                android:gravity="center"
-                android:orientation="horizontal">
+            />
 
-                <TextView
-                    android:id="@+id/fragment_house_list_content_title2_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="@dimen/dp_20"
-                    android:text="@string/power_station_Power_generation_today"
-                    android:textColor="@color/text_90000000"
-                    android:textSize="@dimen/text_14" />
+        <ImageView
+            android:id="@+id/add_iv"
+            android:layout_width="@dimen/dp_31"
+            android:layout_height="@dimen/dp_31"
+            android:layout_alignParentEnd="true"
+            android:src="@drawable/add" />
 
-                <ImageView
-                    android:id="@+id/my_power_station_content_title2_iv"
-                    android:layout_width="@dimen/dp_10"
-                    android:layout_height="@dimen/dp_6"
-                    android:layout_alignTop="@+id/fragment_house_list_content_title2_tv"
-                    android:layout_alignBottom="@+id/fragment_house_list_content_title2_tv"
-                    android:layout_marginStart="@dimen/dp_7"
-                    android:layout_toEndOf="@+id/fragment_house_list_content_title2_tv"
-                    android:src="@drawable/down" />
-            </RelativeLayout>
-
-            <RelativeLayout
-                android:id="@+id/fragment_house_list_content_title3_rl"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="3"
-                android:gravity="center"
-                android:orientation="horizontal">
-
-                <TextView
-                    android:id="@+id/fragment_house_list_content_title3_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="@dimen/dp_20"
-                    android:text="@string/power_station_creation_time"
-                    android:textColor="@color/text_90000000"
-                    android:textSize="@dimen/text_14" />
-
-                <ImageView
-                    android:id="@+id/fragment_house_list_content_title3_iv"
-                    android:layout_width="@dimen/dp_10"
-                    android:layout_height="@dimen/dp_6"
-                    android:layout_alignTop="@+id/fragment_house_list_content_title3_tv"
-                    android:layout_alignBottom="@+id/fragment_house_list_content_title3_tv"
-                    android:layout_marginStart="@dimen/dp_7"
-                    android:layout_toEndOf="@+id/fragment_house_list_content_title3_tv"
-                    android:src="@drawable/down" />
-            </RelativeLayout>
-
-        </LinearLayout>
 
     </RelativeLayout>
-
-    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-        android:id="@+id/fragment_house_srl"
+    <!--鐢电珯鏍囩-->
+    <LinearLayout
+        android:id="@+id/power_station_label_parent"
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        android:orientation="vertical"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/fragment_house_list_head_rl">
+        app:layout_constraintTop_toBottomOf="@+id/title_cl">
 
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/fragment_house_srl_list_rc"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/power_station_label_top_cl"
+            android:layout_width="match_parent"
+            android:layout_height="174dp"
+            android:layout_marginTop="@dimen/dp_21">
+            <!--鎼滅储-->
+            <RelativeLayout
+                android:id="@+id/power_station_search_cl"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_35"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginEnd="@dimen/dp_16"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <RelativeLayout
+                    android:id="@+id/power_station_search_click_cl"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginEnd="@dimen/dp_17"
+                    android:layout_toStartOf="@+id/power_station_default_condition_iv"
+                    android:background="@drawable/search_bj_ff05000000">
+
+                    <ImageView
+                        android:id="@+id/power_station_search_iv"
+                        android:layout_width="@dimen/dp_18"
+                        android:layout_height="@dimen/dp_18"
+                        android:layout_alignParentStart="true"
+                        android:layout_centerVertical="true"
+                        android:layout_marginStart="@dimen/dp_13"
+                        android:src="@drawable/search_path" />
+
+                    <TextView
+                        android:id="@+id/power_station_search_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="@dimen/dp_17"
+                        android:layout_centerVertical="true"
+                        android:layout_marginStart="@dimen/dp_11"
+                        android:layout_toEndOf="@+id/power_station_search_iv"
+                        android:text="Search the power station"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_14" />
+                </RelativeLayout>
+
+                <ImageView
+                    android:id="@+id/power_station_default_condition_iv"
+                    android:layout_width="@dimen/dp_31"
+                    android:layout_height="@dimen/dp_31"
+                    android:layout_alignParentEnd="true"
+                    android:layout_centerVertical="true"
+                    android:src="@drawable/default_condition" />
+
+
+            </RelativeLayout>
+            <!--鏉′欢绛涢��-->
+            <LinearLayout
+                android:id="@+id/screening_condition_ll"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_56"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginTop="@dimen/dp_21"
+                android:layout_marginEnd="@dimen/dp_16"
+                android:orientation="horizontal"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/power_station_search_cl">
+
+                <LinearLayout
+                    android:id="@+id/screening_condition_1"
+                    android:layout_width="@dimen/dp_74"
+                    android:layout_height="@dimen/dp_56"
+                    android:layout_gravity="center_vertical"
+                    android:background="@drawable/station_status_no_ffffff"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/screening_condition_number1_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_25"
+                        android:layout_marginTop="7dp"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_21"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/screening_condition_text1_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_17"
+                        android:layout_marginTop="1dp"
+                        android:gravity="center"
+                        android:text="state"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_14" />
+
+                </LinearLayout>
+
+                <View
+                    android:layout_width="@dimen/dp_16"
+                    android:layout_height="match_parent" />
+
+                <LinearLayout
+                    android:id="@+id/screening_condition_2"
+                    android:layout_width="@dimen/dp_74"
+                    android:layout_height="@dimen/dp_56"
+                    android:layout_gravity="center_vertical"
+                    android:background="@drawable/station_status_no_ffffff"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/screening_condition_number2_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_25"
+                        android:layout_marginTop="7dp"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_21"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/screening_condition_text2_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_17"
+                        android:layout_marginTop="1dp"
+                        android:gravity="center"
+                        android:text="state"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_14" />
+
+                </LinearLayout>
+
+                <View
+                    android:layout_width="@dimen/dp_16"
+                    android:layout_height="match_parent" />
+
+                <LinearLayout
+                    android:id="@+id/screening_condition_3"
+                    android:layout_width="@dimen/dp_74"
+                    android:layout_height="@dimen/dp_56"
+                    android:layout_gravity="center_vertical"
+                    android:background="@drawable/station_status_no_ffffff"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/screening_condition_number3_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_25"
+                        android:layout_marginTop="7dp"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_21"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/screening_condition_text3_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_17"
+                        android:layout_marginTop="1dp"
+                        android:gravity="center"
+                        android:text="state"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_14" />
+
+                </LinearLayout>
+
+                <View
+                    android:layout_width="@dimen/dp_16"
+                    android:layout_height="match_parent" />
+
+                <LinearLayout
+                    android:id="@+id/screening_condition_4"
+                    android:layout_width="@dimen/dp_74"
+                    android:layout_height="@dimen/dp_56"
+                    android:layout_gravity="center_vertical"
+                    android:background="@drawable/station_status_no_ffffff"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/screening_condition_number4_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_25"
+                        android:layout_marginTop="7dp"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_21"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/screening_condition_text4_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_17"
+                        android:layout_marginTop="1dp"
+                        android:gravity="center"
+                        android:text="state"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_14" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+            <!--鍗囧簭闄嶅簭鍔熻兘-->
+            <LinearLayout
+                android:id="@+id/ascending_order_descending_order_parent_ll"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_17"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginTop="@dimen/dp_21"
+                android:layout_marginEnd="@dimen/dp_12"
+                android:orientation="horizontal"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/screening_condition_ll">
+
+                <RelativeLayout
+                    android:id="@+id/station_name_rl"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:id="@+id/station_name_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="@dimen/dp_17"
+                        android:text="@string/station_name"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_12"
+                        android:textStyle="bold" />
+
+                    <ImageView
+                        android:id="@+id/station_name_iv"
+                        android:layout_width="@dimen/dp_18"
+                        android:layout_height="@dimen/dp_18"
+                        android:layout_toEndOf="@+id/station_name_tv"
+                        android:background="@drawable/ascending_descending_order_select" />
+                </RelativeLayout>
+
+
+                <RelativeLayout
+                    android:id="@+id/station_power_rl"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:id="@+id/station_power_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="@dimen/dp_17"
+                        android:text="@string/generated_power"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_12"
+                        android:textStyle="bold" />
+
+                    <ImageView
+                        android:id="@+id/station_power_iv"
+                        android:layout_width="@dimen/dp_18"
+                        android:layout_height="@dimen/dp_18"
+                        android:layout_toEndOf="@+id/station_power_tv"
+                        android:background="@drawable/ascending_descending_order_select" />
+                </RelativeLayout>
+
+
+                <RelativeLayout
+                    android:id="@+id/station_day_rl"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:id="@+id/station_day_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="@dimen/dp_17"
+                        android:text="@string/day_power_generation"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_12"
+                        android:textStyle="bold" />
+
+                    <ImageView
+                        android:id="@+id/station_day_iv"
+                        android:layout_width="@dimen/dp_18"
+                        android:layout_height="@dimen/dp_18"
+                        android:layout_toEndOf="@+id/station_day_tv"
+                        android:background="@drawable/ascending_descending_order_select" />
+                </RelativeLayout>
+
+
+                <RelativeLayout
+                    android:id="@+id/station_month_rl"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:gravity="center"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:id="@+id/station_month_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="@dimen/dp_17"
+                        android:text="@string/month_power_generation"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_12"
+                        android:textStyle="bold" />
+
+                    <ImageView
+                        android:id="@+id/station_month_iv"
+                        android:layout_width="@dimen/dp_18"
+                        android:layout_height="@dimen/dp_18"
+                        android:layout_toEndOf="@+id/station_month_tv"
+                        android:background="@drawable/ascending_descending_order_select" />
+                </RelativeLayout>
+
+
+            </LinearLayout>
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/fragment_house_srl"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:clipToPadding="false"
-            android:paddingBottom="@dimen/dp_16" />
-    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/power_station_label_top_cl">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/fragment_house_srl_list_rc"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:clipToPadding="false"
+                android:paddingBottom="@dimen/dp_16" />
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+
+    </LinearLayout>
+
+    <!--璁惧鏍囩-->
+    <LinearLayout
+        android:id="@+id/device_label_parent"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:orientation="vertical"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/title_cl">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/device_label_top_cl"
+            android:layout_width="match_parent"
+            android:layout_height="40dp"
+            android:layout_marginTop="@dimen/dp_21">
+            <!--鎼滅储-->
+            <RelativeLayout
+                android:id="@+id/device_search_cl"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_35"
+                android:layout_marginStart="@dimen/dp_13"
+                android:layout_marginEnd="@dimen/dp_16"
+                android:background="@drawable/search_bj_ff05000000"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent">
+
+                <ImageView
+                    android:id="@+id/device_search_iv"
+                    android:layout_width="@dimen/dp_18"
+                    android:layout_height="@dimen/dp_18"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerVertical="true"
+                    android:layout_marginStart="@dimen/dp_13"
+                    android:src="@drawable/search_path" />
+
+                <TextView
+                    android:id="@+id/device_search_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="@dimen/dp_17"
+                    android:layout_centerVertical="true"
+                    android:layout_marginStart="@dimen/dp_11"
+                    android:layout_toEndOf="@+id/device_search_iv"
+                    android:text="Search the power station"
+                    android:textColor="@color/text_40000000"
+                    android:textSize="@dimen/text_14" />
+            </RelativeLayout>
+
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/fragment_device_srl"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/power_station_label_top_cl">
+
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/fragment_device_srl_list_rc"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:clipToPadding="false"
+                android:paddingBottom="@dimen/dp_16" />
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+
+    </LinearLayout>
 
     <!--娌℃湁鏁版嵁鏄剧ず鏍峰紡-->
     <include
@@ -136,12 +499,11 @@
         layout="@layout/null_data_view"
         android:layout_width="match_parent"
         android:layout_height="224dp"
+        android:visibility="gone"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        android:visibility="gone"
-        />
+        app:layout_constraintTop_toTopOf="parent" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
 
diff --git a/app/src/main/res/layout/fragment_me.xml b/app/src/main/res/layout/fragment_me.xml
index 6bf98eb..0cc3c1a 100644
--- a/app/src/main/res/layout/fragment_me.xml
+++ b/app/src/main/res/layout/fragment_me.xml
@@ -3,28 +3,33 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/me_parent"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
+    android:layout_height="match_parent">
 
-    >
-
-
-    <include
-        android:id="@+id/toolbar_top_fragment_me_rl"
-        layout="@layout/toolbar_top_view_52" />
+    <TextView
+        android:id="@+id/me_title_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_22"
+        android:layout_marginTop="53dp"
+        android:text="@string/me"
+        android:textColor="@color/text_030D1C"
+        android:textSize="@dimen/text_18"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/fragment_me_icon_parent_cl"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/dp_39"
+        android:layout_marginTop="@dimen/dp_31"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/toolbar_top_fragment_me_rl">
+        app:layout_constraintTop_toBottomOf="@+id/me_title_tv">
 
         <ImageView
             android:id="@+id/fragment_me_icon_iv"
-            android:layout_width="69dp"
-            android:layout_height="69dp"
+            android:layout_width="73dp"
+            android:layout_height="73dp"
             android:background="@drawable/default_image"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
@@ -45,9 +50,11 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        android:layout_marginStart="@dimen/dp_20"
         android:layout_marginTop="@dimen/dp_48"
+        android:layout_marginEnd="@dimen/dp_16"
+        android:background="@drawable/bj_13fffffff"
         android:orientation="vertical"
-        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/fragment_me_icon_parent_cl">
diff --git a/app/src/main/res/layout/fragment_me_line.xml b/app/src/main/res/layout/fragment_me_line.xml
index 975be60..6c38115 100644
--- a/app/src/main/res/layout/fragment_me_line.xml
+++ b/app/src/main/res/layout/fragment_me_line.xml
@@ -1,71 +1,59 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/fragment_me_line_cl"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/dp_64"
-    android:background="@color/text_F9FAFB">
+    android:layout_height="@dimen/dp_64">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/fragment_me_line_cl"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_marginStart="@dimen/dp_20"
-        android:layout_marginEnd="@dimen/dp_20"
-        android:background="@color/text_FFFFFFFF"
+    <ImageView
+        android:id="@+id/fragment_me_line_left_icon_iv"
+        android:layout_width="@dimen/dp_24"
+        android:layout_height="@dimen/dp_24"
+        android:layout_marginStart="@dimen/dp_16"
+        android:src="@drawable/set"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/fragment_me_line_title_iv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_23"
+        android:layout_marginStart="@dimen/dp_7"
+        android:text="@string/me_set"
+        android:textColor="@color/text_90000000"
+        android:textSize="@dimen/text_16"
+        app:layout_constraintBottom_toBottomOf="@id/fragment_me_line_left_icon_iv"
+        app:layout_constraintStart_toEndOf="@+id/fragment_me_line_left_icon_iv"
+        app:layout_constraintTop_toTopOf="@id/fragment_me_line_left_icon_iv" />
+
+    <ImageView
+        android:id="@+id/fragment_me_line_right_icon_iv"
+        android:layout_width="@dimen/dp_7"
+        android:layout_height="@dimen/dp_12"
+        android:layout_marginEnd="@dimen/dp_23"
+        android:src="@drawable/next"
+        app:layout_constraintBottom_toBottomOf="@id/fragment_me_line_left_icon_iv"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent">
-
-        <ImageView
-            android:id="@+id/fragment_me_line_left_icon_iv"
-            android:layout_width="@dimen/dp_24"
-            android:layout_height="@dimen/dp_24"
-            android:layout_marginStart="@dimen/dp_16"
-            android:src="@drawable/set"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <TextView
-            android:id="@+id/fragment_me_line_title_iv"
-            android:layout_width="wrap_content"
-            android:layout_height="@dimen/dp_23"
-            android:layout_marginStart="@dimen/dp_7"
-            android:text="@string/me_set"
-            android:textColor="@color/text_90000000"
-            android:textSize="@dimen/text_16"
-            app:layout_constraintBottom_toBottomOf="@id/fragment_me_line_left_icon_iv"
-            app:layout_constraintStart_toEndOf="@+id/fragment_me_line_left_icon_iv"
-            app:layout_constraintTop_toTopOf="@id/fragment_me_line_left_icon_iv" />
-
-        <ImageView
-            android:id="@+id/fragment_me_line_right_icon_iv"
-            android:layout_width="@dimen/dp_7"
-            android:layout_height="@dimen/dp_12"
-            android:layout_marginEnd="@dimen/dp_23"
-            android:src="@drawable/next"
-            app:layout_constraintBottom_toBottomOf="@id/fragment_me_line_left_icon_iv"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="@id/fragment_me_line_left_icon_iv" />
-        <!--鍔犲ぇ鐐瑰嚮鐑尯-->
-        <TextView
-            android:id="@+id/fragment_me_line_right_icon_click_iv"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            app:layout_constraintBottom_toBottomOf="@id/fragment_me_line_left_icon_iv"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="@id/fragment_me_line_left_icon_iv" />
-        <!-- 闅愯棌绾挎潯-->
-        <View
-            android:id="@+id/fragment_me_line_v"
-            android:layout_width="0dp"
-            android:layout_height="0.5dp"
-            android:background="@color/text_E1E1E1"
-            android:visibility="gone"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent" />
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
+        app:layout_constraintTop_toTopOf="@id/fragment_me_line_left_icon_iv" />
+    <!--鍔犲ぇ鐐瑰嚮鐑尯-->
+    <TextView
+        android:id="@+id/fragment_me_line_right_icon_click_iv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintBottom_toBottomOf="@id/fragment_me_line_left_icon_iv"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/fragment_me_line_left_icon_iv" />
+    <!-- 闅愯棌绾挎潯-->
+    <View
+        android:id="@+id/fragment_me_line_v"
+        android:layout_width="0dp"
+        android:layout_height="0.5dp"
+        android:background="@color/text_E1E1E1"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
 
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml
index 8e346f6..d22ba4f 100644
--- a/app/src/main/res/layout/fragment_message.xml
+++ b/app/src/main/res/layout/fragment_message.xml
@@ -3,134 +3,266 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/message_parent"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/text_F5F7FA">
-
+    android:layout_height="match_parent">
+    <!--澶撮儴鏍囩-->
     <RelativeLayout
         android:id="@+id/message_rl"
-        android:layout_width="0dp"
-        android:layout_height="@dimen/dp_52"
-        android:background="@color/text_245EC3"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_31"
+        android:layout_marginStart="@dimen/dp_16"
+        android:layout_marginTop="@dimen/dp_44"
+        android:layout_marginEnd="@dimen/dp_16"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent">
 
-        <LinearLayout
-            android:id="@+id/message_tab_ll"
-            android:layout_width="match_parent"
+        <TextView
+            android:id="@+id/message_tab_nascent_title_tv"
+            android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:layout_marginStart="@dimen/dp_17"
-            android:layout_marginEnd="@dimen/dp_16"
-            android:orientation="horizontal">
-            <!--鍙戠敓涓�-->
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/message_tab_nascent_cl"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="1">
+            android:layout_centerVertical="true"
+            android:gravity="center_vertical"
+            android:text="@string/message_nascent"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_20"
+            android:textStyle="bold" />
 
-                <TextView
-                    android:id="@+id/message_tab_nascent_title_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="@dimen/dp_23"
-                    android:layout_marginTop="@dimen/dp_16"
-                    android:gravity="center"
-                    android:text="@string/message_nascent"
-                    android:textColor="@color/text_FFFFFFFF"
-                    android:textSize="@dimen/text_16"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
+        <TextView
+            android:id="@+id/message_tab_recover_title_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_centerVertical="true"
+            android:layout_marginStart="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_4"
+            android:layout_toStartOf="@+id/all_clear_tv"
+            android:layout_toEndOf="@+id/message_tab_nascent_title_tv"
+            android:gravity="start|center_vertical"
+            android:text="@string/alarm_record"
+            android:textColor="@color/text_40000000"
+            android:textSize="@dimen/text_16"
 
-                <View
-                    android:id="@+id/line1_v"
-                    android:layout_width="0dp"
-                    android:layout_height="3dp"
-                    android:layout_marginTop="@dimen/dp_11"
-                    android:background="@color/text_FFFFFFFF"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintEnd_toEndOf="@+id/message_tab_nascent_title_tv"
-                    app:layout_constraintStart_toStartOf="@+id/message_tab_nascent_title_tv" />
+            />
+
+        <TextView
+            android:id="@+id/all_clear_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_31"
+            android:layout_alignParentEnd="true"
+            android:gravity="center"
+            android:text="@string/all_read"
+            android:textColor="@color/text_38C494"
+            android:textSize="@dimen/dp_16"
+
+            />
 
 
-            </androidx.constraintlayout.widget.ConstraintLayout>
-            <!--宸叉仮澶�-->
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/message_tab_recover_cl"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="1">
-
-                <TextView
-                    android:id="@+id/message_tab_recover_title_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="@dimen/dp_23"
-                    android:layout_marginTop="@dimen/dp_16"
-                    android:gravity="center"
-                    android:text="@string/message_recover"
-                    android:textColor="@color/text_FFFFFFFF"
-                    android:textSize="@dimen/text_16"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
-
-                <View
-                    android:id="@+id/line2_v"
-                    android:layout_width="0dp"
-                    android:layout_height="3dp"
-                    android:layout_marginTop="@dimen/dp_11"
-                    android:background="@color/text_FFFFFFFF"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintEnd_toEndOf="@+id/message_tab_recover_title_tv"
-                    app:layout_constraintStart_toStartOf="@+id/message_tab_recover_title_tv" />
-
-
-            </androidx.constraintlayout.widget.ConstraintLayout>
-            <!--鍏ㄩ儴 2023骞�12鏈�29鏃�09:49:59闃垮粬瑕佹眰鍏堥殣钘�-->
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/message_tab_all_cl"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_weight="1"
-                android:visibility="gone">
-
-                <TextView
-                    android:id="@+id/message_tab_all_title_tv"
-                    android:layout_width="wrap_content"
-                    android:layout_height="@dimen/dp_23"
-                    android:layout_marginTop="@dimen/dp_16"
-                    android:gravity="center"
-                    android:text="@string/message_all"
-                    android:textColor="@color/text_FFFFFFFF"
-                    android:textSize="@dimen/text_16"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
-
-                <View
-                    android:id="@+id/line3_v"
-                    android:layout_width="0dp"
-                    android:layout_height="3dp"
-                    android:layout_marginTop="@dimen/dp_11"
-                    android:background="@color/text_FFFFFFFF"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintEnd_toEndOf="@+id/message_tab_all_title_tv"
-                    app:layout_constraintStart_toStartOf="@+id/message_tab_all_title_tv" />
-
-
-            </androidx.constraintlayout.widget.ConstraintLayout>
-        </LinearLayout>
     </RelativeLayout>
 
-    <!--Fragment-->
-    <androidx.fragment.app.FragmentContainerView
-        android:id="@+id/message_fcv"
-        android:layout_width="0dp"
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/message_cl"
+        android:layout_width="match_parent"
+        android:layout_height="98dp"
+        android:layout_marginTop="@dimen/dp_21"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/message_rl">
+        <!--鎼滅储-->
+        <RelativeLayout
+            android:id="@+id/message_search_cl"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_13"
+            android:layout_marginEnd="@dimen/dp_16"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <RelativeLayout
+                android:id="@+id/message_search_click_cl"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_alignParentEnd="true"
+                android:layout_marginEnd="@dimen/dp_17"
+                android:background="@drawable/search_bj_ff05000000">
+
+                <ImageView
+                    android:id="@+id/power_station_search_iv"
+                    android:layout_width="@dimen/dp_18"
+                    android:layout_height="@dimen/dp_18"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerVertical="true"
+                    android:layout_marginStart="@dimen/dp_13"
+                    android:src="@drawable/search_path" />
+
+                <TextView
+                    android:id="@+id/power_station_search_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="@dimen/dp_17"
+                    android:layout_centerVertical="true"
+                    android:layout_marginStart="@dimen/dp_11"
+                    android:layout_toEndOf="@+id/power_station_search_iv"
+                    android:text="Search the message"
+                    android:textColor="@color/text_40000000"
+                    android:textSize="@dimen/text_14" />
+            </RelativeLayout>
+
+
+        </RelativeLayout>
+        <!--鏉′欢绛涢��-->
+        <RelativeLayout
+            android:id="@+id/message_condition_screening_rl"
+            android:layout_width="0dp"
+            android:layout_height="@dimen/dp_62"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/message_search_cl">
+
+            <LinearLayout
+                android:id="@+id/message_tab_ll"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginEnd="@dimen/dp_16"
+                android:orientation="horizontal">
+                <!--鍏ㄩ儴璁惧-->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/message_tab_all_device_cl"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/all_device_title_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_20"
+                            android:text="@string/alarm_all_device"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_14" />
+
+                        <View
+                            android:layout_width="@dimen/dp_7"
+                            android:layout_height="match_parent" />
+
+                        <ImageView
+                            android:id="@+id/all_device_title_iv"
+                            android:layout_width="@dimen/dp_10"
+                            android:layout_height="@dimen/dp_10"
+                            android:layout_marginStart="@dimen/dp_7"
+                            android:background="@drawable/up" />
+
+                    </LinearLayout>
+
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+                <!--鍏ㄩ儴绛夌骇-->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/message_tab_all_grade_cl"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/all_grade_title_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_20"
+                            android:text="@string/alarm_all_grade"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_14" />
+
+                        <View
+                            android:layout_width="7dp"
+                            android:layout_height="match_parent" />
+
+                        <ImageView
+                            android:id="@+id/all_grade_title_iv"
+                            android:layout_width="@dimen/dp_10"
+                            android:layout_height="@dimen/dp_10"
+                            android:layout_marginStart="@dimen/dp_7"
+                            android:background="@drawable/up" />
+                    </LinearLayout>
+
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+                <!--鍏ㄩ儴鏃堕棿-->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/message_tab_all_time_cl"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center_vertical|end"
+                        android:orientation="horizontal">
+
+                        <TextView
+                            android:id="@+id/all_time_title_tv"
+                            android:layout_width="wrap_content"
+                            android:layout_height="@dimen/dp_20"
+                            android:layout_marginEnd="@dimen/dp_7"
+                            android:text="@string/alarm_all_time"
+                            android:textColor="@color/text_90000000"
+                            android:textSize="@dimen/text_14" />
+
+                        <View
+                            android:layout_width="@dimen/dp_7"
+                            android:layout_height="match_parent" />
+
+                        <ImageView
+                            android:id="@+id/all_time_title_iv"
+                            android:layout_width="@dimen/dp_10"
+                            android:layout_height="@dimen/dp_10"
+                            android:background="@drawable/up" />
+                    </LinearLayout>
+
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+            </LinearLayout>
+        </RelativeLayout>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/message_srl"
+        android:layout_width="match_parent"
         android:layout_height="0dp"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/message_rl" />
+        app:layout_constraintTop_toBottomOf="@+id/message_cl">
 
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/message_rcv"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:clipToPadding="false"
+            android:paddingBottom="@dimen/dp_16" />
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+    <!--娌℃湁鏁版嵁鏄剧ず鏍峰紡-->
+    <include
+        android:id="@+id/null_data_ic"
+        layout="@layout/null_data_view"
+        android:layout_width="match_parent"
+        android:layout_height="224dp"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/message_cl" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/frgment_house_list_line.xml b/app/src/main/res/layout/frgment_house_list_line.xml
deleted file mode 100644
index b238670..0000000
--- a/app/src/main/res/layout/frgment_house_list_line.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<com.hdl.photovoltaic.widget.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/item_parent_swipeLayout"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
-
-    <include
-        android:id="@+id/swipe_layout_il"
-        layout="@layout/swipe_right_layout" />
-
-    <RelativeLayout
-        android:id="@+id/item_parent_rl"
-        android:layout_width="match_parent"
-        android:layout_height="142dp"
-        android:background="@color/text_F9FAFB">
-
-        <RelativeLayout
-            android:id="@+id/fragment_house_list_line_parent_rl"
-            android:layout_width="0dp"
-            android:layout_height="130dp"
-            android:layout_alignParentStart="true"
-            android:layout_alignParentEnd="true"
-            android:layout_marginStart="@dimen/dp_20"
-            android:layout_marginTop="@dimen/dp_12"
-            android:layout_marginEnd="@dimen/dp_20"
-            android:background="@drawable/house_list_line_parent_bg">
-
-            <ImageView
-                android:id="@+id/fragment_house_list_line_left_iv"
-                android:layout_width="113dp"
-                android:layout_height="130dp"
-                android:background="@drawable/default_user"
-                android:scaleType="centerCrop" />
-
-            <TextView
-                android:id="@+id/fragment_house_list_line_name_tv"
-                android:layout_width="170dp"
-                android:layout_height="@dimen/dp_23"
-                android:layout_marginStart="@dimen/dp_15"
-                android:layout_marginTop="@dimen/dp_28"
-                android:layout_toEndOf="@+id/fragment_house_list_line_left_iv"
-                android:ellipsize="end"
-                android:gravity="center_vertical|start"
-                android:singleLine="true"
-                android:text="@string/power_station"
-                android:textColor="@color/text_90000000"
-                android:textSize="@dimen/text_16" />
-
-            <TextView
-                android:id="@+id/fragment_house_list_line_capacity_tv"
-                android:layout_width="wrap_content"
-                android:layout_height="@dimen/dp_17"
-                android:layout_below="@+id/fragment_house_list_line_name_tv"
-                android:layout_alignStart="@+id/fragment_house_list_line_name_tv"
-                android:layout_marginTop="@dimen/dp_13"
-                android:gravity="center_vertical"
-                android:text="@string/my_power_station_installed_capacity"
-                android:textColor="@color/text_40000000"
-                android:textSize="@dimen/text_12" />
-
-            <TextView
-                android:id="@+id/fragment_house_list_line_power_tv"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_below="@+id/fragment_house_list_line_capacity_tv"
-                android:layout_alignStart="@+id/fragment_house_list_line_capacity_tv"
-                android:layout_marginTop="@dimen/dp_13"
-                android:gravity="center_vertical"
-                android:text="@string/power_station_generated_power"
-                android:textColor="@color/text_40000000"
-                android:textSize="@dimen/text_12" />
-
-            <TextView
-                android:id="@+id/fragment_house_list_line_state_tv"
-                android:layout_width="@dimen/dp_48"
-                android:layout_height="@dimen/dp_33"
-                android:layout_alignParentTop="true"
-                android:layout_alignParentEnd="true"
-                android:background="@drawable/state_ffb300"
-                android:gravity="center"
-                android:text="@string/my_power_station_connecting"
-                android:textColor="@color/text_FFFFFFFF"
-                android:textSize="@dimen/text_12" />
-
-
-        </RelativeLayout>
-
-
-    </RelativeLayout>
-
-</com.hdl.photovoltaic.widget.SwipeLayout>
-
diff --git a/app/src/main/res/layout/item_data.xml b/app/src/main/res/layout/item_data.xml
new file mode 100644
index 0000000..7579de8
--- /dev/null
+++ b/app/src/main/res/layout/item_data.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="@dimen/dp_171"
+    android:layout_height="@dimen/dp_44">
+
+    <TextView
+        android:id="@+id/data_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_24"
+        android:textColor="@color/text_90000000"
+        android:textSize="@dimen/text_20"
+        android:textStyle="bold"
+        android:text="33"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/data_type_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_17"
+        android:layout_marginTop="3dp"
+        android:textColor="@color/text_40000000"
+        android:textSize="@dimen/text_14"
+        app:layout_constraintEnd_toEndOf="@+id/data_tv"
+        app:layout_constraintStart_toStartOf="@+id/data_tv"
+        app:layout_constraintTop_toBottomOf="@+id/data_tv" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_device_details.xml b/app/src/main/res/layout/item_device_details.xml
new file mode 100644
index 0000000..c3b8f3e
--- /dev/null
+++ b/app/src/main/res/layout/item_device_details.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.hdl.photovoltaic.widget.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/item_parent_swipeLayout"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <include
+        android:id="@+id/swipe_layout_il"
+        layout="@layout/swipe_right_layout" />
+
+    <RelativeLayout
+        android:id="@+id/item_parent_rl"
+        android:layout_width="match_parent"
+        android:layout_height="164dp">
+
+        <RelativeLayout
+            android:id="@+id/device_details_info_rl"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginStart="@dimen/dp_16"
+            android:layout_marginTop="@dimen/dp_16"
+            android:layout_marginEnd="@dimen/dp_16"
+            android:background="@drawable/ffffff_13">
+
+            <ImageView
+                android:id="@+id/device_details_image_iv"
+                android:layout_width="44dp"
+                android:layout_height="42dp"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginTop="@dimen/dp_13"
+                android:background="@drawable/device_image"
+                android:scaleType="centerCrop" />
+
+            <TextView
+                android:id="@+id/device_details_name_tv"
+                android:layout_width="170dp"
+                android:layout_height="@dimen/dp_19"
+                android:layout_marginStart="@dimen/dp_11"
+                android:layout_marginTop="@dimen/dp_15"
+                android:layout_toEndOf="@+id/device_details_image_iv"
+                android:ellipsize="end"
+                android:gravity="center_vertical|start"
+                android:singleLine="true"
+                android:textColor="@color/text_90000000"
+                android:textSize="@dimen/text_16"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/device_details_sn_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/dp_17"
+                android:layout_below="@+id/device_details_name_tv"
+                android:layout_alignStart="@+id/device_details_name_tv"
+                android:layout_marginTop="@dimen/dp_3"
+                android:gravity="center_vertical"
+                android:textColor="@color/text_40000000"
+                android:textSize="@dimen/text_12" />
+
+            <LinearLayout
+                android:id="@+id/screening_condition_ll"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_36"
+                android:layout_below="@+id/device_details_image_iv"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginTop="@dimen/dp_17"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:id="@+id/power_ll"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/power_value_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_15"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/power_type_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_15"
+                        android:layout_marginTop="3dp"
+                        android:gravity="center"
+                        android:text="@string/generated_power"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_12" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/day_ll"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/day_value_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_18"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_15"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/day_type_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_15"
+                        android:layout_marginTop="3dp"
+                        android:gravity="center"
+                        android:text="@string/day_power_generation"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_12" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/month_ll"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/month_value_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_18"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_15"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/month_type_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_15"
+                        android:layout_marginTop="3dp"
+                        android:gravity="center"
+                        android:text="@string/month_power_generation"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_12" />
+
+                </LinearLayout>
+
+
+            </LinearLayout>
+
+            <View
+                android:id="@+id/line"
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_below="@+id/screening_condition_ll"
+                android:layout_marginStart="@dimen/dp_17"
+                android:layout_marginTop="@dimen/dp_8"
+                android:layout_marginEnd="@dimen/dp_16"
+                android:background="@color/text_E1E1E1" />
+
+            <ImageView
+                android:id="@+id/plant_details_location_iv"
+                android:layout_width="@dimen/dp_19"
+                android:layout_height="@dimen/dp_19"
+                android:layout_below="@+id/line"
+                android:layout_marginStart="@dimen/dp_11"
+                android:layout_marginTop="@dimen/dp_7"
+                android:src="@drawable/location" />
+
+            <TextView
+                android:id="@+id/plant_details_location_tv"
+                android:layout_width="290dp"
+                android:layout_height="@dimen/dp_19"
+                android:layout_below="@+id/line"
+                android:layout_marginStart="@dimen/dp_3"
+                android:layout_marginTop="@dimen/dp_8"
+                android:layout_toEndOf="@+id/plant_details_location_iv"
+                android:ellipsize="end"
+                android:gravity="center_vertical|start"
+                android:singleLine="true"
+                android:text="@string/power_station"
+                android:textColor="@color/text_40000000"
+                android:textSize="@dimen/text_12" />
+
+            <TextView
+                android:id="@+id/fragment_house_list_line_state_tv"
+                android:layout_width="69dp"
+                android:layout_height="@dimen/dp_33"
+                android:layout_alignParentTop="true"
+                android:layout_alignParentEnd="true"
+                android:background="@drawable/state_ffb300"
+                android:gravity="center"
+                android:text="@string/my_power_station_connecting"
+                android:textColor="@color/text_FFFFFFFF"
+                android:textSize="@dimen/text_12" />
+
+
+        </RelativeLayout>
+
+
+    </RelativeLayout>
+
+</com.hdl.photovoltaic.widget.SwipeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_history_title.xml b/app/src/main/res/layout/item_history_title.xml
new file mode 100644
index 0000000..4837694
--- /dev/null
+++ b/app/src/main/res/layout/item_history_title.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/dp_51">
+
+    <TextView
+        android:id="@+id/history_title_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_23"
+        android:layout_marginStart="@dimen/dp_16"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:textColor="@color/text_90000000"
+        android:textSize="@dimen/text_16"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml
index da1f0a5..bf087ba 100644
--- a/app/src/main/res/layout/item_message.xml
+++ b/app/src/main/res/layout/item_message.xml
@@ -2,8 +2,7 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/dp_150"
-    android:background="@color/text_F5F7FA">
+    android:layout_height="@dimen/dp_115">
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
@@ -26,14 +25,15 @@
             android:id="@+id/item_content_tv"
             android:layout_width="0dp"
             android:layout_height="@dimen/dp_23"
-            android:layout_marginStart="20dp"
-            android:layout_marginTop="16dp"
+            android:layout_marginStart="16dp"
+            android:layout_marginTop="19dp"
             android:layout_marginEnd="@dimen/dp_5"
+            android:ellipsize="end"
             android:gravity="center_vertical"
+            android:singleLine="true"
+            android:textStyle="bold"
             android:textColor="@color/text_90000000"
             android:textSize="@dimen/text_16"
-            android:ellipsize="end"
-            android:singleLine="true"
             app:layout_constraintEnd_toStartOf="@+id/item_estate_tv"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
@@ -42,7 +42,7 @@
             android:id="@+id/item_home_name_tv"
             android:layout_width="wrap_content"
             android:layout_height="@dimen/dp_17"
-            android:layout_marginTop="@dimen/dp_24"
+            android:layout_marginTop="@dimen/dp_6"
             android:textColor="@color/text_40000000"
             android:textSize="@dimen/text_12"
             app:layout_constraintStart_toStartOf="@+id/item_content_tv"
@@ -52,7 +52,7 @@
             android:id="@+id/item_time_tv"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/dp_14"
+            android:layout_marginTop="@dimen/dp_6"
             android:gravity="center_vertical"
             android:textColor="@color/text_40000000"
             android:textSize="@dimen/text_12"
diff --git a/app/src/main/res/layout/item_plant_details.xml b/app/src/main/res/layout/item_plant_details.xml
new file mode 100644
index 0000000..2682a41
--- /dev/null
+++ b/app/src/main/res/layout/item_plant_details.xml
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<com.hdl.photovoltaic.widget.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/item_parent_swipeLayout"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <include
+        android:id="@+id/swipe_layout_il"
+        layout="@layout/swipe_right_layout" />
+
+    <RelativeLayout
+        android:id="@+id/item_parent_rl"
+        android:layout_width="match_parent"
+        android:layout_height="164dp">
+
+        <RelativeLayout
+            android:id="@+id/device_details_info_rl"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginStart="@dimen/dp_16"
+            android:layout_marginTop="@dimen/dp_16"
+            android:layout_marginEnd="@dimen/dp_16"
+            android:background="@drawable/ffffff_13">
+
+            <ImageView
+                android:id="@+id/device_details_image_iv"
+                android:layout_width="44dp"
+                android:layout_height="42dp"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginTop="@dimen/dp_13"
+                android:background="@drawable/default_user"
+                android:scaleType="centerCrop" />
+
+            <TextView
+                android:id="@+id/device_details_name_tv"
+                android:layout_width="170dp"
+                android:layout_height="@dimen/dp_19"
+                android:layout_marginStart="@dimen/dp_11"
+                android:layout_marginTop="@dimen/dp_15"
+                android:layout_toEndOf="@+id/device_details_image_iv"
+                android:ellipsize="end"
+                android:gravity="center_vertical|start"
+                android:singleLine="true"
+                android:text="@string/power_station"
+                android:textColor="@color/text_90000000"
+                android:textSize="@dimen/text_16"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/device_details_sn_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="@dimen/dp_17"
+                android:layout_below="@+id/device_details_name_tv"
+                android:layout_alignStart="@+id/device_details_name_tv"
+                android:layout_marginTop="@dimen/dp_3"
+                android:gravity="center_vertical"
+                android:text="@string/installed_capacity"
+                android:textColor="@color/text_40000000"
+                android:textSize="@dimen/text_12" />
+
+            <LinearLayout
+                android:id="@+id/screening_condition_ll"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_36"
+                android:layout_below="@+id/device_details_image_iv"
+                android:layout_marginStart="@dimen/dp_16"
+                android:layout_marginTop="@dimen/dp_17"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:id="@+id/power_ll"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/power_value_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_18"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_15"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/power_type_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_15"
+                        android:layout_marginTop="3dp"
+                        android:gravity="center"
+                        android:text="@string/generated_power"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_12" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/day_ll"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/day_value_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_18"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_15"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/day_type_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_15"
+                        android:layout_marginTop="3dp"
+                        android:gravity="center"
+                        android:text="@string/day_power_generation"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_12" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/month_ll"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:id="@+id/month_value_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_18"
+                        android:gravity="center"
+                        android:text="99"
+                        android:textColor="@color/text_90000000"
+                        android:textSize="@dimen/text_15"
+                        android:textStyle="bold" />
+
+                    <TextView
+                        android:id="@+id/month_type_tv"
+                        android:layout_width="match_parent"
+                        android:layout_height="@dimen/dp_15"
+                        android:layout_marginTop="3dp"
+                        android:gravity="center"
+                        android:text="@string/month_power_generation"
+                        android:textColor="@color/text_40000000"
+                        android:textSize="@dimen/text_12" />
+
+                </LinearLayout>
+
+
+            </LinearLayout>
+
+            <View
+                android:id="@+id/line"
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_below="@+id/screening_condition_ll"
+                android:layout_marginStart="@dimen/dp_17"
+                android:layout_marginTop="@dimen/dp_8"
+                android:layout_marginEnd="@dimen/dp_16"
+                android:background="@color/text_E1E1E1" />
+
+            <ImageView
+                android:id="@+id/plant_details_location_iv"
+                android:layout_width="@dimen/dp_19"
+                android:layout_height="@dimen/dp_19"
+                android:layout_below="@+id/line"
+                android:layout_marginStart="@dimen/dp_11"
+                android:layout_marginTop="@dimen/dp_7"
+                android:src="@drawable/location" />
+
+            <TextView
+                android:id="@+id/plant_details_location_tv"
+                android:layout_width="290dp"
+                android:layout_height="@dimen/dp_19"
+                android:layout_below="@+id/line"
+                android:layout_marginStart="@dimen/dp_3"
+                android:layout_marginTop="@dimen/dp_8"
+                android:layout_toEndOf="@+id/plant_details_location_iv"
+                android:ellipsize="end"
+                android:gravity="center_vertical|start"
+                android:singleLine="true"
+                android:text="@string/power_station"
+                android:textColor="@color/text_40000000"
+                android:textSize="@dimen/text_12" />
+
+            <TextView
+                android:id="@+id/fragment_house_list_line_state_tv"
+                android:layout_width="69dp"
+                android:layout_height="@dimen/dp_33"
+                android:layout_alignParentTop="true"
+                android:layout_alignParentEnd="true"
+                android:background="@drawable/state_ffb300"
+                android:gravity="center"
+                android:text="@string/my_power_station_connecting"
+                android:textColor="@color/text_FFFFFFFF"
+                android:textSize="@dimen/text_12" />
+
+
+        </RelativeLayout>
+
+
+    </RelativeLayout>
+
+</com.hdl.photovoltaic.widget.SwipeLayout>
+
diff --git a/app/src/main/res/layout/item_search_house.xml b/app/src/main/res/layout/item_search_house.xml
new file mode 100644
index 0000000..0b1b47b
--- /dev/null
+++ b/app/src/main/res/layout/item_search_house.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/dp_75">
+
+    <ImageView
+        android:id="@+id/power_station_search_iv"
+        android:layout_width="@dimen/dp_18"
+        android:layout_height="@dimen/dp_18"
+        android:layout_marginStart="@dimen/dp_16"
+        android:src="@drawable/search_path"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/message_name_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_23"
+        android:layout_marginStart="@dimen/dp_23"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:textColor="@color/text_90000000"
+        android:textSize="@dimen/text_16"
+        app:layout_constraintStart_toEndOf="@+id/power_station_search_iv"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/power_station_location_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_17"
+        android:layout_marginTop="@dimen/dp_7"
+        android:textColor="@color/text_40000000"
+        android:textSize="@dimen/text_12"
+        app:layout_constraintStart_toStartOf="@+id/message_name_tv"
+        app:layout_constraintTop_toBottomOf="@+id/message_name_tv" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_search_message.xml b/app/src/main/res/layout/item_search_message.xml
new file mode 100644
index 0000000..3a55505
--- /dev/null
+++ b/app/src/main/res/layout/item_search_message.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/dp_127">
+
+    <ImageView
+        android:id="@+id/message_search_iv"
+        android:layout_width="@dimen/dp_18"
+        android:layout_height="@dimen/dp_18"
+        android:layout_marginStart="@dimen/dp_16"
+        android:layout_marginTop="@dimen/dp_28"
+        android:src="@drawable/search_path"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginStart="@dimen/dp_57"
+        android:layout_marginTop="@dimen/dp_28"
+        android:layout_marginEnd="@dimen/dp_21"
+        android:background="@drawable/bj_13fffffff"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <TextView
+            android:id="@+id/message_name_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_23"
+            android:layout_marginStart="@dimen/dp_16"
+            android:layout_marginTop="@dimen/dp_19"
+            android:ellipsize="end"
+            android:singleLine="true"
+            android:textColor="@color/text_90000000"
+            android:textSize="@dimen/text_16"
+            android:textStyle="bold"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/message_content_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_17"
+            android:layout_marginTop="@dimen/dp_6"
+            android:textColor="@color/text_40000000"
+            android:textSize="@dimen/text_12"
+            app:layout_constraintStart_toStartOf="@+id/message_name_tv"
+            app:layout_constraintTop_toBottomOf="@+id/message_name_tv" />
+
+        <TextView
+            android:id="@+id/message_time_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_17"
+            android:layout_marginTop="@dimen/dp_6"
+            android:textColor="@color/text_40000000"
+            android:textSize="@dimen/text_12"
+            app:layout_constraintStart_toStartOf="@+id/message_content_tv"
+            app:layout_constraintTop_toBottomOf="@+id/message_content_tv" />
+
+        <TextView
+            android:id="@+id/message_state_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="@dimen/dp_33"
+            android:background="@drawable/state_ffb300"
+            android:gravity="center"
+            android:paddingStart="@dimen/dp_12"
+            android:paddingEnd="@dimen/dp_12"
+            android:textColor="@color/text_FFFFFFFF"
+            android:textSize="@dimen/text_12"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_station.xml b/app/src/main/res/layout/item_station.xml
new file mode 100644
index 0000000..32adc65
--- /dev/null
+++ b/app/src/main/res/layout/item_station.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/station_status_cl"
+    android:layout_width="74dp"
+    android:layout_height="56dp"
+    android:background="@drawable/station_status_no_ffffff">
+
+    <TextView
+        android:id="@+id/station_status_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_25"
+        android:layout_marginTop="7dp"
+        android:text="99"
+        android:textColor="@color/text_90000000"
+        android:textSize="@dimen/text_21"
+        android:textStyle="bold"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <TextView
+        android:id="@+id/station_status_number_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/dp_17"
+        android:layout_marginTop="1dp"
+        android:text="state"
+        android:textColor="@color/text_40000000"
+        android:textSize="@dimen/text_14"
+        app:layout_constraintEnd_toEndOf="@+id/station_status_tv"
+        app:layout_constraintStart_toStartOf="@+id/station_status_tv"
+        app:layout_constraintTop_toBottomOf="@+id/station_status_tv" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_type_title.xml b/app/src/main/res/layout/item_type_title.xml
index 8e61c18..c767cf7 100644
--- a/app/src/main/res/layout/item_type_title.xml
+++ b/app/src/main/res/layout/item_type_title.xml
@@ -19,6 +19,7 @@
             android:id="@+id/type_title_tv"
             android:layout_width="match_parent"
             android:layout_height="@dimen/dp_20"
+            android:gravity="center"
             android:textColor="@color/text_90000000"
             android:textSize="@dimen/text_14"
             app:layout_constraintBottom_toBottomOf="parent"
diff --git a/app/src/main/res/layout/swipe_right_layout.xml b/app/src/main/res/layout/swipe_right_layout.xml
index 9e67d01..73ebdbb 100644
--- a/app/src/main/res/layout/swipe_right_layout.xml
+++ b/app/src/main/res/layout/swipe_right_layout.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="66dp"
-    android:layout_height="142dp"
+    android:layout_height="164dp"
     android:layout_marginTop="@dimen/dp_12"
     android:orientation="vertical">
 
     <View
         android:layout_width="wrap_content"
-        android:layout_height="@dimen/dp_19" />
+        android:layout_height="@dimen/dp_24" />
 
     <ImageView
         android:id="@+id/move_home_iv"
@@ -17,7 +17,7 @@
 
     <View
         android:layout_width="wrap_content"
-        android:layout_height="@dimen/dp_16" />
+        android:layout_height="@dimen/dp_32" />
 
     <ImageView
         android:id="@+id/del_home_iv"
diff --git a/app/src/main/res/layout/toolbar_top_view_44.xml b/app/src/main/res/layout/toolbar_top_view_44.xml
index 16ffe2e..4b31abb 100644
--- a/app/src/main/res/layout/toolbar_top_view_44.xml
+++ b/app/src/main/res/layout/toolbar_top_view_44.xml
@@ -7,7 +7,7 @@
 
     <!--1.杩斿洖鎸夐挳 澧炲ぇ鐐瑰嚮鍖哄煙-->
     <LinearLayout
-        android:id="@+id/top_back_btn"
+        android:id="@+id/top_back_ll"
         android:layout_width="@dimen/dp_56"
         android:layout_height="match_parent"
         android:gravity="center_vertical"
diff --git a/app/src/main/res/layout/toolbar_top_view_52.xml b/app/src/main/res/layout/toolbar_top_view_52.xml
index ddcf450..4269706 100644
--- a/app/src/main/res/layout/toolbar_top_view_52.xml
+++ b/app/src/main/res/layout/toolbar_top_view_52.xml
@@ -8,7 +8,7 @@
 
     <!--1.杩斿洖鎸夐挳 澧炲ぇ鐐瑰嚮鍖哄煙-->
     <LinearLayout
-        android:id="@+id/top_back_btn"
+        android:id="@+id/top_back_ll"
         android:layout_width="@dimen/dp_56"
         android:layout_height="match_parent"
         android:gravity="center_vertical"
diff --git a/app/src/main/res/values-w1240dp/dimens.xml b/app/src/main/res/values-w1240dp/dimens.xml
deleted file mode 100644
index d73f4a3..0000000
--- a/app/src/main/res/values-w1240dp/dimens.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<resources>
-    <dimen name="fab_margin">200dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-w600dp/dimens.xml b/app/src/main/res/values-w600dp/dimens.xml
deleted file mode 100644
index 22d7f00..0000000
--- a/app/src/main/res/values-w600dp/dimens.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<resources>
-    <dimen name="fab_margin">48dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index dabd399..99a78bd 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -48,6 +48,8 @@
     <color name="text_B2B2B2">#B2B2B2</color>
     <color name="text_38C494">#38C494</color>
     <color name="text_C2EDDE">#C2EDDE</color>
+    <color name="text_C1C1C1">#C1C1C1</color>
+    <color name="text_1238C494">#1238C494</color>
 
 
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5c8a221..e56893a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,5 +1,4 @@
 <resources>
-    <!--    <string name="app_name">PhotovoltaicDebug</string>-->
     <string name="app_name">鏅烘収鑳芥簮</string>
     <string name="title_activity_home_login">HomeLoginActivity</string>
     <!-- Strings used for fragments for navigation -->
@@ -10,6 +9,7 @@
 
     <string name="hello_first_fragment">Hello first fragment</string>
     <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
+
 
     <!--鐧诲綍妯″潡-->
     <string name="home_login_chinese">绠�浣撲腑鏂�</string>
@@ -247,4 +247,49 @@
     <string name="port_conflict">搴旂敤鍐茬獊锛岄渶瑕佸叧闂璷npro鎴栬�呭叾瀹冪増鏈殑璋冭瘯杞欢鐒跺悗鍐嶉噸鏂板惎鍔ㄨ繖涓蒋浠惰瘯璇�</string>
 
 
+    <string name="cancel_download_successfully">鍙栨秷涓嬭浇鎴愬姛.</string>
+    <string name="writing_firmware_upgrade_memory_succeeded">鍐欏叆鏂板浐浠舵枃浠跺埌鍐呭瓨鎴愬姛.</string>
+    <string name="download_firmware_upgrade_file_failed">涓嬭浇鍥轰欢鍗囩骇鏂囦欢澶辫触.</string>
+    <string name="found_locally_firmware_upgrade_file">鏈湴鎵句笉鍒板崌绾у浐浠舵枃浠�,璇蜂笅杞藉ソ鍥轰欢鏂囦欢,鍐嶉噸鏂板崌绾�.</string>
+    <string name="notify_gateway_firmware_upgrade_failed">閫氱煡缁欑綉鍏冲崌绾у浐浠舵枃浠跺湴鍧�澶辫触,鏃犳硶鍗囩骇.</string>
+    <string name="local_service_fails">鏈湴鏈嶅姟鏈夊紓甯稿け璐�,鏃犳硶鍗囩骇.</string>
+    <string name="writing_drive_memory_succeeded">鍐欏叆鏂伴┍鍔ㄦ枃浠跺埌鍐呭瓨鎴愬姛.</string>
+    <string name="download_drive_file_failed">涓嬭浇椹卞姩鍗囩骇鏂囦欢澶辫触.</string>
+    <string name="found_locally_drive_file">鏈湴鎵句笉鍒板崌绾ч┍鍔ㄦ枃浠�,璇蜂笅杞藉ソ椹卞姩鏂囦欢,鍐嶉噸鏂板崌绾�.</string>
+    <string name="notify_gateway_drive_failed">閫氱煡缁欑綉鍏冲崌绾ч┍鍔ㄦ枃浠跺湴鍧�澶辫触,鏃犳硶鍗囩骇.</string>
+    <string name="time_selectd">鏃堕棿閫夋嫨</string>
+    <string name="life_cycle">鐢熷懡鏈�</string>
+    <string name="year">骞�</string>
+    <string name="month">鏈�</string>
+    <string name="day">鏃�</string>
+    <string name="hour">鏃�</string>
+    <string name="minutc">鍒�</string>
+    <string name="seconds">绉�</string>
+    <string name="the_query_date_is_exceeded">瓒呭嚭鏌ヨ鏃ユ湡.</string>
+    <string name="energy_generation_statistics">鍙戠數閲忕粺璁�</string>
+    <string name="social_contribution">绀句細璐$尞</string>
+    <string name="day_power_generation">褰撴棩鍙戠數閲�</string>
+    <string name="month_power_generation">褰撴湀鍙戠數閲�</string>
+    <string name="year_power_generation">褰撳勾鍙戠數閲�</string>
+    <string name="cumulative_power_generation">绱鍙戠數閲�</string>
+    <string name="generated_power">鍙戠數鍔熺巼</string>
+    <string name="installed_capacity">瑁呮満瀹归噺</string>
+    <string name="generation">鍙戠數閲�</string>
+    <string name="station_name">鐢电珯鍚嶇О</string>
+    <string name="search">鎼滅储</string>
+    <string name="history_search">鍘嗗彶鎼滅储</string>
+    <string name="search_content_null">鎼滅储鍐呭涓嶈兘涓虹┖.</string>
+    <string name="no_equipment">鏆傛棤璁惧.</string>
+    <string name="filtering">绛涢��</string>
+    <string name="reset">閲嶇疆</string>
+    <string name="string_capacity">缁勪覆瀹归噺锛坘Wp)</string>
+    <string name="grid_connected_state">骞剁綉鐘舵��</string>
+    <string name="grid_connected">骞剁綉</string>
+    <string name="off_network">绂荤綉</string>
+    <string name="the_input_value_has_been_exceeded">杈撳叆鍊煎凡缁忚秴杩�</string>
+    <string name="all_read">涓�閿竻闄�</string>
+    <string name="contact_us">鑱旂郴鎴戜滑</string>
+    <string name="wechat_id">寰俊鍙�</string>
+    <string name="email_address">閭鍦板潃</string>
+    <string name="successful_replication">澶嶅埗鎴愬姛</string>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 4fac929..114e0be 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -4,8 +4,37 @@
         <item name="android:background">@color/black_overlay</item>
         <item name="android:buttonBarStyle">?android:attr/buttonBarStyle</item>
     </style>
+
     <style name="NoAnimationTheme" parent="Theme.AppCompat.Light.NoActionBar">
         <item name="android:windowAnimationStyle">@null</item>
     </style>
+    <!-- 鑷畾涔夊瓧浣撴牱寮� 椤甸潰涓�绾ф爣棰�-->
+    <style name="Text20Style">
+        <item name="android:textSize">@dimen/text_20</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:textColor">@color/text_90000000</item>
+        <!--        <item name="android:fontFamily"></item>-->
+
+    </style>
+    <!-- 鑷畾涔夊瓧浣撴牱寮� 鍐呭涓�绾ф爣棰�-->
+    <style name="Text21Style">
+        <item name="android:textSize">@dimen/text_21</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:textColor">@color/text_90000000</item>
+
+    </style>
+    <!-- 鑷畾涔夊瓧浣撴牱寮� -->
+    <style name="Text14Style">
+        <item name="android:textSize">@dimen/text_14</item>
+        <item name="android:textColor">@color/text_40000000</item>
+    </style>
+    <!-- 鑷畾涔夊瓧浣撴牱寮� -->
+    <style name="Text16Style">
+        <item name="android:textSize">@dimen/text_16</item>
+        <item name="android:textColor">@color/text_40000000</item>
+    </style>
+
+
+
 
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index e7da647..0649322 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -11,13 +11,13 @@
         <item name="colorOnSecondary">@color/black</item>
         <!-- Status bar color. -->
         <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
-
         <!-- Customize your theme here. -->
     </style>
 
     <style name="Theme.PhotovoltaicDebug.NoActionBar">
         <item name="windowActionBar">false</item>
         <item name="windowNoTitle">true</item>
+
     </style>
 
 
diff --git a/pickerview/.gitignore b/pickerview/.gitignore
new file mode 100644
index 0000000..43cf153
--- /dev/null
+++ b/pickerview/.gitignore
@@ -0,0 +1,12 @@
+/build
+*.idea
+/.idea/libraries
+/.idea/modules
+/.idea/compiler.xml
+/.idea/gradle.xml
+/.idea/jarRepositories.xml
+/.idea/misc.xml
+/.idea/modules.xml
+/.idea/vcs.xml
+/.idea/workspace.xml
+/release
\ No newline at end of file
diff --git a/pickerview/build.gradle b/pickerview/build.gradle
new file mode 100644
index 0000000..338d980
--- /dev/null
+++ b/pickerview/build.gradle
@@ -0,0 +1,49 @@
+apply plugin: 'com.android.library'
+//apply plugin: 'com.novoda.bintray-release'//娣诲姞JCenter鎻掍欢
+
+
+
+android {
+    compileSdkVersion 31
+
+    defaultConfig {
+        minSdkVersion 23
+        targetSdkVersion 31
+        versionCode 34
+        versionName "4.1.9"
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+    lintOptions {
+        abortOnError false
+    }
+}
+
+//allprojects {
+//    tasks.withType(Javadoc) {//鍏煎涓枃瀛楃
+//        options{
+//            encoding "UTF-8"
+//            charSet 'UTF-8'
+//            links "http://docs.oracle.com/javase/7/docs/api"
+//        }
+//    }
+//}
+//publish {
+//    userOrg = 'contrarywind'//bintray.com 鐢ㄦ埛鍚�/缁勭粐鍚� user/org name
+//    groupId = 'com.contrarywind'//JCenter涓婃樉绀虹殑璺緞 path
+//    artifactId = 'Android-PickerView'//椤圭洰鍚嶇О project name
+//    publishVersion = '4.1.9'//鐗堟湰鍙� version code
+//    desc = 'this is a pickerview for android'//椤圭洰鎻忚堪 description
+//    website = 'https://github.com/Bigkoo/Android-PickerView' //椤圭洰缃戝潃閾炬帴 link
+//}
+
+dependencies {
+//    compile fileTree(include: ['*.jar'], dir: 'libs')
+    api project(path: ':wheelview')
+//    implementation 'com.contrarywind:wheelview:4.1.0'
+    implementation 'com.android.support:support-annotations:28.0.0'
+}
\ No newline at end of file
diff --git a/pickerview/proguard-rules.pro b/pickerview/proguard-rules.pro
new file mode 100644
index 0000000..0cc5098
--- /dev/null
+++ b/pickerview/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/Sai/Documents/software/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java b/pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java
new file mode 100644
index 0000000..e820eb1
--- /dev/null
+++ b/pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java
@@ -0,0 +1,13 @@
+package com.bigkoo.pickerview;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+    public ApplicationTest() {
+        super(Application.class);
+    }
+}
\ No newline at end of file
diff --git a/pickerview/src/main/AndroidManifest.xml b/pickerview/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e2336d9
--- /dev/null
+++ b/pickerview/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.bigkoo.pickerview">
+
+
+</manifest>
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java b/pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java
new file mode 100644
index 0000000..76f873e
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java
@@ -0,0 +1,44 @@
+package com.bigkoo.pickerview.adapter;
+
+import com.contrarywind.adapter.WheelAdapter;
+
+import java.util.List;
+
+/**
+ * The simple Array wheel adapter
+ * @param <T> the element type
+ */
+public class ArrayWheelAdapter<T> implements WheelAdapter {
+	
+
+	// items
+	private List<T> items;
+
+	/**
+	 * Constructor
+	 * @param items the items
+	 */
+	public ArrayWheelAdapter(List<T> items) {
+		this.items = items;
+
+	}
+	
+	@Override
+	public Object getItem(int index) {
+		if (index >= 0 && index < items.size()) {
+			return items.get(index);
+		}
+		return "";
+	}
+
+	@Override
+	public int getItemsCount() {
+		return items.size();
+	}
+
+	@Override
+	public int indexOf(Object o){
+		return items.indexOf(o);
+	}
+
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java b/pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java
new file mode 100644
index 0000000..99a9721
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java
@@ -0,0 +1,47 @@
+package com.bigkoo.pickerview.adapter;
+
+
+import com.contrarywind.adapter.WheelAdapter;
+
+/**
+ * Numeric Wheel adapter.
+ */
+public class NumericWheelAdapter implements WheelAdapter {
+	
+	private int minValue;
+	private int maxValue;
+
+	/**
+	 * Constructor
+	 * @param minValue the wheel min value
+	 * @param maxValue the wheel max value
+	 */
+	public NumericWheelAdapter(int minValue, int maxValue) {
+		this.minValue = minValue;
+		this.maxValue = maxValue;
+	}
+
+	@Override
+	public Object getItem(int index) {
+		if (index >= 0 && index < getItemsCount()) {
+			int value = minValue + index;
+			return value;
+		}
+		return 0;
+	}
+
+	@Override
+	public int getItemsCount() {
+		return maxValue - minValue + 1;
+	}
+	
+	@Override
+	public int indexOf(Object o){
+		try {
+			return (int)o - minValue;
+		} catch (Exception e) {
+			return -1;
+		}
+
+	}
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java b/pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java
new file mode 100644
index 0000000..5176fd7
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java
@@ -0,0 +1,292 @@
+package com.bigkoo.pickerview.builder;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.contrarywind.view.WheelView;
+
+import androidx.annotation.ColorInt;
+
+/**
+ * Created by xiaosongzeem on 2018/3/20.
+ */
+
+public class OptionsPickerBuilder {
+
+    //閰嶇疆绫�
+    private PickerOptions mPickerOptions;
+
+
+    //Required
+    public OptionsPickerBuilder(Context context, OnOptionsSelectListener listener) {
+        mPickerOptions = new PickerOptions(PickerOptions.TYPE_PICKER_OPTIONS);
+        mPickerOptions.context = context;
+        mPickerOptions.optionsSelectListener = listener;
+    }
+
+    //Option
+    public OptionsPickerBuilder setSubmitText(String textContentConfirm) {
+        mPickerOptions.textContentConfirm = textContentConfirm;
+        return this;
+    }
+
+    public OptionsPickerBuilder setCancelText(String textContentCancel) {
+        mPickerOptions.textContentCancel = textContentCancel;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleText(String textContentTitle) {
+        mPickerOptions.textContentTitle = textContentTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder isDialog(boolean isDialog) {
+        mPickerOptions.isDialog = isDialog;
+        return this;
+    }
+
+    public OptionsPickerBuilder addOnCancelClickListener(View.OnClickListener cancelListener) {
+        mPickerOptions.cancelListener = cancelListener;
+        return this;
+    }
+
+
+    public OptionsPickerBuilder setSubmitColor(int textColorConfirm) {
+        mPickerOptions.textColorConfirm = textColorConfirm;
+        return this;
+    }
+
+    public OptionsPickerBuilder setCancelColor(int textColorCancel) {
+        mPickerOptions.textColorCancel = textColorCancel;
+        return this;
+    }
+
+
+    /**
+     * {@link #setOutSideColor} instead.
+     *
+     * @param backgroundId color resId.
+     */
+    @Deprecated
+    public OptionsPickerBuilder setBackgroundId(int backgroundId) {
+        mPickerOptions.outSideColor = backgroundId;
+        return this;
+    }
+
+    /**
+     * 鏄剧ず鏃剁殑澶栭儴鑳屾櫙鑹查鑹�,榛樿鏄伆鑹�
+     *
+     * @param outSideColor color resId.
+     * @return
+     */
+    public OptionsPickerBuilder setOutSideColor(int outSideColor) {
+        mPickerOptions.outSideColor = outSideColor;
+        return this;
+    }
+
+    /**
+     * ViewGroup 绫诲瀷
+     * 璁剧疆PickerView鐨勬樉绀哄鍣�
+     *
+     * @param decorView Parent View.
+     * @return
+     */
+    public OptionsPickerBuilder setDecorView(ViewGroup decorView) {
+        mPickerOptions.decorView = decorView;
+        return this;
+    }
+
+    public OptionsPickerBuilder setLayoutRes(int res, CustomListener listener) {
+        mPickerOptions.layoutRes = res;
+        mPickerOptions.customListener = listener;
+        return this;
+    }
+
+    public OptionsPickerBuilder setBgColor(int bgColorWheel) {
+        mPickerOptions.bgColorWheel = bgColorWheel;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleBgColor(int bgColorTitle) {
+        mPickerOptions.bgColorTitle = bgColorTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleColor(int textColorTitle) {
+        mPickerOptions.textColorTitle = textColorTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSubCalSize(int textSizeSubmitCancel) {
+        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleSize(int textSizeTitle) {
+        mPickerOptions.textSizeTitle = textSizeTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder setContentTextSize(int textSizeContent) {
+        mPickerOptions.textSizeContent = textSizeContent;
+        return this;
+    }
+
+    public OptionsPickerBuilder setOutSideCancelable(boolean cancelable) {
+        mPickerOptions.cancelable = cancelable;
+        return this;
+    }
+
+
+    public OptionsPickerBuilder setLabels(String label1, String label2, String label3) {
+        mPickerOptions.label1 = label1;
+        mPickerOptions.label2 = label2;
+        mPickerOptions.label3 = label3;
+        return this;
+    }
+
+    /**
+     * 璁剧疆Item 鐨勯棿璺濆�嶆暟锛岀敤浜庢帶鍒� Item 楂樺害闂撮殧
+     *
+     * @param lineSpacingMultiplier 娴偣鍨嬶紝1.0-4.0f 涔嬮棿鏈夋晥,瓒呰繃鍒欏彇鏋佸�笺��
+     */
+    public OptionsPickerBuilder setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier;
+        return this;
+    }
+
+    /**
+     * Set item divider line type color.
+     *
+     * @param dividerColor color resId.
+     */
+    public OptionsPickerBuilder setDividerColor(@ColorInt int dividerColor) {
+        mPickerOptions.dividerColor = dividerColor;
+        return this;
+    }
+
+    /**
+     * Set item divider line type.
+     *
+     * @param dividerType enum Type {@link WheelView.DividerType}
+     */
+    public OptionsPickerBuilder setDividerType(WheelView.DividerType dividerType) {
+        mPickerOptions.dividerType = dividerType;
+        return this;
+    }
+
+    /**
+     * Set the textColor of selected item.
+     *
+     * @param textColorCenter color res.
+     */
+    public OptionsPickerBuilder setTextColorCenter(int textColorCenter) {
+        mPickerOptions.textColorCenter = textColorCenter;
+        return this;
+    }
+
+    /**
+     * Set the textColor of outside item.
+     *
+     * @param textColorOut color resId.
+     */
+    public OptionsPickerBuilder setTextColorOut(@ColorInt int textColorOut) {
+        mPickerOptions.textColorOut = textColorOut;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTypeface(Typeface font) {
+        mPickerOptions.font = font;
+        return this;
+    }
+
+    public OptionsPickerBuilder setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {
+        mPickerOptions.cyclic1 = cyclic1;
+        mPickerOptions.cyclic2 = cyclic2;
+        mPickerOptions.cyclic3 = cyclic3;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSelectOptions(int option1) {
+        mPickerOptions.option1 = option1;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSelectOptions(int option1, int option2) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSelectOptions(int option1, int option2, int option3) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        mPickerOptions.option3 = option3;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTextXOffset(int xoffset_one, int xoffset_two, int xoffset_three) {
+        mPickerOptions.x_offset_one = xoffset_one;
+        mPickerOptions.x_offset_two = xoffset_two;
+        mPickerOptions.x_offset_three = xoffset_three;
+        return this;
+    }
+
+    public OptionsPickerBuilder isCenterLabel(boolean isCenterLabel) {
+        mPickerOptions.isCenterLabel = isCenterLabel;
+        return this;
+    }
+
+
+    /**
+     * 璁剧疆鏈�澶у彲瑙佹暟鐩�
+     *
+     * @param count 寤鸿璁剧疆涓� 3 ~ 9涔嬮棿銆�
+     */
+    public OptionsPickerBuilder setItemVisibleCount(int count) {
+        mPickerOptions.itemsVisibleCount = count;
+        return this;
+    }
+
+    /**
+     * 閫忔槑搴︽槸鍚︽笎鍙�
+     *
+     * @param isAlphaGradient true of false
+     */
+    public OptionsPickerBuilder isAlphaGradient(boolean isAlphaGradient) {
+        mPickerOptions.isAlphaGradient = isAlphaGradient;
+        return this;
+    }
+
+    /**
+     * 鍒囨崲閫夐」鏃讹紝鏄惁杩樺師绗竴椤�
+     *
+     * @param isRestoreItem true锛氳繕鍘燂紱 false: 淇濇寔涓婁竴涓�夐」
+     * @return TimePickerBuilder
+     */
+    public OptionsPickerBuilder isRestoreItem(boolean isRestoreItem) {
+        mPickerOptions.isRestoreItem = isRestoreItem;
+        return this;
+    }
+
+    /**
+     * @param listener 鍒囨崲item椤规粴鍔ㄥ仠姝㈡椂锛屽疄鏃跺洖璋冪洃鍚��
+     * @return
+     */
+    public OptionsPickerBuilder setOptionsSelectChangeListener(OnOptionsSelectChangeListener listener) {
+        mPickerOptions.optionsSelectChangeListener = listener;
+        return this;
+    }
+
+
+    public <T> OptionsPickerView<T> build() {
+        return new OptionsPickerView<>(mPickerOptions);
+    }
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java b/pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java
new file mode 100644
index 0000000..f001319
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java
@@ -0,0 +1,315 @@
+package com.bigkoo.pickerview.builder;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.contrarywind.view.WheelView;
+
+import java.util.Calendar;
+
+import androidx.annotation.ColorInt;
+
+/**
+ * Created by xiaosongzeem on 2018/3/20.
+ */
+
+public class TimePickerBuilder {
+
+    private PickerOptions mPickerOptions;
+
+    //Required
+    public TimePickerBuilder(Context context, OnTimeSelectListener listener) {
+        mPickerOptions = new PickerOptions(PickerOptions.TYPE_PICKER_TIME);
+        mPickerOptions.context = context;
+        mPickerOptions.timeSelectListener = listener;
+    }
+
+    //Option
+    public TimePickerBuilder setGravity(int gravity) {
+        mPickerOptions.textGravity = gravity;
+        return this;
+    }
+
+    public TimePickerBuilder addOnCancelClickListener(View.OnClickListener cancelListener) {
+        mPickerOptions.cancelListener = cancelListener;
+        return this;
+    }
+
+    /**
+     * new boolean[]{true, true, true, false, false, false}
+     * control the "year","month","day","hours","minutes","seconds " display or hide.
+     * 鍒嗗埆鎺у埗鈥滃勾鈥濃�滄湀鈥濃�滄棩鈥濃�滄椂鈥濃�滃垎鈥濃�滅鈥濈殑鏄剧ず鎴栭殣钘忋��
+     *
+     * @param type 甯冨皵鍨嬫暟缁勶紝闀垮害闇�瑕佽缃负6銆�
+     * @return TimePickerBuilder
+     */
+    public TimePickerBuilder setType(boolean[] type) {
+        mPickerOptions.type = type;
+        return this;
+    }
+
+    public TimePickerBuilder setSubmitText(String textContentConfirm) {
+        mPickerOptions.textContentConfirm = textContentConfirm;
+        return this;
+    }
+
+    public TimePickerBuilder isDialog(boolean isDialog) {
+        mPickerOptions.isDialog = isDialog;
+        return this;
+    }
+
+    public TimePickerBuilder setCancelText(String textContentCancel) {
+        mPickerOptions.textContentCancel = textContentCancel;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleText(String textContentTitle) {
+        mPickerOptions.textContentTitle = textContentTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setSubmitColor(int textColorConfirm) {
+        mPickerOptions.textColorConfirm = textColorConfirm;
+        return this;
+    }
+
+    public TimePickerBuilder setCancelColor(int textColorCancel) {
+        mPickerOptions.textColorCancel = textColorCancel;
+        return this;
+    }
+
+    /**
+     * ViewGroup 绫诲瀷鐨勫鍣�
+     *
+     * @param decorView 閫夋嫨鍣ㄤ細琚坊鍔犲埌姝ゅ鍣ㄤ腑
+     * @return TimePickerBuilder
+     */
+    public TimePickerBuilder setDecorView(ViewGroup decorView) {
+        mPickerOptions.decorView = decorView;
+        return this;
+    }
+
+    public TimePickerBuilder setBgColor(int bgColorWheel) {
+        mPickerOptions.bgColorWheel = bgColorWheel;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleBgColor(int bgColorTitle) {
+        mPickerOptions.bgColorTitle = bgColorTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleColor(int textColorTitle) {
+        mPickerOptions.textColorTitle = textColorTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setSubCalSize(int textSizeSubmitCancel) {
+        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleSize(int textSizeTitle) {
+        mPickerOptions.textSizeTitle = textSizeTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setContentTextSize(int textSizeContent) {
+        mPickerOptions.textSizeContent = textSizeContent;
+        return this;
+    }
+
+    /**
+     * 璁剧疆鏈�澶у彲瑙佹暟鐩�
+     *
+     * @param count suggest value: 3, 5, 7, 9
+     */
+    public TimePickerBuilder setItemVisibleCount(int count) {
+        mPickerOptions.itemsVisibleCount = count;
+        return this;
+    }
+
+    /**
+     * 閫忔槑搴︽槸鍚︽笎鍙�
+     *
+     * @param isAlphaGradient true of false
+     */
+    public TimePickerBuilder isAlphaGradient(boolean isAlphaGradient) {
+        mPickerOptions.isAlphaGradient = isAlphaGradient;
+        return this;
+    }
+
+    /**
+     * 鍥犱负绯荤粺Calendar鐨勬湀浠芥槸浠�0-11鐨�,鎵�浠ュ鏋滄槸璋冪敤Calendar鐨剆et鏂规硶鏉ヨ缃椂闂�,鏈堜唤鐨勮寖鍥翠篃瑕佹槸浠�0-11
+     *
+     * @param date
+     * @return TimePickerBuilder
+     */
+    public TimePickerBuilder setDate(Calendar date) {
+        mPickerOptions.date = date;
+        return this;
+    }
+
+    public TimePickerBuilder setLayoutRes(int res, CustomListener customListener) {
+        mPickerOptions.layoutRes = res;
+        mPickerOptions.customListener = customListener;
+        return this;
+    }
+
+
+    /**
+     * 璁剧疆璧峰鏃堕棿
+     * 鍥犱负绯荤粺Calendar鐨勬湀浠芥槸浠�0-11鐨�,鎵�浠ュ鏋滄槸璋冪敤Calendar鐨剆et鏂规硶鏉ヨ缃椂闂�,鏈堜唤鐨勮寖鍥翠篃瑕佹槸浠�0-11
+     */
+
+    public TimePickerBuilder setRangDate(Calendar startDate, Calendar endDate) {
+        mPickerOptions.startDate = startDate;
+        mPickerOptions.endDate = endDate;
+        return this;
+    }
+
+
+    /**
+     * 璁剧疆闂磋窛鍊嶆暟,浣嗘槸鍙兘鍦�1.0-4.0f涔嬮棿
+     *
+     * @param lineSpacingMultiplier
+     */
+    public TimePickerBuilder setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier;
+        return this;
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾跨殑棰滆壊
+     *
+     * @param dividerColor
+     */
+
+    public TimePickerBuilder setDividerColor(@ColorInt int dividerColor) {
+        mPickerOptions.dividerColor = dividerColor;
+        return this;
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾跨殑绫诲瀷
+     *
+     * @param dividerType
+     */
+    public TimePickerBuilder setDividerType(WheelView.DividerType dividerType) {
+        mPickerOptions.dividerType = dividerType;
+        return this;
+    }
+
+    /**
+     * {@link #setOutSideColor} instead.
+     *
+     * @param backgroundId color resId.
+     */
+    @Deprecated
+    public TimePickerBuilder setBackgroundId(int backgroundId) {
+        mPickerOptions.outSideColor = backgroundId;
+        return this;
+    }
+
+    /**
+     * 鏄剧ず鏃剁殑澶栭儴鑳屾櫙鑹查鑹�,榛樿鏄伆鑹�
+     *
+     * @param outSideColor
+     */
+    public TimePickerBuilder setOutSideColor(@ColorInt int outSideColor) {
+        mPickerOptions.outSideColor = outSideColor;
+        return this;
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾夸箣闂寸殑鏂囧瓧鐨勯鑹�
+     *
+     * @param textColorCenter
+     */
+    public TimePickerBuilder setTextColorCenter(@ColorInt int textColorCenter) {
+        mPickerOptions.textColorCenter = textColorCenter;
+        return this;
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾夸互澶栨枃瀛楃殑棰滆壊
+     *
+     * @param textColorOut
+     */
+    public TimePickerBuilder setTextColorOut(@ColorInt int textColorOut) {
+        mPickerOptions.textColorOut = textColorOut;
+        return this;
+    }
+
+    public TimePickerBuilder isCyclic(boolean cyclic) {
+        mPickerOptions.cyclic = cyclic;
+        return this;
+    }
+
+    public TimePickerBuilder setOutSideCancelable(boolean cancelable) {
+        mPickerOptions.cancelable = cancelable;
+        return this;
+    }
+
+    public TimePickerBuilder setLunarCalendar(boolean lunarCalendar) {
+        mPickerOptions.isLunarCalendar = lunarCalendar;
+        return this;
+    }
+
+
+    public TimePickerBuilder setLabel(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {
+        mPickerOptions.label_year = label_year;
+        mPickerOptions.label_month = label_month;
+        mPickerOptions.label_day = label_day;
+        mPickerOptions.label_hours = label_hours;
+        mPickerOptions.label_minutes = label_mins;
+        mPickerOptions.label_seconds = label_seconds;
+        return this;
+    }
+
+    /**
+     * 璁剧疆X杞村�炬枩瑙掑害[ -90 , 90掳]
+     *
+     * @param x_offset_year    骞�
+     * @param x_offset_month   鏈�
+     * @param x_offset_day     鏃�
+     * @param x_offset_hours   鏃�
+     * @param x_offset_minutes 鍒�
+     * @param x_offset_seconds 绉�
+     * @return
+     */
+    public TimePickerBuilder setTextXOffset(int x_offset_year, int x_offset_month, int x_offset_day,
+                                            int x_offset_hours, int x_offset_minutes, int x_offset_seconds) {
+        mPickerOptions.x_offset_year = x_offset_year;
+        mPickerOptions.x_offset_month = x_offset_month;
+        mPickerOptions.x_offset_day = x_offset_day;
+        mPickerOptions.x_offset_hours = x_offset_hours;
+        mPickerOptions.x_offset_minutes = x_offset_minutes;
+        mPickerOptions.x_offset_seconds = x_offset_seconds;
+        return this;
+    }
+
+    public TimePickerBuilder isCenterLabel(boolean isCenterLabel) {
+        mPickerOptions.isCenterLabel = isCenterLabel;
+        return this;
+    }
+
+    /**
+     * @param listener 鍒囨崲item椤规粴鍔ㄥ仠姝㈡椂锛屽疄鏃跺洖璋冪洃鍚��
+     * @return
+     */
+    public TimePickerBuilder setTimeSelectChangeListener(OnTimeSelectChangeListener listener) {
+        mPickerOptions.timeSelectChangeListener = listener;
+        return this;
+    }
+
+    public TimePickerView build() {
+        return new TimePickerView(mPickerOptions);
+    }
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java b/pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java
new file mode 100644
index 0000000..5a4d688
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java
@@ -0,0 +1,114 @@
+package com.bigkoo.pickerview.configure;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectListener;
+import com.contrarywind.view.WheelView;
+
+import java.util.Calendar;
+
+/**
+ * Build Options
+ * Created by xiaosongzeem on 2018/3/8.
+ */
+
+public class PickerOptions {
+
+    //constant
+    private static final int PICKER_VIEW_BTN_COLOR_NORMAL = 0xFF057dff;
+    private static final int PICKER_VIEW_BG_COLOR_TITLE = 0xFFf5f5f5;
+    private static final int PICKER_VIEW_COLOR_TITLE = 0xFF000000;
+    private static final int PICKER_VIEW_BG_COLOR_DEFAULT = 0xFFFFFFFF;
+
+    public static final int TYPE_PICKER_OPTIONS = 1;
+    public static final int TYPE_PICKER_TIME = 2;
+
+    public OnOptionsSelectListener optionsSelectListener;
+    public OnTimeSelectListener timeSelectListener;
+    public View.OnClickListener cancelListener;
+
+    public OnTimeSelectChangeListener timeSelectChangeListener;
+    public OnOptionsSelectChangeListener optionsSelectChangeListener;
+    public CustomListener customListener;
+
+    //options picker
+    public String label1, label2, label3;//鍗曚綅瀛楃
+    public int option1, option2, option3;//榛樿閫変腑椤�
+    public int x_offset_one, x_offset_two, x_offset_three;//x杞村亸绉婚噺
+
+    public boolean cyclic1 = false;//鏄惁寰幆锛岄粯璁ゅ惁
+    public boolean cyclic2 = false;
+    public boolean cyclic3 = false;
+
+    public boolean isRestoreItem = false; //鍒囨崲鏃讹紝杩樺師绗竴椤�
+
+
+    //time picker
+    public boolean[] type = new boolean[]{true, true, true, false, false, false};//鏄剧ず绫诲瀷锛岄粯璁ゆ樉绀猴細 骞存湀鏃�
+
+    public Calendar date;//褰撳墠閫変腑鏃堕棿
+    public Calendar startDate;//寮�濮嬫椂闂�
+    public Calendar endDate;//缁堟鏃堕棿
+    public int startYear;//寮�濮嬪勾浠�
+    public int endYear;//缁撳熬骞翠唤
+
+    public boolean cyclic = false;//鏄惁寰幆
+    public boolean isLunarCalendar = false;//鏄惁鏄剧ず鍐滃巻
+
+    public String label_year, label_month, label_day, label_hours, label_minutes, label_seconds;//鍗曚綅
+    public int x_offset_year, x_offset_month, x_offset_day, x_offset_hours, x_offset_minutes, x_offset_seconds;//鍗曚綅
+
+
+    public PickerOptions(int buildType) {
+        if (buildType == TYPE_PICKER_OPTIONS) {
+            layoutRes = R.layout.pickerview_options;
+        } else {
+            layoutRes = R.layout.pickerview_time;
+        }
+    }
+
+    //******* general field ******//
+    public int layoutRes;
+    public ViewGroup decorView;
+    public int textGravity = Gravity.CENTER;
+    public Context context;
+
+    public String textContentConfirm;//纭畾鎸夐挳鏂囧瓧
+    public String textContentCancel;//鍙栨秷鎸夐挳鏂囧瓧
+    public String textContentTitle;//鏍囬鏂囧瓧
+
+    public int textColorConfirm = PICKER_VIEW_BTN_COLOR_NORMAL;//纭畾鎸夐挳棰滆壊
+    public int textColorCancel = PICKER_VIEW_BTN_COLOR_NORMAL;//鍙栨秷鎸夐挳棰滆壊
+    public int textColorTitle = PICKER_VIEW_COLOR_TITLE;//鏍囬棰滆壊
+
+    public int bgColorWheel = PICKER_VIEW_BG_COLOR_DEFAULT;//婊氳疆鑳屾櫙棰滆壊
+    public int bgColorTitle = PICKER_VIEW_BG_COLOR_DEFAULT;//鏍囬鑳屾櫙棰滆壊
+
+    public int textSizeSubmitCancel = 17;//纭畾鍙栨秷鎸夐挳澶у皬
+    public int textSizeTitle = 18;//鏍囬鏂囧瓧澶у皬
+    public int textSizeContent = 18;//鍐呭鏂囧瓧澶у皬
+
+    public int textColorOut = 0xFFa8a8a8; //鍒嗗壊绾夸互澶栫殑鏂囧瓧棰滆壊
+    public int textColorCenter = 0xFF2a2a2a; //鍒嗗壊绾夸箣闂寸殑鏂囧瓧棰滆壊
+    public int dividerColor = 0xFFd5d5d5; //鍒嗗壊绾跨殑棰滆壊
+    public int outSideColor = -1; //鏄剧ず鏃剁殑澶栭儴鑳屾櫙鑹查鑹�,榛樿鏄伆鑹�
+
+    public float lineSpacingMultiplier = 1.6f; // 鏉$洰闂磋窛鍊嶆暟 榛樿1.6
+    public boolean isDialog;//鏄惁鏄璇濇妯″紡
+
+    public boolean cancelable = true;//鏄惁鑳藉彇娑�
+    public boolean isCenterLabel = false;//鏄惁鍙樉绀轰腑闂寸殑label,榛樿姣忎釜item閮芥樉绀�
+    public Typeface font = Typeface.MONOSPACE;//瀛椾綋鏍峰紡
+    public WheelView.DividerType dividerType = WheelView.DividerType.FILL;//鍒嗛殧绾跨被鍨�
+    public int itemsVisibleCount = 9; //鏈�澶у彲瑙佹潯鐩暟
+    public boolean isAlphaGradient = false; //閫忔槑搴︽笎鍙�
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java b/pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java
new file mode 100644
index 0000000..26cfef1
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java
@@ -0,0 +1,13 @@
+package com.bigkoo.pickerview.listener;
+
+import android.view.View;
+
+/**
+ * Created by KyuYi on 2017/3/2.
+ * E-Mail:kyu_yi@sina.com
+ * 鍔熻兘锛�
+ */
+
+public interface CustomListener {
+    void customLayout(View v);
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/listener/ISelectTimeCallback.java b/pickerview/src/main/java/com/bigkoo/pickerview/listener/ISelectTimeCallback.java
new file mode 100644
index 0000000..775a114
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/listener/ISelectTimeCallback.java
@@ -0,0 +1,10 @@
+package com.bigkoo.pickerview.listener;
+
+/**
+ * Created by zengsong on 2018/3/21.
+ */
+
+public interface ISelectTimeCallback {
+
+    public void onTimeSelectChanged();
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java
new file mode 100644
index 0000000..d3aec7e
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java
@@ -0,0 +1,8 @@
+package com.bigkoo.pickerview.listener;
+
+/**
+ * Created by Sai on 15/8/9.
+ */
+public interface OnDismissListener {
+    public void onDismiss(Object o);
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java
new file mode 100644
index 0000000..f01e774
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java
@@ -0,0 +1,11 @@
+package com.bigkoo.pickerview.listener;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnOptionsSelectChangeListener {
+
+    void onOptionsSelectChanged(int options1, int options2, int options3);
+
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java
new file mode 100644
index 0000000..34b6aab
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java
@@ -0,0 +1,13 @@
+package com.bigkoo.pickerview.listener;
+
+import android.view.View;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnOptionsSelectListener {
+
+    void onOptionsSelect(int options1, int options2, int options3, View v);
+
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectChangeListener.java b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectChangeListener.java
new file mode 100644
index 0000000..40109f2
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectChangeListener.java
@@ -0,0 +1,12 @@
+package com.bigkoo.pickerview.listener;
+
+import java.util.Date;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnTimeSelectChangeListener {
+
+    void onTimeSelectChanged(Date date);
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectListener.java b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectListener.java
new file mode 100644
index 0000000..ab85075
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectListener.java
@@ -0,0 +1,14 @@
+package com.bigkoo.pickerview.listener;
+
+import android.view.View;
+
+import java.util.Date;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnTimeSelectListener {
+
+    void onTimeSelect(Date date, View v);
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/utils/ChinaDate.java b/pickerview/src/main/java/com/bigkoo/pickerview/utils/ChinaDate.java
new file mode 100644
index 0000000..74920c0
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/utils/ChinaDate.java
@@ -0,0 +1,352 @@
+package com.bigkoo.pickerview.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Locale;
+
+public class ChinaDate {
+
+    /**
+     * <lunarInfo 鏁扮粍鍊肩殑璁$畻鍘熺悊>
+     *
+     * 0x浠h〃鍗佸叚杩涘埗锛屽悗闈㈢殑浜斾綅鏁版槸鍗佸叚杩涘埗鏁般��
+     * 涓句釜渚嬪瓙: 1980骞寸殑鏁版嵁鏄� 0x095b0
+     * 浜岃繘鍒�:  0000 1001 0101 1011 0000
+     * 1-4:   琛ㄧず褰撳勾鏄惁涓洪棸骞达紝鏄殑璇濅负1锛屽惁鍒欎负0銆�
+     * 5-16: 涓洪櫎浜嗛棸鏈堝鐨勬甯告湀浠芥槸澶ф湀杩樻槸灏忔湀锛�1涓�30澶╋紝0涓�29澶┿��
+     * 娉ㄦ剰:  浠�1鏈堝埌12鏈堝搴旂殑鏄16浣嶅埌绗�5浣嶃��
+     * 17-20: 闈為棸骞翠负0锛屽ぇ浜�0琛ㄧず闂版湀鏈堜唤锛屼粎褰撳瓨鍦ㄩ棸鏈堢殑鎯呭喌涓嬫湁鎰忎箟銆�
+     */
+    final private static long[] lunarInfo = new long[]{
+            0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909
+            0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919
+            0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929
+            0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939
+            0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949
+            0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959
+            0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969
+            0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979
+            0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989
+            0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999
+            0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009
+            0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019
+            0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029
+            0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039
+            0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049
+            0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059
+            0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069
+            0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079
+            0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089
+            0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099
+            0x0d520};//2100
+
+    private final static String[] nStr1 = new String[]{"", "姝�", "浜�", "涓�", "鍥�",
+            "浜�", "鍏�", "涓�", "鍏�", "涔�", "鍗�", "鍐�", "鑵�"};
+    private final static String[] Gan = new String[]{"鐢�", "涔�", "涓�", "涓�", "鎴�",
+            "宸�", "搴�", "杈�", "澹�", "鐧�"};
+    private final static String[] Zhi = new String[]{"瀛�", "涓�", "瀵�", "鍗�", "杈�",
+            "宸�", "鍗�", "鏈�", "鐢�", "閰�", "鎴�", "浜�"};
+    private final static String[] Animals = new String[]{"榧�", "鐗�", "铏�", "鍏�",
+            "榫�", "铔�", "椹�", "缇�", "鐚�", "楦�", "鐙�", "鐚�"};
+
+    /**
+     * 浼犲洖鍐滃巻
+     *
+     * @param y 骞寸殑鎬诲ぉ鏁�
+     * @return 鍐滃巻
+     */
+    final private static int lYearDays(int y) {
+        int i, sum = 348;
+        for (i = 0x8000; i > 0x8; i >>= 1) {
+            if ((lunarInfo[y - 1900] & i) != 0)
+                sum += 1;
+        }
+        return (sum + leapDays(y));
+    }
+
+    /**
+     * 浼犲洖鍐滃巻
+     *
+     * @param y 骞撮棸鏈堢殑澶╂暟
+     * @return 鍐滃巻
+     */
+    final public static int leapDays(int y) {
+        if (leapMonth(y) != 0) {
+            if ((lunarInfo[y - 1900] & 0x10000) != 0)
+                return 30;
+            else
+                return 29;
+        } else
+            return 0;
+    }
+
+    /**
+     * 浼犲洖鍐滃巻
+     *
+     * @param y 骞撮棸鍝釜鏈� 1-12 , 娌¢棸浼犲洖 0
+     * @return 鍐滃巻
+     */
+    final public static int leapMonth(int y) {
+        return (int) (lunarInfo[y - 1900] & 0xf);
+    }
+
+    /**
+     * 浼犲洖鍐滃巻 y
+     *
+     * @param y y骞磎鏈堢殑鎬诲ぉ鏁�
+     * @param m y骞磎鏈堢殑鎬诲ぉ鏁�
+     * @return 鍐滃巻
+     */
+    final public static int monthDays(int y, int m) {
+        if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
+            return 29;
+        else
+            return 30;
+    }
+
+    /**
+     * 浼犲洖鍐滃巻
+     *
+     * @param y 骞寸殑鐢熻倴
+     * @return
+     */
+    final public static String AnimalsYear(int y) {
+        return Animals[(y - 4) % 12];
+    }
+
+    /**
+     * 浼犲叆
+     *
+     * @param num 鏈堟棩鐨刼ffset 浼犲洖骞叉敮,0鏄敳瀛�
+     * @return 骞叉敮
+     */
+    final private static String cyclicalm(int num) {
+        return (Gan[num % 10] + Zhi[num % 12]);
+    }
+
+    /**
+     * 浼犲叆 offset 浼犲洖骞叉敮
+     *
+     * @param y 0鏄敳瀛�
+     * @return 骞叉敮
+     */
+    final public static String cyclical(int y) {
+        int num = y - 1900 + 36;
+        return (cyclicalm(num));
+    }
+
+
+    /**
+     * 浼犲嚭y骞磎鏈坉鏃ュ搴旂殑鍐滃巻.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
+     *
+     * @param y 骞�
+     * @param m 鏈�
+     * @param d 鏃�
+     * @return y骞磎鏈坉鏃ュ搴旂殑鍐滃巻
+     */
+    final public static long[] calElement(int y, int m, int d) {
+        long[] nongDate = new long[7];
+        int i = 0, temp = 0, leap = 0;
+        Date baseDate = new GregorianCalendar(0 + 1900, 0, 31).getTime();
+        Date objDate = new GregorianCalendar(y, m - 1, d).getTime();
+        long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;
+        nongDate[5] = offset + 40;
+        nongDate[4] = 14;
+        for (i = 1900; i < 2100 && offset > 0; i++) {
+            temp = lYearDays(i);
+            offset -= temp;
+            nongDate[4] += 12;
+        }
+        if (offset < 0) {
+            offset += temp;
+            i--;
+            nongDate[4] -= 12;
+        }
+        nongDate[0] = i;
+        nongDate[3] = i - 1864;
+        leap = leapMonth(i); // 闂板摢涓湀
+        nongDate[6] = 0;
+        for (i = 1; i < 13 && offset > 0; i++) {
+            // 闂版湀
+            if (leap > 0 && i == (leap + 1) && nongDate[6] == 0) {
+                --i;
+                nongDate[6] = 1;
+                temp = leapDays((int) nongDate[0]);
+            } else {
+                temp = monthDays((int) nongDate[0], i);
+            }
+            // 瑙i櫎闂版湀
+            if (nongDate[6] == 1 && i == (leap + 1))
+                nongDate[6] = 0;
+            offset -= temp;
+            if (nongDate[6] == 0)
+                nongDate[4]++;
+        }
+        if (offset == 0 && leap > 0 && i == leap + 1) {
+            if (nongDate[6] == 1) {
+                nongDate[6] = 0;
+            } else {
+                nongDate[6] = 1;
+                --i;
+                --nongDate[4];
+            }
+        }
+        if (offset < 0) {
+            offset += temp;
+            --i;
+            --nongDate[4];
+        }
+        nongDate[1] = i;
+        nongDate[2] = offset + 1;
+        return nongDate;
+    }
+
+    public final static String getChinaDate(int day) {
+        String a = "";
+        if (day == 10)
+            return "鍒濆崄";
+        if (day == 20)
+            return "浜屽崄";
+        if (day == 30)
+            return "涓夊崄";
+        int two = (int) ((day) / 10);
+        if (two == 0)
+            a = "鍒�";
+        if (two == 1)
+            a = "鍗�";
+        if (two == 2)
+            a = "寤�";
+        if (two == 3)
+            a = "涓�";
+        int one = (int) (day % 10);
+        switch (one) {
+            case 1:
+                a += "涓�";
+                break;
+            case 2:
+                a += "浜�";
+                break;
+            case 3:
+                a += "涓�";
+                break;
+            case 4:
+                a += "鍥�";
+                break;
+            case 5:
+                a += "浜�";
+                break;
+            case 6:
+                a += "鍏�";
+                break;
+            case 7:
+                a += "涓�";
+                break;
+            case 8:
+                a += "鍏�";
+                break;
+            case 9:
+                a += "涔�";
+                break;
+        }
+        return a;
+    }
+
+    public static String getCurrentLunarDate() {
+        Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);
+        int year = today.get(Calendar.YEAR);
+        int month = today.get(Calendar.MONTH) + 1;
+        int date = today.get(Calendar.DATE);
+        long[] l = calElement(year, month, date);
+        StringBuffer sToday = new StringBuffer();
+        try {
+            sToday.append(sdf.format(today.getTime()));
+            sToday.append(" 鍐滃巻");
+            sToday.append(cyclical(year));
+            sToday.append('(');
+            sToday.append(AnimalsYear(year));
+            sToday.append(")骞�");
+            sToday.append(nStr1[(int) l[1]]);
+            sToday.append("鏈�");
+            sToday.append(getChinaDate((int) (l[2])));
+            return sToday.toString();
+        } finally {
+            sToday = null;
+        }
+    }
+
+    public static String oneDay(int year, int month, int day) {
+        //   Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);
+        long[] l = calElement(year, month, day);
+        StringBuffer sToday = new StringBuffer();
+        try {
+            //   sToday.append(sdf.format(today.getTime()));
+            sToday.append(" 鍐滃巻");
+            sToday.append(cyclical(year));
+            sToday.append('(');
+            sToday.append(AnimalsYear(year));
+            sToday.append(")骞�");
+            sToday.append(nStr1[(int) l[1]]);
+            sToday.append("鏈�");
+            sToday.append(getChinaDate((int) (l[2])));
+            return sToday.toString();
+        } finally {
+            sToday = null;
+        }
+    }
+
+    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy骞碝鏈坉鏃� EEEEE");
+
+
+    /**
+     * @param lunarYear 鍐滃巻骞翠唤
+     * @return String of Ganzhi: 鐢插瓙骞�
+     * 鐢蹭箼涓欎竵鎴婂繁搴氳緵澹櫢
+     * 瀛愪笐瀵呭嵂杈板烦鏃犱负鐢抽厜鎴屼亥
+     */
+    public static String getLunarYearText(int lunarYear) {
+        return Gan[(lunarYear - 4) % 10] + Zhi[(lunarYear - 4) % 12] + "骞�";
+    }
+
+
+    public static ArrayList<String> getYears(int startYear, int endYear) {
+        ArrayList<String> years = new ArrayList<>();
+        for (int i = startYear; i < endYear; i++) {
+            years.add(String.format("%s(%d)", getLunarYearText(i), i));
+        }
+        return years;
+    }
+
+    /**
+     * 鑾峰彇year骞寸殑鎵�鏈夋湀浠�
+     *
+     * @param year 骞�
+     * @return 鏈堜唤鍒楄〃
+     */
+    public static ArrayList<String> getMonths(int year) {
+        ArrayList<String> baseMonths = new ArrayList<>();
+        for (int i = 1; i < nStr1.length; i++) {
+            baseMonths.add(nStr1[i] + "鏈�");
+        }
+        if (leapMonth(year) != 0) {
+            baseMonths.add(leapMonth(year), "闂�" + nStr1[leapMonth(year)] + "鏈�");
+        }
+        return baseMonths;
+    }
+
+    /**
+     * 鑾峰彇姣忔湀鍐滃巻鏄剧ず鍚嶇О
+     *
+     * @param maxDay 澶�
+     * @return 鍚嶇О鍒楄〃
+     */
+    public static ArrayList<String> getLunarDays(int maxDay) {
+        ArrayList<String> days = new ArrayList<>();
+        for (int i = 1; i <= maxDay; i++) {
+            days.add(getChinaDate(i));
+        }
+        return days;
+    }
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/utils/LunarCalendar.java b/pickerview/src/main/java/com/bigkoo/pickerview/utils/LunarCalendar.java
new file mode 100644
index 0000000..7986c0d
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/utils/LunarCalendar.java
@@ -0,0 +1,429 @@
+package com.bigkoo.pickerview.utils;
+
+import android.util.Log;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * author: Jerry on 2016/7/11 11:29.
+ * description:宸ュ叿绫伙紝瀹炵幇鍏啘鍘嗕簰杞�
+ */
+public class LunarCalendar {
+
+    /**
+     * 鏀寔杞崲鐨勬渶灏忓啘鍘嗗勾浠�
+     */
+    public static final int MIN_YEAR = 1900;
+    /**
+     * 鏀寔杞崲鐨勬渶澶у啘鍘嗗勾浠�
+     */
+    public static final int MAX_YEAR = 2099;
+
+    /**
+     * 鍏巻姣忔湀鍓嶇殑澶╂暟
+     */
+    private static final int DAYS_BEFORE_MONTH[] = {0, 31, 59, 90, 120, 151, 181,
+            212, 243, 273, 304, 334, 365};
+
+    /**
+     * 鐢ㄦ潵琛ㄧず1900骞村埌2099骞撮棿鍐滃巻骞翠唤鐨勭浉鍏充俊鎭紝鍏�24浣峛it鐨�16杩涘埗琛ㄧず锛屽叾涓細
+     * 1. 鍓�4浣嶈〃绀鸿骞撮棸鍝釜鏈堬紱
+     * 2. 5-17浣嶈〃绀哄啘鍘嗗勾浠�13涓湀鐨勫ぇ灏忔湀鍒嗗竷锛�0琛ㄧず灏忥紝1琛ㄧず澶э紱
+     * 3. 鏈�鍚�7浣嶈〃绀哄啘鍘嗗勾棣栵紙姝f湀鍒濅竴锛夊搴旂殑鍏巻鏃ユ湡銆�
+     * <p>
+     * 浠�2014骞寸殑鏁版嵁0x955ABF涓轰緥璇存槑锛�
+     * 1001 0101 0101 1010 1011 1111
+     * 闂颁節鏈�  鍐滃巻姝f湀鍒濅竴瀵瑰簲鍏巻1鏈�31鍙�
+     */
+    private static final int LUNAR_INFO[] = {
+            0x84B6BF,/*1900*/
+            0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A,/*1901-1910*/
+            0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754,/*1911-1920*/
+            0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E,/*1921-1930*/
+            0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48,/*1931-1940*/
+            0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51,/*1941-1950*/
+            0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C,/*1951-1960*/
+            0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46,/*1961-1970*/
+            0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50,/*1971-1980*/
+            0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x095746, 0x5497BB,/*1981-1990*/
+            0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645,/*1991-2000*/
+            0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E,/*2001-2010*/
+            0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9,/*2011-2020*/
+            0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x6a573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43,/*2021-2030*/
+            0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C,/*2031-2040*/
+            0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37,/*2041-2050*/
+            0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06AA44, 0x4AB638, 0x0AAE4C, 0x092E42,/*2051-2060*/
+            0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B,/*2061-2070*/
+            0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6,/*2071-2080*/
+            0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E,/*2081-2090*/
+            0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5          /*2091-2099*/
+    };
+    private static int[] solar_1_1 = {1887, 0xec04c, 0xec23f, 0xec435, 0xec649,
+            0xec83e, 0xeca51, 0xecc46, 0xece3a, 0xed04d, 0xed242, 0xed436,
+            0xed64a, 0xed83f, 0xeda53, 0xedc48, 0xede3d, 0xee050, 0xee244,
+            0xee439, 0xee64d, 0xee842, 0xeea36, 0xeec4a, 0xeee3e, 0xef052,
+            0xef246, 0xef43a, 0xef64e, 0xef843, 0xefa37, 0xefc4b, 0xefe41,
+            0xf0054, 0xf0248, 0xf043c, 0xf0650, 0xf0845, 0xf0a38, 0xf0c4d,
+            0xf0e42, 0xf1037, 0xf124a, 0xf143e, 0xf1651, 0xf1846, 0xf1a3a,
+            0xf1c4e, 0xf1e44, 0xf2038, 0xf224b, 0xf243f, 0xf2653, 0xf2848,
+            0xf2a3b, 0xf2c4f, 0xf2e45, 0xf3039, 0xf324d, 0xf3442, 0xf3636,
+            0xf384a, 0xf3a3d, 0xf3c51, 0xf3e46, 0xf403b, 0xf424e, 0xf4443,
+            0xf4638, 0xf484c, 0xf4a3f, 0xf4c52, 0xf4e48, 0xf503c, 0xf524f,
+            0xf5445, 0xf5639, 0xf584d, 0xf5a42, 0xf5c35, 0xf5e49, 0xf603e,
+            0xf6251, 0xf6446, 0xf663b, 0xf684f, 0xf6a43, 0xf6c37, 0xf6e4b,
+            0xf703f, 0xf7252, 0xf7447, 0xf763c, 0xf7850, 0xf7a45, 0xf7c39,
+            0xf7e4d, 0xf8042, 0xf8254, 0xf8449, 0xf863d, 0xf8851, 0xf8a46,
+            0xf8c3b, 0xf8e4f, 0xf9044, 0xf9237, 0xf944a, 0xf963f, 0xf9853,
+            0xf9a47, 0xf9c3c, 0xf9e50, 0xfa045, 0xfa238, 0xfa44c, 0xfa641,
+            0xfa836, 0xfaa49, 0xfac3d, 0xfae52, 0xfb047, 0xfb23a, 0xfb44e,
+            0xfb643, 0xfb837, 0xfba4a, 0xfbc3f, 0xfbe53, 0xfc048, 0xfc23c,
+            0xfc450, 0xfc645, 0xfc839, 0xfca4c, 0xfcc41, 0xfce36, 0xfd04a,
+            0xfd23d, 0xfd451, 0xfd646, 0xfd83a, 0xfda4d, 0xfdc43, 0xfde37,
+            0xfe04b, 0xfe23f, 0xfe453, 0xfe648, 0xfe83c, 0xfea4f, 0xfec44,
+            0xfee38, 0xff04c, 0xff241, 0xff436, 0xff64a, 0xff83e, 0xffa51,
+            0xffc46, 0xffe3a, 0x10004e, 0x100242, 0x100437, 0x10064b, 0x100841,
+            0x100a53, 0x100c48, 0x100e3c, 0x10104f, 0x101244, 0x101438,
+            0x10164c, 0x101842, 0x101a35, 0x101c49, 0x101e3d, 0x102051,
+            0x102245, 0x10243a, 0x10264e, 0x102843, 0x102a37, 0x102c4b,
+            0x102e3f, 0x103053, 0x103247, 0x10343b, 0x10364f, 0x103845,
+            0x103a38, 0x103c4c, 0x103e42, 0x104036, 0x104249, 0x10443d,
+            0x104651, 0x104846, 0x104a3a, 0x104c4e, 0x104e43, 0x105038,
+            0x10524a, 0x10543e, 0x105652, 0x105847, 0x105a3b, 0x105c4f,
+            0x105e45, 0x106039, 0x10624c, 0x106441, 0x106635, 0x106849,
+            0x106a3d, 0x106c51, 0x106e47, 0x10703c, 0x10724f, 0x107444,
+            0x107638, 0x10784c, 0x107a3f, 0x107c53, 0x107e48};
+    private static int[] lunar_month_days = {1887, 0x1694, 0x16aa, 0x4ad5,
+            0xab6, 0xc4b7, 0x4ae, 0xa56, 0xb52a, 0x1d2a, 0xd54, 0x75aa, 0x156a,
+            0x1096d, 0x95c, 0x14ae, 0xaa4d, 0x1a4c, 0x1b2a, 0x8d55, 0xad4,
+            0x135a, 0x495d, 0x95c, 0xd49b, 0x149a, 0x1a4a, 0xbaa5, 0x16a8,
+            0x1ad4, 0x52da, 0x12b6, 0xe937, 0x92e, 0x1496, 0xb64b, 0xd4a,
+            0xda8, 0x95b5, 0x56c, 0x12ae, 0x492f, 0x92e, 0xcc96, 0x1a94,
+            0x1d4a, 0xada9, 0xb5a, 0x56c, 0x726e, 0x125c, 0xf92d, 0x192a,
+            0x1a94, 0xdb4a, 0x16aa, 0xad4, 0x955b, 0x4ba, 0x125a, 0x592b,
+            0x152a, 0xf695, 0xd94, 0x16aa, 0xaab5, 0x9b4, 0x14b6, 0x6a57,
+            0xa56, 0x1152a, 0x1d2a, 0xd54, 0xd5aa, 0x156a, 0x96c, 0x94ae,
+            0x14ae, 0xa4c, 0x7d26, 0x1b2a, 0xeb55, 0xad4, 0x12da, 0xa95d,
+            0x95a, 0x149a, 0x9a4d, 0x1a4a, 0x11aa5, 0x16a8, 0x16d4, 0xd2da,
+            0x12b6, 0x936, 0x9497, 0x1496, 0x1564b, 0xd4a, 0xda8, 0xd5b4,
+            0x156c, 0x12ae, 0xa92f, 0x92e, 0xc96, 0x6d4a, 0x1d4a, 0x10d65,
+            0xb58, 0x156c, 0xb26d, 0x125c, 0x192c, 0x9a95, 0x1a94, 0x1b4a,
+            0x4b55, 0xad4, 0xf55b, 0x4ba, 0x125a, 0xb92b, 0x152a, 0x1694,
+            0x96aa, 0x15aa, 0x12ab5, 0x974, 0x14b6, 0xca57, 0xa56, 0x1526,
+            0x8e95, 0xd54, 0x15aa, 0x49b5, 0x96c, 0xd4ae, 0x149c, 0x1a4c,
+            0xbd26, 0x1aa6, 0xb54, 0x6d6a, 0x12da, 0x1695d, 0x95a, 0x149a,
+            0xda4b, 0x1a4a, 0x1aa4, 0xbb54, 0x16b4, 0xada, 0x495b, 0x936,
+            0xf497, 0x1496, 0x154a, 0xb6a5, 0xda4, 0x15b4, 0x6ab6, 0x126e,
+            0x1092f, 0x92e, 0xc96, 0xcd4a, 0x1d4a, 0xd64, 0x956c, 0x155c,
+            0x125c, 0x792e, 0x192c, 0xfa95, 0x1a94, 0x1b4a, 0xab55, 0xad4,
+            0x14da, 0x8a5d, 0xa5a, 0x1152b, 0x152a, 0x1694, 0xd6aa, 0x15aa,
+            0xab4, 0x94ba, 0x14b6, 0xa56, 0x7527, 0xd26, 0xee53, 0xd54, 0x15aa,
+            0xa9b5, 0x96c, 0x14ae, 0x8a4e, 0x1a4c, 0x11d26, 0x1aa4, 0x1b54,
+            0xcd6a, 0xada, 0x95c, 0x949d, 0x149a, 0x1a2a, 0x5b25, 0x1aa4,
+            0xfb52, 0x16b4, 0xaba, 0xa95b, 0x936, 0x1496, 0x9a4b, 0x154a,
+            0x136a5, 0xda4, 0x15ac};
+
+    /**
+     * 灏嗗啘鍘嗘棩鏈熻浆鎹负鍏巻鏃ユ湡
+     *
+     * @param year        鍐滃巻骞翠唤
+     * @param month       鍐滃巻鏈�
+     * @param monthDay    鍐滃巻鏃�
+     * @param isLeapMonth 璇ユ湀鏄惁鏄棸鏈�
+     * @return 杩斿洖鍐滃巻鏃ユ湡瀵瑰簲鐨勫叕鍘嗘棩鏈燂紝year0, month1, day2.
+     */
+    public static final int[] lunarToSolar(int year, int month, int monthDay,
+                                           boolean isLeapMonth) {
+        int dayOffset;
+        int leapMonth;
+        int i;
+
+        if (year < MIN_YEAR || year > MAX_YEAR || month < 1 || month > 12
+                || monthDay < 1 || monthDay > 30) {
+            throw new IllegalArgumentException(
+                    "Illegal lunar date, must be like that:\n\t" +
+                            "year : 1900~2099\n\t" +
+                            "month : 1~12\n\t" +
+                            "day : 1~30");
+        }
+
+        dayOffset = (LUNAR_INFO[year - MIN_YEAR] & 0x001F) - 1;
+
+        if (((LUNAR_INFO[year - MIN_YEAR] & 0x0060) >> 5) == 2)
+            dayOffset += 31;
+
+        for (i = 1; i < month; i++) {
+            if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (i - 1))) == 0)
+                dayOffset += 29;
+            else
+                dayOffset += 30;
+        }
+
+        dayOffset += monthDay;
+        leapMonth = (LUNAR_INFO[year - MIN_YEAR] & 0xf00000) >> 20;
+
+        // 杩欎竴骞存湁闂版湀
+        if (leapMonth != 0) {
+            if (month > leapMonth || (month == leapMonth && isLeapMonth)) {
+                if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (month - 1))) == 0)
+                    dayOffset += 29;
+                else
+                    dayOffset += 30;
+            }
+        }
+
+        if (dayOffset > 366 || (year % 4 != 0 && dayOffset > 365)) {
+            year += 1;
+            if (year % 4 == 1)
+                dayOffset -= 366;
+            else
+                dayOffset -= 365;
+        }
+
+        int[] solarInfo = new int[3];
+        for (i = 1; i < 13; i++) {
+            int iPos = DAYS_BEFORE_MONTH[i];
+            if (year % 4 == 0 && i > 2) {
+                iPos += 1;
+            }
+
+            if (year % 4 == 0 && i == 2 && iPos + 1 == dayOffset) {
+                solarInfo[1] = i;
+                solarInfo[2] = dayOffset - 31;
+                break;
+            }
+
+            if (iPos >= dayOffset) {
+                solarInfo[1] = i;
+                iPos = DAYS_BEFORE_MONTH[i - 1];
+                if (year % 4 == 0 && i > 2) {
+                    iPos += 1;
+                }
+                if (dayOffset > iPos)
+                    solarInfo[2] = dayOffset - iPos;
+                else if (dayOffset == iPos) {
+                    if (year % 4 == 0 && i == 2)
+                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1] + 1;
+                    else
+                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1];
+
+                } else
+                    solarInfo[2] = dayOffset;
+                break;
+            }
+        }
+        solarInfo[0] = year;
+
+        return solarInfo;
+    }
+
+    public static final int[] solarToLunar(int year, int month, int monthDay) {
+        int[] lunarDate = new int[4];
+
+        int index = year - solar_1_1[0];
+        int data = (year << 9) | (month << 5)
+                | (monthDay);
+        int solar11 = 0;
+        if (solar_1_1[index] > data) {
+            index--;
+        }
+        solar11 = solar_1_1[index];
+        int y = getBitInt(solar11, 12, 9);
+        int m = getBitInt(solar11, 4, 5);
+        int d = getBitInt(solar11, 5, 0);
+        long offset = solarToInt(year, month,
+                monthDay) - solarToInt(y, m, d);
+
+        int days = lunar_month_days[index];
+        int leap = getBitInt(days, 4, 13);
+
+        int lunarY = index + solar_1_1[0];
+        int lunarM = 1;
+        int lunarD = 1;
+        offset += 1;
+
+        for (int i = 0; i < 13; i++) {
+            int dm = getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;
+            if (offset > dm) {
+                lunarM++;
+                offset -= dm;
+            } else {
+                break;
+            }
+        }
+        lunarD = (int) (offset);
+        lunarDate[0] = lunarY;
+        lunarDate[1] = lunarM;
+        boolean isLeap = false;
+        if (leap != 0 && lunarM > leap) {
+            lunarDate[1] = lunarM - 1;
+            if (lunarM == leap + 1) {
+                isLeap = true;
+            }
+        }
+
+        lunarDate[2] = lunarD;
+        lunarDate[3] = isLeap ? 1 : 0;
+        //Log.i("----------->",year+"-"+month+"-"+monthDay+"====>"+lunarDate[0]+"-"+lunarDate[1]+"-"+lunarDate[2]+"-"+lunarDate[3]);
+        return lunarDate;
+    }
+
+
+    /**
+     * 灏嗗叕鍘嗘棩鏈熻浆鎹负鍐滃巻鏃ユ湡锛屼笖鏍囪瘑鏄惁鏄棸鏈�
+     *
+     * @param year
+     * @param month
+     * @param monthDay
+     * @return 杩斿洖鍏巻鏃ユ湡瀵瑰簲鐨勫啘鍘嗘棩鏈燂紝year0锛宮onth1锛宒ay2锛宭eap3
+     * @deprecated 涓嶅噯纭�
+     */
+    @Deprecated
+    public static final int[] solarToLunarDeprecated(int year, int month, int monthDay) {
+        int[] lunarDate = new int[4];
+        Date baseDate = new GregorianCalendar(1900, 0, 31).getTime();
+        Date objDate = new GregorianCalendar(year, month - 1, monthDay).getTime();
+        int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);
+
+        // 鐢╫ffset鍑忓幓姣忓啘鍘嗗勾鐨勫ぉ鏁拌绠楀綋澶╂槸鍐滃巻绗嚑澶�
+        // iYear鏈�缁堢粨鏋滄槸鍐滃巻鐨勫勾浠�, offset鏄綋骞寸殑绗嚑澶�
+        int iYear, daysOfYear = 0;
+        for (iYear = MIN_YEAR; iYear <= MAX_YEAR && offset > 0; iYear++) {
+            daysOfYear = daysInLunarYear(iYear);
+            offset -= daysOfYear;
+        }
+        if (offset < 0) {
+            offset += daysOfYear;
+            iYear--;
+        }
+
+        // 鍐滃巻骞翠唤
+        lunarDate[0] = iYear;
+
+        int leapMonth = leapMonth(iYear); // 闂板摢涓湀,1-12
+        boolean isLeap = false;
+        // 鐢ㄥ綋骞寸殑澶╂暟offset,閫愪釜鍑忓幓姣忔湀锛堝啘鍘嗭級鐨勫ぉ鏁帮紝姹傚嚭褰撳ぉ鏄湰鏈堢殑绗嚑澶�
+        int iMonth, daysOfMonth = 0;
+        for (iMonth = 1; iMonth <= 13 && offset > 0; iMonth++) {
+            daysOfMonth = daysInLunarMonth(iYear, iMonth);
+            offset -= daysOfMonth;
+        }
+        // 褰撳墠鏈堣秴杩囬棸鏈堬紝瑕佹牎姝�
+        if (leapMonth != 0 && iMonth > leapMonth) {
+            --iMonth;
+            Log.i("----------->", year + "-" + month + "-" + monthDay + "====>" + iMonth + "-" + leapMonth);
+            if (iMonth == leapMonth) {
+                isLeap = true;
+            }
+        }
+        // offset灏忎簬0鏃讹紝涔熻鏍℃
+        if (offset < 0) {
+            offset += daysOfMonth;
+            --iMonth;
+        }
+
+        lunarDate[1] = iMonth;
+        lunarDate[2] = offset + 1;
+        lunarDate[3] = isLeap ? 1 : 0;
+
+        //Log.i("----------->",year+"-"+month+"-"+monthDay+"====>"+lunarDate[0]+"-"+lunarDate[1]+"-"+lunarDate[2]+"-"+lunarDate[3]);
+        return lunarDate;
+    }
+
+    /**
+     * 浼犲洖鍐滃巻year骞磎onth鏈堢殑鎬诲ぉ鏁�
+     *
+     * @param year  瑕佽绠楃殑骞翠唤
+     * @param month 瑕佽绠楃殑鏈�
+     * @return 浼犲洖澶╂暟
+     */
+    final public static int daysInMonth(int year, int month) {
+        return daysInMonth(year, month, false);
+    }
+
+    /**
+     * 浼犲洖鍐滃巻year骞磎onth鏈堢殑鎬诲ぉ鏁�
+     *
+     * @param year  瑕佽绠楃殑骞翠唤
+     * @param month 瑕佽绠楃殑鏈�
+     * @param leap  褰撴湀鏄惁鏄棸鏈�
+     * @return 浼犲洖澶╂暟锛屽鏋滈棸鏈堟槸閿欒鐨勶紝杩斿洖0.
+     */
+    public static final int daysInMonth(int year, int month, boolean leap) {
+        int leapMonth = leapMonth(year);
+        int offset = 0;
+
+        // 濡傛灉鏈勾鏈夐棸鏈堜笖month澶т簬闂版湀鏃讹紝闇�瑕佹牎姝�
+        if (leapMonth != 0 && month > leapMonth) {
+            offset = 1;
+        }
+
+        // 涓嶈�冭檻闂版湀
+        if (!leap) {
+            return daysInLunarMonth(year, month + offset);
+        } else {
+            // 浼犲叆鐨勯棸鏈堟槸姝g‘鐨勬湀浠�
+            if (leapMonth != 0 && leapMonth == month) {
+                return daysInLunarMonth(year, month + 1);
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 浼犲洖鍐滃巻 year骞寸殑鎬诲ぉ鏁�
+     *
+     * @param year 灏嗚璁$畻鐨勫勾浠�
+     * @return 杩斿洖浼犲叆骞翠唤鐨勬�诲ぉ鏁�
+     */
+    private static int daysInLunarYear(int year) {
+        int i, sum = 348;
+        if (leapMonth(year) != 0) {
+            sum = 377;
+        }
+        int monthInfo = LUNAR_INFO[year - MIN_YEAR] & 0x0FFF80;
+        for (i = 0x80000; i > 0x7; i >>= 1) {
+            if ((monthInfo & i) != 0)
+                sum += 1;
+        }
+        return sum;
+    }
+
+    /**
+     * 浼犲洖鍐滃巻 year骞磎onth鏈堢殑鎬诲ぉ鏁帮紝鎬诲叡鏈�13涓湀鍖呮嫭闂版湀
+     *
+     * @param year  灏嗚璁$畻鐨勫勾浠�
+     * @param month 灏嗚璁$畻鐨勬湀浠�
+     * @return 浼犲洖鍐滃巻 year骞磎onth鏈堢殑鎬诲ぉ鏁�
+     */
+    private static int daysInLunarMonth(int year, int month) {
+        if ((LUNAR_INFO[year - MIN_YEAR] & (0x100000 >> month)) == 0)
+            return 29;
+        else
+            return 30;
+    }
+
+    /**
+     * 浼犲洖鍐滃巻 year骞撮棸鍝釜鏈� 1-12 , 娌¢棸浼犲洖 0
+     *
+     * @param year 灏嗚璁$畻鐨勫勾浠�
+     * @return 浼犲洖鍐滃巻 year骞撮棸鍝釜鏈�1-12, 娌¢棸浼犲洖 0
+     */
+    public static int leapMonth(int year) {
+        return (int) ((LUNAR_INFO[year - MIN_YEAR] & 0xF00000)) >> 20;
+    }
+
+
+    private static int getBitInt(int data, int length, int shift) {
+        return (data & (((1 << length) - 1) << shift)) >> shift;
+    }
+
+    private static long solarToInt(int y, int m, int d) {
+        m = (m + 9) % 12;
+        y = y - m / 10;
+        return 365 * y + y / 4 - y / 100 + y / 400 + (m * 306 + 5) / 10
+                + (d - 1);
+    }
+
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java b/pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java
new file mode 100644
index 0000000..3e4a9f6
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java
@@ -0,0 +1,26 @@
+package com.bigkoo.pickerview.utils;
+
+import android.view.Gravity;
+
+import com.bigkoo.pickerview.R;
+
+/**
+ * Created by Sai on 15/8/9.
+ */
+public class PickerViewAnimateUtil {
+    private static final int INVALID = -1;
+    /**
+     * Get default animation resource when not defined by the user
+     *
+     * @param gravity       the animGravity of the dialog
+     * @param isInAnimation determine if is in or out animation. true when is is
+     * @return the id of the animation resource
+     */
+    public static int getAnimationResource(int gravity, boolean isInAnimation) {
+        switch (gravity) {
+            case Gravity.BOTTOM:
+                return isInAnimation ? R.anim.pickerview_slide_in_bottom : R.anim.pickerview_slide_out_bottom;
+        }
+        return INVALID;
+    }
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java
new file mode 100644
index 0000000..6ddddc5
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java
@@ -0,0 +1,361 @@
+package com.bigkoo.pickerview.view;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Color;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.FrameLayout;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.OnDismissListener;
+import com.bigkoo.pickerview.utils.PickerViewAnimateUtil;
+
+/**
+ * Created by Sai on 15/11/22.
+ * 绮句豢iOSPickerViewController鎺т欢
+ */
+public class BasePickerView {
+
+    private Context context;
+    protected ViewGroup contentContainer;
+    private ViewGroup rootView;//闄勫姞View 鐨� 鏍筕iew
+    private ViewGroup dialogView;//闄勫姞Dialog 鐨� 鏍筕iew
+
+    protected PickerOptions mPickerOptions;
+    private OnDismissListener onDismissListener;
+    private boolean dismissing;
+
+    private Animation outAnim;
+    private Animation inAnim;
+    private boolean isShowing;
+
+    protected int animGravity = Gravity.BOTTOM;
+
+    private Dialog mDialog;
+    protected View clickView;//鏄�氳繃鍝釜View寮瑰嚭鐨�
+    private boolean isAnim = true;
+
+    public BasePickerView(Context context) {
+        this.context = context;
+    }
+
+
+    protected void initViews() {
+
+        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
+
+        LayoutInflater layoutInflater = LayoutInflater.from(context);
+        if (isDialog()) {
+            //濡傛灉鏄璇濇妯″紡
+            dialogView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, null, false);
+            //璁剧疆鐣岄潰鐨勮儗鏅负閫忔槑
+            dialogView.setBackgroundColor(Color.TRANSPARENT);
+            //杩欎釜鏄湡姝h鍔犺浇閫夋嫨鍣ㄧ殑鐖跺竷灞�
+            contentContainer = (ViewGroup) dialogView.findViewById(R.id.content_container);
+            //璁剧疆瀵硅瘽妗� 榛樿宸﹀彸闂磋窛灞忓箷30
+            params.leftMargin = 30;
+            params.rightMargin = 30;
+            contentContainer.setLayoutParams(params);
+            //鍒涘缓瀵硅瘽妗�
+            createDialog();
+            //缁欒儗鏅缃偣鍑讳簨浠�,杩欐牱褰撶偣鍑诲唴瀹逛互澶栫殑鍦版柟浼氬叧闂晫闈�
+            dialogView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    dismiss();
+                }
+            });
+        } else {
+            //濡傛灉鍙槸瑕佹樉绀哄湪灞忓箷鐨勪笅鏂�
+            //decorView鏄痑ctivity鐨勬牴View,鍖呭惈 contentView 鍜� titleView
+            if (mPickerOptions.decorView == null) {
+                mPickerOptions.decorView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
+            }
+            //灏嗘帶浠舵坊鍔犲埌decorView涓�
+            rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, mPickerOptions.decorView, false);
+            rootView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+            if (mPickerOptions.outSideColor != -1) {
+                rootView.setBackgroundColor(mPickerOptions.outSideColor);
+            }
+            //杩欎釜鏄湡姝h鍔犺浇鏃堕棿閫夊彇鍣ㄧ殑鐖跺竷灞�
+            contentContainer = (ViewGroup) rootView.findViewById(R.id.content_container);
+            contentContainer.setLayoutParams(params);
+        }
+        setKeyBackCancelable(true);
+    }
+
+    protected void initAnim() {
+        inAnim = getInAnimation();
+        outAnim = getOutAnimation();
+    }
+
+    protected void initEvents() {
+    }
+
+
+    /**
+     * @param v      (鏄�氳繃鍝釜View寮瑰嚭鐨�)
+     * @param isAnim 鏄惁鏄剧ず鍔ㄧ敾鏁堟灉
+     */
+    public void show(View v, boolean isAnim) {
+        this.clickView = v;
+        this.isAnim = isAnim;
+        show();
+    }
+
+    public void show(boolean isAnim) {
+        show(null, isAnim);
+    }
+
+    public void show(View v) {
+        this.clickView = v;
+        show();
+    }
+
+
+    /**
+     * 娣诲姞View鍒版牴瑙嗗浘
+     */
+    public void show() {
+        if (isDialog()) {
+            showDialog();
+        } else {
+            if (isShowing()) {
+                return;
+            }
+            isShowing = true;
+            onAttached(rootView);
+            rootView.requestFocus();
+        }
+    }
+
+
+    /**
+     * show鐨勬椂鍊欒皟鐢�
+     *
+     * @param view 杩欎釜View
+     */
+    private void onAttached(View view) {
+        mPickerOptions.decorView.addView(view);
+        if (isAnim) {
+            contentContainer.startAnimation(inAnim);
+        }
+    }
+
+
+    /**
+     * 妫�娴嬭View鏄笉鏄凡缁忔坊鍔犲埌鏍硅鍥�
+     *
+     * @return 濡傛灉瑙嗗浘宸茬粡瀛樺湪璇iew杩斿洖true
+     */
+    public boolean isShowing() {
+        if (isDialog()) {
+            return false;
+        } else {
+            return rootView.getParent() != null || isShowing;
+        }
+
+    }
+
+    public void dismiss() {
+        if (isDialog()) {
+            dismissDialog();
+        } else {
+            if (dismissing) {
+                return;
+            }
+
+            if (isAnim) {
+                //娑堝け鍔ㄧ敾
+                outAnim.setAnimationListener(new Animation.AnimationListener() {
+                    @Override
+                    public void onAnimationStart(Animation animation) {
+
+                    }
+
+                    @Override
+                    public void onAnimationEnd(Animation animation) {
+                        dismissImmediately();
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animation animation) {
+
+                    }
+                });
+                contentContainer.startAnimation(outAnim);
+            } else {
+                dismissImmediately();
+            }
+            dismissing = true;
+        }
+
+
+    }
+
+    public void dismissImmediately() {
+
+        mPickerOptions.decorView.post(new Runnable() {
+            @Override
+            public void run() {
+                //浠庢牴瑙嗗浘绉婚櫎
+                mPickerOptions.decorView.removeView(rootView);
+                isShowing = false;
+                dismissing = false;
+                if (onDismissListener != null) {
+                    onDismissListener.onDismiss(BasePickerView.this);
+                }
+            }
+        });
+
+
+    }
+
+    private Animation getInAnimation() {
+        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, true);
+        return AnimationUtils.loadAnimation(context, res);
+    }
+
+    private Animation getOutAnimation() {
+        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, false);
+        return AnimationUtils.loadAnimation(context, res);
+    }
+
+    public BasePickerView setOnDismissListener(OnDismissListener onDismissListener) {
+        this.onDismissListener = onDismissListener;
+        return this;
+    }
+
+    public void setKeyBackCancelable(boolean isCancelable) {
+
+        ViewGroup View;
+        if (isDialog()) {
+            View = dialogView;
+        } else {
+            View = rootView;
+        }
+
+        View.setFocusable(isCancelable);
+        View.setFocusableInTouchMode(isCancelable);
+        if (isCancelable) {
+            View.setOnKeyListener(onKeyBackListener);
+        } else {
+            View.setOnKeyListener(null);
+        }
+    }
+
+    private View.OnKeyListener onKeyBackListener = new View.OnKeyListener() {
+        @Override
+        public boolean onKey(View v, int keyCode, KeyEvent event) {
+            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_DOWN && isShowing()) {
+                dismiss();
+                return true;
+            }
+            return false;
+        }
+    };
+
+    protected BasePickerView setOutSideCancelable(boolean isCancelable) {
+
+        if (rootView != null) {
+            View view = rootView.findViewById(R.id.outmost_container);
+
+            if (isCancelable) {
+                view.setOnTouchListener(onCancelableTouchListener);
+            } else {
+                view.setOnTouchListener(null);
+            }
+        }
+
+        return this;
+    }
+
+    /**
+     * 璁剧疆瀵硅瘽妗嗘ā寮忔槸鍚﹀彲浠ョ偣鍑诲閮ㄥ彇娑�
+     */
+    public void setDialogOutSideCancelable() {
+        if (mDialog != null) {
+            mDialog.setCancelable(mPickerOptions.cancelable);
+        }
+    }
+
+
+    /**
+     * Called when the user touch on black overlay, in order to dismiss the dialog.
+     */
+    private final View.OnTouchListener onCancelableTouchListener = new View.OnTouchListener() {
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                dismiss();
+            }
+            return false;
+        }
+    };
+
+    public View findViewById(int id) {
+        return contentContainer.findViewById(id);
+    }
+
+    public void createDialog() {
+        if (dialogView != null) {
+            mDialog = new Dialog(context, R.style.custom_dialog2);
+            mDialog.setCancelable(mPickerOptions.cancelable);//涓嶈兘鐐瑰闈㈠彇娑�,涔熶笉鑳界偣back鍙栨秷
+            mDialog.setContentView(dialogView);
+
+            Window dialogWindow = mDialog.getWindow();
+            if (dialogWindow != null) {
+                dialogWindow.setWindowAnimations(R.style.picker_view_scale_anim);
+                dialogWindow.setGravity(Gravity.CENTER);//鍙互鏀规垚Bottom
+            }
+
+            mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+                @Override
+                public void onDismiss(DialogInterface dialog) {
+                    if (onDismissListener != null) {
+                        onDismissListener.onDismiss(BasePickerView.this);
+                    }
+                }
+            });
+        }
+    }
+
+    private void showDialog() {
+        if (mDialog != null) {
+            mDialog.show();
+        }
+    }
+
+    private void dismissDialog() {
+        if (mDialog != null) {
+            mDialog.dismiss();
+        }
+    }
+
+    public ViewGroup getDialogContainerLayout() {
+        return contentContainer;
+    }
+
+
+    public Dialog getDialog() {
+        return mDialog;
+    }
+
+
+    public boolean isDialog() {
+        return false;
+    }
+
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/OptionsPickerView.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/OptionsPickerView.java
new file mode 100644
index 0000000..a9333f5
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/OptionsPickerView.java
@@ -0,0 +1,197 @@
+package com.bigkoo.pickerview.view;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.configure.PickerOptions;
+
+import java.util.List;
+
+/**
+ * 鏉′欢閫夋嫨鍣�
+ * Created by Sai on 15/11/22.
+ */
+public class OptionsPickerView<T> extends BasePickerView implements View.OnClickListener {
+
+    private WheelOptions<T> wheelOptions;
+
+    private static final String TAG_SUBMIT = "submit";
+    private static final String TAG_CANCEL = "cancel";
+
+
+    public OptionsPickerView(PickerOptions pickerOptions) {
+        super(pickerOptions.context);
+        mPickerOptions = pickerOptions;
+        initView(pickerOptions.context);
+    }
+
+    private void initView(Context context) {
+        setDialogOutSideCancelable();
+        initViews();
+        initAnim();
+        initEvents();
+        if (mPickerOptions.customListener == null) {
+            LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer);
+
+            //椤堕儴鏍囬
+            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+            RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar);
+
+            //纭畾鍜屽彇娑堟寜閽�
+            Button btnSubmit = (Button) findViewById(R.id.btnSubmit);
+            Button btnCancel = (Button) findViewById(R.id.btnCancel);
+
+            btnSubmit.setTag(TAG_SUBMIT);
+            btnCancel.setTag(TAG_CANCEL);
+            btnSubmit.setOnClickListener(this);
+            btnCancel.setOnClickListener(this);
+
+            //璁剧疆鏂囧瓧
+            btnSubmit.setText(TextUtils.isEmpty(mPickerOptions.textContentConfirm) ? context.getResources().getString(R.string.pickerview_submit) : mPickerOptions.textContentConfirm);
+            btnCancel.setText(TextUtils.isEmpty(mPickerOptions.textContentCancel) ? context.getResources().getString(R.string.pickerview_cancel) : mPickerOptions.textContentCancel);
+            tvTitle.setText(TextUtils.isEmpty(mPickerOptions.textContentTitle) ? "" : mPickerOptions.textContentTitle);//榛樿涓虹┖
+
+            //璁剧疆color
+            btnSubmit.setTextColor(mPickerOptions.textColorConfirm);
+            btnCancel.setTextColor(mPickerOptions.textColorCancel);
+            tvTitle.setTextColor(mPickerOptions.textColorTitle);
+            rv_top_bar.setBackgroundColor(mPickerOptions.bgColorTitle);
+
+            //璁剧疆鏂囧瓧澶у皬
+            btnSubmit.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            btnCancel.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            tvTitle.setTextSize(mPickerOptions.textSizeTitle);
+        } else {
+            mPickerOptions.customListener.customLayout(LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer));
+        }
+
+        // ----婊氳疆甯冨眬
+        final LinearLayout optionsPicker = (LinearLayout) findViewById(R.id.optionspicker);
+        optionsPicker.setBackgroundColor(mPickerOptions.bgColorWheel);
+
+        wheelOptions = new WheelOptions<>(optionsPicker, mPickerOptions.isRestoreItem);
+        if (mPickerOptions.optionsSelectChangeListener != null) {
+            wheelOptions.setOptionsSelectChangeListener(mPickerOptions.optionsSelectChangeListener);
+        }
+
+        wheelOptions.setTextContentSize(mPickerOptions.textSizeContent);
+        wheelOptions.setItemsVisible(mPickerOptions.itemsVisibleCount);
+        wheelOptions.setAlphaGradient(mPickerOptions.isAlphaGradient);
+        wheelOptions.setLabels(mPickerOptions.label1, mPickerOptions.label2, mPickerOptions.label3);
+        wheelOptions.setTextXOffset(mPickerOptions.x_offset_one, mPickerOptions.x_offset_two, mPickerOptions.x_offset_three);
+        wheelOptions.setCyclic(mPickerOptions.cyclic1, mPickerOptions.cyclic2, mPickerOptions.cyclic3);
+        wheelOptions.setTypeface(mPickerOptions.font);
+
+        setOutSideCancelable(mPickerOptions.cancelable);
+
+        wheelOptions.setDividerColor(mPickerOptions.dividerColor);
+        wheelOptions.setDividerType(mPickerOptions.dividerType);
+        wheelOptions.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier);
+        wheelOptions.setTextColorOut(mPickerOptions.textColorOut);
+        wheelOptions.setTextColorCenter(mPickerOptions.textColorCenter);
+        wheelOptions.isCenterLabel(mPickerOptions.isCenterLabel);
+    }
+
+    /**
+     * 鍔ㄦ�佽缃爣棰�
+     *
+     * @param text 鏍囬鏂囨湰鍐呭
+     */
+    public void setTitleText(String text) {
+        TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+        if (tvTitle != null) {
+            tvTitle.setText(text);
+        }
+    }
+
+    /**
+     * 璁剧疆榛樿閫変腑椤�
+     *
+     * @param option1
+     */
+    public void setSelectOptions(int option1) {
+        mPickerOptions.option1 = option1;
+        reSetCurrentItems();
+    }
+
+
+    public void setSelectOptions(int option1, int option2) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        reSetCurrentItems();
+    }
+
+    public void setSelectOptions(int option1, int option2, int option3) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        mPickerOptions.option3 = option3;
+        reSetCurrentItems();
+    }
+
+    private void reSetCurrentItems() {
+        if (wheelOptions != null) {
+            wheelOptions.setCurrentItems(mPickerOptions.option1, mPickerOptions.option2, mPickerOptions.option3);
+        }
+    }
+
+    public void setPicker(List<T> optionsItems) {
+        this.setPicker(optionsItems, null, null);
+    }
+
+    public void setPicker(List<T> options1Items, List<List<T>> options2Items) {
+        this.setPicker(options1Items, options2Items, null);
+    }
+
+    public void setPicker(List<T> options1Items,
+                          List<List<T>> options2Items,
+                          List<List<List<T>>> options3Items) {
+
+        wheelOptions.setPicker(options1Items, options2Items, options3Items);
+        reSetCurrentItems();
+    }
+
+
+    //涓嶈仈鍔ㄦ儏鍐典笅璋冪敤
+    public void setNPicker(List<T> options1Items,
+                           List<T> options2Items,
+                           List<T> options3Items) {
+
+        wheelOptions.setLinkage(false);
+        wheelOptions.setNPicker(options1Items, options2Items, options3Items);
+        reSetCurrentItems();
+    }
+
+    @Override
+    public void onClick(View v) {
+        String tag = (String) v.getTag();
+        if (tag.equals(TAG_SUBMIT)) {
+            returnData();
+        } else if (tag.equals(TAG_CANCEL)) {
+            if (mPickerOptions.cancelListener != null) {
+                mPickerOptions.cancelListener.onClick(v);
+            }
+        }
+        dismiss();
+    }
+
+    //鎶界鎺ュ彛鍥炶皟鐨勬柟娉�
+    public void returnData() {
+        if (mPickerOptions.optionsSelectListener != null) {
+            int[] optionsCurrentItems = wheelOptions.getCurrentItems();
+            mPickerOptions.optionsSelectListener.onOptionsSelect(optionsCurrentItems[0], optionsCurrentItems[1], optionsCurrentItems[2], clickView);
+        }
+    }
+
+
+    @Override
+    public boolean isDialog() {
+        return mPickerOptions.isDialog;
+    }
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java
new file mode 100644
index 0000000..0381294
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java
@@ -0,0 +1,293 @@
+package com.bigkoo.pickerview.view;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.ISelectTimeCallback;
+
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 鏃堕棿閫夋嫨鍣�
+ * Created by Sai on 15/11/22.
+ * Updated by XiaoSong on 2017-2-22.
+ */
+public class TimePickerView extends BasePickerView implements View.OnClickListener {
+
+    private WheelTime wheelTime; //鑷畾涔夋帶浠�
+    private static final String TAG_SUBMIT = "submit";
+    private static final String TAG_CANCEL = "cancel";
+
+    public TimePickerView(PickerOptions pickerOptions) {
+        super(pickerOptions.context);
+        mPickerOptions = pickerOptions;
+        initView(pickerOptions.context);
+    }
+
+    private void initView(Context context) {
+        setDialogOutSideCancelable();
+        initViews();
+        initAnim();
+
+        if (mPickerOptions.customListener == null) {
+            LayoutInflater.from(context).inflate(R.layout.pickerview_time, contentContainer);
+
+            //椤堕儴鏍囬
+            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+            RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar);
+
+            //纭畾鍜屽彇娑堟寜閽�
+            Button btnSubmit = (Button) findViewById(R.id.btnSubmit);
+            Button btnCancel = (Button) findViewById(R.id.btnCancel);
+            //杩欐牱鍋氬彲浠ラ樆姝㈠瓙鎺т欢鐨勭偣鍑讳簨浠剁┛閫忓埌鐖舵帶浠朵笂锛屼粠鑰屼娇寰楃埗鎺т欢鍝嶅簲鐐瑰嚮浜嬩欢銆�
+            tvTitle.setClickable(true);
+            tvTitle.setFocusable(true);
+
+
+            btnSubmit.setTag(TAG_SUBMIT);
+            btnCancel.setTag(TAG_CANCEL);
+
+            btnSubmit.setOnClickListener(this);
+            btnCancel.setOnClickListener(this);
+
+            //璁剧疆鏂囧瓧
+            btnSubmit.setText(TextUtils.isEmpty(mPickerOptions.textContentConfirm) ? context.getResources().getString(R.string.pickerview_submit) : mPickerOptions.textContentConfirm);
+            btnCancel.setText(TextUtils.isEmpty(mPickerOptions.textContentCancel) ? context.getResources().getString(R.string.pickerview_cancel) : mPickerOptions.textContentCancel);
+            tvTitle.setText(TextUtils.isEmpty(mPickerOptions.textContentTitle) ? "" : mPickerOptions.textContentTitle);//榛樿涓虹┖
+
+            //璁剧疆color
+            btnSubmit.setTextColor(mPickerOptions.textColorConfirm);
+            btnCancel.setTextColor(mPickerOptions.textColorCancel);
+            tvTitle.setTextColor(mPickerOptions.textColorTitle);
+            rv_top_bar.setBackgroundColor(mPickerOptions.bgColorTitle);
+
+            //璁剧疆鏂囧瓧澶у皬
+            btnSubmit.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            btnCancel.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            tvTitle.setTextSize(mPickerOptions.textSizeTitle);
+
+        } else {
+            mPickerOptions.customListener.customLayout(LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer));
+        }
+        // 鏃堕棿杞疆 鑷畾涔夋帶浠�
+        LinearLayout timePickerView = (LinearLayout) findViewById(R.id.timepicker);
+        timePickerView.setBackgroundColor(mPickerOptions.bgColorWheel);
+
+        initWheelTime(timePickerView);
+    }
+
+    private void initWheelTime(LinearLayout timePickerView) {
+        wheelTime = new WheelTime(timePickerView, mPickerOptions.type, mPickerOptions.textGravity, mPickerOptions.textSizeContent);
+        if (mPickerOptions.timeSelectChangeListener != null) {
+            wheelTime.setSelectChangeCallback(new ISelectTimeCallback() {
+                @Override
+                public void onTimeSelectChanged() {
+                    try {
+                        Date date = WheelTime.dateFormat.parse(wheelTime.getTime());
+                        mPickerOptions.timeSelectChangeListener.onTimeSelectChanged(date);
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+
+        wheelTime.setLunarMode(mPickerOptions.isLunarCalendar);
+
+        if (mPickerOptions.startYear != 0 && mPickerOptions.endYear != 0
+                && mPickerOptions.startYear <= mPickerOptions.endYear) {
+            setRange();
+        }
+
+        //鑻ユ墜鍔ㄨ缃簡鏃堕棿鑼冨洿闄愬埗
+        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
+            if (mPickerOptions.startDate.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {
+                throw new IllegalArgumentException("startDate can't be later than endDate");
+            } else {
+                setRangDate();
+            }
+        } else if (mPickerOptions.startDate != null) {
+            if (mPickerOptions.startDate.get(Calendar.YEAR) < 1900) {
+                throw new IllegalArgumentException("The startDate can not as early as 1900");
+            } else {
+                setRangDate();
+            }
+        } else if (mPickerOptions.endDate != null) {
+            if (mPickerOptions.endDate.get(Calendar.YEAR) > 2100) {
+                throw new IllegalArgumentException("The endDate should not be later than 2100");
+            } else {
+                setRangDate();
+            }
+        } else {//娌℃湁璁剧疆鏃堕棿鑼冨洿闄愬埗锛屽垯浼氫娇鐢ㄩ粯璁よ寖鍥淬��
+            setRangDate();
+        }
+
+        setTime();
+        wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day
+                , mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds);
+        wheelTime.setTextXOffset(mPickerOptions.x_offset_year, mPickerOptions.x_offset_month, mPickerOptions.x_offset_day,
+                mPickerOptions.x_offset_hours, mPickerOptions.x_offset_minutes, mPickerOptions.x_offset_seconds);
+        wheelTime.setItemsVisible(mPickerOptions.itemsVisibleCount);
+        wheelTime.setAlphaGradient(mPickerOptions.isAlphaGradient);
+        setOutSideCancelable(mPickerOptions.cancelable);
+        wheelTime.setCyclic(mPickerOptions.cyclic);
+        wheelTime.setDividerColor(mPickerOptions.dividerColor);
+        wheelTime.setDividerType(mPickerOptions.dividerType);
+        wheelTime.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier);
+        wheelTime.setTextColorOut(mPickerOptions.textColorOut);
+        wheelTime.setTextColorCenter(mPickerOptions.textColorCenter);
+        wheelTime.isCenterLabel(mPickerOptions.isCenterLabel);
+    }
+
+
+    /**
+     * 璁剧疆榛樿鏃堕棿
+     */
+    public void setDate(Calendar date) {
+        mPickerOptions.date = date;
+        setTime();
+    }
+
+    /**
+     * 璁剧疆鍙互閫夋嫨鐨勬椂闂磋寖鍥�, 瑕佸湪setTime涔嬪墠璋冪敤鎵嶆湁鏁堟灉
+     */
+    private void setRange() {
+        wheelTime.setStartYear(mPickerOptions.startYear);
+        wheelTime.setEndYear(mPickerOptions.endYear);
+
+    }
+
+    /**
+     * 璁剧疆鍙互閫夋嫨鐨勬椂闂磋寖鍥�, 瑕佸湪setTime涔嬪墠璋冪敤鎵嶆湁鏁堟灉
+     */
+    private void setRangDate() {
+        wheelTime.setRangDate(mPickerOptions.startDate, mPickerOptions.endDate);
+        initDefaultSelectedDate();
+    }
+
+    private void initDefaultSelectedDate() {
+        //濡傛灉鎵嬪姩璁剧疆浜嗘椂闂磋寖鍥�
+        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
+            //鑻ラ粯璁ゆ椂闂存湭璁剧疆锛屾垨鑰呰缃殑榛樿鏃堕棿瓒婄晫浜嗭紝鍒欒缃粯璁ら�変腑鏃堕棿涓哄紑濮嬫椂闂淬��
+            if (mPickerOptions.date == null || mPickerOptions.date.getTimeInMillis() < mPickerOptions.startDate.getTimeInMillis()
+                    || mPickerOptions.date.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {
+                mPickerOptions.date = mPickerOptions.startDate;
+            }
+        } else if (mPickerOptions.startDate != null) {
+            //娌℃湁璁剧疆榛樿閫変腑鏃堕棿,閭e氨鎷垮紑濮嬫椂闂村綋榛樿鏃堕棿
+            mPickerOptions.date = mPickerOptions.startDate;
+        } else if (mPickerOptions.endDate != null) {
+            mPickerOptions.date = mPickerOptions.endDate;
+        }
+    }
+
+    /**
+     * 璁剧疆閫変腑鏃堕棿,榛樿閫変腑褰撳墠鏃堕棿
+     */
+    private void setTime() {
+        int year, month, day, hours, minute, seconds;
+        Calendar calendar = Calendar.getInstance();
+
+        if (mPickerOptions.date == null) {
+            calendar.setTimeInMillis(System.currentTimeMillis());
+            year = calendar.get(Calendar.YEAR);
+            month = calendar.get(Calendar.MONTH);
+            day = calendar.get(Calendar.DAY_OF_MONTH);
+            hours = calendar.get(Calendar.HOUR_OF_DAY);
+            minute = calendar.get(Calendar.MINUTE);
+            seconds = calendar.get(Calendar.SECOND);
+        } else {
+            year = mPickerOptions.date.get(Calendar.YEAR);
+            month = mPickerOptions.date.get(Calendar.MONTH);
+            day = mPickerOptions.date.get(Calendar.DAY_OF_MONTH);
+            hours = mPickerOptions.date.get(Calendar.HOUR_OF_DAY);
+            minute = mPickerOptions.date.get(Calendar.MINUTE);
+            seconds = mPickerOptions.date.get(Calendar.SECOND);
+        }
+
+        wheelTime.setPicker(year, month, day, hours, minute, seconds);
+    }
+
+
+    @Override
+    public void onClick(View v) {
+        String tag = (String) v.getTag();
+        if (tag.equals(TAG_SUBMIT)) {
+            returnData();
+        } else if (tag.equals(TAG_CANCEL)) {
+            if (mPickerOptions.cancelListener != null) {
+                mPickerOptions.cancelListener.onClick(v);
+            }
+        }
+        dismiss();
+    }
+
+    public void returnData() {
+        if (mPickerOptions.timeSelectListener != null) {
+            try {
+                Date date = WheelTime.dateFormat.parse(wheelTime.getTime());
+                mPickerOptions.timeSelectListener.onTimeSelect(date, clickView);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 鍔ㄦ�佽缃爣棰�
+     *
+     * @param text 鏍囬鏂囨湰鍐呭
+     */
+    public void setTitleText(String text) {
+        TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+        if (tvTitle != null) {
+            tvTitle.setText(text);
+        }
+    }
+
+    /**
+     * 鐩墠鏆傛椂鍙敮鎸佽缃�1900 - 2100骞�
+     *
+     * @param lunar 鍐滃巻鐨勫紑鍏�
+     */
+    public void setLunarCalendar(boolean lunar) {
+        try {
+            int year, month, day, hours, minute, seconds;
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(WheelTime.dateFormat.parse(wheelTime.getTime()));
+            year = calendar.get(Calendar.YEAR);
+            month = calendar.get(Calendar.MONTH);
+            day = calendar.get(Calendar.DAY_OF_MONTH);
+            hours = calendar.get(Calendar.HOUR_OF_DAY);
+            minute = calendar.get(Calendar.MINUTE);
+            seconds = calendar.get(Calendar.SECOND);
+
+            wheelTime.setLunarMode(lunar);
+            wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day,
+                    mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds);
+            wheelTime.setPicker(year, month, day, hours, minute, seconds);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public boolean isLunarCalendar() {
+        return wheelTime.isLunarMode();
+    }
+
+
+    @Override
+    public boolean isDialog() {
+        return mPickerOptions.isDialog;
+    }
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
new file mode 100644
index 0000000..ca36475
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
@@ -0,0 +1,428 @@
+package com.bigkoo.pickerview.view;
+
+import android.graphics.Typeface;
+import android.view.View;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.adapter.ArrayWheelAdapter;
+import com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;
+import com.contrarywind.listener.OnItemSelectedListener;
+import com.contrarywind.view.WheelView;
+
+import java.util.List;
+
+public class WheelOptions<T> {
+    private View view;
+    private WheelView wv_option1;
+    private WheelView wv_option2;
+    private WheelView wv_option3;
+
+    private List<T> mOptions1Items;
+    private List<List<T>> mOptions2Items;
+    private List<List<List<T>>> mOptions3Items;
+
+    private boolean linkage = true;//榛樿鑱斿姩
+    private boolean isRestoreItem; //鍒囨崲鏃讹紝杩樺師绗竴椤�
+    private OnItemSelectedListener wheelListener_option1;
+    private OnItemSelectedListener wheelListener_option2;
+
+    private OnOptionsSelectChangeListener optionsSelectChangeListener;
+
+    public View getView() {
+        return view;
+    }
+
+    public void setView(View view) {
+        this.view = view;
+    }
+
+    public WheelOptions(View view, boolean isRestoreItem) {
+        super();
+        this.isRestoreItem = isRestoreItem;
+        this.view = view;
+        wv_option1 = (WheelView) view.findViewById(R.id.options1);// 鍒濆鍖栨椂鏄剧ず鐨勬暟鎹�
+        wv_option2 = (WheelView) view.findViewById(R.id.options2);
+        wv_option3 = (WheelView) view.findViewById(R.id.options3);
+    }
+
+
+    public void setPicker(List<T> options1Items,
+                          List<List<T>> options2Items,
+                          List<List<List<T>>> options3Items) {
+        this.mOptions1Items = options1Items;
+        this.mOptions2Items = options2Items;
+        this.mOptions3Items = options3Items;
+
+        // 閫夐」1
+        wv_option1.setAdapter(new ArrayWheelAdapter(mOptions1Items));// 璁剧疆鏄剧ず鏁版嵁
+        wv_option1.setCurrentItem(0);// 鍒濆鍖栨椂鏄剧ず鐨勬暟鎹�
+        // 閫夐」2
+        if (mOptions2Items != null) {
+            wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(0)));// 璁剧疆鏄剧ず鏁版嵁
+        }
+        wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 鍒濆鍖栨椂鏄剧ず鐨勬暟鎹�
+        // 閫夐」3
+        if (mOptions3Items != null) {
+            wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(0).get(0)));// 璁剧疆鏄剧ず鏁版嵁
+        }
+        wv_option3.setCurrentItem(wv_option3.getCurrentItem());
+        wv_option1.setIsOptions(true);
+        wv_option2.setIsOptions(true);
+        wv_option3.setIsOptions(true);
+
+        if (this.mOptions2Items == null) {
+            wv_option2.setVisibility(View.GONE);
+        } else {
+            wv_option2.setVisibility(View.VISIBLE);
+        }
+        if (this.mOptions3Items == null) {
+            wv_option3.setVisibility(View.GONE);
+        } else {
+            wv_option3.setVisibility(View.VISIBLE);
+        }
+
+        // 鑱斿姩鐩戝惉鍣�
+        wheelListener_option1 = new OnItemSelectedListener() {
+
+            @Override
+            public void onItemSelected(int index) {
+                int opt2Select = 0;
+                if (mOptions2Items == null) {//鍙湁1绾ц仈鍔ㄦ暟鎹�
+                    if (optionsSelectChangeListener != null) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), 0, 0);
+                    }
+                } else {
+                    if (!isRestoreItem) {
+                        opt2Select = wv_option2.getCurrentItem();//涓婁竴涓猳pt2鐨勯�変腑浣嶇疆
+                        //鏂皁pt2鐨勪綅缃紝鍒ゆ柇濡傛灉鏃т綅缃病鏈夎秴杩囨暟鎹寖鍥达紝鍒欐部鐢ㄦ棫浣嶇疆锛屽惁鍒欓�変腑鏈�鍚庝竴椤�
+                        opt2Select = opt2Select >= mOptions2Items.get(index).size() - 1 ? mOptions2Items.get(index).size() - 1 : opt2Select;
+                    }
+                    wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(index)));
+                    wv_option2.setCurrentItem(opt2Select);
+
+                    if (mOptions3Items != null) {
+                        wheelListener_option2.onItemSelected(opt2Select);
+                    } else {//鍙湁2绾ц仈鍔ㄦ暟鎹紝婊戝姩绗�1椤瑰洖璋�
+                        if (optionsSelectChangeListener != null) {
+                            optionsSelectChangeListener.onOptionsSelectChanged(index, opt2Select, 0);
+                        }
+                    }
+                }
+            }
+        };
+
+        wheelListener_option2 = new OnItemSelectedListener() {
+
+            @Override
+            public void onItemSelected(int index) {
+                if (mOptions3Items != null) {
+                    int opt1Select = wv_option1.getCurrentItem();
+                    opt1Select = opt1Select >= mOptions3Items.size() - 1 ? mOptions3Items.size() - 1 : opt1Select;
+                    index = index >= mOptions2Items.get(opt1Select).size() - 1 ? mOptions2Items.get(opt1Select).size() - 1 : index;
+                    int opt3 = 0;
+                    if (!isRestoreItem) {
+                        // wv_option3.getCurrentItem() 涓婁竴涓猳pt3鐨勯�変腑浣嶇疆
+                        //鏂皁pt3鐨勪綅缃紝鍒ゆ柇濡傛灉鏃т綅缃病鏈夎秴杩囨暟鎹寖鍥达紝鍒欐部鐢ㄦ棫浣嶇疆锛屽惁鍒欓�変腑鏈�鍚庝竴椤�
+                        opt3 = wv_option3.getCurrentItem() >= mOptions3Items.get(opt1Select).get(index).size() - 1 ?
+                                mOptions3Items.get(opt1Select).get(index).size() - 1 : wv_option3.getCurrentItem();
+                    }
+                    wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(wv_option1.getCurrentItem()).get(index)));
+                    wv_option3.setCurrentItem(opt3);
+
+                    //3绾ц仈鍔ㄦ暟鎹疄鏃跺洖璋�
+                    if (optionsSelectChangeListener != null) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, opt3);
+                    }
+                } else {//鍙湁2绾ц仈鍔ㄦ暟鎹紝婊戝姩绗�2椤瑰洖璋�
+                    if (optionsSelectChangeListener != null) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, 0);
+                    }
+                }
+            }
+        };
+        // 娣诲姞鑱斿姩鐩戝惉
+        if (options1Items != null && linkage) {
+            wv_option1.setOnItemSelectedListener(wheelListener_option1);
+        }
+        if (options2Items != null && linkage) {
+            wv_option2.setOnItemSelectedListener(wheelListener_option2);
+        }
+        if (options3Items != null && linkage && optionsSelectChangeListener != null) {
+            wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(int index) {
+                    optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index);
+                }
+            });
+        }
+    }
+
+
+    //涓嶈仈鍔ㄦ儏鍐典笅
+    public void setNPicker(List<T> options1Items, List<T> options2Items, List<T> options3Items) {
+
+        // 閫夐」1
+        wv_option1.setAdapter(new ArrayWheelAdapter<>(options1Items));// 璁剧疆鏄剧ず鏁版嵁
+        wv_option1.setCurrentItem(0);// 鍒濆鍖栨椂鏄剧ず鐨勬暟鎹�
+        // 閫夐」2
+        if (options2Items != null) {
+            wv_option2.setAdapter(new ArrayWheelAdapter<>(options2Items));// 璁剧疆鏄剧ず鏁版嵁
+        }
+        wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 鍒濆鍖栨椂鏄剧ず鐨勬暟鎹�
+        // 閫夐」3
+        if (options3Items != null) {
+            wv_option3.setAdapter(new ArrayWheelAdapter<>(options3Items));// 璁剧疆鏄剧ず鏁版嵁
+        }
+        wv_option3.setCurrentItem(wv_option3.getCurrentItem());
+        wv_option1.setIsOptions(true);
+        wv_option2.setIsOptions(true);
+        wv_option3.setIsOptions(true);
+
+        if (optionsSelectChangeListener != null) {
+            wv_option1.setOnItemSelectedListener(new OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(int index) {
+                    optionsSelectChangeListener.onOptionsSelectChanged(index, wv_option2.getCurrentItem(), wv_option3.getCurrentItem());
+                }
+            });
+        }
+
+        if (options2Items == null) {
+            wv_option2.setVisibility(View.GONE);
+        } else {
+            wv_option2.setVisibility(View.VISIBLE);
+            if (optionsSelectChangeListener != null) {
+                wv_option2.setOnItemSelectedListener(new OnItemSelectedListener() {
+                    @Override
+                    public void onItemSelected(int index) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, wv_option3.getCurrentItem());
+                    }
+                });
+            }
+        }
+        if (options3Items == null) {
+            wv_option3.setVisibility(View.GONE);
+        } else {
+            wv_option3.setVisibility(View.VISIBLE);
+            if (optionsSelectChangeListener != null) {
+                wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() {
+                    @Override
+                    public void onItemSelected(int index) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index);
+                    }
+                });
+            }
+        }
+    }
+
+    public void setTextContentSize(int textSize) {
+        wv_option1.setTextSize(textSize);
+        wv_option2.setTextSize(textSize);
+        wv_option3.setTextSize(textSize);
+    }
+
+    private void setLineSpacingMultiplier() {
+
+    }
+
+    /**
+     * 璁剧疆閫夐」鐨勫崟浣�
+     *
+     * @param label1 鍗曚綅
+     * @param label2 鍗曚綅
+     * @param label3 鍗曚綅
+     */
+    public void setLabels(String label1, String label2, String label3) {
+        if (label1 != null) {
+            wv_option1.setLabel(label1);
+        }
+        if (label2 != null) {
+            wv_option2.setLabel(label2);
+        }
+        if (label3 != null) {
+            wv_option3.setLabel(label3);
+        }
+    }
+
+    /**
+     * 璁剧疆x杞村亸绉婚噺
+     */
+    public void setTextXOffset(int x_offset_one, int x_offset_two, int x_offset_three) {
+        wv_option1.setTextXOffset(x_offset_one);
+        wv_option2.setTextXOffset(x_offset_two);
+        wv_option3.setTextXOffset(x_offset_three);
+    }
+
+    /**
+     * 璁剧疆鏄惁寰幆婊氬姩
+     *
+     * @param cyclic 鏄惁寰幆
+     */
+    public void setCyclic(boolean cyclic) {
+        wv_option1.setCyclic(cyclic);
+        wv_option2.setCyclic(cyclic);
+        wv_option3.setCyclic(cyclic);
+    }
+
+    /**
+     * 璁剧疆瀛椾綋鏍峰紡
+     *
+     * @param font 绯荤粺鎻愪緵鐨勫嚑绉嶆牱寮�
+     */
+    public void setTypeface(Typeface font) {
+        wv_option1.setTypeface(font);
+        wv_option2.setTypeface(font);
+        wv_option3.setTypeface(font);
+    }
+
+    /**
+     * 鍒嗗埆璁剧疆绗竴浜屼笁绾ф槸鍚﹀惊鐜粴鍔�
+     *
+     * @param cyclic1,cyclic2,cyclic3 鏄惁寰幆
+     */
+    public void setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {
+        wv_option1.setCyclic(cyclic1);
+        wv_option2.setCyclic(cyclic2);
+        wv_option3.setCyclic(cyclic3);
+    }
+
+    /**
+     * 杩斿洖褰撳墠閫変腑鐨勭粨鏋滃搴旂殑浣嶇疆鏁扮粍 鍥犱负鏀寔涓夌骇鑱斿姩鏁堟灉锛屽垎涓変釜绾у埆绱㈠紩锛�0锛�1锛�2銆�
+     * 鍦ㄥ揩閫熸粦鍔ㄦ湭鍋滄鏃讹紝鐐瑰嚮纭畾鎸夐挳锛屼細杩涜鍒ゆ柇锛屽鏋滃尮閰嶆暟鎹秺鐣岋紝鍒欒涓�0锛岄槻姝ndex鍑洪敊瀵艰嚧宕╂簝銆�
+     *
+     * @return 绱㈠紩鏁扮粍
+     */
+    public int[] getCurrentItems() {
+        int[] currentItems = new int[3];
+        currentItems[0] = wv_option1.getCurrentItem();
+
+        if (mOptions2Items != null && mOptions2Items.size() > 0) {//闈炵┖鍒ゆ柇
+            currentItems[1] = wv_option2.getCurrentItem() > (mOptions2Items.get(currentItems[0]).size() - 1) ? 0 : wv_option2.getCurrentItem();
+        } else {
+            currentItems[1] = wv_option2.getCurrentItem();
+        }
+
+        if (mOptions3Items != null && mOptions3Items.size() > 0) {//闈炵┖鍒ゆ柇
+            currentItems[2] = wv_option3.getCurrentItem() > (mOptions3Items.get(currentItems[0]).get(currentItems[1]).size() - 1) ? 0 : wv_option3.getCurrentItem();
+        } else {
+            currentItems[2] = wv_option3.getCurrentItem();
+        }
+
+        return currentItems;
+    }
+
+    public void setCurrentItems(int option1, int option2, int option3) {
+        if (linkage) {
+            itemSelected(option1, option2, option3);
+        } else {
+            wv_option1.setCurrentItem(option1);
+            wv_option2.setCurrentItem(option2);
+            wv_option3.setCurrentItem(option3);
+        }
+    }
+
+    private void itemSelected(int opt1Select, int opt2Select, int opt3Select) {
+        if (mOptions1Items != null) {
+            wv_option1.setCurrentItem(opt1Select);
+        }
+        if (mOptions2Items != null) {
+            wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(opt1Select)));
+            wv_option2.setCurrentItem(opt2Select);
+        }
+        if (mOptions3Items != null) {
+            wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(opt1Select).get(opt2Select)));
+            wv_option3.setCurrentItem(opt3Select);
+        }
+    }
+
+    /**
+     * 璁剧疆闂磋窛鍊嶆暟,浣嗘槸鍙兘鍦�1.2-4.0f涔嬮棿
+     *
+     * @param lineSpacingMultiplier
+     */
+    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        wv_option1.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_option2.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_option3.setLineSpacingMultiplier(lineSpacingMultiplier);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾跨殑棰滆壊
+     *
+     * @param dividerColor
+     */
+    public void setDividerColor(int dividerColor) {
+        wv_option1.setDividerColor(dividerColor);
+        wv_option2.setDividerColor(dividerColor);
+        wv_option3.setDividerColor(dividerColor);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾跨殑绫诲瀷
+     *
+     * @param dividerType
+     */
+    public void setDividerType(WheelView.DividerType dividerType) {
+        wv_option1.setDividerType(dividerType);
+        wv_option2.setDividerType(dividerType);
+        wv_option3.setDividerType(dividerType);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾夸箣闂寸殑鏂囧瓧鐨勯鑹�
+     *
+     * @param textColorCenter
+     */
+    public void setTextColorCenter(int textColorCenter) {
+        wv_option1.setTextColorCenter(textColorCenter);
+        wv_option2.setTextColorCenter(textColorCenter);
+        wv_option3.setTextColorCenter(textColorCenter);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾夸互澶栨枃瀛楃殑棰滆壊
+     *
+     * @param textColorOut
+     */
+    public void setTextColorOut(int textColorOut) {
+        wv_option1.setTextColorOut(textColorOut);
+        wv_option2.setTextColorOut(textColorOut);
+        wv_option3.setTextColorOut(textColorOut);
+    }
+
+    /**
+     * Label 鏄惁鍙樉绀轰腑闂撮�変腑椤圭殑
+     *
+     * @param isCenterLabel
+     */
+    public void isCenterLabel(boolean isCenterLabel) {
+        wv_option1.isCenterLabel(isCenterLabel);
+        wv_option2.isCenterLabel(isCenterLabel);
+        wv_option3.isCenterLabel(isCenterLabel);
+    }
+
+    public void setOptionsSelectChangeListener(OnOptionsSelectChangeListener optionsSelectChangeListener) {
+        this.optionsSelectChangeListener = optionsSelectChangeListener;
+    }
+
+    public void setLinkage(boolean linkage) {
+        this.linkage = linkage;
+    }
+
+    /**
+     * 璁剧疆鏈�澶у彲瑙佹暟鐩�
+     *
+     * @param itemsVisible 寤鸿璁剧疆涓� 3 ~ 9涔嬮棿銆�
+     */
+    public void setItemsVisible(int itemsVisible) {
+        wv_option1.setItemsVisibleCount(itemsVisible);
+        wv_option2.setItemsVisibleCount(itemsVisible);
+        wv_option3.setItemsVisibleCount(itemsVisible);
+    }
+
+    public void setAlphaGradient(boolean isAlphaGradient) {
+        wv_option1.setAlphaGradient(isAlphaGradient);
+        wv_option2.setAlphaGradient(isAlphaGradient);
+        wv_option3.setAlphaGradient(isAlphaGradient);
+    }
+}
diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
new file mode 100644
index 0000000..d7023bd
--- /dev/null
+++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
@@ -0,0 +1,900 @@
+package com.bigkoo.pickerview.view;
+
+import android.view.View;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.adapter.ArrayWheelAdapter;
+import com.bigkoo.pickerview.adapter.NumericWheelAdapter;
+import com.bigkoo.pickerview.listener.ISelectTimeCallback;
+import com.bigkoo.pickerview.utils.ChinaDate;
+import com.bigkoo.pickerview.utils.LunarCalendar;
+import com.contrarywind.listener.OnItemSelectedListener;
+import com.contrarywind.view.WheelView;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+
+
+public class WheelTime {
+    public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private View view;
+    private WheelView wv_year;
+    private WheelView wv_month;
+    private WheelView wv_day;
+    private WheelView wv_hours;
+    private WheelView wv_minutes;
+    private WheelView wv_seconds;
+    private int gravity;
+
+    private boolean[] type;
+    private static final int DEFAULT_START_YEAR = 1900;
+    private static final int DEFAULT_END_YEAR = 2100;
+    private static final int DEFAULT_START_MONTH = 1;
+    private static final int DEFAULT_END_MONTH = 12;
+    private static final int DEFAULT_START_DAY = 1;
+    private static final int DEFAULT_END_DAY = 31;
+
+    private int startYear = DEFAULT_START_YEAR;
+    private int endYear = DEFAULT_END_YEAR;
+    private int startMonth = DEFAULT_START_MONTH;
+    private int endMonth = DEFAULT_END_MONTH;
+    private int startDay = DEFAULT_START_DAY;
+    private int endDay = DEFAULT_END_DAY; //琛ㄧず31澶╃殑
+    private int currentYear;
+
+    private int textSize;
+
+    private boolean isLunarCalendar = false;
+    private ISelectTimeCallback mSelectChangeCallback;
+
+    public WheelTime(View view, boolean[] type, int gravity, int textSize) {
+        super();
+        this.view = view;
+        this.type = type;
+        this.gravity = gravity;
+        this.textSize = textSize;
+    }
+
+    public void setLunarMode(boolean isLunarCalendar) {
+        this.isLunarCalendar = isLunarCalendar;
+    }
+
+    public boolean isLunarMode() {
+        return isLunarCalendar;
+    }
+
+    public void setPicker(int year, int month, int day) {
+        this.setPicker(year, month, day, 0, 0, 0);
+    }
+
+    public void setPicker(int year, final int month, int day, int h, int m, int s) {
+        if (isLunarCalendar) {
+            int[] lunar = LunarCalendar.solarToLunar(year, month + 1, day);
+            setLunar(lunar[0], lunar[1] - 1, lunar[2], lunar[3] == 1, h, m, s);
+        } else {
+            setSolar(year, month, day, h, m, s);
+        }
+    }
+
+    /**
+     * 璁剧疆鍐滃巻
+     *
+     * @param year
+     * @param month
+     * @param day
+     * @param h
+     * @param m
+     * @param s
+     */
+    private void setLunar(int year, final int month, int day, boolean isLeap, int h, int m, int s) {
+        // 骞�
+        wv_year = (WheelView) view.findViewById(R.id.year);
+        wv_year.setAdapter(new ArrayWheelAdapter(ChinaDate.getYears(startYear, endYear)));// 璁剧疆"骞�"鐨勬樉绀烘暟鎹�
+        wv_year.setLabel("");// 娣诲姞鏂囧瓧
+        wv_year.setCurrentItem(year - startYear);// 鍒濆鍖栨椂鏄剧ず鐨勬暟鎹�
+        wv_year.setGravity(gravity);
+
+        // 鏈�
+        wv_month = (WheelView) view.findViewById(R.id.month);
+        wv_month.setAdapter(new ArrayWheelAdapter(ChinaDate.getMonths(year)));
+        wv_month.setLabel("");
+
+        int leapMonth = ChinaDate.leapMonth(year);
+        if (leapMonth != 0 && (month > leapMonth - 1 || isLeap)) { //閫変腑鏈堟槸闂版湀鎴栧ぇ浜庨棸鏈�
+            wv_month.setCurrentItem(month + 1);
+        } else {
+            wv_month.setCurrentItem(month);
+        }
+
+        wv_month.setGravity(gravity);
+
+        // 鏃�
+        wv_day = (WheelView) view.findViewById(R.id.day);
+        // 鍒ゆ柇澶у皬鏈堝強鏄惁闂板勾,鐢ㄦ潵纭畾"鏃�"鐨勬暟鎹�
+        if (ChinaDate.leapMonth(year) == 0) {
+            wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year, month))));
+        } else {
+            wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year))));
+        }
+        wv_day.setLabel("");
+        wv_day.setCurrentItem(day - 1);
+        wv_day.setGravity(gravity);
+
+        wv_hours = (WheelView) view.findViewById(R.id.hour);
+        wv_hours.setAdapter(new NumericWheelAdapter(0, 23));
+        //wv_hours.setLabel(context.getString(R.string.pickerview_hours));// 娣诲姞鏂囧瓧
+        wv_hours.setCurrentItem(h);
+        wv_hours.setGravity(gravity);
+
+        wv_minutes = (WheelView) view.findViewById(R.id.min);
+        wv_minutes.setAdapter(new NumericWheelAdapter(0, 59));
+        //wv_minutes.setLabel(context.getString(R.string.pickerview_minutes));// 娣诲姞鏂囧瓧
+        wv_minutes.setCurrentItem(m);
+        wv_minutes.setGravity(gravity);
+
+        wv_seconds = (WheelView) view.findViewById(R.id.second);
+        wv_seconds.setAdapter(new NumericWheelAdapter(0, 59));
+        //wv_seconds.setLabel(context.getString(R.string.pickerview_minutes));// 娣诲姞鏂囧瓧
+        wv_seconds.setCurrentItem(m);
+        wv_seconds.setGravity(gravity);
+
+        // 娣诲姞"骞�"鐩戝惉
+        wv_year.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int year_num = index + startYear;
+                // 鍒ゆ柇鏄笉鏄棸骞�,鏉ョ‘瀹氭湀鍜屾棩鐨勯�夋嫨
+                wv_month.setAdapter(new ArrayWheelAdapter(ChinaDate.getMonths(year_num)));
+                if (ChinaDate.leapMonth(year_num) != 0 && wv_month.getCurrentItem() > ChinaDate.leapMonth(year_num) - 1) {
+                    wv_month.setCurrentItem(wv_month.getCurrentItem() + 1);
+                } else {
+                    wv_month.setCurrentItem(wv_month.getCurrentItem());
+                }
+
+                int currentIndex = wv_day.getCurrentItem();
+                int maxItem = 29;
+                if (ChinaDate.leapMonth(year_num) != 0 && wv_month.getCurrentItem() > ChinaDate.leapMonth(year_num) - 1) {
+                    if (wv_month.getCurrentItem() == ChinaDate.leapMonth(year_num) + 1) {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year_num))));
+                        maxItem = ChinaDate.leapDays(year_num);
+                    } else {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, wv_month.getCurrentItem()))));
+                        maxItem = ChinaDate.monthDays(year_num, wv_month.getCurrentItem());
+                    }
+                } else {
+                    wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, wv_month.getCurrentItem() + 1))));
+                    maxItem = ChinaDate.monthDays(year_num, wv_month.getCurrentItem() + 1);
+                }
+
+                if (currentIndex > maxItem - 1) {
+                    wv_day.setCurrentItem(maxItem - 1);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+        // 娣诲姞"鏈�"鐩戝惉
+        wv_month.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int month_num = index;
+                int year_num = wv_year.getCurrentItem() + startYear;
+                int currentIndex = wv_day.getCurrentItem();
+                int maxItem = 29;
+                if (ChinaDate.leapMonth(year_num) != 0 && month_num > ChinaDate.leapMonth(year_num) - 1) {
+                    if (wv_month.getCurrentItem() == ChinaDate.leapMonth(year_num) + 1) {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year_num))));
+                        maxItem = ChinaDate.leapDays(year_num);
+                    } else {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, month_num))));
+                        maxItem = ChinaDate.monthDays(year_num, month_num);
+                    }
+                } else {
+                    wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, month_num + 1))));
+                    maxItem = ChinaDate.monthDays(year_num, month_num + 1);
+                }
+
+                if (currentIndex > maxItem - 1) {
+                    wv_day.setCurrentItem(maxItem - 1);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+        setChangedListener(wv_day);
+        setChangedListener(wv_hours);
+        setChangedListener(wv_minutes);
+        setChangedListener(wv_seconds);
+
+        if (type.length != 6) {
+            throw new RuntimeException("type[] length is not 6");
+        }
+        wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE);
+        wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE);
+        wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE);
+        wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE);
+        wv_minutes.setVisibility(type[4] ? View.VISIBLE : View.GONE);
+        wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE);
+        setContentTextSize();
+    }
+
+    /**
+     * 璁剧疆鍏巻
+     *
+     * @param year
+     * @param month
+     * @param day
+     * @param h
+     * @param m
+     * @param s
+     */
+    private void setSolar(int year, final int month, int day, int h, int m, int s) {
+        // 娣诲姞澶у皬鏈堟湀浠藉苟灏嗗叾杞崲涓簂ist,鏂逛究涔嬪悗鐨勫垽鏂�
+        String[] months_big = {"1", "3", "5", "7", "8", "10", "12"};
+        String[] months_little = {"4", "6", "9", "11"};
+
+        final List<String> list_big = Arrays.asList(months_big);
+        final List<String> list_little = Arrays.asList(months_little);
+
+        currentYear = year;
+        // 骞�
+        wv_year = (WheelView) view.findViewById(R.id.year);
+        wv_year.setAdapter(new NumericWheelAdapter(startYear, endYear));// 璁剧疆"骞�"鐨勬樉绀烘暟鎹�
+
+
+        wv_year.setCurrentItem(year - startYear);// 鍒濆鍖栨椂鏄剧ず鐨勬暟鎹�
+        wv_year.setGravity(gravity);
+        // 鏈�
+        wv_month = (WheelView) view.findViewById(R.id.month);
+        if (startYear == endYear) {//寮�濮嬪勾绛変簬缁堟骞�
+            wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));
+            wv_month.setCurrentItem(month + 1 - startMonth);
+        } else if (year == startYear) {
+            //璧峰鏃ユ湡鐨勬湀浠芥帶鍒�
+            wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));
+            wv_month.setCurrentItem(month + 1 - startMonth);
+        } else if (year == endYear) {
+            //缁堟鏃ユ湡鐨勬湀浠芥帶鍒�
+            wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));
+            wv_month.setCurrentItem(month);
+        } else {
+            wv_month.setAdapter(new NumericWheelAdapter(1, 12));
+            wv_month.setCurrentItem(month);
+        }
+        wv_month.setGravity(gravity);
+        // 鏃�
+        wv_day = (WheelView) view.findViewById(R.id.day);
+
+        boolean leapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
+        if (startYear == endYear && startMonth == endMonth) {
+            if (list_big.contains(String.valueOf(month + 1))) {
+                if (endDay > 31) {
+                    endDay = 31;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+                if (endDay > 30) {
+                    endDay = 30;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+            } else {
+                // 闂板勾
+                if (leapYear) {
+                    if (endDay > 29) {
+                        endDay = 29;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+                } else {
+                    if (endDay > 28) {
+                        endDay = 28;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+                }
+            }
+            wv_day.setCurrentItem(day - startDay);
+        } else if (year == startYear && month + 1 == startMonth) {
+            // 璧峰鏃ユ湡鐨勫ぉ鏁版帶鍒�
+            if (list_big.contains(String.valueOf(month + 1))) {
+
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, 31));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, 30));
+            } else {
+                // 闂板勾 29锛屽钩骞� 28
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, leapYear ? 29 : 28));
+            }
+            wv_day.setCurrentItem(day - startDay);
+        } else if (year == endYear && month + 1 == endMonth) {
+            // 缁堟鏃ユ湡鐨勫ぉ鏁版帶鍒�
+            if (list_big.contains(String.valueOf(month + 1))) {
+                if (endDay > 31) {
+                    endDay = 31;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+                if (endDay > 30) {
+                    endDay = 30;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+            } else {
+                // 闂板勾
+                if (leapYear) {
+                    if (endDay > 29) {
+                        endDay = 29;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+                } else {
+                    if (endDay > 28) {
+                        endDay = 28;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+                }
+            }
+            wv_day.setCurrentItem(day - 1);
+        } else {
+            // 鍒ゆ柇澶у皬鏈堝強鏄惁闂板勾,鐢ㄦ潵纭畾"鏃�"鐨勬暟鎹�
+            if (list_big.contains(String.valueOf(month + 1))) {
+                wv_day.setAdapter(new NumericWheelAdapter(1, 31));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+                wv_day.setAdapter(new NumericWheelAdapter(1, 30));
+            } else {
+                // 闂板勾 29锛屽钩骞� 28
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, leapYear ? 29 : 28));
+            }
+            wv_day.setCurrentItem(day - 1);
+        }
+
+        wv_day.setGravity(gravity);
+        //鏃�
+        wv_hours = (WheelView) view.findViewById(R.id.hour);
+        wv_hours.setAdapter(new NumericWheelAdapter(0, 23));
+
+        wv_hours.setCurrentItem(h);
+        wv_hours.setGravity(gravity);
+        //鍒�
+        wv_minutes = (WheelView) view.findViewById(R.id.min);
+        wv_minutes.setAdapter(new NumericWheelAdapter(0, 59));
+
+        wv_minutes.setCurrentItem(m);
+        wv_minutes.setGravity(gravity);
+        //绉�
+        wv_seconds = (WheelView) view.findViewById(R.id.second);
+        wv_seconds.setAdapter(new NumericWheelAdapter(0, 59));
+
+        wv_seconds.setCurrentItem(s);
+        wv_seconds.setGravity(gravity);
+
+        // 娣诲姞"骞�"鐩戝惉
+        wv_year.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int year_num = index + startYear;
+                currentYear = year_num;
+                int currentMonthItem = wv_month.getCurrentItem();//璁板綍涓婁竴娆$殑item浣嶇疆
+                // 鍒ゆ柇澶у皬鏈堝強鏄惁闂板勾,鐢ㄦ潵纭畾"鏃�"鐨勬暟鎹�
+                if (startYear == endYear) {
+                    //閲嶆柊璁剧疆鏈堜唤
+                    wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));
+
+                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
+                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
+                        wv_month.setCurrentItem(currentMonthItem);
+                    }
+
+                    int monthNum = currentMonthItem + startMonth;
+
+                    if (startMonth == endMonth) {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(year_num, monthNum, startDay, endDay, list_big, list_little);
+                    } else if (monthNum == startMonth) {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(year_num, monthNum, startDay, 31, list_big, list_little);
+                    } else if (monthNum == endMonth) {
+                        setReDay(year_num, monthNum, 1, endDay, list_big, list_little);
+                    } else {//閲嶆柊璁剧疆鏃�
+                        setReDay(year_num, monthNum, 1, 31, list_big, list_little);
+                    }
+                } else if (year_num == startYear) {//绛変簬寮�濮嬬殑骞�
+                    //閲嶆柊璁剧疆鏈堜唤
+                    wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));
+
+                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
+                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
+                        wv_month.setCurrentItem(currentMonthItem);
+                    }
+
+                    int month = currentMonthItem + startMonth;
+                    if (month == startMonth) {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(year_num, month, startDay, 31, list_big, list_little);
+                    } else {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(year_num, month, 1, 31, list_big, list_little);
+                    }
+
+                } else if (year_num == endYear) {
+                    //閲嶆柊璁剧疆鏈堜唤
+                    wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));
+                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
+                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
+                        wv_month.setCurrentItem(currentMonthItem);
+                    }
+                    int monthNum = currentMonthItem + 1;
+
+                    if (monthNum == endMonth) {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(year_num, monthNum, 1, endDay, list_big, list_little);
+                    } else {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(year_num, monthNum, 1, 31, list_big, list_little);
+                    }
+
+                } else {
+                    //閲嶆柊璁剧疆鏈堜唤
+                    wv_month.setAdapter(new NumericWheelAdapter(1, 12));
+                    //閲嶆柊璁剧疆鏃�
+                    setReDay(year_num, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+
+        // 娣诲姞"鏈�"鐩戝惉
+        wv_month.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int month_num = index + 1;
+
+                if (startYear == endYear) {
+                    month_num = month_num + startMonth - 1;
+                    if (startMonth == endMonth) {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(currentYear, month_num, startDay, endDay, list_big, list_little);
+                    } else if (startMonth == month_num) {
+
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(currentYear, month_num, startDay, 31, list_big, list_little);
+                    } else if (endMonth == month_num) {
+                        setReDay(currentYear, month_num, 1, endDay, list_big, list_little);
+                    } else {
+                        setReDay(currentYear, month_num, 1, 31, list_big, list_little);
+                    }
+                } else if (currentYear == startYear) {
+                    month_num = month_num + startMonth - 1;
+                    if (month_num == startMonth) {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(currentYear, month_num, startDay, 31, list_big, list_little);
+                    } else {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(currentYear, month_num, 1, 31, list_big, list_little);
+                    }
+
+                } else if (currentYear == endYear) {
+                    if (month_num == endMonth) {
+                        //閲嶆柊璁剧疆鏃�
+                        setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, endDay, list_big, list_little);
+                    } else {
+                        setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);
+                    }
+
+                } else {
+                    //閲嶆柊璁剧疆鏃�
+                    setReDay(currentYear, month_num, 1, 31, list_big, list_little);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+        setChangedListener(wv_day);
+        setChangedListener(wv_hours);
+        setChangedListener(wv_minutes);
+        setChangedListener(wv_seconds);
+
+        if (type.length != 6) {
+            throw new IllegalArgumentException("type[] length is not 6");
+        }
+        wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE);
+        wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE);
+        wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE);
+        wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE);
+        wv_minutes.setVisibility(type[4] ? View.VISIBLE : View.GONE);
+        wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE);
+        setContentTextSize();
+    }
+
+    private void setChangedListener(WheelView wheelView) {
+        if (mSelectChangeCallback != null) {
+            wheelView.setOnItemSelectedListener(new OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(int index) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            });
+        }
+
+    }
+
+
+    private void setReDay(int year_num, int monthNum, int startD, int endD, List<String> list_big, List<String> list_little) {
+        int currentItem = wv_day.getCurrentItem();
+
+//        int maxItem;
+        if (list_big.contains(String.valueOf(monthNum))) {
+            if (endD > 31) {
+                endD = 31;
+            }
+            wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//            maxItem = endD;
+        } else if (list_little.contains(String.valueOf(monthNum))) {
+            if (endD > 30) {
+                endD = 30;
+            }
+            wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//            maxItem = endD;
+        } else {
+            if ((year_num % 4 == 0 && year_num % 100 != 0)
+                    || year_num % 400 == 0) {
+                if (endD > 29) {
+                    endD = 29;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//                maxItem = endD;
+            } else {
+                if (endD > 28) {
+                    endD = 28;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//                maxItem = endD;
+            }
+        }
+
+        if (currentItem > wv_day.getAdapter().getItemsCount() - 1) {
+            currentItem = wv_day.getAdapter().getItemsCount() - 1;
+            wv_day.setCurrentItem(currentItem);
+        }
+    }
+
+
+    private void setContentTextSize() {
+        wv_day.setTextSize(textSize);
+        wv_month.setTextSize(textSize);
+        wv_year.setTextSize(textSize);
+        wv_hours.setTextSize(textSize);
+        wv_minutes.setTextSize(textSize);
+        wv_seconds.setTextSize(textSize);
+    }
+
+
+    public void setLabels(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {
+        if (isLunarCalendar) {
+            return;
+        }
+
+        if (label_year != null) {
+            wv_year.setLabel(label_year);
+        } else {
+            wv_year.setLabel(view.getContext().getString(R.string.pickerview_year));
+        }
+        if (label_month != null) {
+            wv_month.setLabel(label_month);
+        } else {
+            wv_month.setLabel(view.getContext().getString(R.string.pickerview_month));
+        }
+        if (label_day != null) {
+            wv_day.setLabel(label_day);
+        } else {
+            wv_day.setLabel(view.getContext().getString(R.string.pickerview_day));
+        }
+        if (label_hours != null) {
+            wv_hours.setLabel(label_hours);
+        } else {
+            wv_hours.setLabel(view.getContext().getString(R.string.pickerview_hours));
+        }
+        if (label_mins != null) {
+            wv_minutes.setLabel(label_mins);
+        } else {
+            wv_minutes.setLabel(view.getContext().getString(R.string.pickerview_minutes));
+        }
+        if (label_seconds != null) {
+            wv_seconds.setLabel(label_seconds);
+        } else {
+            wv_seconds.setLabel(view.getContext().getString(R.string.pickerview_seconds));
+        }
+
+    }
+
+    public void setTextXOffset(int x_offset_year, int x_offset_month, int x_offset_day,
+                               int x_offset_hours, int x_offset_minutes, int x_offset_seconds) {
+        wv_year.setTextXOffset(x_offset_year);
+        wv_month.setTextXOffset(x_offset_month);
+        wv_day.setTextXOffset(x_offset_day);
+        wv_hours.setTextXOffset(x_offset_hours);
+        wv_minutes.setTextXOffset(x_offset_minutes);
+        wv_seconds.setTextXOffset(x_offset_seconds);
+    }
+
+    /**
+     * 璁剧疆鏄惁寰幆婊氬姩
+     *
+     * @param cyclic
+     */
+    public void setCyclic(boolean cyclic) {
+        wv_year.setCyclic(cyclic);
+        wv_month.setCyclic(cyclic);
+        wv_day.setCyclic(cyclic);
+        wv_hours.setCyclic(cyclic);
+        wv_minutes.setCyclic(cyclic);
+        wv_seconds.setCyclic(cyclic);
+    }
+
+    public String getTime() {
+        if (isLunarCalendar) {
+            //濡傛灉鏄啘鍘� 杩斿洖瀵瑰簲鐨勫叕鍘嗘椂闂�
+            return getLunarTime();
+        }
+        StringBuilder sb = new StringBuilder();
+        if (currentYear == startYear) {
+           /* int i = wv_month.getCurrentItem() + startMonth;
+            System.out.println("i:" + i);*/
+            if ((wv_month.getCurrentItem() + startMonth) == startMonth) {
+                sb.append((wv_year.getCurrentItem() + startYear)).append("-")
+                        .append((wv_month.getCurrentItem() + startMonth)).append("-")
+                        .append((wv_day.getCurrentItem() + startDay)).append(" ")
+                        .append(wv_hours.getCurrentItem()).append(":")
+                        .append(wv_minutes.getCurrentItem()).append(":")
+                        .append(wv_seconds.getCurrentItem());
+            } else {
+                sb.append((wv_year.getCurrentItem() + startYear)).append("-")
+                        .append((wv_month.getCurrentItem() + startMonth)).append("-")
+                        .append((wv_day.getCurrentItem() + 1)).append(" ")
+                        .append(wv_hours.getCurrentItem()).append(":")
+                        .append(wv_minutes.getCurrentItem()).append(":")
+                        .append(wv_seconds.getCurrentItem());
+            }
+
+        } else {
+            sb.append((wv_year.getCurrentItem() + startYear)).append("-")
+                    .append((wv_month.getCurrentItem() + 1)).append("-")
+                    .append((wv_day.getCurrentItem() + 1)).append(" ")
+                    .append(wv_hours.getCurrentItem()).append(":")
+                    .append(wv_minutes.getCurrentItem()).append(":")
+                    .append(wv_seconds.getCurrentItem());
+        }
+
+        return sb.toString();
+    }
+
+
+    /**
+     * 鍐滃巻杩斿洖瀵瑰簲鐨勫叕鍘嗘椂闂�
+     *
+     * @return
+     */
+    private String getLunarTime() {
+        StringBuilder sb = new StringBuilder();
+        int year = wv_year.getCurrentItem() + startYear;
+        int month = 1;
+        boolean isLeapMonth = false;
+        if (ChinaDate.leapMonth(year) == 0) {
+            month = wv_month.getCurrentItem() + 1;
+        } else {
+            if ((wv_month.getCurrentItem() + 1) - ChinaDate.leapMonth(year) <= 0) {
+                month = wv_month.getCurrentItem() + 1;
+            } else if ((wv_month.getCurrentItem() + 1) - ChinaDate.leapMonth(year) == 1) {
+                month = wv_month.getCurrentItem();
+                isLeapMonth = true;
+            } else {
+                month = wv_month.getCurrentItem();
+            }
+        }
+        int day = wv_day.getCurrentItem() + 1;
+        int[] solar = LunarCalendar.lunarToSolar(year, month, day, isLeapMonth);
+
+        sb.append(solar[0]).append("-")
+                .append(solar[1]).append("-")
+                .append(solar[2]).append(" ")
+                .append(wv_hours.getCurrentItem()).append(":")
+                .append(wv_minutes.getCurrentItem()).append(":")
+                .append(wv_seconds.getCurrentItem());
+        return sb.toString();
+    }
+
+    public View getView() {
+        return view;
+    }
+
+    public int getStartYear() {
+        return startYear;
+    }
+
+    public void setStartYear(int startYear) {
+        this.startYear = startYear;
+    }
+
+    public int getEndYear() {
+        return endYear;
+    }
+
+    public void setEndYear(int endYear) {
+        this.endYear = endYear;
+    }
+
+
+    public void setRangDate(Calendar startDate, Calendar endDate) {
+
+        if (startDate == null && endDate != null) {
+            int year = endDate.get(Calendar.YEAR);
+            int month = endDate.get(Calendar.MONTH) + 1;
+            int day = endDate.get(Calendar.DAY_OF_MONTH);
+            if (year > startYear) {
+                this.endYear = year;
+                this.endMonth = month;
+                this.endDay = day;
+            } else if (year == startYear) {
+                if (month > startMonth) {
+                    this.endYear = year;
+                    this.endMonth = month;
+                    this.endDay = day;
+                } else if (month == startMonth) {
+                    if (day > startDay) {
+                        this.endYear = year;
+                        this.endMonth = month;
+                        this.endDay = day;
+                    }
+                }
+            }
+
+        } else if (startDate != null && endDate == null) {
+            int year = startDate.get(Calendar.YEAR);
+            int month = startDate.get(Calendar.MONTH) + 1;
+            int day = startDate.get(Calendar.DAY_OF_MONTH);
+            if (year < endYear) {
+                this.startMonth = month;
+                this.startDay = day;
+                this.startYear = year;
+            } else if (year == endYear) {
+                if (month < endMonth) {
+                    this.startMonth = month;
+                    this.startDay = day;
+                    this.startYear = year;
+                } else if (month == endMonth) {
+                    if (day < endDay) {
+                        this.startMonth = month;
+                        this.startDay = day;
+                        this.startYear = year;
+                    }
+                }
+            }
+
+        } else if (startDate != null && endDate != null) {
+            this.startYear = startDate.get(Calendar.YEAR);
+            this.endYear = endDate.get(Calendar.YEAR);
+            this.startMonth = startDate.get(Calendar.MONTH) + 1;
+            this.endMonth = endDate.get(Calendar.MONTH) + 1;
+            this.startDay = startDate.get(Calendar.DAY_OF_MONTH);
+            this.endDay = endDate.get(Calendar.DAY_OF_MONTH);
+        }
+
+    }
+
+    /**
+     * 璁剧疆闂磋窛鍊嶆暟,浣嗘槸鍙兘鍦�1.0-4.0f涔嬮棿
+     *
+     * @param lineSpacingMultiplier
+     */
+    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        wv_day.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_month.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_year.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_hours.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_minutes.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_seconds.setLineSpacingMultiplier(lineSpacingMultiplier);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾跨殑棰滆壊
+     *
+     * @param dividerColor
+     */
+    public void setDividerColor(int dividerColor) {
+        wv_day.setDividerColor(dividerColor);
+        wv_month.setDividerColor(dividerColor);
+        wv_year.setDividerColor(dividerColor);
+        wv_hours.setDividerColor(dividerColor);
+        wv_minutes.setDividerColor(dividerColor);
+        wv_seconds.setDividerColor(dividerColor);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾跨殑绫诲瀷
+     *
+     * @param dividerType
+     */
+    public void setDividerType(WheelView.DividerType dividerType) {
+        wv_day.setDividerType(dividerType);
+        wv_month.setDividerType(dividerType);
+        wv_year.setDividerType(dividerType);
+        wv_hours.setDividerType(dividerType);
+        wv_minutes.setDividerType(dividerType);
+        wv_seconds.setDividerType(dividerType);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾夸箣闂寸殑鏂囧瓧鐨勯鑹�
+     *
+     * @param textColorCenter
+     */
+    public void setTextColorCenter(int textColorCenter) {
+        wv_day.setTextColorCenter(textColorCenter);
+        wv_month.setTextColorCenter(textColorCenter);
+        wv_year.setTextColorCenter(textColorCenter);
+        wv_hours.setTextColorCenter(textColorCenter);
+        wv_minutes.setTextColorCenter(textColorCenter);
+        wv_seconds.setTextColorCenter(textColorCenter);
+    }
+
+    /**
+     * 璁剧疆鍒嗗壊绾夸互澶栨枃瀛楃殑棰滆壊
+     *
+     * @param textColorOut
+     */
+    public void setTextColorOut(int textColorOut) {
+        wv_day.setTextColorOut(textColorOut);
+        wv_month.setTextColorOut(textColorOut);
+        wv_year.setTextColorOut(textColorOut);
+        wv_hours.setTextColorOut(textColorOut);
+        wv_minutes.setTextColorOut(textColorOut);
+        wv_seconds.setTextColorOut(textColorOut);
+    }
+
+    /**
+     * @param isCenterLabel 鏄惁鍙樉绀轰腑闂撮�変腑椤圭殑
+     */
+    public void isCenterLabel(boolean isCenterLabel) {
+        wv_day.isCenterLabel(isCenterLabel);
+        wv_month.isCenterLabel(isCenterLabel);
+        wv_year.isCenterLabel(isCenterLabel);
+        wv_hours.isCenterLabel(isCenterLabel);
+        wv_minutes.isCenterLabel(isCenterLabel);
+        wv_seconds.isCenterLabel(isCenterLabel);
+    }
+
+    public void setSelectChangeCallback(ISelectTimeCallback mSelectChangeCallback) {
+        this.mSelectChangeCallback = mSelectChangeCallback;
+    }
+
+    public void setItemsVisible(int itemsVisibleCount) {
+        wv_day.setItemsVisibleCount(itemsVisibleCount);
+        wv_month.setItemsVisibleCount(itemsVisibleCount);
+        wv_year.setItemsVisibleCount(itemsVisibleCount);
+        wv_hours.setItemsVisibleCount(itemsVisibleCount);
+        wv_minutes.setItemsVisibleCount(itemsVisibleCount);
+        wv_seconds.setItemsVisibleCount(itemsVisibleCount);
+    }
+
+    public void setAlphaGradient(boolean isAlphaGradient) {
+        wv_day.setAlphaGradient(isAlphaGradient);
+        wv_month.setAlphaGradient(isAlphaGradient);
+        wv_year.setAlphaGradient(isAlphaGradient);
+        wv_hours.setAlphaGradient(isAlphaGradient);
+        wv_minutes.setAlphaGradient(isAlphaGradient);
+        wv_seconds.setAlphaGradient(isAlphaGradient);
+    }
+}
diff --git a/pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml b/pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml
new file mode 100644
index 0000000..d374b90
--- /dev/null
+++ b/pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+  <alpha
+      android:duration="@integer/animation_default_duration"
+      android:fromAlpha="0.0"
+      android:toAlpha="1.0" />
+
+  <scale
+      android:duration="@integer/animation_default_duration"
+      android:fromXScale="0.0"
+      android:toXScale="1.0"
+      android:fromYScale="0.0"
+      android:toYScale="1.0"
+      android:pivotX="50%"
+      android:pivotY="50%"/>
+
+</set>
\ No newline at end of file
diff --git a/pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml b/pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml
new file mode 100644
index 0000000..64acb59
--- /dev/null
+++ b/pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+  <alpha
+      android:duration="@integer/animation_default_duration"
+      android:fromAlpha="1.0"
+      android:toAlpha="0.3" />
+
+  <scale
+      android:duration="@integer/animation_default_duration"
+      android:fromXScale="1.0"
+      android:toXScale="0.0"
+      android:fromYScale="1.0"
+      android:toYScale="0.0"
+      android:pivotX="50%"
+      android:pivotY="50%"/>
+</set>
\ No newline at end of file
diff --git a/pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml b/pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml
new file mode 100644
index 0000000..58fd94b
--- /dev/null
+++ b/pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+     android:shareInterpolator="false">
+
+  <translate
+      android:duration="@integer/animation_default_duration"
+      android:fromXDelta="0%"
+      android:toXDelta="0%"
+      android:fromYDelta="100%"
+      android:toYDelta="0%"/>
+</set>
\ No newline at end of file
diff --git a/pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml b/pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml
new file mode 100644
index 0000000..6a45af3
--- /dev/null
+++ b/pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+     android:shareInterpolator="false">
+
+  <translate
+      android:duration="@integer/animation_default_duration"
+      android:fromXDelta="0%"
+      android:toXDelta="0%"
+      android:fromYDelta="0%"
+      android:toYDelta="100%"/>
+</set>
\ No newline at end of file
diff --git a/pickerview/src/main/res/drawable/selector_pickerview_btn.xml b/pickerview/src/main/res/drawable/selector_pickerview_btn.xml
new file mode 100644
index 0000000..fd6ad35
--- /dev/null
+++ b/pickerview/src/main/res/drawable/selector_pickerview_btn.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true" android:color="@color/pickerview_timebtn_pre" />
+    <item android:color="@color/pickerview_timebtn_nor" />
+</selector>
diff --git a/pickerview/src/main/res/layout/include_pickerview_topbar.xml b/pickerview/src/main/res/layout/include_pickerview_topbar.xml
new file mode 100644
index 0000000..f7d4812
--- /dev/null
+++ b/pickerview/src/main/res/layout/include_pickerview_topbar.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/rv_topbar"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/pickerview_bgColor_default">
+
+    <Button
+        android:id="@+id/btnCancel"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:background="@android:color/transparent"
+        android:gravity="left|center_vertical"
+        android:paddingLeft="@dimen/pickerview_topbar_padding"
+        android:text="@string/pickerview_cancel"
+        android:textAllCaps="false"
+        android:textColor="@drawable/selector_pickerview_btn"
+        android:textSize="@dimen/pickerview_topbar_btn_textsize" />
+
+    <TextView
+        android:id="@+id/tvTitle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_toLeftOf="@+id/btnSubmit"
+        android:layout_toRightOf="@+id/btnCancel"
+        android:gravity="center"
+        android:textColor="@color/pickerview_topbar_title"
+        android:textSize="@dimen/pickerview_topbar_title_textsize"
+        />
+
+    <Button
+        android:id="@id/btnSubmit"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignParentRight="true"
+        android:background="@android:color/transparent"
+        android:gravity="right|center_vertical"
+        android:paddingRight="@dimen/pickerview_topbar_padding"
+        android:text="@string/pickerview_submit"
+        android:textAllCaps="false"
+        android:textColor="@drawable/selector_pickerview_btn"
+        android:textSize="@dimen/pickerview_topbar_btn_textsize" />
+</RelativeLayout>
diff --git a/pickerview/src/main/res/layout/layout_basepickerview.xml b/pickerview/src/main/res/layout/layout_basepickerview.xml
new file mode 100644
index 0000000..091ff8d
--- /dev/null
+++ b/pickerview/src/main/res/layout/layout_basepickerview.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    android:id="@+id/outmost_container"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clickable="true"
+    android:background="@color/pickerview_bgColor_overlay">
+
+    <FrameLayout
+        android:id="@+id/content_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+    </FrameLayout>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/pickerview/src/main/res/layout/pickerview_options.xml b/pickerview/src/main/res/layout/pickerview_options.xml
new file mode 100644
index 0000000..a5e3378
--- /dev/null
+++ b/pickerview/src/main/res/layout/pickerview_options.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <include
+        layout="@layout/include_pickerview_topbar"
+        android:layout_width="match_parent"
+        android:layout_height="50dp" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="#E1E1E1" />
+
+    <LinearLayout
+        android:id="@+id/optionspicker"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@android:color/white"
+        android:gravity="center"
+        android:minHeight="180dp"
+        android:orientation="horizontal">
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/options1"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/options2"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/options3"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+    </LinearLayout>
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/pickerview/src/main/res/layout/pickerview_time.xml b/pickerview/src/main/res/layout/pickerview_time.xml
new file mode 100644
index 0000000..8ea76e0
--- /dev/null
+++ b/pickerview/src/main/res/layout/pickerview_time.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <include
+        layout="@layout/include_pickerview_topbar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/pickerview_topbar_height" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="#E1E1E1" />
+
+    <LinearLayout
+        android:id="@+id/timepicker"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@android:color/white"
+        android:gravity="center"
+        android:minHeight="150dp"
+        android:orientation="horizontal">
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/year"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="0.96" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/month"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/day"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/hour"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/min"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/second"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+    </LinearLayout>
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/pickerview/src/main/res/values-en/strings.xml b/pickerview/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..6ba3260
--- /dev/null
+++ b/pickerview/src/main/res/values-en/strings.xml
@@ -0,0 +1,11 @@
+<resources>
+
+    <string name="pickerview_cancel">Cancel</string>
+    <string name="pickerview_submit">Confirm</string>
+    <string name="pickerview_year"> </string>
+    <string name="pickerview_month"> </string>
+    <string name="pickerview_day"> </string>
+    <string name="pickerview_hours"> </string>
+    <string name="pickerview_minutes"> </string>
+    <string name="pickerview_seconds"> </string>
+</resources>
diff --git a/pickerview/src/main/res/values/dimens.xml b/pickerview/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..9ea5247
--- /dev/null
+++ b/pickerview/src/main/res/values/dimens.xml
@@ -0,0 +1,13 @@
+<resources>
+    <!-- 椤堕儴鎸夐挳鏍忛珮搴� -->
+    <dimen name="pickerview_topbar_height">52dp</dimen>
+
+    <!-- 椤堕儴鎸夐挳padding -->
+    <dimen name="pickerview_topbar_padding">20dp</dimen>
+
+    <!-- 椤堕儴鎸夐挳鏂囧瓧澶у皬 -->
+    <dimen name="pickerview_topbar_btn_textsize">17sp</dimen>
+    <dimen name="pickerview_topbar_title_textsize">18sp</dimen>
+    <!-- 閫夐」鏂囧瓧澶у皬 -->
+    <dimen name="pickerview_textsize">20sp</dimen>
+</resources>
diff --git a/pickerview/src/main/res/values/integers.xml b/pickerview/src/main/res/values/integers.xml
new file mode 100644
index 0000000..d3fb3c1
--- /dev/null
+++ b/pickerview/src/main/res/values/integers.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+  <integer name="animation_default_duration">300</integer>
+</resources>
\ No newline at end of file
diff --git a/pickerview/src/main/res/values/strings.xml b/pickerview/src/main/res/values/strings.xml
new file mode 100644
index 0000000..3c7f01a
--- /dev/null
+++ b/pickerview/src/main/res/values/strings.xml
@@ -0,0 +1,11 @@
+<resources>
+
+    <string name="pickerview_cancel">鍙栨秷</string>
+    <string name="pickerview_submit">纭畾</string>
+    <string name="pickerview_year">骞�</string>
+    <string name="pickerview_month">鏈�</string>
+    <string name="pickerview_day">鏃�</string>
+    <string name="pickerview_hours">鏃�</string>
+    <string name="pickerview_minutes">鍒�</string>
+    <string name="pickerview_seconds">绉�</string>
+</resources>
diff --git a/pickerview/src/main/res/values/styles.xml b/pickerview/src/main/res/values/styles.xml
new file mode 100644
index 0000000..29a356b
--- /dev/null
+++ b/pickerview/src/main/res/values/styles.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <style name="custom_dialog2" parent="@android:style/Theme.Dialog">
+        <item name="android:windowFrame">@null</item>
+        <!-- Dialog鐨剋indowFrame妗嗕负鏃� -->
+        <item name="android:windowIsFloating">true</item>
+        <!-- 鏄惁婕傜幇鍦╝ctivity涓� -->
+        <item name="android:windowIsTranslucent">true</item>
+        <!-- 鏄惁鍗婇�忔槑 -->
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:background">@null</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <!-- 鍘婚櫎榛戣壊杈规鐨勫叧閿缃」 -->
+        <item name="android:backgroundDimEnabled">true</item>
+        <!-- 灞忓箷鑳屾櫙鏄惁鍙樻殫 -->
+        <item name="android:backgroundDimAmount">0.3</item>
+    </style>
+
+    <style name="picker_view_scale_anim" mce_bogus="1" parent="android:Animation">
+        <item name="android:windowEnterAnimation">@anim/pickerview_dialog_scale_in</item>
+        <item name="android:windowExitAnimation">@anim/pickerview_dialog_scale_out</item>
+    </style>
+
+
+    <style name="picker_view_slide_anim" mce_bogus="1" parent="android:Animation">
+        <item name="android:windowEnterAnimation">@anim/pickerview_slide_in_bottom</item>
+        <item name="android:windowExitAnimation">@anim/pickerview_slide_out_bottom</item>
+    </style>
+
+</resources>
diff --git a/settings.gradle b/settings.gradle
index fa03948..151d3ce 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,4 +2,6 @@
 include ':app'
 include ':third-zxing'
 include ':countrypicker'
-//include ':sdk'
+include ':aa_chart_core'
+include ':pickerview'
+include ':wheelview'
diff --git a/third-zxing/build.gradle b/third-zxing/build.gradle
index 2961ed2..c39f127 100644
--- a/third-zxing/build.gradle
+++ b/third-zxing/build.gradle
@@ -2,12 +2,12 @@
 
 
 android {
-    compileSdkVersion 29
+    compileSdkVersion 30
     buildToolsVersion "29.0.1"
 
     defaultConfig {
-        minSdkVersion 21
-        targetSdkVersion 26
+        minSdkVersion 23
+        targetSdkVersion 30
         versionCode 1
         versionName "1.0"
 
diff --git a/third-zxing/src/main/java/com/zxing/qrcode/CaptureActivity.java b/third-zxing/src/main/java/com/zxing/qrcode/CaptureActivity.java
index 8e15982..51ddfa1 100644
--- a/third-zxing/src/main/java/com/zxing/qrcode/CaptureActivity.java
+++ b/third-zxing/src/main/java/com/zxing/qrcode/CaptureActivity.java
@@ -100,7 +100,7 @@
     public void afterViewBind(View rootView, Bundle savedInstanceState) {
 
         light_iv = findViewById(R.id.light_iv);
-        backll = findViewById(R.id.top_back_btn);
+        backll = findViewById(R.id.top_back_ll);
         backll.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
diff --git a/third-zxing/src/main/res/layout/activity_capture.xml b/third-zxing/src/main/res/layout/activity_capture.xml
index 417171b..66698cd 100644
--- a/third-zxing/src/main/res/layout/activity_capture.xml
+++ b/third-zxing/src/main/res/layout/activity_capture.xml
@@ -16,7 +16,7 @@
 
         <!--1.杩斿洖鎸夐挳 澧炲ぇ鐐瑰嚮鍖哄煙-->
         <LinearLayout
-            android:id="@+id/top_back_btn"
+            android:id="@+id/top_back_ll"
             android:layout_width="56dp"
             android:layout_height="match_parent"
             android:gravity="center_vertical"
diff --git a/wheelview/.gitignore b/wheelview/.gitignore
new file mode 100644
index 0000000..43cf153
--- /dev/null
+++ b/wheelview/.gitignore
@@ -0,0 +1,12 @@
+/build
+*.idea
+/.idea/libraries
+/.idea/modules
+/.idea/compiler.xml
+/.idea/gradle.xml
+/.idea/jarRepositories.xml
+/.idea/misc.xml
+/.idea/modules.xml
+/.idea/vcs.xml
+/.idea/workspace.xml
+/release
\ No newline at end of file
diff --git a/wheelview/build.gradle b/wheelview/build.gradle
new file mode 100644
index 0000000..6bd966b
--- /dev/null
+++ b/wheelview/build.gradle
@@ -0,0 +1,47 @@
+apply plugin: 'com.android.library'
+//apply plugin: 'com.novoda.bintray-release'//娣诲姞鎻掍欢
+
+
+
+android {
+    compileSdkVersion 31
+
+    defaultConfig {
+        minSdkVersion 23
+        targetSdkVersion 31
+        versionCode 31
+        versionName "4.1.0"
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+    lintOptions {
+        abortOnError false
+    }
+}
+
+//allprojects {
+//    tasks.withType(Javadoc) {//鍏煎涓枃瀛楃
+//        options{
+//            encoding "UTF-8"
+//            charSet 'UTF-8'
+//            links "http://docs.oracle.com/javase/7/docs/api"
+//        }
+//    }
+//}
+//publish {
+//    userOrg = 'contrarywind'//bintray.com 鐢ㄦ埛鍚�/缁勭粐鍚� user/org name
+//    groupId = 'com.contrarywind'//JCenter涓婃樉绀虹殑璺緞 path
+//    artifactId = 'wheelview'//椤圭洰鍚嶇О project name
+//    publishVersion = '4.1.0'//鐗堟湰鍙� version code
+//    desc = 'this is a wheelview for android'//椤圭洰鎻忚堪 description
+//    website = 'https://github.com/Bigkoo/Android-PickerView' //椤圭洰缃戝潃閾炬帴 link
+//}
+
+dependencies {
+//    compile fileTree(include: ['*.jar'], dir: 'libs')
+    implementation 'com.android.support:support-annotations:28.0.0'
+}
\ No newline at end of file
diff --git a/wheelview/proguard-rules.pro b/wheelview/proguard-rules.pro
new file mode 100644
index 0000000..8b26010
--- /dev/null
+++ b/wheelview/proguard-rules.pro
@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\song\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/wheelview/src/androidTest/java/test/wheelview/ExampleInstrumentedTest.java b/wheelview/src/androidTest/java/test/wheelview/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..b5aa002
--- /dev/null
+++ b/wheelview/src/androidTest/java/test/wheelview/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package test.wheelview;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumentation test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() throws Exception {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getTargetContext();
+
+        assertEquals("test.wheelview.test", appContext.getPackageName());
+    }
+}
diff --git a/wheelview/src/main/AndroidManifest.xml b/wheelview/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..88cabec
--- /dev/null
+++ b/wheelview/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.contrarywind.view">
+
+</manifest>
diff --git a/wheelview/src/main/java/com/contrarywind/adapter/WheelAdapter.java b/wheelview/src/main/java/com/contrarywind/adapter/WheelAdapter.java
new file mode 100644
index 0000000..5e53b7b
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/adapter/WheelAdapter.java
@@ -0,0 +1,25 @@
+package com.contrarywind.adapter;
+
+
+public interface WheelAdapter<T> {
+	/**
+	 * Gets items count
+	 * @return the count of wheel items
+	 */
+	int getItemsCount();
+	
+	/**
+	 * Gets a wheel item by index.
+	 * @param index the item index
+	 * @return the wheel item text or null
+	 */
+	T getItem(int index);
+	
+	/**
+	 * Gets maximum item length. It is used to determine the wheel width.
+	 * If -1 is returned there will be used the default wheel width.
+	 * @param o  the item object
+	 * @return the maximum item length or -1
+     */
+	int indexOf(T o);
+}
diff --git a/wheelview/src/main/java/com/contrarywind/interfaces/IPickerViewData.java b/wheelview/src/main/java/com/contrarywind/interfaces/IPickerViewData.java
new file mode 100644
index 0000000..33c4956
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/interfaces/IPickerViewData.java
@@ -0,0 +1,8 @@
+package com.contrarywind.interfaces;
+
+/**
+ * Created by Sai on 2016/7/13.
+ */
+public interface IPickerViewData {
+    String getPickerViewText();
+}
diff --git a/wheelview/src/main/java/com/contrarywind/listener/LoopViewGestureListener.java b/wheelview/src/main/java/com/contrarywind/listener/LoopViewGestureListener.java
new file mode 100644
index 0000000..da8266c
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/listener/LoopViewGestureListener.java
@@ -0,0 +1,25 @@
+package com.contrarywind.listener;
+
+import android.view.MotionEvent;
+
+import com.contrarywind.view.WheelView;
+
+
+/**
+ * 鎵嬪娍鐩戝惉
+ */
+public final class LoopViewGestureListener extends android.view.GestureDetector.SimpleOnGestureListener {
+
+    private final WheelView wheelView;
+
+
+    public LoopViewGestureListener(WheelView wheelView) {
+        this.wheelView = wheelView;
+    }
+
+    @Override
+    public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+        wheelView.scrollBy(velocityY);
+        return true;
+    }
+}
diff --git a/wheelview/src/main/java/com/contrarywind/listener/OnItemSelectedListener.java b/wheelview/src/main/java/com/contrarywind/listener/OnItemSelectedListener.java
new file mode 100644
index 0000000..953841a
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/listener/OnItemSelectedListener.java
@@ -0,0 +1,6 @@
+package com.contrarywind.listener;
+
+
+public interface OnItemSelectedListener {
+    void onItemSelected(int index);
+}
diff --git a/wheelview/src/main/java/com/contrarywind/timer/InertiaTimerTask.java b/wheelview/src/main/java/com/contrarywind/timer/InertiaTimerTask.java
new file mode 100644
index 0000000..2e5f061
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/timer/InertiaTimerTask.java
@@ -0,0 +1,79 @@
+package com.contrarywind.timer;
+
+import com.contrarywind.view.WheelView;
+
+import java.util.TimerTask;
+
+/**
+ * 婊氬姩鎯�х殑瀹炵幇
+ *
+ * @author 灏忓旦
+ * date:  2017-12-23 23:20:44
+ */
+public final class InertiaTimerTask extends TimerTask {
+
+    private float mCurrentVelocityY; //褰撳墠婊戝姩閫熷害
+    private final float mFirstVelocityY;//鎵嬫寚绂诲紑灞忓箷鏃剁殑鍒濆閫熷害
+    private final WheelView mWheelView;
+
+    /**
+     * @param wheelView 婊氳疆瀵硅薄
+     * @param velocityY Y杞存粦琛岄�熷害
+     */
+    public InertiaTimerTask(WheelView wheelView, float velocityY) {
+        super();
+        this.mWheelView = wheelView;
+        this.mFirstVelocityY = velocityY;
+        mCurrentVelocityY = Integer.MAX_VALUE;
+    }
+
+    @Override
+    public final void run() {
+
+        //闃叉闂姩锛屽閫熷害鍋氫竴涓檺鍒躲��
+        if (mCurrentVelocityY == Integer.MAX_VALUE) {
+            if (Math.abs(mFirstVelocityY) > 2000F) {
+                mCurrentVelocityY = mFirstVelocityY > 0 ? 2000F : -2000F;
+            } else {
+                mCurrentVelocityY = mFirstVelocityY;
+            }
+        }
+
+        //鍙戦�乭andler娑堟伅 澶勭悊骞抽『鍋滄婊氬姩閫昏緫
+        if (Math.abs(mCurrentVelocityY) >= 0.0F && Math.abs(mCurrentVelocityY) <= 20F) {
+            mWheelView.cancelFuture();
+            mWheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_SMOOTH_SCROLL);
+            return;
+        }
+
+        int dy = (int) (mCurrentVelocityY / 100F);
+        mWheelView.setTotalScrollY(mWheelView.getTotalScrollY() - dy);
+        if (!mWheelView.isLoop()) {
+            float itemHeight = mWheelView.getItemHeight();
+            float top = (-mWheelView.getInitPosition()) * itemHeight;
+            float bottom = (mWheelView.getItemsCount() - 1 - mWheelView.getInitPosition()) * itemHeight;
+            if (mWheelView.getTotalScrollY() - itemHeight * 0.25 < top) {
+                top = mWheelView.getTotalScrollY() + dy;
+            } else if (mWheelView.getTotalScrollY() + itemHeight * 0.25 > bottom) {
+                bottom = mWheelView.getTotalScrollY() + dy;
+            }
+
+            if (mWheelView.getTotalScrollY() <= top) {
+                mCurrentVelocityY = 40F;
+                mWheelView.setTotalScrollY((int) top);
+            } else if (mWheelView.getTotalScrollY() >= bottom) {
+                mWheelView.setTotalScrollY((int) bottom);
+                mCurrentVelocityY = -40F;
+            }
+        }
+
+        if (mCurrentVelocityY < 0.0F) {
+            mCurrentVelocityY = mCurrentVelocityY + 20F;
+        } else {
+            mCurrentVelocityY = mCurrentVelocityY - 20F;
+        }
+
+        //鍒锋柊UI
+        mWheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW);
+    }
+}
diff --git a/wheelview/src/main/java/com/contrarywind/timer/MessageHandler.java b/wheelview/src/main/java/com/contrarywind/timer/MessageHandler.java
new file mode 100644
index 0000000..34a4856
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/timer/MessageHandler.java
@@ -0,0 +1,42 @@
+package com.contrarywind.timer;
+
+import android.os.Handler;
+import android.os.Message;
+
+import com.contrarywind.view.WheelView;
+
+/**
+ * Handler 娑堟伅绫�
+ *
+ * @author 灏忓旦
+ * date: 2017-12-23 23:20:44
+ */
+public final class MessageHandler extends Handler {
+    public static final int WHAT_INVALIDATE_LOOP_VIEW = 1000;
+    public static final int WHAT_SMOOTH_SCROLL = 2000;
+    public static final int WHAT_ITEM_SELECTED = 3000;
+
+    private final WheelView wheelView;
+
+    public MessageHandler(WheelView wheelView) {
+        this.wheelView = wheelView;
+    }
+
+    @Override
+    public final void handleMessage(Message msg) {
+        switch (msg.what) {
+            case WHAT_INVALIDATE_LOOP_VIEW:
+                wheelView.invalidate();
+                break;
+
+            case WHAT_SMOOTH_SCROLL:
+                wheelView.smoothScroll(WheelView.ACTION.FLING);
+                break;
+
+            case WHAT_ITEM_SELECTED:
+                wheelView.onItemSelected();
+                break;
+        }
+    }
+
+}
diff --git a/wheelview/src/main/java/com/contrarywind/timer/SmoothScrollTimerTask.java b/wheelview/src/main/java/com/contrarywind/timer/SmoothScrollTimerTask.java
new file mode 100644
index 0000000..403b68a
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/timer/SmoothScrollTimerTask.java
@@ -0,0 +1,64 @@
+package com.contrarywind.timer;
+
+import com.contrarywind.view.WheelView;
+
+import java.util.TimerTask;
+
+/**
+ * 骞虫粦婊氬姩鐨勫疄鐜�
+ *
+ * @author 灏忓旦
+ */
+public final class SmoothScrollTimerTask extends TimerTask {
+
+    private int realTotalOffset;
+    private int realOffset;
+    private int offset;
+    private final WheelView wheelView;
+
+    public SmoothScrollTimerTask(WheelView wheelView, int offset) {
+        this.wheelView = wheelView;
+        this.offset = offset;
+        realTotalOffset = Integer.MAX_VALUE;
+        realOffset = 0;
+    }
+
+    @Override
+    public final void run() {
+        if (realTotalOffset == Integer.MAX_VALUE) {
+            realTotalOffset = offset;
+        }
+        //鎶婅婊氬姩鐨勮寖鍥寸粏鍒嗘垚10灏忎唤锛屾寜10灏忎唤鍗曚綅鏉ラ噸缁�
+        realOffset = (int) ((float) realTotalOffset * 0.1F);
+
+        if (realOffset == 0) {
+            if (realTotalOffset < 0) {
+                realOffset = -1;
+            } else {
+                realOffset = 1;
+            }
+        }
+
+        if (Math.abs(realTotalOffset) <= 1) {
+            wheelView.cancelFuture();
+            wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);
+        } else {
+            wheelView.setTotalScrollY(wheelView.getTotalScrollY() + realOffset);
+
+            //杩欓噷濡傛灉涓嶆槸寰幆妯″紡锛屽垯鐐瑰嚮绌虹櫧浣嶇疆闇�瑕佸洖婊氾紝涓嶇劧灏变細鍑虹幇閫夊埌锛�1 item鐨� 鎯呭喌
+            if (!wheelView.isLoop()) {
+                float itemHeight = wheelView.getItemHeight();
+                float top = (float) (-wheelView.getInitPosition()) * itemHeight;
+                float bottom = (float) (wheelView.getItemsCount() - 1 - wheelView.getInitPosition()) * itemHeight;
+                if (wheelView.getTotalScrollY() <= top || wheelView.getTotalScrollY() >= bottom) {
+                    wheelView.setTotalScrollY(wheelView.getTotalScrollY() - realOffset);
+                    wheelView.cancelFuture();
+                    wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);
+                    return;
+                }
+            }
+            wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW);
+            realTotalOffset = realTotalOffset - realOffset;
+        }
+    }
+}
diff --git a/wheelview/src/main/java/com/contrarywind/view/WheelView.java b/wheelview/src/main/java/com/contrarywind/view/WheelView.java
new file mode 100644
index 0000000..45f114a
--- /dev/null
+++ b/wheelview/src/main/java/com/contrarywind/view/WheelView.java
@@ -0,0 +1,840 @@
+package com.contrarywind.view;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.GestureDetector;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+
+import com.contrarywind.adapter.WheelAdapter;
+import com.contrarywind.interfaces.IPickerViewData;
+import com.contrarywind.listener.LoopViewGestureListener;
+import com.contrarywind.listener.OnItemSelectedListener;
+import com.contrarywind.timer.InertiaTimerTask;
+import com.contrarywind.timer.MessageHandler;
+import com.contrarywind.timer.SmoothScrollTimerTask;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 3d婊氳疆鎺т欢
+ */
+public class WheelView extends View {
+
+    public enum ACTION { // 鐐瑰嚮锛屾粦缈�(婊戝埌灏藉ご)锛屾嫋鎷戒簨浠�
+        CLICK, FLING, DAGGLE
+    }
+
+    public enum DividerType { // 鍒嗛殧绾跨被鍨�
+        FILL, WRAP, CIRCLE
+    }
+
+    private static final String[] TIME_NUM = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09"};
+
+    private DividerType dividerType;//鍒嗛殧绾跨被鍨�
+
+    private Context context;
+    private Handler handler;
+    private GestureDetector gestureDetector;
+    private OnItemSelectedListener onItemSelectedListener;
+
+    private boolean isOptions = false;
+    private boolean isCenterLabel = true;
+
+    // Timer mTimer;
+    private ScheduledExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
+    private ScheduledFuture<?> mFuture;
+
+    private Paint paintOuterText;
+    private Paint paintCenterText;
+    private Paint paintIndicator;
+
+    private WheelAdapter adapter;
+
+    private String label;//闄勫姞鍗曚綅
+    private int textSize;//閫夐」鐨勬枃瀛楀ぇ灏�
+    private int maxTextWidth;
+    private int maxTextHeight;
+    private int textXOffset;
+    private float itemHeight;//姣忚楂樺害
+
+
+    private Typeface typeface = Typeface.MONOSPACE;//瀛椾綋鏍峰紡锛岄粯璁ゆ槸绛夊瀛椾綋
+    private int textColorOut;
+    private int textColorCenter;
+    private int dividerColor;
+    private int dividerWidth;
+
+    // 鏉$洰闂磋窛鍊嶆暟
+    private float lineSpacingMultiplier = 1.6F;
+    private boolean isLoop;
+
+    // 绗竴鏉$嚎Y鍧愭爣鍊�
+    private float firstLineY;
+    //绗簩鏉$嚎Y鍧愭爣
+    private float secondLineY;
+    //涓棿label缁樺埗鐨刌鍧愭爣
+    private float centerY;
+
+    //褰撳墠婊氬姩鎬婚珮搴鍊�
+    private float totalScrollY;
+
+    //鍒濆鍖栭粯璁ら�変腑椤�
+    private int initPosition;
+
+    //閫変腑鐨処tem鏄鍑犱釜
+    private int selectedItem;
+    private int preCurrentIndex;
+
+    // 缁樺埗鍑犱釜鏉$洰锛屽疄闄呬笂绗竴椤瑰拰鏈�鍚庝竴椤筜杞村帇缂╂垚0%浜嗭紝鎵�浠ュ彲瑙佺殑鏁扮洰瀹為檯涓�9
+    private int itemsVisible = 11;
+
+    private int measuredHeight;// WheelView 鎺т欢楂樺害
+    private int measuredWidth;// WheelView 鎺т欢瀹藉害
+
+    // 鍗婂緞
+    private int radius;
+
+    private int mOffset = 0;
+    private float previousY = 0;
+    private long startTime = 0;
+
+    // 淇敼杩欎釜鍊煎彲浠ユ敼鍙樻粦琛岄�熷害
+    private static final int VELOCITY_FLING = 5;
+    private int widthMeasureSpec;
+
+    private int mGravity = Gravity.CENTER;
+    private int drawCenterContentStart = 0;//涓棿閫変腑鏂囧瓧寮�濮嬬粯鍒朵綅缃�
+    private int drawOutContentStart = 0;//闈炰腑闂存枃瀛楀紑濮嬬粯鍒朵綅缃�
+    private static final float SCALE_CONTENT = 0.8F;//闈炰腑闂存枃瀛楀垯鐢ㄦ鎺у埗楂樺害锛屽帇鎵佸舰鎴�3d閿欒
+    private float CENTER_CONTENT_OFFSET;//鍋忕Щ閲�
+
+    private boolean isAlphaGradient = false; //閫忔槑搴︽笎鍙�
+
+    public WheelView(Context context) {
+        this(context, null);
+    }
+
+    public WheelView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        textSize = getResources().getDimensionPixelSize(R.dimen.pickerview_textsize);//榛樿澶у皬
+
+        DisplayMetrics dm = getResources().getDisplayMetrics();
+        float density = dm.density; // 灞忓箷瀵嗗害姣旓紙0.75/1.0/1.5/2.0/3.0锛�
+
+        if (density < 1) {//鏍规嵁瀵嗗害涓嶅悓杩涜閫傞厤
+            CENTER_CONTENT_OFFSET = 2.4F;
+        } else if (1 <= density && density < 2) {
+            CENTER_CONTENT_OFFSET = 4.0F;
+        } else if (2 <= density && density < 3) {
+            CENTER_CONTENT_OFFSET = 6.0F;
+        } else if (density >= 3) {
+            CENTER_CONTENT_OFFSET = density * 2.5F;
+        }
+
+        if (attrs != null) {
+            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.pickerview, 0, 0);
+            mGravity = a.getInt(R.styleable.pickerview_wheelview_gravity, Gravity.CENTER);
+            textColorOut = a.getColor(R.styleable.pickerview_wheelview_textColorOut, 0xFFa8a8a8);
+            textColorCenter = a.getColor(R.styleable.pickerview_wheelview_textColorCenter, 0xFF2a2a2a);
+            dividerColor = a.getColor(R.styleable.pickerview_wheelview_dividerColor, 0xFFd5d5d5);
+            dividerWidth = a.getDimensionPixelSize(R.styleable.pickerview_wheelview_dividerWidth, 2);
+            textSize = a.getDimensionPixelOffset(R.styleable.pickerview_wheelview_textSize, textSize);
+            lineSpacingMultiplier = a.getFloat(R.styleable.pickerview_wheelview_lineSpacingMultiplier, lineSpacingMultiplier);
+            a.recycle();//鍥炴敹鍐呭瓨
+        }
+
+        judgeLineSpace();
+        initLoopView(context);
+    }
+
+    /**
+     * 鍒ゆ柇闂磋窛鏄惁鍦�1.0-4.0涔嬮棿
+     */
+    private void judgeLineSpace() {
+        if (lineSpacingMultiplier < 1.0f) {
+            lineSpacingMultiplier = 1.0f;
+        } else if (lineSpacingMultiplier > 4.0f) {
+            lineSpacingMultiplier = 4.0f;
+        }
+    }
+
+    private void initLoopView(Context context) {
+        this.context = context;
+        handler = new MessageHandler(this);
+        gestureDetector = new GestureDetector(context, new LoopViewGestureListener(this));
+        gestureDetector.setIsLongpressEnabled(false);
+        isLoop = true;
+
+        totalScrollY = 0;
+        initPosition = -1;
+        initPaints();
+    }
+
+    private void initPaints() {
+        paintOuterText = new Paint();
+        paintOuterText.setColor(textColorOut);
+        paintOuterText.setAntiAlias(true);
+        paintOuterText.setTypeface(typeface);
+        paintOuterText.setTextSize(textSize);
+
+        paintCenterText = new Paint();
+        paintCenterText.setColor(textColorCenter);
+        paintCenterText.setAntiAlias(true);
+        paintCenterText.setTextScaleX(1.1F);
+        paintCenterText.setTypeface(typeface);
+        paintCenterText.setTextSize(textSize);
+
+        paintIndicator = new Paint();
+        paintIndicator.setColor(dividerColor);
+        paintIndicator.setAntiAlias(true);
+
+        setLayerType(LAYER_TYPE_SOFTWARE, null);
+    }
+
+    private void reMeasure() {//閲嶆柊娴嬮噺
+        if (adapter == null) {
+            return;
+        }
+
+        measureTextWidthHeight();
+
+        //鍗婂渾鐨勫懆闀� = item楂樺害涔樹互item鏁扮洰-1
+        int halfCircumference = (int) (itemHeight * (itemsVisible - 1));
+        //鏁翠釜鍦嗙殑鍛ㄩ暱闄や互PI寰楀埌鐩村緞锛岃繖涓洿寰勭敤浣滄帶浠剁殑鎬婚珮搴�
+        measuredHeight = (int) ((halfCircumference * 2) / Math.PI);
+        //姹傚嚭鍗婂緞
+        radius = (int) (halfCircumference / Math.PI);
+        //鎺т欢瀹藉害锛岃繖閲屾敮鎸亀eight
+        measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
+        //璁$畻涓ゆ潯妯嚎 鍜� 閫変腑椤圭敾绗旂殑鍩虹嚎Y浣嶇疆
+        firstLineY = (measuredHeight - itemHeight) / 2.0F;
+        secondLineY = (measuredHeight + itemHeight) / 2.0F;
+        centerY = secondLineY - (itemHeight - maxTextHeight) / 2.0f - CENTER_CONTENT_OFFSET;
+
+        //鍒濆鍖栨樉绀虹殑item鐨刾osition
+        if (initPosition == -1) {
+            if (isLoop) {
+                initPosition = (adapter.getItemsCount() + 1) / 2;
+            } else {
+                initPosition = 0;
+            }
+        }
+        preCurrentIndex = initPosition;
+    }
+
+    /**
+     * 璁$畻鏈�澶ength鐨凾ext鐨勫楂樺害
+     */
+    private void measureTextWidthHeight() {
+        Rect rect = new Rect();
+        for (int i = 0; i < adapter.getItemsCount(); i++) {
+            String s1 = getContentText(adapter.getItem(i));
+            paintCenterText.getTextBounds(s1, 0, s1.length(), rect);
+
+            int textWidth = rect.width();
+            if (textWidth > maxTextWidth) {
+                maxTextWidth = textWidth;
+            }
+        }
+        paintCenterText.getTextBounds("\u661F\u671F", 0, 2, rect); // 鏄熸湡鐨勫瓧绗︾紪鐮侊紙浠ュ畠涓烘爣鍑嗛珮搴︼級
+        maxTextHeight = rect.height() + 2;
+        itemHeight = lineSpacingMultiplier * maxTextHeight;
+    }
+
+    public void smoothScroll(ACTION action) {//骞虫粦婊氬姩鐨勫疄鐜�
+        cancelFuture();
+        if (action == ACTION.FLING || action == ACTION.DAGGLE) {
+            mOffset = (int) ((totalScrollY % itemHeight + itemHeight) % itemHeight);
+            if ((float) mOffset > itemHeight / 2.0F) {//濡傛灉瓒呰繃Item楂樺害鐨勪竴鍗婏紝婊氬姩鍒颁笅涓�涓狪tem鍘�
+                mOffset = (int) (itemHeight - (float) mOffset);
+            } else {
+                mOffset = -mOffset;
+            }
+        }
+        //鍋滄鐨勬椂鍊欙紝浣嶇疆鏈夊亸绉伙紝涓嶆槸鍏ㄩ儴閮借兘姝g‘鍋滄鍒颁腑闂翠綅缃殑锛岃繖閲屾妸鏂囧瓧浣嶇疆鎸洖涓棿鍘�
+        mFuture = mExecutor.scheduleWithFixedDelay(new SmoothScrollTimerTask(this, mOffset), 0, 10, TimeUnit.MILLISECONDS);
+    }
+
+    public final void scrollBy(float velocityY) {//婊氬姩鎯�х殑瀹炵幇
+        cancelFuture();
+        mFuture = mExecutor.scheduleWithFixedDelay(new InertiaTimerTask(this, velocityY), 0, VELOCITY_FLING, TimeUnit.MILLISECONDS);
+    }
+
+    public void cancelFuture() {
+        if (mFuture != null && !mFuture.isCancelled()) {
+            mFuture.cancel(true);
+            mFuture = null;
+        }
+    }
+
+    /**
+     * 璁剧疆鏄惁寰幆婊氬姩
+     *
+     * @param cyclic 鏄惁寰幆
+     */
+    public final void setCyclic(boolean cyclic) {
+        isLoop = cyclic;
+    }
+
+    public final void setTypeface(Typeface font) {
+        typeface = font;
+        paintOuterText.setTypeface(typeface);
+        paintCenterText.setTypeface(typeface);
+    }
+
+    public final void setTextSize(float size) {
+        if (size > 0.0F) {
+            textSize = (int) (context.getResources().getDisplayMetrics().density * size);
+            paintOuterText.setTextSize(textSize);
+            paintCenterText.setTextSize(textSize);
+        }
+    }
+
+    public final void setCurrentItem(int currentItem) {
+        //涓嶆坊鍔犺繖鍙�,褰撹繖涓獁heelView涓嶅彲瑙佹椂,榛樿閮芥槸0,浼氬鑷磋幏鍙栧埌鐨勬椂闂撮敊璇�
+        this.selectedItem = currentItem;
+        this.initPosition = currentItem;
+        totalScrollY = 0;//鍥炲綊椤堕儴锛屼笉鐒堕噸璁緎etCurrentItem鐨勮瘽浣嶇疆浼氬亸绉荤殑锛屽氨浼氭樉绀哄嚭涓嶅浣嶇疆鐨勬暟鎹�
+        invalidate();
+    }
+
+    public final void setOnItemSelectedListener(OnItemSelectedListener OnItemSelectedListener) {
+        this.onItemSelectedListener = OnItemSelectedListener;
+    }
+
+    public final void setAdapter(WheelAdapter adapter) {
+        this.adapter = adapter;
+        reMeasure();
+        invalidate();
+    }
+
+    public void setItemsVisibleCount(int visibleCount) {
+        if (visibleCount % 2 == 0) {
+            visibleCount += 1;
+        }
+        this.itemsVisible = visibleCount + 2; //绗竴鏉″拰鏈�鍚庝竴鏉�
+    }
+
+    public void setAlphaGradient(boolean alphaGradient) {
+        isAlphaGradient = alphaGradient;
+    }
+
+    public final WheelAdapter getAdapter() {
+        return adapter;
+    }
+
+    public final int getCurrentItem() {
+        // return selectedItem;
+        if (adapter == null) {
+            return 0;
+        }
+        if (isLoop && (selectedItem < 0 || selectedItem >= adapter.getItemsCount())) {
+            return Math.max(0, Math.min(Math.abs(Math.abs(selectedItem) - adapter.getItemsCount()), adapter.getItemsCount() - 1));
+        }
+        return Math.max(0, Math.min(selectedItem, adapter.getItemsCount() - 1));
+    }
+
+    public final void onItemSelected() {
+        if (onItemSelectedListener != null) {
+            postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    onItemSelectedListener.onItemSelected(getCurrentItem());
+                }
+            }, 200L);
+        }
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (adapter == null) {
+            return;
+        }
+        //initPosition瓒婄晫浼氶�犳垚preCurrentIndex鐨勫�间笉姝g‘
+        initPosition = Math.min(Math.max(0, initPosition), adapter.getItemsCount() - 1);
+
+        //婊氬姩鐨刌鍊奸珮搴﹂櫎鍘绘瘡琛孖tem鐨勯珮搴︼紝寰楀埌婊氬姩浜嗗灏戜釜item锛屽嵆change鏁�
+        //婊氬姩鍋忕Щ鍊�,鐢ㄤ簬璁板綍婊氬姩浜嗗灏戜釜item
+        int change = (int) (totalScrollY / itemHeight);
+        // Log.d("change", "" + change);
+
+        try {
+            //婊氬姩涓疄闄呯殑棰勯�変腑鐨刬tem(鍗崇粡杩囦簡涓棿浣嶇疆鐨刬tem) 锛� 婊戝姩鍓嶇殑浣嶇疆 锛� 婊戝姩鐩稿浣嶇疆
+            preCurrentIndex = initPosition + change % adapter.getItemsCount();
+
+        } catch (ArithmeticException e) {
+            Log.e("WheelView", "鍑洪敊浜嗭紒adapter.getItemsCount() == 0锛岃仈鍔ㄦ暟鎹笉鍖归厤");
+        }
+        if (!isLoop) {//涓嶅惊鐜殑鎯呭喌
+            if (preCurrentIndex < 0) {
+                preCurrentIndex = 0;
+            }
+            if (preCurrentIndex > adapter.getItemsCount() - 1) {
+                preCurrentIndex = adapter.getItemsCount() - 1;
+            }
+        } else {//寰幆
+            if (preCurrentIndex < 0) {//涓句釜渚嬪瓙锛氬鏋滄�绘暟鏄�5锛宲reCurrentIndex 锛� 锛�1锛岄偅涔坧reCurrentIndex鎸夊惊鐜潵璇达紝鍏跺疄鏄�0鐨勪笂闈紝涔熷氨鏄�4鐨勪綅缃�
+                preCurrentIndex = adapter.getItemsCount() + preCurrentIndex;
+            }
+            if (preCurrentIndex > adapter.getItemsCount() - 1) {//鍚岀悊涓婇潰,鑷繁鑴戣ˉ涓�涓�
+                preCurrentIndex = preCurrentIndex - adapter.getItemsCount();
+            }
+        }
+        //璺熸粴鍔ㄦ祦鐣呭害鏈夊叧锛屾�绘粦鍔ㄨ窛绂讳笌姣忎釜item楂樺害鍙栦綑锛屽嵆骞朵笉鏄竴鏍兼牸鐨勬粴鍔紝姣忎釜item涓嶄竴瀹氭粴鍒板搴擱ect閲岀殑锛岃繖涓猧tem瀵瑰簲鏍煎瓙鐨勫亸绉诲��
+        float itemHeightOffset = (totalScrollY % itemHeight);
+
+
+        //缁樺埗涓棿涓ゆ潯妯嚎
+        if (dividerType == DividerType.WRAP) {//妯嚎闀垮害浠呭寘瑁瑰唴瀹�
+            float startX;
+            float endX;
+
+            if (TextUtils.isEmpty(label)) {//闅愯棌Label鐨勬儏鍐�
+                startX = (measuredWidth - maxTextWidth) / 2 - 12;
+            } else {
+                startX = (measuredWidth - maxTextWidth) / 4 - 12;
+            }
+
+            if (startX <= 0) {//濡傛灉瓒呰繃浜哤heelView鐨勮竟缂�
+                startX = 10;
+            }
+            endX = measuredWidth - startX;
+            canvas.drawLine(startX, firstLineY, endX, firstLineY, paintIndicator);
+            canvas.drawLine(startX, secondLineY, endX, secondLineY, paintIndicator);
+        } else if (dividerType == DividerType.CIRCLE) {
+            //鍒嗗壊绾夸负鍦嗗湀褰㈢姸
+            paintIndicator.setStyle(Paint.Style.STROKE);
+            paintIndicator.setStrokeWidth(dividerWidth);
+            float startX;
+            float endX;
+            if (TextUtils.isEmpty(label)) {//闅愯棌Label鐨勬儏鍐�
+                startX = (measuredWidth - maxTextWidth) / 2f - 12;
+            } else {
+                startX = (measuredWidth - maxTextWidth) / 4f - 12;
+            }
+            if (startX <= 0) {//濡傛灉瓒呰繃浜哤heelView鐨勮竟缂�
+                startX = 10;
+            }
+            endX = measuredWidth - startX;
+            //鍗婂緞濮嬬粓浠ュ楂樹腑鏈�澶х殑鏉ョ畻
+            float radius = Math.max((endX - startX), itemHeight) / 1.8f;
+            canvas.drawCircle(measuredWidth / 2f, measuredHeight / 2f, radius, paintIndicator);
+        } else {
+            canvas.drawLine(0.0F, firstLineY, measuredWidth, firstLineY, paintIndicator);
+            canvas.drawLine(0.0F, secondLineY, measuredWidth, secondLineY, paintIndicator);
+        }
+
+        //鍙樉绀洪�変腑椤筁abel鏂囧瓧鐨勬ā寮忥紝骞朵笖Label鏂囧瓧涓嶄负绌猴紝鍒欒繘琛岀粯鍒�
+        if (!TextUtils.isEmpty(label) && isCenterLabel) {
+            //缁樺埗鏂囧瓧锛岄潬鍙冲苟鐣欏嚭绌洪殭
+            int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label);
+            canvas.drawText(label, drawRightContentStart - CENTER_CONTENT_OFFSET, centerY, paintCenterText);
+        }
+
+        // 璁剧疆鏁扮粍涓瘡涓厓绱犵殑鍊�
+        int counter = 0;
+        while (counter < itemsVisible) {
+            Object showText;
+            int index = preCurrentIndex - (itemsVisible / 2 - counter);//绱㈠紩鍊硷紝鍗冲綋鍓嶅湪鎺т欢涓棿鐨刬tem鐪嬩綔鏁版嵁婧愮殑涓棿锛岃绠楀嚭鐩稿婧愭暟鎹簮鐨刬ndex鍊�
+
+            //鍒ゆ柇鏄惁寰幆锛屽鏋滄槸寰幆鏁版嵁婧愪篃浣跨敤鐩稿寰幆鐨刾osition鑾峰彇瀵瑰簲鐨刬tem鍊硷紝濡傛灉涓嶆槸寰幆鍒欒秴鍑烘暟鎹簮鑼冨洿浣跨敤""绌虹櫧瀛楃涓插~鍏咃紝鍦ㄧ晫闈笂褰㈡垚绌虹櫧鏃犳暟鎹殑item椤�
+            if (isLoop) {
+                index = getLoopMappingIndex(index);
+                showText = adapter.getItem(index);
+            } else if (index < 0) {
+                showText = "";
+            } else if (index > adapter.getItemsCount() - 1) {
+                showText = "";
+            } else {
+                showText = adapter.getItem(index);
+            }
+
+            canvas.save();
+            // 寮ч暱 L = itemHeight * counter - itemHeightOffset
+            // 姹傚姬搴� 伪 = L / r  (寮ч暱/鍗婂緞) [0,蟺]
+            double radian = ((itemHeight * counter - itemHeightOffset)) / radius;
+            // 寮у害杞崲鎴愯搴�(鎶婂崐鍦嗕互Y杞翠负杞村績鍚戝彸杞�90搴︼紝浣垮叾澶勪簬绗竴璞¢檺鍙婄鍥涜薄闄�
+            // angle [-90掳,90掳]
+            float angle = (float) (90D - (radian / Math.PI) * 180D);//item绗竴椤�,浠�90搴﹀紑濮嬶紝閫愭笎閫掑噺鍒� -90搴�
+
+            // 璁$畻鍙栧�煎彲鑳芥湁缁嗗井鍋忓樊锛屼繚璇佽礋90掳鍒�90掳浠ュ鐨勪笉缁樺埗
+            if (angle > 90F || angle < -90F) {
+                canvas.restore();
+            } else {
+                //鑾峰彇鍐呭鏂囧瓧
+                String contentText;
+
+                //濡傛灉鏄痩abel姣忛」閮芥樉绀虹殑妯″紡锛屽苟涓攊tem鍐呭涓嶄负绌恒�乴abel 涔熶笉涓虹┖
+                if (!isCenterLabel && !TextUtils.isEmpty(label) && !TextUtils.isEmpty(getContentText(showText))) {
+                    contentText = getContentText(showText) + label;
+                } else {
+                    contentText = getContentText(showText);
+                }
+                // 鏍规嵁褰撳墠瑙掑害璁$畻鍑哄亸宸郴鏁帮紝鐢ㄤ互鍦ㄧ粯鍒舵椂鎺у埗鏂囧瓧鐨� 姘村钩绉诲姩 閫忔槑搴� 鍊炬枩绋嬪害.
+                float offsetCoefficient = (float) Math.pow(Math.abs(angle) / 90f, 2.2);
+
+                reMeasureTextSize(contentText);
+                //璁$畻寮�濮嬬粯鍒剁殑浣嶇疆
+                measuredCenterContentStart(contentText);
+                measuredOutContentStart(contentText);
+                float translateY = (float) (radius - Math.cos(radian) * radius - (Math.sin(radian) * maxTextHeight) / 2D);
+                //鏍规嵁Math.sin(radian)鏉ユ洿鏀筩anvas鍧愭爣绯诲師鐐癸紝鐒跺悗缂╂斁鐢诲竷锛屼娇寰楁枃瀛楅珮搴﹁繘琛岀缉鏀撅紝褰㈡垚寮у舰3d瑙嗚宸�
+                canvas.translate(0.0F, translateY);
+                if (translateY <= firstLineY && maxTextHeight + translateY >= firstLineY) {
+                    // 鏉$洰缁忚繃绗竴鏉$嚎
+                    canvas.save();
+                    canvas.clipRect(0, 0, measuredWidth, firstLineY - translateY);
+                    canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);
+                    setOutPaintStyle(offsetCoefficient, angle);
+                    canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);
+                    canvas.restore();
+                    canvas.save();
+                    canvas.clipRect(0, firstLineY - translateY, measuredWidth, (int) (itemHeight));
+                    canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);
+                    canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText);
+                    canvas.restore();
+                } else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) {
+                    // 鏉$洰缁忚繃绗簩鏉$嚎
+                    canvas.save();
+                    canvas.clipRect(0, 0, measuredWidth, secondLineY - translateY);
+                    canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F);
+                    canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTER_CONTENT_OFFSET, paintCenterText);
+                    canvas.restore();
+                    canvas.save();
+                    canvas.clipRect(0, secondLineY - translateY, measuredWidth, (int) (itemHeight));
+                    canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);
+                    setOutPaintStyle(offsetCoefficient, angle);
+                    canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText);
+                    canvas.restore();
+                } else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) {
+                    // 涓棿鏉$洰
+                    // canvas.clipRect(0, 0, measuredWidth, maxTextHeight);
+                    //璁╂枃瀛楀眳涓�
+                    float Y = maxTextHeight - CENTER_CONTENT_OFFSET;//鍥犱负鍦嗗姬瑙掓崲绠楃殑鍚戜笅鍙栧�硷紝瀵艰嚧瑙掑害绋嶅井鏈夌偣鍋忓樊锛屽姞涓婄敾绗旂殑鍩虹嚎浼氬亸涓婏紝鍥犳闇�瑕佸亸绉婚噺淇涓�涓�
+                    canvas.drawText(contentText, drawCenterContentStart, Y, paintCenterText);
+                    //璁剧疆閫変腑椤�
+                    selectedItem = preCurrentIndex - (itemsVisible / 2 - counter);
+                } else {
+                    // 鍏朵粬鏉$洰
+                    canvas.save();
+                    canvas.clipRect(0, 0, measuredWidth, (int) (itemHeight));
+                    canvas.scale(1.0F, (float) Math.sin(radian) * SCALE_CONTENT);
+                    setOutPaintStyle(offsetCoefficient, angle);
+                    // 鎺у埗鏂囧瓧姘村钩鍋忕Щ璺濈
+                    canvas.drawText(contentText, drawOutContentStart + textXOffset * offsetCoefficient, maxTextHeight, paintOuterText);
+                    canvas.restore();
+                }
+                canvas.restore();
+                paintCenterText.setTextSize(textSize);
+            }
+            counter++;
+        }
+    }
+
+    //璁剧疆鏂囧瓧鍊炬枩瑙掑害锛岄�忔槑搴�
+    private void setOutPaintStyle(float offsetCoefficient, float angle) {
+        // 鎺у埗鏂囧瓧鍊炬枩瑙掑害
+        float DEFAULT_TEXT_TARGET_SKEW_X = 0.5f;
+        int multiplier = 0;
+        if (textXOffset > 0) {
+            multiplier = 1;
+        } else if (textXOffset < 0) {
+            multiplier = -1;
+        }
+        paintOuterText.setTextSkewX(multiplier * (angle > 0 ? -1 : 1) * DEFAULT_TEXT_TARGET_SKEW_X * offsetCoefficient);
+
+        // 鎺у埗閫忔槑搴�
+        int alpha = isAlphaGradient ? (int) ((90F - Math.abs(angle)) / 90f * 255) : 255;
+        // Log.d("WheelView", "alpha:" + alpha);
+        paintOuterText.setAlpha(alpha);
+    }
+
+    /**
+     * reset the size of the text Let it can fully display
+     *
+     * @param contentText item text content.
+     */
+    private void reMeasureTextSize(String contentText) {
+        Rect rect = new Rect();
+        paintCenterText.getTextBounds(contentText, 0, contentText.length(), rect);
+        int width = rect.width();
+        int size = textSize;
+        while (width > measuredWidth) {
+            size--;
+            //璁剧疆2鏉℃í绾夸腑闂寸殑鏂囧瓧澶у皬
+            paintCenterText.setTextSize(size);
+            paintCenterText.getTextBounds(contentText, 0, contentText.length(), rect);
+            width = rect.width();
+        }
+        //璁剧疆2鏉℃í绾垮闈㈢殑鏂囧瓧澶у皬
+        paintOuterText.setTextSize(size);
+    }
+
+
+    //閫掑綊璁$畻鍑哄搴旂殑index
+    private int getLoopMappingIndex(int index) {
+        if (index < 0) {
+            index = index + adapter.getItemsCount();
+            index = getLoopMappingIndex(index);
+        } else if (index > adapter.getItemsCount() - 1) {
+            index = index - adapter.getItemsCount();
+            index = getLoopMappingIndex(index);
+        }
+        return index;
+    }
+
+    /**
+     * 鑾峰彇鎵�鏄剧ず鐨勬暟鎹簮
+     *
+     * @param item data resource
+     * @return 瀵瑰簲鏄剧ず鐨勫瓧绗︿覆
+     */
+    private String getContentText(Object item) {
+        if (item == null) {
+            return "";
+        } else if (item instanceof IPickerViewData) {
+            return ((IPickerViewData) item).getPickerViewText();
+        } else if (item instanceof Integer) {
+            //濡傛灉涓烘暣褰㈠垯鏈�灏戜繚鐣欎袱浣嶆暟.
+            return getFixNum((int) item);
+        }
+        return item.toString();
+    }
+
+    private String getFixNum(int timeNum) {
+        return timeNum >= 0 && timeNum < 10 ? TIME_NUM[timeNum] : String.valueOf(timeNum);
+    }
+
+    private void measuredCenterContentStart(String content) {
+        Rect rect = new Rect();
+        paintCenterText.getTextBounds(content, 0, content.length(), rect);
+        switch (mGravity) {
+            case Gravity.CENTER://鏄剧ず鍐呭灞呬腑
+                if (isOptions || label == null || label.equals("") || !isCenterLabel) {
+                    drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.5);
+                } else {//鍙樉绀轰腑闂磍abel鏃讹紝鏃堕棿閫夋嫨鍣ㄥ唴瀹瑰亸宸︿竴鐐癸紝鐣欏嚭绌洪棿缁樺埗鍗曚綅鏍囩
+                    drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.25);
+                }
+                break;
+            case Gravity.LEFT:
+                drawCenterContentStart = 0;
+                break;
+            case Gravity.RIGHT://娣诲姞鍋忕Щ閲�
+                drawCenterContentStart = measuredWidth - rect.width() - (int) CENTER_CONTENT_OFFSET;
+                break;
+        }
+    }
+
+    private void measuredOutContentStart(String content) {
+        Rect rect = new Rect();
+        paintOuterText.getTextBounds(content, 0, content.length(), rect);
+        switch (mGravity) {
+            case Gravity.CENTER:
+                if (isOptions || label == null || label.equals("") || !isCenterLabel) {
+                    drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.5);
+                } else {//鍙樉绀轰腑闂磍abel鏃讹紝鏃堕棿閫夋嫨鍣ㄥ唴瀹瑰亸宸︿竴鐐癸紝鐣欏嚭绌洪棿缁樺埗鍗曚綅鏍囩
+                    drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.25);
+                }
+                break;
+            case Gravity.LEFT:
+                drawOutContentStart = 0;
+                break;
+            case Gravity.RIGHT:
+                drawOutContentStart = measuredWidth - rect.width() - (int) CENTER_CONTENT_OFFSET;
+                break;
+        }
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        this.widthMeasureSpec = widthMeasureSpec;
+        reMeasure();
+        setMeasuredDimension(measuredWidth, measuredHeight);
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        boolean eventConsumed = gestureDetector.onTouchEvent(event);
+        boolean isIgnore = false;//瓒呰繃杈圭晫婊戝姩鏃讹紝涓嶅啀缁樺埗UI銆�
+
+        float top = -initPosition * itemHeight;
+        float bottom = (adapter.getItemsCount() - 1 - initPosition) * itemHeight;
+        float ratio = 0.25f;
+
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                startTime = System.currentTimeMillis();
+                cancelFuture();
+                previousY = event.getRawY();
+                break;
+
+            case MotionEvent.ACTION_MOVE:
+                float dy = previousY - event.getRawY();
+                previousY = event.getRawY();
+                totalScrollY = totalScrollY + dy;
+
+                // normal mode銆�
+                if (!isLoop) {
+                    if ((totalScrollY - itemHeight * ratio < top && dy < 0)
+                            || (totalScrollY + itemHeight * ratio > bottom && dy > 0)) {
+                        //蹇粦鍔ㄥ埌杈圭晫浜嗭紝璁剧疆宸叉粦鍔ㄥ埌杈圭晫鐨勬爣蹇�
+                        totalScrollY -= dy;
+                        isIgnore = true;
+                    } else {
+                        isIgnore = false;
+                    }
+                }
+                break;
+
+            case MotionEvent.ACTION_UP:
+            default:
+                if (!eventConsumed) {//鏈秷璐规帀浜嬩欢
+
+                    /**
+                     *@describe <鍏充簬寮ч暱鐨勮绠�>
+                     *
+                     * 寮ч暱鍏紡锛� L = 伪*R
+                     * 鍙嶄綑寮﹀叕寮忥細arccos(cos伪) = 伪
+                     * 鐢变簬涔嬪墠鏄湁椤烘椂閽堝亸绉�90搴︼紝
+                     * 鎵�浠ュ疄闄呭姬搴﹁寖鍥次�2鐨勫�� 锛毼�2 = 蟺/2-伪    锛埼�=[0,蟺] 伪2 = [-蟺/2,蟺/2]锛�
+                     * 鏍规嵁姝e鸡浣欏鸡杞崲鍏紡 cos伪 = sin(蟺/2-伪)
+                     * 浠e叆锛屽緱锛� cos伪 = sin(蟺/2-伪) = sin伪2 = (R - y) / R
+                     * 鎵�浠ュ姬闀� L = arccos(cos伪)*R = arccos((R - y) / R)*R
+                     */
+
+                    float y = event.getY();
+                    double L = Math.acos((radius - y) / radius) * radius;
+                    //item0 鏈変竴鍗婃槸鍦ㄤ笉鍙鍖哄煙锛屾墍浠ラ渶瑕佸姞涓� itemHeight / 2
+                    int circlePosition = (int) ((L + itemHeight / 2) / itemHeight);
+                    float extraOffset = (totalScrollY % itemHeight + itemHeight) % itemHeight;
+                    //宸叉粦鍔ㄧ殑寮ч暱鍊�
+                    mOffset = (int) ((circlePosition - itemsVisible / 2) * itemHeight - extraOffset);
+
+                    if ((System.currentTimeMillis() - startTime) > 120) {
+                        // 澶勭悊鎷栨嫿浜嬩欢
+                        smoothScroll(ACTION.DAGGLE);
+                    } else {
+                        // 澶勭悊鏉$洰鐐瑰嚮浜嬩欢
+                        smoothScroll(ACTION.CLICK);
+                    }
+                }
+                break;
+        }
+        if (!isIgnore && event.getAction() != MotionEvent.ACTION_DOWN) {
+            invalidate();
+        }
+        return true;
+    }
+
+    public int getItemsCount() {
+        return adapter != null ? adapter.getItemsCount() : 0;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public void isCenterLabel(boolean isCenterLabel) {
+        this.isCenterLabel = isCenterLabel;
+    }
+
+    public void setGravity(int gravity) {
+        this.mGravity = gravity;
+    }
+
+    public int getTextWidth(Paint paint, String str) { //calculate text width
+        int iRet = 0;
+        if (str != null && str.length() > 0) {
+            int len = str.length();
+            float[] widths = new float[len];
+            paint.getTextWidths(str, widths);
+            for (int j = 0; j < len; j++) {
+                iRet += (int) Math.ceil(widths[j]);
+            }
+        }
+        return iRet;
+    }
+
+    public void setIsOptions(boolean options) {
+        isOptions = options;
+    }
+
+    public void setTextColorOut(int textColorOut) {
+
+        this.textColorOut = textColorOut;
+        paintOuterText.setColor(this.textColorOut);
+    }
+
+    public void setTextColorCenter(int textColorCenter) {
+        this.textColorCenter = textColorCenter;
+        paintCenterText.setColor(this.textColorCenter);
+    }
+
+    public void setTextXOffset(int textXOffset) {
+        this.textXOffset = textXOffset;
+        if (textXOffset != 0) {
+            paintCenterText.setTextScaleX(1.0f);
+        }
+    }
+
+    public void setDividerWidth(int dividerWidth) {
+        this.dividerWidth = dividerWidth;
+        paintIndicator.setStrokeWidth(dividerWidth);
+    }
+
+    public void setDividerColor(int dividerColor) {
+        this.dividerColor = dividerColor;
+        paintIndicator.setColor(dividerColor);
+    }
+
+    public void setDividerType(DividerType dividerType) {
+        this.dividerType = dividerType;
+    }
+
+    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        if (lineSpacingMultiplier != 0) {
+            this.lineSpacingMultiplier = lineSpacingMultiplier;
+            judgeLineSpace();
+        }
+    }
+
+    public boolean isLoop() {
+        return isLoop;
+    }
+
+    public float getTotalScrollY() {
+        return totalScrollY;
+    }
+
+    public void setTotalScrollY(float totalScrollY) {
+        this.totalScrollY = totalScrollY;
+    }
+
+    public float getItemHeight() {
+        return itemHeight;
+    }
+
+    public int getInitPosition() {
+        return initPosition;
+    }
+
+    @Override
+    public Handler getHandler() {
+        return handler;
+    }
+}
\ No newline at end of file
diff --git a/wheelview/src/main/res/values/attrs.xml b/wheelview/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..d6343aa
--- /dev/null
+++ b/wheelview/src/main/res/values/attrs.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="pickerview">
+        <attr name="wheelview_gravity">
+            <enum name="center" value="17"/>
+            <enum name="left" value="3"/>
+            <enum name="right" value="5"/>
+        </attr>
+        <attr name="wheelview_textSize" format="dimension"/>
+        <attr name="wheelview_textColorOut" format="color"/>
+        <attr name="wheelview_textColorCenter" format="color"/>
+        <attr name="wheelview_dividerColor" format="color"/>
+        <attr name="wheelview_dividerWidth" format="dimension"/>
+        <attr name="wheelview_lineSpacingMultiplier" format="float"/>
+    </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/wheelview/src/main/res/values/colors.xml b/wheelview/src/main/res/values/colors.xml
new file mode 100644
index 0000000..f95f8f3
--- /dev/null
+++ b/wheelview/src/main/res/values/colors.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="pickerview_timebtn_nor">#057dff</color>
+    <color name="pickerview_timebtn_pre">#c2daf5</color>
+    <color name="pickerview_bg_topbar">#f5f5f5</color>
+
+    <color name="pickerview_topbar_title">#000000</color>
+    <color name="pickerview_wheelview_textcolor_out">#a8a8a8</color>
+    <color name="pickerview_wheelview_textcolor_center">#2a2a2a</color>
+    <color name="pickerview_wheelview_textcolor_divider">#d5d5d5</color>
+    <color name="pickerview_bgColor_overlay">#60000000</color>
+    <color name="pickerview_bgColor_default">#FFFFFFFF</color>
+
+</resources>
diff --git a/wheelview/src/main/res/values/dimens.xml b/wheelview/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..ddfb5ab
--- /dev/null
+++ b/wheelview/src/main/res/values/dimens.xml
@@ -0,0 +1,13 @@
+<resources>
+    <!-- 椤堕儴鎸夐挳鏍忛珮搴� -->
+    <dimen name="pickerview_topbar_height">44dp</dimen>
+
+    <!-- 椤堕儴鎸夐挳padding -->
+    <dimen name="pickerview_topbar_padding">20dp</dimen>
+
+    <!-- 椤堕儴鎸夐挳鏂囧瓧澶у皬 -->
+    <dimen name="pickerview_topbar_btn_textsize">17sp</dimen>
+    <dimen name="pickerview_topbar_title_textsize">18sp</dimen>
+    <!-- 閫夐」鏂囧瓧澶у皬 -->
+    <dimen name="pickerview_textsize">20sp</dimen>
+</resources>
diff --git a/wheelview/src/main/res/values/strings.xml b/wheelview/src/main/res/values/strings.xml
new file mode 100644
index 0000000..0a65b07
--- /dev/null
+++ b/wheelview/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">wheelview</string>
+</resources>

--
Gitblit v1.8.0