From 4c41b73e5cf0e8b89fff0cbbd5c0d89cb6b49cf1 Mon Sep 17 00:00:00 2001 From: GPrathap Date: Mon, 21 Dec 2015 08:55:18 +0530 Subject: [PATCH] updated drone_analyzer feature: jaggery app --- .../resources/agent/deviceConfig.properties | 2 +- .../device-view.hbs | 106 +- .../device-view.js | 19 +- .../public/images/thumb.png | Bin 48636 -> 76844 bytes .../public/js/device-detail.js | 197 +++ .../public/js/load-map.js | 55 + .../public/templates/applications-list.hbs | 12 + .../public/templates/operations-log.hbs | 24 + .../public/templates/policy-compliance.hbs | 79 ++ .../private/conf/device-type.json | 4 +- .../type-view.hbs | 87 +- .../public/css/main-app.css | 171 +++ .../background_drone.png | Bin 0 -> 26787 bytes .../direction_drone.png | Bin 0 -> 11617 bytes .../drone_position_controller/pitch_drone.png | Bin 0 -> 20046 bytes .../public/images/no_video_preview.gif | Bin 0 -> 2111 bytes .../3dobject_controller/3dObjectControler.js | 206 +++ .../js/3dobject_controller/Coordinates.js | 148 ++ .../OrbitAndPanControls.js | 531 +++++++ .../js/3dobject_controller/three.min.js | 706 ++++++++++ .../public/js/common/ajax_handler.js | 50 + .../public/js/common/general_handler | 101 ++ .../public/js/common/websocket_api | 60 + .../public/js/config/config.js | 39 + .../public/js/d3.min.js | 5 + .../public/js/download.js | 174 +++ .../public/js/initJs | 21 + .../public/js/jQueryRotate.js | 339 +++++ .../public/js/jquery.validate.js | 1220 +++++++++++++++++ .../public/js/mainHandler | 144 ++ .../public/js/modules/controller.js | 29 + .../public/js/modules/flight_dynamics.js | 79 ++ .../public/js/modules/realtime_plotting | 148 ++ .../statistics.hbs | 332 +++++ .../statistics.js | 42 + .../statistics.json | 3 + 36 files changed, 5041 insertions(+), 92 deletions(-) create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/device-detail.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/load-map.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/applications-list.hbs create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/operations-log.hbs create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/policy-compliance.hbs create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/background_drone.png create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/direction_drone.png create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/pitch_drone.png create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/no_video_preview.gif create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/3dObjectControler.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/Coordinates.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/OrbitAndPanControls.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js create mode 100644 features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/agent/deviceConfig.properties b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/agent/deviceConfig.properties index bb1ae2c992..50d1d9d89f 100644 --- a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/agent/deviceConfig.properties +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/agent/deviceConfig.properties @@ -15,7 +15,7 @@ # # -#[Device-Configurations] +[Device-Configurations] owner=${DEVICE_OWNER} deviceId=${DEVICE_ID} device-name=${DEVICE_NAME} diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs index 9bb42928b5..576eebb7b7 100644 --- a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.hbs @@ -1,15 +1,6 @@ -{{#zone "topCss"}} - -{{/zone}} - {{#zone "device-thumbnail"}} {{/zone}} - {{#zone "device-opetations"}}
Operations @@ -18,53 +9,70 @@ {{unit "iot.unit.device.operation" device=device}}
{{/zone}} - {{#zone "device-detail-properties"}} -
-
+
+ +
+
-
-
Device Details
- {{unit "iot.unit.device.stats" device=device}} -
+
+
Device Statistics
+ {{unit "iot.unit.device.droneanalyzer.statistics" device=device}} +
-
-
Policy Compliance
-
- -
-
- Not available yet +
+
Policy Compliance
+
+ +
+
+ Not available yet +
+
-
-
-
-
Operations Log
-
- -
-
- Not available yet +
+
Operations Log
+
+ +
+
+ Not available yet +
+
-
diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js index fc980ac4f9..3a16ffa5ca 100644 --- a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/device-view.js @@ -1,3 +1,20 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ function onRequest(context) { var log = new Log("device-view.js"); var deviceType = context.uriParams.deviceType; @@ -11,4 +28,4 @@ function onRequest(context) { return {"device": device}; } } -} \ No newline at end of file +} diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/images/thumb.png b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/images/thumb.png index b74b20f9f86cb04e5658db1d3d2d06a30a77e388..6bbaf4b50890672663b5a4ff05ceb17d307738be 100644 GIT binary patch literal 76844 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 JotR1R{{Wjm!aD!} literal 48636 zcmbTdby!wG_$^9zcL;pa(%m2_-6i$WCEZ9P-CZIbf*_!DgEZ2qbax{i-tkxG+#pf!8VPHgFdpnz&+gZ9p%q*>K9Yv{6TRW*Cwicq)y1dF9%Fa@jHnws;u9liUDq7|~ zcIJW>)UU-LBHluv0S8NWQ;4^Ny`!6uwYD!;br4xHRs^sgzyWpaq{vAa&odjxHveu**Q7bxdd4`IfZ!mg*f>j|Mf);p5|&{ zC8Qz!=D(f=eiNm(ad&qXVrTdA@?!JiW^;12X6Fdort zM)Th-NL#v@yV^Rt+d4Ty{gvTInnIeEC6gZZ$c`R|*-*!_P$=-&rHZ-i7` zZNa3N+Dki`dpKA+y30$8QiCgO7Pb~bf?TGST$a4ttQ-~`maJC1JRGcoW@curf>xY@ ze3m?BW}JKi|J~02@qP{-2|+=rHxj&joSd98yaIv}+=4O^9K1aIk}@)!eE)r~yrY}D zsiV2&e?Qyy-?RVoUYY;TdxfN2Elu5>T(z8>?EgCo)NGvGo!o4koFP(D5Jp{FM++w} zw^#pW=s#ar+S1k5)6(LNtCIudKZaPy_W$&FK~76vD-bMJyyl#&yc|4StY(5%e5_m+ zoK}1SJRE}jR@~J8b-%^`-=Sj%onrqNC;waA{P&+gF#h}Te^vqb<$u2TF8S-n;+zN5P?Q5gQz7gwhiAM z4GDOwrYhLP~0?_RCG&59?FKJbYs zd0Obd%m3RIyz2kB_kUf9(*1WiQ+k8&KU8OOHclL3A?47|=QV=*BMoz(e;eG5ZKVLMxRqC_p5WRz36k80wYQw_9 zsM<~us9F_EG+qzptT{2?E}|35{;lmDXMUM0iVS61C)^epBz#vd^tGcythS+n&$wL6 zs<*GNMC`m5zXV}|T&{~hGGZs{NTDoO*z4q1YjZPVmw_=iH@9w3M57Y@Ax7Y$xMxJ+ zTp})?CyH ze_=49>LOS`g?$*w;{Gn?fA7sqfEL(n_{`|{hY_ce{c#aMPp~mhked$)qHC*;XYZ_o z@^oO^&|dDs(@#shFsv#oi)3VEY`WaeFkV?~d+(N0zW%MGx8iU!s<#4hX=rGuK}<|c zN}Mw`bctB(1d*z>;i?^W&nXx!3W>VI`E;dS^JhA1YpwM-CBnT=Qs^T4@51g*&xs00h+#@_JoFt=>{i)I1;`#)Tz92{>%qI>OV*T#m1Ts+*} zUtmcKBL#_KRUl{KK4c~elAzQ2H5C_cQIRlGqrg=W%m4b5=Af-TTV!QrMFW$9zgCoc zmQ;_s+CUa6Ay&3tlpn6T()RxHs7$@+g0!&9M(!=`3LkGKg5mBGi2S{T&N zu&6X%y$w$fH^#aAPEbMk6bB|W=?w>XXLu5k=g*_h_-P!T@M+FEs>*5kSJB;NMga70m!9w_`u1!^oXyyrZY znR>=WDjpslQFL^4e;eOl?yyqBHj1wQFtM>VH|M56=z4KmYam+zPf%Z^#gwqr>}Kt7 zbFy5tM&n_JUnAFsgy0R{tR^jOR%44jBw=I`&YWYoBI^cGK76!N2a_HF(XTx}e{Eo; z-S-rsz61}o>BoXpbc?1(3l1ht(5i&1oNYSVy1Mg5 z?LLHIOFW{LpFe*tG-z}j%a=S1`S8Ke)I`nwU}k8!udk0{WzoREKsbcVHKbe8wCtg( zyj(ClDd}5_Vg}piLD~Swle_hH zc6L8uW)NYv7D0=gFl&{ep`nGByW_;LUD^aR_Tf`CKO!oH(shS|VBzhNG0C>3z!ZH3 zBM8fneC6)ydQn?f=MHCCINnEgaB*>A%noh4?fdo3{1nH881-#JXpD{kT(Ca|0)N_+ zxi@tpp+-!fjEsyIK0f}Y1aE0^X(>^UxG~D<{@Vo~ES7gY7UoD?eDHovKOo0AWMl`3 za~kZBT?oWN*UinXz2#Uue`#!N?Ads=!`~~!vXq*zrsJFuuR0e7i^d8kb|kNRG4SxP zMNSkZv$}6!fPq558AADHODX())hjz16Z(lE7CLD5_lSsyz8_)et?)0surV->)^~R1 zC}!FuRZYf6e*SzwBN$^JBsZ0-@#2{Z>-OQRn|?T(lU0q@L4C&yJ7f1)qL_g?aDfd?=MsokB_$<&l%hU=9;=L6HEMkF$)U;?%7KS)?yol6W4G%$Lr87JtVT#~ z^lGgz_vgMY!gzVzQ0AAi{NWgU@h`7M;4`SSv9?g@SGqnOA06p*FUtFnkl2YM_OF8E zw9p?%PLm&Z0b9g`Nn+7c_%XQ8Cs;Bl%Tn6$(RZyY7)!HM2^AF^o9bk9bDEr>BZD%R zJoabhxSzj&qnXIuz9vp&?;>2#?(VJ^9QR|O$p=-tg5`a?*1~o`;k)jbFq9#(dMaD}of4?Xum3(?CcvV;p3~?m!c^zt;u1T*x%o?2 zVchkH>Uc&2)_Jo(4&B7k=xw8;5fi+%ALo!|nEHzZ^W=uQgK-f zzUAj{BpS^unyB?!^}m5vduti`AYlmm88N}d#bwUKqZ$sEqmgbN&V$@{XCzA#tmpQ` z++1j%WEBsQHcOt}4|7rY5PJhL1)jV2f(Wqq3Ch(}{(scHa1hNyLPDsJV`g;bg@QYB zlQT1KSE21bIrL{`j;NF}8?(yVBVpl&GW$)Q?WLuqEKE!XyGCG<@q8c&U=?1L%u37dqG-l}UYZP)iEw$; z2pM|QrtV+8;`sEzexjz3JN~zpV3F)x3th-)TUqV6Qc>ky^nyDEAXg zM*#d6vxayY>#M87`GnvW(Ps03c#QB5Wpq%xsLtOgx+ybniT%8CkKw6iAM6`upSCeF^k&kxUy zD?W#4Qpjg8C;$c)Jv_oJ;g*N}vhvaQa%c1sQgZk%uAcCmFF>8DnT~(#@*WSyw(I2AZOh!4|?%8%t#b2bVb@A|iewWlt0~>4p*SDv>R(o4K{c(_kvbcTY~d_7g77>GeBLUK&Zg~f%3XQSSyHlxziF6sR6 ze*N0L>)0-AadAZMoN?fnn#reMo6lRp54t!fPGzg2Ew=}judeusr6^7BI6sC_YSenm$|ujuIL_=Y+Dj)WTl`%073^W)t^VNsDHDxqS9 z0iD$T7m|42q7|K_0+RRdR%gDfwI6s**BF98cz!64(=v&4jv9VodqogRpiXrf1S#Oj)63ZXSwK*Wt4ZLb02 z#2V}~hOa-6zZCH1LEfGALgpl_rKQC~@(}HK8@Bj@R0;utFNo171zFdCpk{bF$uGdt z+p3G>)!?5*W|VZ%lB53Y9*%2sf>J+UkZ@gayeX+DAOlyh6Fp6ZO3&FL1-n z_v5}kSr$%azl-jDIFr`bg&0ZDBQI#ewi5Mk4n+@~Z|PAfaeRbfa~M~M3kxF5WX$=d z7lTxEk{G_y;&F&gG3W&!;p^uxL=$Y20BMEa|-9ua4_l4^MYZC8~r=9hD>5Tup zsIRYgLU-Mfe4-HbamQcR7iYrAVVfkL=VpaFauKdW=g)}GoS{Wg>pcEuGg&AP@OTuQ zkuX2lI{sd-Q5z?DyU@_m(=Wi;B%twbhhtF)#iFYItWMg}3$ z+nx=@#*5^jb2<0@PS#{|bMpsD`N{IdzxVTxv4pzwJ1*S{dU{Q!wA5`A1|7~P;Ucq|B^%-VT7QnYcNqi=A|k|+{3XY|6>*iD zZ?d1vhJ)i+`>SFNd^|iA-}mpI$Wu<_j>eDUdNggcO{dlUnteE~SWxGsilzkI_Yxr& zV2f3`KkLEnab7maJ}`+mX{@Q4AWs!>!Y4j6__wD8C?%dagBHRMr{f?&Si1*PlQ(u! zZ_SOwEie^SRbNwwGHh&azV156A~NCf|GL0yyCIVXL*YsLk!sT*OYKe_;M{S%V#RFN zU^1;R6z2dFhBTxLDbMB3z`v3&9g!iG_|MPJ0ZM;AzM366S#BL&&-zPH=spj?WHMyg zG_>_+hUxn#>Yz@DiN1MocXu~@D5EhBmbPpHWlk(|hm~UumSWr9`eZ;$K1*`gt^32D zeQv~*lg&(bUo*`yDI1*nOue*lR!>q0H~XKn^`4l}L??jubwi^*bChs!zu>!uqA#KI z?1yjMo3ruYa=u!+5`XYl|BHnJFeOWIckB#s=mibL}jQC?HU@?3ip!nZmm z5)u+<&{Y*Cqh$AE54~E}orqK<+a2EI)4mwu*CDXq{^;e78sf9}$K1B_ zFS!5J=(L)kFPGu&6_u|0b1=g*4BT-!{`z%WWhDzVsPiTtAZl!^Rhlrp2%44tO`p)- zeU&V(ZA{GK!!h^#7|47~)_km=xtZA<`q>TrcqV5NcJ?sG-0s-$uq!NA+~z|pAhFBc zA?`9>8PAoRAN|w=v2V9hROy30Znqy?9L!e4IG5>jD^}9rvPaKfAtw@F7$r5hZV%tM z4E|yiNt%l(aF_X;btXfI*I?qWyk+O;xI#F%p9y39Xr&}sH=Iab(Mi0Vktj-%oSZy1 zZ1MfG%OHtpQh$tl^MUcmr%N2=VJ|?}sxOSzktEpze}A`>;&f^JwQ3jL8zVX3U7ZZ) z<|qn%agKmRdKkwrB_dtIJQ#Z&<`amDveN_hQhAVISL_#!xO7@4w_;K&PGi_R1e)5~ z9*I;lq((uE7@OSs#;H85w~z+k(~lzx51E>pYMyOG4xIHX{*hjgDpuSD%u_|}?|8v| z#Hz0#E9>a$+Xix8_3fDZKobj#Eo-=?w1IOd>&RfXr)nFc*o907At5obS2D+L_=dnT zTNAf%Wbsezx`}n`t_P*?gbNiYbcI&A^}8*^xbw8*;Y1ID4L$!VKJ`s19AiJ;IxTK& zJLm+S!>Y%to>qwK9jL0HM-D9q3s{UKu!d)isr|*z@=fSk)dR_@*7+$W#p%b;JZvjg zi-m>7S-hm6@AXljb0paiRr0k`TXHtPlhDO-1gv-#r}x=fd8i<9II*lZ>hG|!q7Xu* zN=&!iqJSjeSZ6T~lk}prx|%s3to*TiA^u5OWf%EVeZ) zOa`ZH8(+lVE)1QR?M3`of}$u_@y@*LY;u?oRkplcIeB?O_LL#|HGCzxjEw%hI8fmk zg8k{+T*`T}(%$+u_Vs*}-`9P?$kl)c2ccEO*QltdtN3ilIfXBj!o2Aw)LYMtKA`S& zu^r8qq{(2n!41w5SPjL6y06--eH({i>}VTGVYr#9`w;;nEZRJ2v%#wO-2&lb&6?n3 zLyB7XTz^ds+&HiOmfPR_(&#q{l%gRu9rx=F6rwKvA_Ud3D^kc_NM^gWJvz(Bi;b&< zQWFR%?8it_O$VP+Q+t^&keY}8m7|hk8IdKv=+65(sbgfbC1I$jsGM#_%zRW(P&i?G zTVwLtMM;%6$u4s9JsEQn-n7&}b-tP?H+StRXJ!)&Eh{T)y~WWIy=7_vwwBf=jZSKX z&es2mfGIszs1G(o+~zcc#Ww z*3_e3n~Of;AEb$$gfkDp!NKX!)6;jnsgo)iZ~S^Nn2BGti*(RkP#-4(OVqELmXb<+I3FIbc!O=RMRLsC~NOMtMze7Spt{ZK9cmNG+RbfP)k@;vAM zh2tXNdA<+XP95)!@PE6)w13MfRn4PJOG$AH!gtmv|BbIIat=qoGRJ#LGK+{7h(*P( z+C-{J9~9L{`zklc@Lu1Tcw8N3JJ8(uEWYNKQq`*=?Y1ZYMMx-Qxt1`O>=Q>;1oWq z6c5dI@f1brS!Vp(v*6&ZVH0Es2eBgprimjm^cqSJQJz%5Hpkdjz4fhG zfwS!MzCg4oM^9gupoCnLrJBE|f{F^1wb;LAaUFj07-CcIoAPrVr0Cb@OEaifArR`e zkxvQUoL0Ia2$aK`Y#E&++BnD7E$?Q(NO{jp6|?jX@r){XVH$%@1wLKPH>elAc?v&l zNO#^YL#ZeXma?3gW`Z9%Z#B_4T`TY*1hJnhEh^B^R7;ziz zbs3qz#A$aB6g(ki(6O`c2L}f%YRMsG51haM6o+@Gy=VzgP(Tx!W)G3QeR~dyh@bKC z-z}r2joIO%NQM30yvK}>kB2ToSY~1G*l^R>PjR?~R+ebEx!v&d&^ka(a$Zuq`Wq8; z=AT0K=1L>v%R?F$tycaw?d>$G)dTr6KjIr#wEq#zY zDPgC-W9v3&W@i4AD286r&%O&)g1W0s<~SvbD<=Mg1+fesfg00x*Ib_^+RJPAxt*PVYd{?Q(umzd z^2bMMSxKUiwHH5*-(t$n$RO_YxjH}yU##ep3<~j+X$&#dVrNCtdiCm+aC1k#8lxe| zY+_v#W?lKccBZC4am3Ws(%K4IXpfhuqE-@ekvuk?@;55;g_ZMaEs)Q^+ygXs_|vCP zPlm=dwY7&rU}DrTTtiyOkub?-jF{4{cbL467wXYDY-YZ%eFG0gzN?zp(yu>7is%sizTJG7RQ>P^-OO23%H*Lt+)?&4BCskM?yQeSaMk0Sv* z82?W?nSg~(Z}i3VFv8!z$9&U9L_|c>>{$2xJJ-LGU?T}ccb|OgILJLrrP#rVX38IB z56GQedNMj&z$U7uFhs~^j{CMfambE? z26f$qYf9g6o;}^H5`#@UXPfB=2pgjV0|UujMbKqTB=xrS^>s(_w&kYbzW)Ax+n38& z!sTzI+5HqzZ}uCare+cT01WkcW@e_>P1Fg<#{5!v>~Bp(o6rEp|NL}5Kt=kM6`_fK z$^Gn(4Znzj^2;i{Vr5MY$A?4V>+9=h8rgVv?o>i6oIdn}LiD4ot&t?g)41u`T6Yeq_YC%A0LAUN@vEjs_y|pQd(c%Eivgjv}9yfs&dMe_`S5`2hr^Y+Ns4sH|?8> zkTzZvVx)`}@nV|%>6?((lU1^ge=a?a7kK@zkAABwlw91OcK!{xsGo;cz*ydXnMnLL z_x8o4#zi|wCfoV>5JLU(Qrt+_=Hn)pO*oZYk*rae=Hf8##L)0?&#+a`2_3nwI`hwW zyLnM8L~koLaO<&`n3X$5@jQjqfNqra6F)@mj!jibNlS|2@w?3=bvD3m@ih$%CzzQS zDGDV4O#vk@U%tExnq5q+CMG0&+B`h;O$qR9QjrqIl~Oj#Z)p+w`15INeH~YU_vZWn zJ;i60NaF%9Wqp`PCs&8=1|U4L7d)aIJYOg9y!ySCq-Qp~IMr<wXI^JmVfi-#B%!JM<{GvpNg6Z20UW zZMCYbSsn12cs#-u`@~q^Y1mX3Wo2clYO=^~WZtGHMH<^Xu68^j>59TQCIgm{6oclF zaS*)N9jn#e|DCmX>#(}>Is|trE#&C1+g`z%5vqUu(SiqFqY2~>NAbeWARl3*z(Vu= z<2yg%RM|4g0&iR|t`&v(E?@RN=2`fH4>h{|u7rOsFVQVsc=zm2Hckto>N%>uzkmPU zR$PUbB;ufWUv_z*$r>b8PuL*mB-htp zDJEh)g9?j(Ir0NBiN)(Uoj;dzQoh7Na!gY?lt@gzW!9=hx>7MID}?MzmE;+xO(1!m z0$T|phKFhLH?VyGg9AlyV>@_wKS4VLVQ*r`t7$ld%j0OOB!;kLKyM2OiEm-gTU^tA zf<4>{C77Pm1i_=M8ayBG&pstsj(1NW0n*-)xu04{Rjg12+^$27jFyeqs01TlS!0Sp zi(anulf!XmyYX{@w+GU4Jw_sbT}g{g)W1zrxb5m4U5TCjBzhY?&+yNm+)3C51`=VC z>o90Nxe_g`utNGRCxbF=HfCVvS;yZlVZf!GVt+00v*gnIj7#&z-mt+wi+@&ue4cy? zP1xf=i?z-dR@YQlj?55~)yJxx847`_)K-B4lx|9P_Y6XHZSCc5P;2hjeD}tz=qXEh zp-fLfXGOvn!^30K)6*(>r8#kNaWol+6##)<0ErfnC6kBjWtY_5v&o(>Obo3%D1qdu z-7tt|4Qytn&cn{qF|OEGeVFK6KIbO;y5T@e&BNtN2;Sr;-CzUhpmJYl%$xTm8iHiG zUSA3V(ckPI({D`A%C&(?)+l_K`dGmif*c`_@3TcM;+)&p6I$sDXcEYkv5}FC)Es(F zu|%1iw|+UFKIMwOzn~RjPKd?iBb`-j>Ll~F$BjaABo@^-L85`CRyL!h0>28k+&n=M zX=019IBI0`*XrtO_zQK^;}IavM!gg=;FW0WS7}l9{(DqAK79W4j$%YyJF7Ox(0U{6 zU@ewF!r@kK~n0O|p}rp<(F6&jM@NCIW~+F{ngUo6ag$@$d-FqW5NxYopvZ z(Ut5*B1KP~!bSIEQKu;g`nQ1;Ddd;qM3oISsdp5K5k}b+#h=sgSb-MwjX{{|c(%O~G zP0%sPfBV=xJU26=#c^h%<%q<0VX0^Fk`xq@(f!zyK7I0A?~TIW1%k7`#*{2|> ztjmSn+1@4;vj4?V0a7cWrVu6fNa_BVumNkQ)_fr?{k7p(>BWg)#Z znYmIp@fR`cMWOP>7#k#0YhDa;ALlsx6*&Z~Ppdhv1D~z6wY9Sh=V4t>;*2my>3=Kr z&M*FIa24c#p&nV3y95Psd0$$0Khw3OWelcwJam=~5vCq4F~T`5CN@^Y189X{ES-q5 z>IUcaqTNVgp7>#WkTQ%}X=#h`i#n9p&_V||#Toqu;t;oln4xMDpVaw&%}$scu^~A~ zZ>+5arQ`n;2o=8uNF_lN8|%FCMs-d9ekr9k?Mr5qya^Zl-TVDI{BnbO}xYGy-twHz= z<&Aq~Vq#+5;Xm{oA78}+RZWS~!>*fT(4d8t);bGBxum96n}r4=fnhp*G<^%Eg=X+j zDVYIu^epl@J|UqK#=kCJ5w)ecSx+6CNR#9!QA5fUZ^3BDk_B(B7&>m4(&%B$!#gFD zW~@F*60bi#Yob;~7V^oRlkwd8s_B_EpK4_aNW{x)feMtN^4D~HI0 z+e)oQc_nQqjB?xTtrKsR6L(vU_}4fp97>1f^&W85iC7yJPu>Y!R31`(ldieNg#{$nC;GAtvM=x7#tb1={j}g3n_$}; z@rd1>s+ZyqKwgOAUcz2bVCpsFe!~glAI(iWvb?+;;lrUSzL7+`(o$1Xqhe!D;V`dJ zq$iZ7AW3SHayEw-5X4&`DULH<-%ugZZ+b5;s?pP8w_4{#(Ljzxi|KCoR1YF+*g7@i5j>OCCQE(7pNHLsKcBl#0KR9Hx; z%J&~%Dk@H02_*y8=oHg$ZF^{jf%byWNQpdKT2fNZ_#~5GM~TBZj)06TTy%#IYc}Pb z@C=*6kQb6@0lWxarAh)%_lMO?F!z{Mt^n9eVN;3-e4N7RcDX*%d&m{_t&&_kvu(xF z*Go%GOjOOPO2|;wd#9!0(@(P-N{NBuI^2t&XhL=-pQUrD!`29Ga$av6pbA_HpIVz{ zV`a^;u(cJ;J-qo|TdS$4pfFQvXwAmPreY|Gi*!OA@&^$f$LWx}T-yz@8$wj=+*!D1bngh^-{k^?Qg&$i{mHYWsBHCbe<=;D}P2t?+J9QOAS8p%@*TY&>ff#KmUP=p~ zjNB-Ix9mu~$XO`Vt%k;Uo-EzH5Q2qy9s?2^3S8POI^}%$IQAP^**tb8CJptYiYKN1 z7d!aYA5&5^Q7{2!osZbrA^g96I4U3e#uU@?~24SuuVzx2+;FtOjv#6_MoXnBvBL{M^DMU-FtN@y%)5+aKv2Jb!|tYD}mHE=L%(CQaCE{M%$U$D*y< z+gklG0J_jUHh8A3wJ0@3Xv}24Th?zaZrdqXxU}TQ2Cv8XRC@{ zrG}t}7{b95E)eT7Pt3maP=-RGVPbjMNCU1UZCWpS?F60I#0@lc+JO}40krsAVlC$0 zDI_E$tngLe=&72Kh0w?hHy6ye<+G`d zcgUd!R4jrR(P_UJW_C=CDg|4rud6b3VZJ|PSV$odopj>Doq*PObQ1O}5(ded{TDL` zFYhd~h{&Uto7*MqSC>^r7Uz*nPNy7TbJpvJu~dLVYwi$;0#nVA!PWJH%pcEba}>{x>m++|10#vAN-GwKkpn4W)Q*^;W=Y?z-}?8Q$WXetlg0{!%LZkso-j5RoXA z*C9&sYHB#tP_L>FcZobE-(;F*S~n1byZ1FU841QPrpNYz_f=DJAu)mEBg{i=#ies9aczg#vth4IidfE#CBiBE4FFJu?|KE~Hu|71pzW zi5 zY%Ghy-_PRtqtOC~vqMAW=w%RQb0UC|x>r^xn~Cqwo+y9Jf~r$H$~wk6=DLdJ@2RON zrBH*e(<#l*Dh{|m=zsvvtQ6`;2Z8#W*L0zQxA=(}BpQJrA zY2j@8=vY%+#C7QHn@C?+if&3u%4g&@?drGRsC|HOa}JpL{vd{77Y>h-;!7yMd-qNS zpwe}~B~GW}NQsGW&H-{1L&8H@zck37@L|=jvmtly&H7ieRen^At8rwBQKx*rmE`FB zT0h|}GIKdmu4ug3>zhiM=o`?8uD`#(UA@EOhX%pN`OfEUU$9jghC?`*O3)piB5+D# zb9ObjqSx z=gEI&P#=IWtIr+F9=nLg(@G<_o5|VoQw8=jY80EiW%FG|G1(E)JZi?6rvR z2N9ACB;d!K*5p9i5zOb9aMhFM8XR(n@R!E(U)Ds=MNB#&KZ7nqAi;&d&{k#0V?|I& zk0;Lrw$=rT!YN@%9X@fR?Ityin7a$^(f(z7^-7-TqIGt5)@9Z2Qu+14Gi7)BTL-zg zVm3>T36^aiBuE+$a8whJ-=ny8OI-J6iob(?*>oxrs>u|2|6MpT7@^9y$$cMBh?)Ww z&O%0Dy(N_to-!sn+RxOvg$;oir2BGJu{&DoQJ2IX&J{{?lM5FjrFh8C0!*(q!gjR z=SMG4*~SZNq5w`+b9YB%eIs!rtgV8PlciQK)giSuR&A2F)m32TCd6?P(KUqx;3d4l zts01g;%q>hM1jdy6%>i1{ZhA{TkX9oO-yR_vOt=&kByGjXP-DeD^F^npv9+GLIDM% zDnl_BwTDK)E3Wq6aUh(}g_I|kYm{r$Ki6oz6Eo=w>aZ7gGN1C-EK?%z~(%Pe4)JNiw&4&d(vX}FZw0m^;_O{egFDD)PyLE#KXh0 z-Z%eFPC&OecPY57V!5x@Fuw5((73Xr#6e-El;58;@9N+bD^i|omLjHn6k|SJ?fjbn zOfe4UfIScC9w;Yd6IN6#GzK!jey0zTieue5SQjn9t4Ayrm(GC^#dR@e-OeW zS>jGH;V(Db=TXl0KTIw6tF>rj)c-7{{V10%gUZj82%z0RNyTfGjh$U}!kfg;YOvUqT`xpT)(+Q^JjDRwkwvZa~9bvtUy5RF%3j zIohpvK!44Cz26bV&GBCul<0bI1WYV77gt#1qyDT5yUmYGI-1{8{`DN7Aj}t#ZfolL~#tv~FlS;sO zP59_9R?pRL_~~-&i%5?SVt{xz5f%X=B@O2rS@-Dz=NSUyhKAAkYh)CKv$2XFO4X+R zg}4rD@nJNqQv8KGUrz`+h5guLry!CDwQ}7@rZb>TQ=)E>vpfGd-ucLD_hTX2Z}Rk$ z$onbE8GCB%@4~@Ra56ta@$l_-e5j%B6s^G1BPxOvEWEO^GRQy?v^YuDs8}&;;NtR) z>Q9bbaB((ZyOE?U#pIDLTR|?CV;^L>S-p9B1RDCTBvMZGDF$!a8)%I~5pn38E^$I< z!M>3b#V~ij7R76AW;VJPneij7{Osbw6{)@ll``=UuF1+x_^CTRWtBFWv~J1I6nECQ z^q6-RuaH{lD&4xT1FR)P0~$84uRuQ`mS*G_N4Wc zMT=?n6=lfV4`E?_B$z~*N>r5aQaDa2KL&?~^@q&e%MF319vEm)zz=iri=zJ z$Mk}-F8WZy+}xah{nx0D3%|)!4s)t|lz>r4A{*634wvQdrg(>oWEy*-%HKI^V|SxH z!$@hg<`dReul6zG-&4j8jb%fG%R7)@{X`?c+`eu)LCw)W2emCRm0m}(ndP8m^qepz zBgk?wIGCWyPrHBda@B6W%AY;euV8uAN%=x%9Q*j56#HeFArRCJ1k#)H`2JRL;<0~` z{s~B?Zixoz=oL8Fl(rv&gy|!_`c5|QBy5h_NNnq2C)+8!NWj?KLpc9XvXyK<)R9e2OC!{W;Z1emjN`<2nvQ;13!M%t_U^Cu!|=ANzAEmtTm{Oa$^s% zv7f10BYevoFe9)^2s(cpAtWSh2FFyq)8A59B%-qZST+G>c_-w8&2sO`;u!e#32a$@ zfn*BR@!~^=*psm9El+U|n2i%{F@ATTfW@gjqnaUFax)tmtDA;Xuh4t-0F@94zy!Q1 zWN^-`<>dHyImYze@SopzvA^5%(eDmOj&bbdKo_ve&ZGQJ=%}g9u%W}lLQw@ydE6aU z=8ldhK4LeGV66E$v-bT@f}Pn7xyAo{C}1T^aS>jl`+-Jc&+f8}awc^L%(kKwt)zQV zP%mXiBy&2bpeLySeAo4*Z7^5{ZemhbnfpJbC1YqpPud|oKHZ68wm@eRzgywx4JBWG z3A;7meLMAT<^66>BZ(tYNY+(x>pD1NK$gI_z1}j=*4Bp3@teIpE{ng)cidv%-&#xPU)Mc@?#rfc`i0z4NHH#Uy&nUf_yNp$i90IpG*dh|YEs#| zxaBCm>i|1(m#KB&|8PAzOFV(uCQ!%<*9EMUpl&aVX0%>94!V#7>hhWA>aC0b1gqxZ zb<{bA#-J`oyf9*BV;iFf6pmuB4SQ|Z*twHESU(UKY7EY}-QkGkA-(6?D$jqH3+sA7 zOiKEDAFOUqkbE0Wj$o<#-b&7Ug}PRs)3#j#g1=RW6_Y-b6hDdn3J8avOqGi5AlntX zdF=O;YgTYnlgM+*)F{E9odZt?cFeedv2Id4AwK?%fy~^cdV6qiuqa7U+}be161qoe zr8|&!p%#<$j>s4nf#-Llg@uJ$#Kak>zcRujUy~@`1N&ecJ3D(I`ob|W zC%}+N_Sjl(eK_~W2o9iYzkCZuirS*X>G${T7~qiz z{0eQq$At7!1=mb=+hj>DDvE2slCHvY#RmoN*Orx)eM_NNMgxgu%3v>`sRLs*s>dup zh3!it-6T4&NA)V1(;MY(G21vHZ+XJl?NWU38x6Y_)FMKf)4hF!0zv+bjm@5$_mxGU z*(u4K41TG28>q2%#ok7KM*VaL3c6TRGFMYBNhpoS-R%=_7lcQi6CO^;T1ZH*r_K6)ZM;P&3njj7jIz6t6^G|XVm)z+~ z8wf;NE53k_3%o=U=%GNp`H+w4qy%1s%rOE$KK38@$8|&OyYg)sBy00$cbM)x8sg$z zwbJg&jCu0Bnt-GwV!M)IWIjUj*z}R? z-zm(iZIM$^{e{O>wEJnz49n6MUid9}+{u2q<%+q|Gh(A%@-a&%?iD`!GRiea%k2le z&Fw>QoG1Yi=h~vmYFZL5t`pSydBVo87JXboaa$?8S-*Ed0`S6UJF4EEEDPR}eZXGlO?{_LS1D>UWreB47C1DUeF-EGYzBJckERIiaKS!k+AVucl$svwB$9VOf}k9Z zOHH3iIal;)6l!AD-Ndfqoa=%Ax`b7|wN$bV=sIys91D+Q^V`m#-uK(j&(0!IB=Z$} z?Qv{)RYcl}x8Xj$Y75+k-_?%iuXf)?!I^DS(PUQTCXY;ea@6#IFszc^X0*YCF+zb1 ze9|W)d22>vd3-KvJEdOUTYeit7CG1unX80^1XV~;ih{uglw(f7NQ&9`sK{ES@>L-4 z`&vp~pLOB4ZQi}<2gmtydas@YzPV~7F7P7$8^jMEeF(~tbD3zo{&~Ay#B0Bnp5a*$ z^a01vb53@)ZzVYT2jg&+0ra4AP}&F#V)o;4{Plbs?0%QXuD?#Nbw}O!f3b9yVO73Q z*WPq@H&P-E0@5WZ-AGGIqm*5I9OppkOOqArCoe00a$?~Kq9vAeakHRE@&-|=?rOt#W2Y$VI$c0v4*v_S$Js^fFMi zvt?9i9is6&D$x6VAHZ1v&f*huIXOA>(gIqoyR3JTZurwx~UUDZ2Uovgj<_3*c?Tr{TbN}cd(i!W)XUiI7@mjjt+GAL`6k$#6=sIT_v58HS;(QcScwFuMgmrLw~s+-lTchk^xDk ziak+bFmsIsyHjxcf?1P)II4geI$!f2+g~H`V4)_NmfGe8zTVjOhU{u}0|cFCnd0 z)1#vmyvvVd9$iFIm>a#gKHY9V*Jw2!$`~kOg$PygY{+ln7miKIRRngyue^Gv9%W%4J;G$FK_(+RhO^)XDbH*5ITGLfe-y;T$C9pz zY?cCg)p4?&pqktXCYC$;MwnLV$XoRJRe=4Mtj$~BUV~gJ@9|aGv-&Q7iY>KPhcHe_ z$s20IU$&HpDmjjPdfMDdyWunHsOHd6ZZTI=xxFz))^n#sJO-%+5BL@X!L|7>s;S9G z+Ls=U%|euIec&LmEW@CW8okJ7Dij3l-u`q(|A{N{WzT`0r2win+Z8c3m5hy)m*S&9f_=-K3tTDxyd>G-cR8|E_TRpq%J|2S)Oq*7-ieFr%L`mQaZZ8 zda&(EuUy+Ey9%vZl~OqLydgajxI4#%flC>(=HE0oKYy{V+L@G;bOIoR`rOs*5BA$p z8%f_tC!S`DJ@ZEsVK_$nD!%fW_tPKqsQFO0n1qCXPFKg9pZ-C^^aeG*%-w&Q*p;5` zD7oqtI(MhpBb+M%ETaKN%jZ4R0vJLYZO|N0Jd~3gu*~I^M7ry8?~3W72P#QJzyt`E z6sGXtu)R3b4)e@KnOuZPQ{BgpuE?5PK(8aAzw_BD+9>&{(?=_4?3#Y6dAzl`;~7aa7=-d6&s{oy zpI1kgCZ}+mj`aTPp5pP97z394`{!ClL@~MYcNDj@WW^WK4I&Q4;`mflkkdY1KC{JD zP}Nv7THh`FsrVe*fe6)@EK;s1aZO3~6eaj-Gs6eC5Czc+l%C(;7-zJ~a8AZ;ZeTJG zu-Y>y9E5u2MqZEw?9!_*g(=*}=oBYkCs26D7`m!3)ds`=Y0@=cp%&V$@8Ge?QfwL zP`bFskIscvkVdk>;hSi)Jt|Q4f}KRYXQ&~BNl;786~VS51syJ>2V@y@ld>a>d}Vo> zS2{!rD#w(ac$*dW(e4z*qN__>7PcyV4x5O7wOES5`DD1CS5Jw_T%diF+z0Uwx|~mU zQ5T{DQc_YfVm9Wjj`93{ys@YMnieqeq5D=R#IATYXjMQJqpwI%;ZC%*SlimrKk_Xs z^N(PrketK=m7a9U`}js){?SRayJdKz8iM3yC*eyu%sn%My>Bge$@AhJsNBg^u!l5To2eHzBq@<*# zz02jnT9I=%p<1txT^Cy)^Y1nnUVD0}+|ox#(c8!Xt0R4Qwq0-v$&0;!?cxj#9Rj(@ zvS_txB(2@GnQ02jd7Y!=yIskD%{58aJYg_q5m{CRR)|2=bhwQ4TsLX4j$s+c4Ilz$ zA&*qaIJ_$;fo#X`m6pV<^&fl( zzSM0kFP~5t@(tYCo=IyY3#P_75@tr=s@WVz%9W6t9&NE_!)zw5htBK{vZ;6%sJ1Q! zW@a6459r_9$UPB*InKWU5{G)x*9Pv9Yti=~;Cee*(_>O43ICvcb^iS(WJo}Skc+<5; z?-Jno(q;Klbv=M0e)P+iwr#o2asHV50s>3@@0K2&{&ti)BiCDyH4A{iCqD7tg~3{e z$_MA0e(S>ZLdD$)vR&AF|Gat}u^#J4uCK2*5szeml%O?J(h08dP}17kcy>&qo0bzT z%Q&7Q&XnPt_gQXdb7}l@BgQXYcHppYK(;Z!0 zu)B)XRkGch%cIkZJ4qLDmv?K{PYHQTK)3Aq%io~}pYTPnQCjF*@3OMG42~GGMg-_{ z=zBxn)U?8nJ6fe5KVc9wIGNJVi>)h3vaQUeKTJAW9k3oicG?N2rLV8=SF0d)X$qIt zrxPp&>sM&ves+{`a-K);h@=)zKoTFbnxqR=X~JM*y*QWS;F@4Kzq}Ij0T2#>)4rHip>NDJV;~4*JzcuNI>HC}#z|6$dDQ7vu zzp#A>C(J8v`5N5|O~o3tkWYBQ_S=tI;o0Gb5kd;(qb70L)_RK$vnlS_-EREfl{ZjS zOjiT0h&Zq(a-7nF5VZx&2nVt|eYB-w*laN1$B=3GHG>vgx&#i9OOolZ6dRz%1Z4F+ z+`vieK$S7cSGAU9HVjiaAu(l6J-lf&L4LoVOCBoB6Rfetw#Zc;a(q`kOOQshNb*0e zR@YyzJw=BoR%=fR6k>bI%gXjAc`&3>T)2`59_Z@oTHs@2Gu;iJ=SC{D2ix?q!n`PU z+!xl}3TGgRNS^REO;m1|8@d2VHW!QS#KlYnRqPRu;NPE_A>8T{6vKlNx*zlk zLviryJ+b((bB*C}#DaSri^Dwq5wBVxkf8 zv9IV;@S5+b64neSV|e{5(#I**xe}Bjsce)bz}m4VsKt&l4<#E~Gk2I_69`o@zAE@h zpsc25s&wh^#b$9D$hflp^y$+vFdX!TG7_Zdclny%A(ihsPABAfWJzU83uXvUCOg^| z{NAW7w51|W;_Acu*{1H!wo%{#{|5tkSDD?9Cdyr`poyBKBq!%&LOxG2B}DxWE(eTn zbzNM31tS(HXihU_iWiQ~&x7JIl@DSc4h&^Z4YcmakjM$bC%V`I%mD#o22HD4{nJO| z=^6R^6fnf-%3TfPi>_&hnK`>9Ar*Gu2?c6l`V`vEa*1Z{lB<)`Z(O4LQmEGas3)N~ ztcRoWNxqRu)p+rrPkK1)59!3+DuWa8JidGsIW$+*m=r? zqvU7LEjWB10uS0SWcZYS`A9NJI2*vGHOlVF8Yh-8r!jdVm zI99})2Ymy*+#4ejy6KfJz1pm$sh|6l#JBg`eGSVU9UWcHQ+K2q9N2ZCjX)Bn=c*Hu z>9OWDZC)8v?5TXMLg~)6lH-Rw+lihKNPR{VD8V&HhF>vz11^TZB*!3uON7LS@_Tls zRt`&!_l_E;6}QCPSVq6MN!8Z#SHlo;1q!a8;-aEnU)LMSg%H`M?1T7$^Z!&$l-(=20uJl4~;j- z6?{60%;$Bm`r2$HTHS3+-F$8{Nd>TP%pm_`WN0sss5+g9KWN^waFrywh1vtXBv z;KmS~c6E@Cik1o6gj};-4$ZebUWo!!gY@F2rlz)zjvGrz>=5RVt$HA;P&!x$DVjQg zj`M}npd!lF*-o$WNiPjqaj%L1_u@m<84e-QHCu$aBD>}DumCdfuAL*geq!L$UKYsZ zyH7mWnqU!R-?d>}qufFO>;`>D1jXewX4mKoXfHWc#!tQ@VO{l^-pL=%(m>cTAiNL~ zj+BG|8}%BXYoDG3g34c7L5Fco%9RZs>rvet@x3bJ2tvNzK5M*Rmr1#~%TB0A)NujP z5gNX#`iK%J^;k;YN~gT^{Gn}lu#xZ7#RLC|2#0bt`ThF5Al&C z&Le+f4}>XIW67&e-1^LZmREQB;kvfP__-TLCo>vnd2W-aWyPZt$0#KEdfl~nW`FOv zK2(tm7j>)7dG_N|vsOvhmgCjOgzO{ZJuLEiGDBN|Yzt*nF@~rGii68jDDD&A zVjXx<3YE#szxfF*G!^*Jzf*;v6b@U(CjnewfN5$^!p^O7TtiOG5YiX;(b- zz=ui(ZN{ef1`ry{^?UK6qsLu{Z@1l}k$$fCW8pWt806^KSn)cr+%bbz)TS;ZoszJ0 z_YI3FwZGT3`*Yw9JyP#jbuXT||3~IjHcUO@Xx2Vg;Z;OL#UJQr{=xh28R-`(AC?db zQc{*%349(7;^(GCv3dlaVTEyGwq>|Up4rwlRQM2<`At*B`%GXzKPWdb(LD%$p40e~ zOu7#c@sCYNkUoy1O4@f;}(6yUaBWeBsg19f;k^^cJ5-Ms$8`Yy|ACtmJuF@j%b+2;#25 z7Of`+yLIWJ*hGKc#O8RBA6O+DVbY#Zl$Dz^&y}xl1ds87=l;TMz|mTN$KbbN)GreaDjRtHtdUy{?>D6HKpWfnri1aoiCcX-{yx`T#9|?Uk|I7N51sj!K`9(+`a82X;tWy#J=T`q5Fhv=GValXU{;Bl4e}U1IUozJ_Lk* z(@2S-e0w|w=69(%(5sWMBYQqbHj|7`X#JBxMsmM`y4IHK=HpA&`yM5AyoP%1=sN9O zI~m@^i6jg~$c>Ck*$^i+3PHxt1bHE2q+jhtx`WYyeX(`+$KX2jLx7bv1gN{X_XB(tNCz`BO?Jsv&3mAso4 zT|$WCQDaSwJDHZ^TWs))0%Cvt;?f&}jA^V+9ovGba8nCNwo zX>a@*fko0Pg^i`$oDFq(tQwmx<=492JTpCG<19L09Nx-TncOCg3rNM~HnkEeyD3lg zldz$VK%1BzKi|iAAN@7X7i#oWz?;TKTudYe2SPj44vo_AI3UFkjGLAl;V5L*i&=Lm znZJI5r~@ZVJZ@*y+=nR zE%(09a$R`xg#uXLgWDJ_7w?)2)GGxvbo6hCdyaY~mg=JM4AM&&Q4i>5T8L-F`)kIj z?^{0n3o%BeCr=m&FfnWPU<%&5F`VLm390B1zw>(V3nN#EG3h9+ri`D9B?(|lSA6*J z0U>099Ug$iK8H+ssSB2*ud6`^K$kQm441x#nBo#)(&x@@b-9R`hb%1)Qh9Az9+F%u zlXBNrBI4J12~km{5pjy=yO+OpaD&7N2nd`&eKujVZ29!*6Q^gHVpkjd>9+sjTj?DL zVd@|kmr880NYc?-Cgn89sgWJNxdvNaKX{lpOR{($R?Q&qi;)-4k1CXPyVPD`M`#0QlBk@gfb`Q@Be!^HT`lMMi30pyj&;xt>~8MyP@E)*-E(I zvmMT=DaA{{jOU@fnmaUFo)|V@G5^c5(4|#IjMq1! z(3lm~6pHbEmQ)D^XZRaQ!njPUZmZ8hJQJTpbB;J5ICaB~i83&DLzw+|?np{X@Y9Vbr5W*G0&$v0P9-=yB`{CRTlqHkN5;UwBk$;KXW9I!g!Y*(E- zVZ*P23|WkmeCNZW-dGmbb5)I_KN~^Fq~`@1+>56h)_Q9PpYS#Mzqgsjh?I?u4Qj?E zWI)aE%*_qs6Zh{YOh2ZjyvGK;OnIKZ@*9$=m&%?>4?VI?ZS^_GFzYx9vCp0oP|ECw zoSu5xsHA$N4gNYM+%E8*QlgaHw6C z7xjgGUyGOjmQb#%Jf16h;ZO=MnTpaWOIF zTG7pLa6_HwU|9?dX5MFlzTbg857!>_Sh2I|-5vA;_6lk#{w_xW#WP;R$6FXiu zWAukWR*&JDe7|g>ir7I_13)jAiYYr(FXqpU_(MiWhs(rd$7$FRqd%l?bd)Qi+!@|> zQl;jNl4)m+N@2~0;mYm5;!WKanxDV}`U{gmbY%0{D{$uB_dQc$LAUF~?NEARmWf*| z6XDQ<^Tq1(>c7bG?Zn_}QYk}nkVoa-$UTy7OA+#30iTZp4NZ1NJ(;Js_x@yqlVLeH zsh^=E#i|U}Kj}s1bogy!6n zd*2xum#XHl^P|uyo4>N3>(Yv-2=nmZ)78Yp<5OccV?`z;Iib*9>|<5m((-ryUbz{k zv|NSvdjbDbFyEl1xtSD>=*{kilWE5@N#EDVR`IWv)uo_J*#?VKArs%d{lU*)X{S|P zcb6Z?zgGb@m?iK1`yZ@`g%X*tl9gZuZiG?#Hzs=%pm$~ zgN0q1@|n-jQX-vJTmHGV)iKnT2ea{i%ZfC!Bj zm#+A7*pv`s81Ms>gh#V5IOy-Z`jJhRN|f93&7cG~Hin`+3M|i`K`Zp@#q7jZJpPQw zmY#@(+1E-Ub`;n9iol<6cbPF$nbDI> zWZeadme}TugT-{!l)8g{+5-D(699+QkdGgyE z?R%?@I_)5EYxjn?dI1$*4DnlJuC+R!j%BNK7IEnY#i=-UInzc>9SCR(zJhOh&TfFy z%It%3tjffYFPS~eX{X_=0vfBu>V)YTxPXE&Mx@bOcsFDi*N#eW5Gjv;AtfBr3XKo` z4GRq>$D}2QE3sqYB6h=IG@lxWg48TD?=ME4vXeszR*pJWh%_MGk0!&=Z~{8uPZzG* z$~8T%;?Hi0{m7ekjm&o2f*mr!2aG8FKAGiJ-7KH1ZEeqN;8PBU^aNtKzrboR@$Y9j zZ4rkar5p$)OBiDe_4klsrIrki0ri5#m^M?Sv;Eu%%R34cl{N)z9d+g9yM(|1|0!xW zs}ES|2^>zts&cF+#wi9P=x zxSz?CZ}X3gN;{5CxLrCO?rhX}bRutgSydJOCbhD@r5O3c!Q`GTbMR)7D=KS0gO3?H z_J#4Yvx|$_guimShzZ<-Gl^KE8_D3Z_c?~=JOvS4@MhbQzcrNM$Ft|pQDlB8u4L{v zvIq%@^^rak8VS)P%e+Ekccm-_|6hP_LcrfMKtucoRol12k~tur4EOXPbN@lCk1wE` zSK>;FbV;U$iOdB;Kw=sOH)?~Z74LBaR>}aBj~=Y3_!3!dM--8za9C1;q}&KCsvwEl zh&YtwREa0aDJdralEnTmSK30)$f&d+qOvVR;&_Pp90v4Wh_9dTF*0`bLQ0=R$DVPU zaSPMCYo_wiK%QLV%ZP}8m_@v_h&EZhj=AZ53O-*RXIoW8Je0u4z*pqWz?F!9pkxlE>_Wt6TAOz{<{boYx$Yu|L5BW-4eoCj*yUPTw2Fo z77Gc3C&ZZFKf*XazEJV?&dSf9GxUEK@s(S-F;QBK#?ZrO@CXHRy#Zt|aAv_%XUwpQ z5$)Tr-4f5o#EXI$E&2P|y3*z6&)!&46jT~NxIZvp2B~^`7P59#upzolcRpYpI?LFj zh@9lv2ibyw+Yy^(@2m%h_Y~Ro&s&Hjaz4@&B7>0?ev{+$4ocY%mh2+G$5TAG2I8_< z8s9RM@Gn)7HCbp6eb=G?OaQ7aW<4aklrMdEjzj^qd!Y#z7CllGP_r87Z%9G2deB$B~D8DC5So4kqtP*H*mA64B+EiC6l;>((Wg_ySS`t|f z-OSO$Bg?lK%4(1G0Z9r%!trIu%N43{&jMg<&m89VuRx6N2+37vO}|cyG8{xly>~EK z{8^j^!zORCkQ%G668!&rq;E2ec@}l84T5Bp+V{tlCZ30L1c*2 z3K1Ou!HyuU@{KS!_#e^An;qJJ=tS<$K$T?}eJ6f#@7IfI#hXWcoQa+gTJsAx>Cm4U zM`kkBx>o{~lIB~Hq$;HE#g`zHVv`XFbsMW1&Rb)})eTc}^x_USY;KH!lyyoAFz;sY z@Sj()c1;2MwEky0Gh$+5*N{Q4TS;}5%f@8n zI3-$1IHCM)31a2AuUXFOJ(q9leSRuh+J&`n0x3#7^I2sxtY%nSBo$R02~3QZM>q(v zb57D&;v;MnKR(3G-OG}9;|C9~8o-8Q4^VpV5ZPwIyfoBR0Tn|nk^FR?M65AB)DI%c zX-_m5_+%af+edP%IKw>a2e_)scO{WlbZ?m#J75?o^r$er_p;4?vYkT>86&lU`lIDbA`wE46XwveV^-2RyTt+c`~Z=MbfQ4Hb4f-2~O7E>o8Ic z?n8EEUB64y_2yAn!H)NfLSbS%<`s^-!a{&aoYM$9Q{EE%KD27|Z2tVYj6jq8_2=q@ z%4R6Pw%=dd0{o@3FZ}%(!YzJpKf^nm``8`(UHTS?tD~zMOO-=Tl2A+=VZs|ZwEgS# zq4aDIp6~Y zmLS|q0<~bS51?611vbWwhB7kMev<{^ecPmlsdh8Md}awqZ!C3$JTFoOlp|RdI6ew7 zO6X9_Bf*>@g;%GIJow+uMJC9fGw{wptv*LdSRI7NHBe46`&9pk)#3wvb-Fd!svM53 zQh25l=>aG2(HBKj-D~(d!kYceVo_IbTRQQ&dQSRTM^bi_V_rcf$%u4)LC$oY&?U#U zyaJbQm^)FPi@V4G7XAZ~c1Xj&E_`#512o3RAo#wmiZufhkI%Z(-1GJhB zaPS$V+Q~Yt1d$GZu5QWRG&SIrp>B37G%Fe>k4I=xVMctrL{oG`uJk<#Eo7!$1gFsX z@z)Z~>Mi8+)YMeE??K+ES6PCdlhgXBeFFn8@u>uC$W5(L?;wvC*&8k}NHqt)tyQn| z_&4#Gi%l_3#RYXQbXn=t{QPqH-`^&BZu7~c05iA5q{i!f5)YmY9d2|4C>XiB739RkL-&1l2+ttgKpEh)-9*Y48G)pax@#0q(I7 z3r$v(?HIg45)AY?S|%V`x(<48D0C7Z3Ej68R9PcZD+Qp_y59O&I5X0$W^SmOR*F_k`So^^DJ2?izO#{ z&F|a!jvNpf;+9hn5#5yFh(_c8>1kTX2>Z(zME5f z29&gK-9r9Ym7jlze?;0&cm7|5CWl5og4`H3Fuec%8nm2@u};f~>jsN9ZqIAX~6oGVMMlO3vZ{EBJ{$BH>+c!S{evXV&ymia8URA`P z<4zM+kekWMMe}oIVeZ%DQ`s|4WTj5H$# z#~ci+q;qOyw(l)buHega8P3%t(d`{W=&S+B|7C2$hdb>3QLhLXI%CWv#ay3~KGiyW zmVitfV;2k441e&aijCMfU?{2XX_!#Os_&=}j@MdX{Gl(rm?apxK-tQbL!wQ>rk!9Y z`7t5arB@+@tEk>SgbAIi?0mfGhLe`N>?2{Y7KF*RE_z7Jkl<4=EwLk+;*7(KNm7O` zN>R{;lb!whbBH-09wwBp8&&asf0B{2N7w-vrk_+TW66Xogs9&&ye|V454>JMQ_{gH ze-aC5hVKPS6qusGc=B)d|{_R zC&ako$=GrL)M)=Ehl!rnP6LdB16iEsA($v3?la+dlRG2muv{$(R;2{QGa{k`t|9@D zTTK!)HlHiz<@kXRNH*&O{vy^r@uwox%tr?MLove5>o^PGu>RW-Qxk(xd#T$q80e1Ynh8cm?Py~#_*FVymM$wiw* znN?uCTDk$(O6#MIa@~a{>MKCCJr74{iUtBk`NsWwPx?l*qCz`#P6ED2a+lQm-zrUl z*X2FM-g73o(nV5?E9Qd9G*b#nv@4j|h%%L}kTMoXuU@+WjT0Tp?{7JN1{zxSOz)+` z4YET&p1nGdv1y~o5r16aujHM{Z#{rq^I5Rw1LN^+FuVg$(C{TVX?7kR9R(jZh-1bF zb8&M^!oq|XE^_z-%I)kHKKK^l@RJt3eS8=abO+E0NuC<3Pz)YsfeA~Tx!^7b+Z#dQ z#P!3llJP@iXNhUgNe9B(M))sQJo{J4ESe zptnaTbqUdGNOF#H6;e-(2q8+uze}iLigwwrDaKLq~Tu!1OKh)$`TC7ey;E#=$nY)-*F z!Xp?y3q9J5)xCK6@DrWF!Ch?8o=+FuGXIe0#Yc<+RZ`qGBj&+?haQU2Q$9)mi2rsw zigZC&N@Ud?3~PYv_1DCfVCz&`eER$R&st$dCj}4JT7M%;qSVT@wIKUD0j;jw+SIxG z9~>@MBZDJfQn(9o`(b%YOKhQuiHe@7sj9XaPhiqCH~yQOn~U#9(Izyf4V9?rx~Ka- z4iTV$(~={X@8J0a!;~DM9-sE{g%p$_Z~AD{Xs(0%{&6KM_2=T+)M z-I-A{sHA(A!r^t`C#a(9vOP8L>sR=5w8KF0!$HA^JxeAO-*<#x`xH$ZtE_tytO|MktXvm@D~{c*;tCPpa~M>06pXSf$yBJ7>h-ZsdxU z8>YCo3{9So8}3G|%7wMdIbt;x`P^Zw)LND&fN?nEzmqdCsI2SHAVrSg(~9t=VTu~< z5I^H1UlW4DI9F8S6fLK2>jEYo;nBD+tD2iJ>kvK-B7`Bn0%Ofb90SkR&=ooxFnJ}Y zg&e17P`A$q6k6w3G69xcLD0OwAjGz|2*2Tjh>K~G>g3bzbNAl!r}qJzkq^^gf})ym z#p2JiJv}{3Z0Uw|ox7KA>6f%kvf=1gV0T&Ae0~Ej`Wk418vB=@s8%^Tx%c6$Wc57g zJA?squyUVQ+d3}#vtirUW(4D(fGdIBX$izt(_SO@3C5ueMzii&9FcaJG*+!6l znO*W3MKNe5FuvsmRv+PshPYo6j*(5o8jn&_A7#laCm3q;_DB7J{m3%jiYC$LBqv7tG`}X*#$7FirG`8Y`^)=yIlM25eNu0Yn z%IecYE|Bh%V{Yyoe$~w^C6zO?!CSgs3VtK6?i*I$f-me*O|W&9F2|#O3d)c6mk)6R zYqNKI(=SJpckR7bd(iZxg;ZA}RKgjT=WKXuA}BJ8R1Ll+lW_D(3J5%7ttO59_;C&D zlwhsOxoZ}k(;N4(f2DdH=Fjn9swKUmGC<*e=lyvmA+6B&;+O!B?~ovQ9F8T9iN#C! z2IB?j|9(`~<2WQ`LMGbJ72l)y1)Bl27d@bt(`g696V4-_L=qRgFkf|$4>l1tT}~Uz zQ2i@f9WxPX8rQFI@W}NAI75T`)(5B@i?4V)FW1y^ikwCY1l~f5 zdyyVpO{0l=U%lg29lTWtPC*zCx?RNCvAw;0L5i*La{TYw{J7Ud5#=?#J9n_sGH}tw zS0MvWpZuw$yE=`Rw~t+Vq&0;qL+o*_YWvIey32rtq>Y+RFWQ`uF$7 zVqHPUtai)srHjk^&BY9&qa|`Ut5tpN()z+nW?rvQE|tx!L{kiUi!P2ryP%AN6PrXW zhx;uxebE_fP2r~~M2G@MfA%|KKEYsWC*(==wDyglxE$qZ3oGHz9`or5l=6Q5oF?HD zNz4AjuGhg{U_E7^lMV{NIh`NAwW^{%;6uA-(_m~if+D`TCE+P`Z3-{#OBfw!(!tzh z5XN-D3vkp7i+D!r?T*7E6pzXj_w)HD=y;9d59*|u`?|993#0#c!5VwbtntLRh|OgV zb^)u_NO8qhVv6EN@HHowGc{=VhrW-iQ+)E}8vTCD%W z#>P&52jr4uHMZS;{iMH8;s0I(>{Clj`8dT&_>!btH0QLTajeTA!a3l%pIhzW;o$=m zWaRYje{1gwF&wW{-P{h`DBJWY_cX}1T3`dSiJ;5eDc>LJp^NA2?FgHia}b42t4I`l z4N=klc4XGHWIgq9J}B#02vPe5W)UACd`XO*E#~MKmc60GJqYAR3o zF~$$9ThcFd=1$>Kj3)TXaWP)qE>DPQdwvk=BAP>cEH4`(``*@4QTaIpJSZ>40}Rm#t`VU_JXQL)x|T>S#r^$p5j! z$EKHw;o%g5Ic0_&!T!q$i?;j&oC88sNLzdw3RhD;EISdeF>pHA(=G-R`kC`nVF zmNJB$nM=3p&UlZu`paMV`Ua3fguAnQe>OtN*L_}+mX0oI^4EVC&-3Ef%>&P-g;pYq zwhKHT@0rDqanp%;ZiynUZL9ndUK88Er8s+^^GiXoJX<22Iae#Ih@$A%@~OR}Db7@5 z)4O-?q-P|<3OXAg4`wn|ceDNIa7>3sDB_obwYGxf{Bjj$r}UGF0)>M-tOuQecDA;g zpDeq>%(8`D9Mz}Zq(7mgBxS3eG`lDBN1s;A(_tQJoOs=_b2Co1cpc(c(-|gFM7v=> zAoqe+>arSP1A%p|%bU$d{ce5+?QHNu>g3DXJk)Mmc@)oP_j$ zh)?BsW_7-u_zIaHcLax7=q%2AWM^}s3GeMmR`cxuQ02sH%knAgn%73teq5R_cmyot zXx3b=J)gGe30Qo8l4Nu|40} zX2z}1&AZRQCma~)B5R)C5<_Ix(%B0R#zb}biQ#OyQHd@h@j~fsDlkETwr`Y*4Oy z6=9Y2z)kAq9n^*IY*UU8J4N;weUl>dr%$H&+w<_Tu&$CISs&YgNSDDcB}M^f1J2dL zSFldbtRlV5kr0~sQAxveRKW4?2jba(M$~bNn)CHf@6!+d^fYKAo8z1@Ogh;7oMCtr zElN{x%=$%#x~;>R!7Cq&2^ruTPSZ*%162O;AMX9g=_Ef!oPvl zg02_eX(uHh8d)YRwMwc7$2h8(cq=#P`YA=)qkbx@M`~(+XegFEN*woJ*~Yl2*<)m` z`lnhm+0s8Nh-#%edVFmRW1nJwU-l8$<$JAWMTA^GS6TVG4_kZz-DBM%7b-)aXszP% zJME0v+aEX23Z0O@b*{gCqFWyO0C31upJ;gcSjr{{tMA2)ysg6UG@dYZ$RzY5Jfqy} zXMBLa**0L*gD>x!Z~l?O6Uoofk;A^2UGJe6$Zz47xQ%fiLyQR;$E17@^H>e1#ipS7 zBp`WFRDgvPXe&Nt_&uL|HIm^}z16wQ2dt_np+=%jFF(N!bMgS`q8S%Q+&(8_TH3fC z+_w$LS_N%tY&7xWj3Kp;6nM}>`tZf4&X{l>;_D?TU21{BF{u1FwO_gNT~&_*mvsYV(ztGvTL`eQ11LkEw{38kE5( zf-tQ%+-1q`CUSf9D2Aa2b>?A?h=&ztEoq9UD0e@Lpvy-2dW6ZlMBbzhMo%Vg?^{uH zhHU#Iq63TlF)sjzK6_OI)J-fVW3{ozqhX|zVmAIGw7H9>7s=V#zx!rqUyzztEv0?g zB%RQx*od|J7D@h1_Q|W(5rBUvP>)3m;z)K}q**aaN&UTF<*zV50MQF~+@yyU{0o*2 zeNNaiMqSLKS`si{p%R&uBrHJ|n$bhn7#s0v0I@7hYM8=|Q(S!h;VY&e1XK#6yAhsL z!c|;(DOp*qX}du<&D>%a8#f;c4T+{rdXQSj7a9O_K<&<$YY(PX^Zp@Zozwm?p>m{hVGUIuBG@7 zcSx$S3@H3t==Zn3maIa;zxS}nxY9nJM(2AdChr2VSdu};DjI&?eCPxIoL4>Uk3R+7 zc+$GMlZh{cRHfwP{FPuJaE9%&u~aFJemKF0xZ;?Vj^xGFHQ}`p6!o?XKtB@(O{RIs zYx!2_ja;VDeEVZ4Ytd4R^L8oY53ZD95knnNFcuY@ejSyi3IvRE>YeJ)AX(JCz5I{Z zZ_@yNptl9=cyN;ML^f#VCijn|x#lW0Fa+DRH)2ppjQ}q9xN^94k_{#vuoErwSr~vC>KcsFGrFW_||D!kNa?_ zwFhtN@tRRQ6=%A^A60WoM}MiT<(hzWMfl}x-efp zXs4E_(W$X#pRuQX>$jeu6B4^>gQVdBXh zcx-BQoJpXQY4iu9XzJg`@koGda)XtgI=j_X7D@-_*zd}+En1qkXCJDED9B7z| z&XEJy=u`LSAhuF6^I-cU5}j$AdsPbH;Z0x>tZ^NpT1R?|MyHhO1=cdi>wN0jF=xC&j zKiUibL|g$VNSeT zI(_Z1F#=4}O*+l1%g`johJ;@*2A=$fbA?{i#2 zj6^@^5crZ-W{M^5{eorYcxdebFArb3m)LH8Lt!lb1Y-aRN~yb^9`Y{&?RXFCoou}y zLS~gh;&_GGy^-t@r?pwX9s6TEHoiI0hd({`OB!4k#q^He{g-x{FK-3$r?jG29bC133M8W{qrR1;4Jw>~wAxG7}GK?07nf;xvPo9KM4*As< z6HSxQ3;nplUKBH5zEmhOG31==GkOd`AJNdkkh6O5Ybw(=+S@cuW%())2mzb59^G*E z@w^IqAl!&bk0VrznXI3BZD8YIiSPA2!3Z44d2xX@Vh$mY7+JNVBdiCY9;Ag{f9hra zZ}&gpH~G7$G?KOGRUZjvS|CA*m3KNN?<=cscw}bAwjc#Lwkx@hbf<#3x@7NVS0f=? zKy9pMn4pj;t12CrYMw|F5dAjLI^N)&^d>yIY!}B?Lr3Bt=46 zx}`(`K|<;7?nVje?nb%d8+U%!;Gu4} zt9@m~OGtJ(Oy+*9Mr+sk8JS3dR?k+p)9VEd_7alseg#0Cc&-riC;mvn0-b-_HqdA1A`Ei+QFpl!Y z6!7nhcJU_rp0Y*>1SqTSZ|Q+FoYB8r@a+j&eG14I#A#f(&3L_F%KQ(sw}x|7laUK> z4N0pUN8~yl0Q+Q!PB;=I%q;DIFVz8YfIrM#+n-P&Fo;u0j}mNUqi(sM^?_!QtaZ}U z)z#I?d`9p-!E~l;PBNSkeQ2&hnp9wNhe`8aMU>AqNJ-yxc%52uTsT<`vu+8x&sH8T zfQG@kUskvDNTI=f5l+oiQXxCiU=))MW2^f~olrD6YUgE65gMxEyp5z}2au+g(x@(Y zr?q0rZ=hc|kxg6P(rTL*1i|>72r5h$UXl?1HF*LK$XJ?aeWb%h&K^qmg8vMeA{zn8 z@jhJ(BV%Jew6M|%aCM8oO@1{!HtEJDf^5^a!yJwYaj&3lIpfNS_>s}uSWor%G%#>C z+s(g=i-((A$cv@tK^L5vhmj|Jdy-roXlPutn?fuso3wqL>prfaJYMbc^KlEM<`yQM ztz06Q>vC?aPjWa%zPHztl2*eg(bTRxELB{#| z8#K^|L7r>{G#hk)F8d+~=&RS*kw3-qj*0N`4?i|=@Biazj+Id*$Z^Lhl+_)UFmtJi zA*1_-tIl0Cg*CV};Nb#6*P)n1(Za4-v)fOW>g_Zdp*B@hCQoVk6U=cZR?O2S{vXuW z*4E6|FHz&c_gy#MuMhm6Y7VDcT~~Iu)2$PaVg6aMh(F!= zMUQ{!i5hnR=mn`7{`MdY3x-I4na|hh0uStF?xYX z<4}0q{tH_)pUz{`%Sd$JnqWf=_YBtHDtul4Ey;WQ{NIVF?o4;A~yct9?6e?P-;MXH9V+8eUc+4-H|Aa$w**|EjZk~(hmn$ z?tJX6j(p^e-TXjNaaU{Jsy@X_;T~j3#X%&b*#?Qr397(&uw@3DIOgnwf2f05O3#ZW zwlsrE9rOhv(+=cL&c@~CEvN~mzlr%?yQ*b8-0i){Mq*t`rD&P%Bt1XAS`9{0Gy`z> z--73_>+6R6==K5zrNq`pecz-kx$$*sMuHBCVZw4J7;wCu4#uWU-$_tr1jA81M5da? zW=Mf9Z1>k&jek#-xspJmXoSsTih7Bfo&erjnndO$fMYS7sXdTLv zy^;J4177?=Ph{mbCqF7G*CB0{R&EbsO86izujT#w==%5s3k>V};*iSix< zc4C9v(0Lwst(aXflvTg*vw#GQQ4m9qDNxfNXm3LO!yO8|~ z&yX?Me_>+JMR;W4e9sjxjjKKR&FhPK&-L4Pu#4P@E6>2O)G3FQfbo=%CfYn|DpFDY zN|O?d=OIZlD6W#} zC{x+3J%XAPNTokzz=NX9>|&~g4ILqwYG#hqd>uZzL-eMnFz?+u4 zqY!A>iCO-Vd0`~~GcrE=WAz&sSnHs_ z*W{uMsQah0zU~Gzh8rl{wInW_>RO@;ykjtvrjN6u9-aO8QGZUNNRs6BP1`ZMei&LO z`G;^_w+wleZUE$~LQA>STsK>U%&*TNrN~fO94plx^(W7COTmY@wFe`=aVhf;aIYhg zg(472^`A56$j%uDxP_i7(tMLg@!FHAYijx{zrGGKiyzk$;_Ejd<)%diMiazVb#%nl zbPIQ2!v6N3!Fy4hs46cokW2i)0gW2H+{JABI;}36SgQ;pstY`L++ad5##X%t-8e_b z$NwM^cwG9BR?k_f@W3|Sql_P>DkE14wlLKHh@RoFFIi6ju0E}Y$e`zc*P525FJkq$ zqjVkBlL>m_t7oq~A#TKm51LoA;AfonDEQW4)+V1TG*2Lu0f$#BxW_~mB4A=E-lE`( z-gb zvCa?zr%Lm!oXR#rdB2;&o&?4W-!A|>emMX02PPaQaMlXQ`(lQ*79dN0&S+m3PwJptS;@0pHQ zT7TT7=DxqV!?o>J03&ZPOe|(7?J1{!UR>u6%APS%BYyImb*-Q&_vIZ(Yo666w>))A z$(tA(`||!3oUn(8ZO6%;;@;1RgaX(sCc(VH0>L6Od$(3(pkdDmG?8O}Zf?YYu>Tt&5CmFJJu?ypqy~0zVju&;0P3p%hTI7~VOHU3zo~mU)yL2?e2- z$)br5$WtP5S9vf^8(l{L44UeTn}*BU-CtwT-{#}({nFLl-3jNr*r*jBR$M;)oQXHo zxfFrPZ4sEau%JLb8TYT#(;z1q-)Z-Y0^z5UY!`*=pJ(CsDmH$E7Rx;3c$mI1q;#sN zpulGDdf@P&LssHBjB-XA3V1}wA?|-%-GsVsYrV`)5h|W#@h51i|Im#8+>G*8XUp5r zgDRJD8gA%M@UC)lhRsEus!i_n0)98!i;IitFeWR2+KVrMm~uNb)#=F%wVG3N`DGxq z+z>G`8mOwML>Ms@V9rEPG2n)rBq?UJ?b!t(*F3279&Uo|q4Upm_uK9^^ zyC+*ug39X@dR?7?W7u=$y2Kw1Zt-j0#( zC%E0n$}&S5AybC}8DF^o2c5KYdr^Ljn8ow~`T(6$L`!D}#9>}3(6X8^&*b^L&kQ9y z+-~Ux3eP_1Q$4tW-)@K+_FnKDOxRjmC$j@FM>-&%$Y0-<*kw$EcOv7#;27>_>SS6l~`GZ;P>nazn-%3 z@6tBGrxrB7f;%3fCcEtWCVGY!wn3?Lfw6ToZqo;0wAAIct@1*$rmtcG0|U9L$e<6^ z2&k}CyyeQZeu6e@0p<>R&}+Sed*xpxYS?(?>lcQCD*sIV@98V(u0L2zfAO;7Gua zXulEiRNXBYwU4wThCh_ph1s%AUb%S-e22?J(KK$!A?_JiOwz(1hrT*5kHu(#ANl*r z9i@{dEVrDr_;})+gaoZ}oFvRLud;tz9aOC@(@+rO4Ca;`p*!hXifz`95vUb3=;PV> z%$z)5?~jBJazpDzGnsL&07fVS<$`Cfz+e8yYHDK<#(O|a4>3WIZAwjsszQiX#0O}K z7zm;oGVEBJnmT@k7I#7F(o@`SVE(X~m5t5%0LdncDC^7758`L1*!LDE%C$IHaTqT( zfOr7!Hb`H#>vn+fdPWvpQK;~U^P^fc)#?UpdsWaAfL}#)e!Twg0cC!crs5hkZhGv$ zSqtnJIZ~}_ozdl8N>4~Q)=gk`{%vHwXrba4#$bNpjK@>QyYT7?+FwdS+<6E3tf4gE zp7homlhpqV1NA+5Os>bhNbWsH?29vVuAOqK zQh+47VT->|D-c@u#+OQmI(nj@>bjk}DM%ze7Mu%NoUh`krXVA8i#RAj?Q;|cG2814 z7EE`10Ug`_mAZ`SRPE4vy>}qkysOaE>9!Y3h8-Yhyw@k?wgWW2@(|q13mqJ>0Wcq6E(9G*}_Bjza^f2#w~v?M#jXH z7XSdtnz1bb0YPW)Ne{lvoMwzK2m)V%?c=%L(f(TJZ)&kEXRdO6r!x$5K%$S)4lfFP zVRv0h(n$OT9J)&%ii!OE3ck+xz>TU8&@=V$45fXHSDyYO|E2&V7y2UoT zV`oNhn?B;f&ohTE&m6e6jc} z_*s5u@sBnWQW>Vhfiu2+W;DH<1}IUNf^OWisPCUhOw(x(o0tyuhAs+0Y=2`Dt<);h zDQH5a1ax_LtAsqO2_GLwJv2Fz?oN4_f_h~DzF0lZ!^pdP`ELfJT&T$>n6kw!931XI zqv!K<;(Z(Ke(aQE7lvW|3KR%!uY&J=`2L;(H9y#@+yE-vLZ*k6N}lwbt9GPphC*&j z1v4Mt5iwEzGB{0@KH|(TmvVmIXFg<>{8=~!LGkTlJ7?l8lNj?EU2x4b%e{?~Ol2p@ z5&3l*6*@eVIodGiiMW7H`#XHWk(QapjTmy%>4_CsMUMkU7+N27z+@Q$c6Zi5_l#v) z8tKzSS^cBW^?L%1MmbaWV`99)1ky>p?Kr!rD=<|PG`&Rl%fQ-VYkT_~)3`6?U;wVC zX=Hf#@VoN8#6&tyXd&MR%&-{D3c;>9P=oZn0W=Xf(ZuQR#VlnP21)E6WRjZ_yEqd2 zDIY!Bm86ocmL^8Cqj6|{XjV|&#%y{~XET-y@3p^!_b-+pu*#<{UG|y6b~~9s9Wm)k zV&?>mU-&I2d~!#V@X44KJ5cE7YD70Y$U)fmGUZYV2%I%oDM%U1#jh)y*BsbG_vfEK z52oddovve5hs(<0>F%y@QJHl{jJB6=qcu+@neuG{ao>+^s32rfOQ!g4=^E8W$YUMX z+peg1kRBz4D-+ZcyMo}QJ+xe{sAckEPPAAq%<-8)BiFI4??=i55Cx^Y=(m~IMXza_ zt}_FVVt%!Oa|%mlor-}WMlYTq2r(gC6nJf4LcQcPi%HbN;oXo$|3*VZv-8ba!&IJY zmjL}lZ45C^7VaMxg*N$L7#Cl9gRtKCPsIjXVblNF{2Kd<=Biob`y0G(3}sJ`VSt-7 z@0aG6Lby=C)UFVS%2)L@;wb8Jqy9saC`H!2i<~;$5^qk8T>6x>v=6P;k2#V=GsK*i z=x=&<6Za|J`|@(G1h*W3QHTjTOf9%BoDk}AWLaOOzb?yawrBG*;CI;|`IpJ?qts7w z=>aafYAyYJeU}^SjZJ!$MlmZOxaP!U#P|&UerpM?Re|91+S>_wQjK8Vy243ci#-^C z8;Y*`=4{NWe0TP#--P&_N|h6ZoWIZ2Eqy|E2e|qA0hbSSXAeZ`j{DS=7g5J~en4(4 z8TMi-_K%ayMFqb)-=8lsVqzxt3%;c$pOBGCHyrk}9lI+USjbrdF% z+jX9Jhn9wC&&_83g-uOv{b1N|;9c`RsBGR8DHYUyCULVbS*);#=a={8S@)k%d2I zwJBi@HTAXo3bK)@FY4rD*fv`4mWKs(kKz5JwK{L*D?>+3eZ2+(yn_Je0jcfyMD2`L zy`e8_qa}wSOL(RN0@a=cYAun+MUvAP5My{9b<&ldKDYk*g-5=ZW9b^Kssz4@x0vl4 zetai?-$#F4E~xVJlV+FW^qH}96KvQW<~BAV9F)^8JuZu5(~=S7aEL)XDc1G54bViB zrCLR{f^+vKTtqb0} zH(ubb3u4k)1tY%SjV&$L7}qAf?*u?g*NvrdwqN|xu|Ln_LC3tm3?%mvq6~cSjYjYs z&d@#UAi>Uav!GT$%k8N_@c;fmiN<9La7eo=V>#(U!kwZD_5s1PWBflzaDNx=6~l6Q zCUpyF(Nw#ppzN}8=Y+b>JXq3+_@{`XP~JW zzXF>Jjsf;LYoF`~ zU5b@|Q;j9FHGX081z&NQ_ew~6Q{qm~&*{UugE+4Ae8VeZb*jJQ%LOe3^0B@eDtCi9 zR47sCUyo|IwdxM=(RP7<$Y}ale*+A-g8uJKutHlSopSH*rQWp1`Tsuk*@asAc+P{* zIMhph0GH%6eWe6PF7`gA7`W$`p>96(r1iCe!oV4=F*>)Dn z(!T_O_vngp+m0bPi@5)u#9}FkHgUFc+fif)MxZATnu2>QVahK!EQ|>UAAcpXTFK?T zfwF&x>96=266ZXygi9NKhDi5szA{98n=P=tuWW5uo*B-K2jE@>-1);GA?BoBx`=CO znY>2dXuxXn+7J7Z$^PlnSNO~NjzMm29O{|py-+xk*no|?_H(=KrHaWy2fN*dT7VZ5 z4C4omrs7a3iuk_K2EPQ){PMjk)kgYY8>yP3|DN;+JDMVVy+#gjyNUss`t1c|{2R^r ztAtxuf6J2|V&>8ird(Z*aOOD$ru`tvo05`}iVKg7WKA=69DTujwR%g0BHd5+DyG=| zRU(p&@&WB}j;}J6=n4O8#H>0?ouVo=W7J<^nthgv0F}!Z(pyr!$~zcU2SQ!7G}~L9 z0MMgKV4I3o{5RMoVb!&}Xc{Y#8e;k0{v{*d!bRWnRa*($r-RW&Uq%|5Gk!mRI)cZK z_H6gQr96Rpd=tAc2R^IqNO(li?-yX6UsnKy@_@*(o(H_*HEPri^P+k>C}iHzG&NH- zb&G$G+iiK{gw2}fT3N6Tpjc+mpZ@C?SVkR)LJPJ8!yvs|-oksa`+@fkg1l7n^&d6B zZ>yTKH2Q-tL3&!6=V^@i+E;%$2fl=A=Cj7Wm!1P;;uC@=^e5|l8J7z8QdDgOGo!vN zE5TU&i$dm#lpb+fY@%fODScrp$UEJ>e&}ie*L3#6H;*FW98`nrLrw3sj?v8W@SiSP z`bcd~NqqTRGx+CL0>9E5b`B0PjM=**&2fN^<{^_AadUf$9fKPvLpX3Yg>u(3QbX+BfhecGn(kK2-%pe! zb{mB!2$iqM*SkP@!4A==@)d+LxQ)!&qO*)X421HtAEI--RIbJ_<8E>RmdnE{TT2Gx zo-4$Itw~&{u$sL_w~~MOB2(*dIX$VEZd{y&p%Hkj4}#2(IJG@ACtc|1EjK#JTNyji z)O_Tp%XzNet5m^*~`*#5Wz z@3PB*!cx$7i~T-f!>IiXWW4ah=A|E;cpOQ=d&9QF%Qzh1Zg&4Ig{(w5AUBnR&rOUB z-TTOtCqt<%H%MN{UL9S)m+A;ROTbu^2eM8mF3Ptg=uI~S0kz|@n=tRYf;Qbe^eRNb z2rpDqr0ifj_!oz%Z7M>W<~x`h_LK7RnD_>UVTmQ_h9GvPK;IG^aR#|qyq9S>wfA_e z!dLHT8#a6rTYiSl`|t4NPctUP?-F94d?$!_4W>Z>D#}HyIurZ%l3o#Md zf%Oi7*vDfzCtdD@LbuVkY#!6(!bPUl($Pug8d#L2jsQj47uOzRkPNcC#&o$z#SMT4 zVMnY|I}gn1=;!*WEmcr`i-_V3%`H-g^7Ci%&Pl)!;$cVV1wY|^W!0z9Bg?$X7QpCw z27|*ohrH?Ch!z)u;|eWOfvC}%!TR+zI3MY-R4>bji;8e!!BAhKEmJJ$zqh^Zg{v}E z@WjAiQ48LpncjMKC_4vD{USs2vwxzUkM3&HxiP=_?!N)d8dU@0uOTg;GKpyVm1)#?-CN?z`%|%E*8^ z!i4lrNZulmd0Nv3U%EOkWXYgF(;7s~S0y-%qegvgZJDAb=)Gk#&hvzXKNrb- za{vp#j&p>~oXo`>RvX+~GL1lWJ;A5%xoifUH(%65$eCYYL5jSmkm*4R$a3LJ`wdDlGtM-lyfw18k20*s`KUYVORdx8=We zg>!l$uxIC6hE-WjUsA=zRu`Pdi9t3KQ&v(ESqa{v+@H0mh=`0n6rZ9O7hf-q40b3F z3Kuo!Ut@l|v@b=L^&stmMf{8id~bGmy0V&FR+rj@@X%Q2D9Xls2nzRm;V#;%jd!6N zr!yMERYnH*zXQWOYm1{Kx2Uw__jd0K2d2Y)(a1#sZ!t}SGkDi$pqzxYEfN^_B*Go< zG)ru1UsF7m_)RuZ;H*#*7Q@SbpxWU_&=|RsUIC-{3P61~Yuv!lSjZRZ<7Y;Dy>MZo z_^J(3VKN^LxI_D!NrV?hB9bQdk@i04Qdl4inw-SixjBM~3~kYY{C30q(~YHAw7$FV zDmsDE{{(rT-TCFu)QckACun&r?3vBZZx|qfI_@emDoVt?QONgF*xVb91)G))vinD- zrk>#;elDCG8=D+a(9paZ1$_v>He$pY#WO-Crp3G@)vjj`hAz56og}G)QbdWKosgE+ z{0%@k25Q}c=uH39GgV&Zl^NNVJzj?yVCY;R3go$1t;E(VR-b~Icz&X@qZ%+4r}bVC zRL67{Oz}hLu7)oZ1JRf5x6@=%OL0KBo}a&~I10x{k47Tz^*H)Fbre3P{jRw#0@h+SXG$@Mk?BKtS9+@0nlD>l7$i-FeI zOL)w??@CJtMqC@->o}~to6tFJudI*vbM`agkrb5o?ty?0%fZoyc_V6MWTYN&{H5pu ze|7FJM&Xv)5Hy1j7$12bqb|#K*QC*5{@vn_!aZv5Eol=bOV*gHE$#@fpGg8a4xi{b zAN0!4s`<1&@3LG4CnbqH!BR_(_SxhOPAD*ZB@ zN9fXjO<3}G!`@;}y%FQ$vd7$fHM7ZoZyYh)*okoEdV(nGw=u6>P=SqFpR zo+D2suJ!6_5jP3$!3~7g$EZJiD9x$Zoqrcgj{FAU_jeP(@nwx1$@x%j+c(E)e-5rC!7}?Nd{$78{L1yYaj#l!{yG%$m#RHuJ1-7k%a5Ukh@u1FfWBJ>5`Gs~tJLE}J9&m`Xrk~< zc0>E^_oc=IZvXCNl>zdxp;x!LZad8y{uI|FB7`(DzRhGk*@nNebpj|g%YEIeC+4?4 zmSztQaD_q`_!pPnZ<$F}Mv(FCS>b+?yL4Jpvvt^-F!iItkZ# z$9c1?^3bP{RUC-Te+*791Bg*GPYhJe>*TpO*taS>XUzjw>tGY*hvzSgoS0aU(BHDU znu;iwg<|+x=q3~O-pnzMYjJ-9hJXU4DR(ONz5*=HhCh4wr~NgLHveVytP}Sx^=_h~ zM{zvOL@iz2SkJZOHfl=E&Za*Fm)6Y%EC?&T8#a$AoKOVPl+)70Z710_K$vt18`|OR zuYaq&2W~A1Z42R-bGznC{IJq#C3-y-mZx%^ZT$70`?*vfTdAJf?dc*J417t{ztfv& z-9DQtyum60UJv#CR>kq@f5Hs%VI89Ktzgcdv?4)eH&XC_l$)l|(Wp-=Okm!eE&eR` z7?235R*!>E{V3A59ygC>iApWG2)qM}C+Uoi-1g_ny6wi(pEFVj+M#p=qq?%ojXId< zJh;VXMurw=E%BZ-PH@90ppXu=Z-aul{pE#w`wn$d@jDwuZxfG~w{~{Qhlhtn%)kbg z0FXDw)^DDY@@Ku19B6Zm7aeR{6iQFy_ZI@0H%5^`HaSRT*9`Ol6Zx;V)sox?m}(aA zJ&hjO^C@unkmHNTvYBMMX7Dr{vl`2-Q9u5p*Ix|r(fx2xC7Rfcm7d!te4x8IxdTn%>$#PP=sr7tQv%fEFi+%J#IM=-xR4 z6ulFljC%KUJJTlefne1V>^jxH@bvBhT$>dkG=%TLO=Ia#qerZZt~^j-RwDwQs4dSQ zmq*LX0l$y#0h(?B-Hor|!L1s?c4A(bg~fss(x8+aww7Q$dW_?m6g-Chiu=Bna;@>7 zGPAczwv)`8quuHm!h=>olucowqvL}J>MC)>dUxph5b}VY0_G0}b7uJ21NEf(eDtmHY91j3(6* zZM4rEusoPzQINC(pzcFm%(j{Ol-Y!IMcbg@bstftf*b`0Irpq2sH$!7)`ox`U|Rt7kq4J~$> zN?XZ)!A~C1Co8mhf4KEvVtJm)skYSoPLl7bg{_sY)=f!W~r@okI%acvxYkHBcE`S@8M z0 zBvlrqHPJnp#t8l${1v?|q?$|}sa~vuSD1ZF?0pe?cneIRzDZ?fq=(Ep_Hgt&toF8- z=o{742|T}iKnPFC^O|T)mk`ZbQBlzaNUcX+US3N92&~y~V%b(q)O_1sbDF3+8(e=$ z0yj~ktxApY$MaS_Z_x`fYw2GMbytuGei5{wCm)+~_@i`V{nvCd$W^7J!cvRG;cce5 zZ}l8LA}$$Idem!c2Cl5SVa+gA92+HX12&4NhIIMujoLoy(^B3ynWC2Y9~qnjrPk4d zddU%rLukHDd70RY!H5%btd^fB#uF$aWOD>)D>2w{Nhk8Up#7ML!lKvbwG6BV8)bDZixJI9z|)#!CGu2sTPY*t4A>;n^E0wvWP$< zBkaLd#=eJ=EYm~?8ras7-~gqLXCIosFITYYbhj3w3K+4sgEs!4Oixs&Y3 zY!u-{_m(T4+Tb>czY;%*d0#)Gg4qAV3xd3~Oofg><#bEb%CgY)pKb2)mJUwc^#Mj` zp8cE_Vp`1TY00t=UnIDOP(I+@)M7Q&lGS*MB0yL3xu=qQuIE7y`Cxrh`5Y}DBR8MK zoMMZwP+3GYcZ5A0zC;`K0s3?`tyL9A81b2NT)7fLn-Ll&ReToOtfoPTZgkZ$8etZ- z$^zo*b%7 diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/device-detail.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/device-detail.js new file mode 100644 index 0000000000..730a132be5 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/device-detail.js @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +(function () { + var deviceId = $(".device-id"); + var deviceIdentifier = deviceId.data("deviceid"); + var deviceType = deviceId.data("type"); + var payload = [deviceIdentifier]; + var operationTable; + if (deviceType == "ios") { + var serviceUrl = "/ios/operation/deviceinfo"; + } else if (deviceType == "android") { + var serviceUrl = "/mdm-android-agent/operation/device-info"; + } + if(serviceUrl){ + invokerUtil.post(serviceUrl, payload, + function(message){ + console.log(message); + }, function (message) { + console.log(message); + }); + } + $(document).ready(function(){ + $(".panel-body").removeClass("hidden"); + $("#loading-content").remove(); + loadOperationBar(deviceType); + loadOperationsLog(); + loadApplicationsList(); + loadPolicyCompliance(); + + $("#refresh-policy").click(function () { + $('#policy-spinner').removeClass('hidden'); + loadPolicyCompliance(); + }); + + $("#refresh-apps").click(function () { + $('#apps-spinner').removeClass('hidden'); + loadApplicationsList(); + }); + + $("#refresh-operations").click(function () { + $('#operations-spinner').removeClass('hidden'); + loadOperationsLog(true); + }); + + }); + + function loadOperationsLog(update) { + var operationsLog = $("#operations-log"); + var deviceListingSrc = operationsLog.attr("src"); + var deviceId = operationsLog.data("device-id"); + var deviceType = operationsLog.data("device-type"); + + $.template("operations-log", deviceListingSrc, function (template) { + var serviceURL = "/devicemgt_admin/operations/"+deviceType+"/"+deviceId; + + var successCallback = function (data) { + data = JSON.parse(data); + $('#operations-spinner').addClass('hidden'); + var viewModel = {}; + viewModel.operations = data; + if(data.length > 0){ + var content = template(viewModel); + if(!update) { + $("#operations-log-container").html(content); + operationTable = $('#operations-log-table').datatables_extended(); + }else{ + $('#operations-log-table').dataTable().fnClearTable(); + for(var i=0; i < data.length; i++) { + var status; + if(data[i].status == "COMPLETED") { + status = " Completed"; + } else if(data[i].status == "PENDING") { + status = " Pending"; + } else if(data[i].status == "ERROR") { + status = " Error"; + } else if(data[i].status == "IN_PROGRESS") { + status = " In Progress"; + } + + $('#operations-log-table').dataTable().fnAddData([ + data[i].code, + status, + data[i].createdTimeStamp + ]); + } + } + } + + }; + invokerUtil.get(serviceURL, + successCallback, function(message){ + console.log(message); + }); + }); + + } + + function loadApplicationsList() { + var applicationsList = $("#applications-list"); + var deviceListingSrc = applicationsList.attr("src"); + var deviceId = applicationsList.data("device-id"); + var deviceType = applicationsList.data("device-type"); + + $.template("application-list", deviceListingSrc, function (template) { + var serviceURL = "/devicemgt_admin/operations/"+deviceType+"/"+deviceId+"/apps"; + + var successCallback = function (data) { + data = JSON.parse(data); + $('#apps-spinner').addClass('hidden'); + var viewModel = {}; + if(data != null && data.length > 0) { + for (var i = 0; i < data.length; i++) { + data[i].name = data[i].name.replace(/[^\w\s]/gi, ' '); + data[i].name = data[i].name.replace(/[0-9]/g, ' '); + } + } + viewModel.applications = data; + viewModel.deviceType = deviceType; + if(data.length > 0){ + var content = template(viewModel); + $("#applications-list-container").html(content); + } + + }; + invokerUtil.get(serviceURL, + successCallback, function(message){ + console.log(message); + }); + }); + } + + function loadPolicyCompliance() { + var policyCompliance = $("#policy-view"); + var policySrc = policyCompliance.attr("src"); + var deviceId = policyCompliance.data("device-id"); + var deviceType = policyCompliance.data("device-type"); + var activePolicy = null; + + $.template("policy-view", policySrc, function (template) { + var serviceURLPolicy ="/devicemgt_admin/policies/"+deviceType+"/"+deviceId+"/active-policy" + var serviceURLCompliance = "/devicemgt_admin/policies/"+deviceType+"/"+deviceId; + + var successCallbackCompliance = function (data) { + var viewModel = {}; + viewModel.policy = activePolicy; + viewModel.deviceType = deviceType; + if(data != null && data.complianceFeatures!= null && data.complianceFeatures != undefined && data.complianceFeatures.length > 0) { + viewModel.compliance = "NON-COMPLIANT"; + viewModel.complianceFeatures = data.complianceFeatures; + var content = template(viewModel); + $("#policy-list-container").html(content); + } else { + viewModel.compliance = "COMPLIANT"; + var content = template(viewModel); + $("#policy-list-container").html(content); + $("#policy-compliance-table").addClass("hidden"); + } + + }; + + var successCallbackPolicy = function (data) { + data = JSON.parse(data); + $('#policy-spinner').addClass('hidden'); + if(data != null && data.active == true){ + activePolicy = data; + invokerUtil.get(serviceURLCompliance, + successCallbackCompliance, function(message){ + console.log(message); + }); + } + }; + + invokerUtil.get(serviceURLPolicy, + successCallbackPolicy, function(message){ + console.log(message); + }); + }); + + } + +}()); diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/load-map.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/load-map.js new file mode 100644 index 0000000000..92ae2d2d8d --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/js/load-map.js @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +$(document).ready(function(){ + if (document.getElementById('device-location')){ + loadMap(); + } +}); + +function loadMap() { + var map; + function initialize() { + var mapOptions = { + zoom: 18 + }; + var lat = $("#device-location").data("lat"); + var long = $("#device-location").data("long"); + + if(lat != null && lat != undefined && lat != "" && long != null && long != undefined && long != "") { + $("#map-error").hide(); + $("#device-location").show(); + map = new google.maps.Map(document.getElementById('device-location'), + mapOptions); + + var pos = new google.maps.LatLng(lat, + long); + var marker = new google.maps.Marker({ + position: pos, + map: map + }); + + map.setCenter(pos); + }else{ + $("#device-location").hide(); + $("#map-error").show(); + } + + } + google.maps.event.addDomListener(window, 'load', initialize); +} \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/applications-list.hbs b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/applications-list.hbs new file mode 100644 index 0000000000..8fba28621b --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/applications-list.hbs @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/operations-log.hbs b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/operations-log.hbs new file mode 100644 index 0000000000..cc5db5117a --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/operations-log.hbs @@ -0,0 +1,24 @@ + + + + + + + + + + {{#each operations}} + + + + + + {{/each}} +
+ +
Operation CodeStatusRequest created at
{{code}} + {{#equal status "COMPLETED"}} Completed{{/equal}} + {{#equal status "PENDING"}} Pending{{/equal}} + {{#equal status "ERROR"}} Error{{/equal}} + {{#equal status "IN_PROGRESS"}} In Progress{{/equal}} + {{createdTimeStamp}}
\ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/policy-compliance.hbs b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/policy-compliance.hbs new file mode 100644 index 0000000000..6dabda7870 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.device-view/public/templates/policy-compliance.hbs @@ -0,0 +1,79 @@ +
+ +
+
+ + {{#equal deviceType "android"}} + + {{/equal}} + {{#equal deviceType "ios"}} + + {{/equal}} + {{#equal deviceType "windows"}} + + {{/equal}} + + +

{{policy.policyName}}

+ {{deviceType}} +
+
+
+
+
+
+ Ownership Type : {{policy.ownershipType}} +
+
+
+
+ Compliance Type : {{policy.compliance}} +
+
+
+
+ Compliance : + {{#equal compliance "COMPLIANT"}} + Compliant + {{/equal}} + {{#equal compliance "NON-COMPLIANT"}} + Not Compliant + {{/equal}} +
+
+
+
+ +
+
+
+ + + + + + + + + {{#each complianceFeatures}} + + + + + {{/each}} +
+ +
FeatureCompliance
{{featureCode}} + {{#equal compliance true}} Compliant{{/equal}} + {{#equal compliance false}} Not Compliant{{/equal}} +
\ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/private/conf/device-type.json b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/private/conf/device-type.json index 63e083bca8..731a4fb80b 100644 --- a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/private/conf/device-type.json +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/private/conf/device-type.json @@ -1,8 +1,6 @@ { "deviceType": { "label": "Drone Analyzer", - "category": "iot", - "downloadAgentUri": "DroneAnalyzerServiceUnitManager/manager/device/drone_analyzer/download", - "downloadAgentLinkGenUri" : "DroneAnalyzerServiceUnitManager/manager/device/drone_analyzer/generate_link" + "category": "iot" } } \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs index d54bc9f7e6..bc5fdf3bbe 100644 --- a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.drone_analyzer.type-view/type-view.hbs @@ -1,7 +1,7 @@
-

Virtual Firealrm

+

Drone Analyzer


-

Connect your Android device to the WSO2 device cloud.

+

Connect your drone device to the WSO2 device cloud.

@@ -13,14 +13,7 @@

Hardware Requirements


    -
  • - Raspberry Pi (Internet Enabled)
  • -
  • - DHT11 Temperature Sensor
  • -
  • - LED
  • -
  • - Buzzer(3v)
  • +
  • 01 Set up your IRIS+ Drone as shown in the schematic below.

@@ -38,19 +31,21 @@
-

- -    - +
+ +
-
- Download +
+
+ Download Now    - +     Copy Link        @@ -151,9 +146,7 @@

Prepare


Get your device ready

    -
  • 01 Set up your RaspberryPi device as shown in the schematic below and get the FireAlarm setup.
  • -
  • 02 Connect a monitor to your RaspberryPi via the HDMI cable to get a UI view of the device.
  • -
  • 03 Get the RaspberryPi to connect to the internet (via Ethernet or Wifi) and note its IP_ADDRESS
  • +
  • 01 Set up your IRIS+ Drone as shown in the schematic below.

@@ -173,9 +166,41 @@

Connect (Quick Start)


Internet of Things Foundation Quickstart connection

    -
  • 01 Click on the 'Create DEB' button above to get the download link for the FireAlarm setup files
  • -
  • 02 (The following commands can be issued by directly typing into the terminal of the device or by an 'ssh' login from a remote PC)
  • -
  • 03 Download the FireAlarm setup files using the following command: 'curl -k < url_link_received_from_the_above_step >> Agent.zip'
    This will download a zip file named 'Agent.zip'
  • +
  • 01 Click on the download button above to get the IRIS+ Drone setup files
  • +
  • 02 Connecting to drone +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Connection typeConnection string
    Linux computer connected to the drone via USB/dev/ttyAMA0(also set baud=57600)
    OSX computer connected to the drone via USBdev/cu.usbmodem1
    Windows computer connected to the drone via USB (in this case on COM14)com14
    Windows computer connected to the drone using a 3DR Telemetry Radio on COM14com14(also set baud=57600)
    +
    + Ones you have the setup files please run startservice.sh with root privilege.
    + Note: these connection types may vary from computer to computer. So please provide the correct + connection port +

@@ -248,18 +273,4 @@ {{#zone "bottomJs"}} {{js "/js/download.js"}} {{js "/js/jquery.validate.js"}} - {{/zone}} \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css new file mode 100644 index 0000000000..98b5f3049a --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/css/main-app.css @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +.box { + margin-top: 10px; + margin-bottom: 10px; +} + +.box-inner { + border: 1px solid #DEDEDE; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + box-shadow: 0 0 10px rgba(189, 189, 189, 0.4); + -webkit-box-shadow: 0 0 10px rgba(189, 189, 189, 0.4); + -moz-box-shadow: 0 0 10px rgba(189, 189, 189, 0.4); +} + +.box-header { + border: none; + padding-top: 5px; + border-bottom: 1px solid #DEDEDE; + border-radius: 3px 3px 0 0; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + height: 35px; + min-height: 35px !important; + margin-bottom: 0; + font-weight: bold; + font-size: 16px; + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(0, 0, 0, 0.1))); + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); + background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); + background: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); + background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffffff', endColorstr='#1a000000', GradientType=0); + +} + +.box-header h2 { + font-size: 15px; + width: auto; + clear: none; + float: left; + line-height: 25px; + white-space: nowrap; + font-weight: bold; + margin-top: 0; + margin-bottom: 0; +} + +.box-header h3 { + font-size: 13px; + width: auto; + clear: none; + float: left; + line-height: 25px; + white-space: nowrap; +} + +.box-header h2 > i { + margin-top: 1px; +} + +.box-icon { + float: right; +} + +.box-icon a { + clear: none; + float: left; + margin: 0 2px; + height: 20px; + width: 5px; + margin-top: 1px; +} + +.box-icon a i { + margin-left: -6px; + top: -1px; +} + +.box-content { + padding: 10px; +} + +.btn-round { + border-radius: 40px; + -webkit-border-radius: 40px; + -moz-border-radius: 40px; + font-size: 12px; + padding-top: 4px; +} + +.navbar-brand { + font-family: 'Shojumaru', cursive, Arial, serif; + letter-spacing: 2px; + text-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5); + width: 183px; + font-size: 17px; +} + +.navbar-brand img { + float: left; + height: 20px; + width: 20px; + margin-right: 5px; +} + +.navbar-brand span { + float: left; +} + +.navbar-search { + margin-left: 10px; + margin-top: 7px; +} + +.navbar-inner { + padding-top: 5px; + padding-bottom: 5px; + line-height: 30px; + height: 60px; +} + +.navbar-inner .btn-group { + margin: 7px 5px 0 5px; +} + +.bs-icons li { + list-style: none; +} + +.box-content .nav-tabs { + margin-right: -10px; + margin-left: -10px; +} + +.box-content.buttons { + min-height: 297px; +} + +.sidebar-nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.navbar { + border-radius: 0; +} diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/background_drone.png b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/background_drone.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ce7dc40d87da479b11193a13a91c2f68363547 GIT binary patch literal 26787 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 literal 0 HcmV?d00001 diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/pitch_drone.png b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/images/drone_position_controller/pitch_drone.png new file mode 100644 index 0000000000000000000000000000000000000000..84afb8f1888ebec0dbd5cb4b8c3bde86c3bc05de GIT binary patch literal 20046 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 0 ) { + + this.dispatchEvent( changeEvent ); + + lastPosition.copy( this.object.position ); + + } + + }; + + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function onMouseDown( event ) { + + if ( scope.enabled === false ) { return; } + event.preventDefault(); + + if ( event.button === 0 ) { + if ( scope.noRotate === true ) { return; } + + state = STATE.ROTATE; + + rotateStart.set( event.clientX, event.clientY ); + + } else if ( event.button === 1 ) { + if ( scope.noZoom === true ) { return; } + + state = STATE.DOLLY; + + dollyStart.set( event.clientX, event.clientY ); + + } else if ( event.button === 2 ) { + if ( scope.noPan === true ) { return; } + + state = STATE.PAN; + + panStart.set( event.clientX, event.clientY ); + + } + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) { return; } + + event.preventDefault(); + + if ( state === STATE.ROTATE ) { + if ( scope.noRotate === true ) { return; } + + rotateEnd.set( event.clientX, event.clientY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + // rotating across whole screen goes 360 degrees around + scope.rotateLeft( 2 * Math.PI * rotateDelta.x / scope.domElement.width * scope.rotateSpeed ); + // rotating up and down along whole screen attempts to go 360, but limited to 180 + scope.rotateUp( 2 * Math.PI * rotateDelta.y / scope.domElement.height * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + } else if ( state === STATE.DOLLY ) { + if ( scope.noZoom === true ) { return; } + + dollyEnd.set( event.clientX, event.clientY ); + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + scope.dollyIn(); + + } else { + + scope.dollyOut(); + + } + + dollyStart.copy( dollyEnd ); + + } else if ( state === STATE.PAN ) { + if ( scope.noPan === true ) { return; } + + panEnd.set( event.clientX, event.clientY ); + panDelta.subVectors( panEnd, panStart ); + + scope.pan( panDelta ); + + panStart.copy( panEnd ); + + } + + } + + function onMouseUp( /* event */ ) { + + if ( scope.enabled === false ) { return; } + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + // this is needed when the program is inside an iframe + // to prevent scrolling the whole page + event.preventDefault(); + if ( scope.enabled === false ) { return; } + if ( scope.noZoom === true ) { return; } + + var delta = 0; + + if ( event.wheelDelta ) { // WebKit / Opera / Explorer 9 + + delta = event.wheelDelta; + + } else if ( event.detail ) { // Firefox + + delta = - event.detail; + + } + + if ( delta > 0 ) { + + scope.dollyOut(); + + } else { + + scope.dollyIn(); + + } + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false ) { return; } + if ( scope.noKeys === true ) { return; } + if ( scope.noPan === true ) { return; } + + // pan a pixel - I guess for precise positioning? + switch ( event.keyCode ) { + + case scope.keys.UP: + scope.pan( new THREE.Vector2( 0, 1 ) ); + break; + case scope.keys.BOTTOM: + scope.pan( new THREE.Vector2( 0, -1 ) ); + break; + case scope.keys.LEFT: + scope.pan( new THREE.Vector2( 1, 0 ) ); + break; + case scope.keys.RIGHT: + scope.pan( new THREE.Vector2( -1, 0 ) ); + break; + } + + } + + function touchstart( event ) { + + if ( scope.enabled === false ) { return; } + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + if ( scope.noRotate === true ) { return; } + + state = STATE.TOUCH_ROTATE; + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + break; + + case 2: // two-fingered touch: dolly + if ( scope.noZoom === true ) { return; } + + state = STATE.TOUCH_DOLLY; + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + var distance = Math.sqrt( dx * dx + dy * dy ); + dollyStart.set( 0, distance ); + break; + + case 3: // three-fingered touch: pan + if ( scope.noPan === true ) { return; } + + state = STATE.TOUCH_PAN; + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + break; + + default: + state = STATE.NONE; + + } + } + + function touchmove( event ) { + + if ( scope.enabled === false ) { return; } + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + if ( scope.noRotate === true ) { return; } + if ( state !== STATE.TOUCH_ROTATE ) { return; } + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + // rotating across whole screen goes 360 degrees around + scope.rotateLeft( 2 * Math.PI * rotateDelta.x / scope.domElement.width * scope.rotateSpeed ); + // rotating up and down along whole screen attempts to go 360, but limited to 180 + scope.rotateUp( 2 * Math.PI * rotateDelta.y / scope.domElement.height * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + break; + + case 2: // two-fingered touch: dolly + if ( scope.noZoom === true ) { return; } + if ( state !== STATE.TOUCH_DOLLY ) { return; } + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + scope.dollyOut(); + + } else { + + scope.dollyIn(); + + } + + dollyStart.copy( dollyEnd ); + break; + + case 3: // three-fingered touch: pan + if ( scope.noPan === true ) { return; } + if ( state !== STATE.TOUCH_PAN ) { return; } + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + panDelta.subVectors( panEnd, panStart ); + + scope.pan( panDelta ); + + panStart.copy( panEnd ); + break; + + default: + state = STATE.NONE; + + } + + } + + function touchend( /* event */ ) { + + if ( scope.enabled === false ) { return; } + + state = STATE.NONE; + } + + this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false ); + this.domElement.addEventListener( 'mousedown', onMouseDown, false ); + this.domElement.addEventListener( 'mousewheel', onMouseWheel, false ); + this.domElement.addEventListener( 'DOMMouseScroll', onMouseWheel, false ); // firefox + + this.domElement.addEventListener( 'keydown', onKeyDown, false ); + + this.domElement.addEventListener( 'touchstart', touchstart, false ); + this.domElement.addEventListener( 'touchend', touchend, false ); + this.domElement.addEventListener( 'touchmove', touchmove, false ); + +}; diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js new file mode 100644 index 0000000000..c504d196cf --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/3dobject_controller/three.min.js @@ -0,0 +1,706 @@ +// three.js - http://github.com/mrdoob/three.js +'use strict';var THREE=THREE||{REVISION:"56"};self.console=self.console||{info:function(){},log:function(){},debug:function(){},warn:function(){},error:function(){}};self.Int32Array=self.Int32Array||Array;self.Float32Array=self.Float32Array||Array;String.prototype.trim=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")}; +THREE.extend=function(a,b){if(Object.keys)for(var c=Object.keys(b),d=0,e=c.length;d>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSV:function(a,b,c){console.log("DEPRECATED: Color's .setHSV() will be removed. Use .setHSL( h, s, l ) instead.");return this.setHSL(a,b*c/(1>(a=(2-b)*c)?a:2-a),a/2)},setHSL:function(a, +b,c){if(0===b)this.r=this.g=this.b=c;else{var d=function(a,b,c){0>c&&(c+=1);1c?b:c<2/3?a+6*(b-a)*(2/3-c):a},b=0.5>=c?c*(1+b):c+b-c*b,c=2*c-b;this.r=d(c,b,a+1/3);this.g=d(c,b,a);this.b=d(c,b,a-1/3)}return this},setStyle:function(a){if(/^rgb\((\d+),(\d+),(\d+)\)$/i.test(a))return a=/^rgb\((\d+),(\d+),(\d+)\)$/i.exec(a),this.r=Math.min(255,parseInt(a[1],10))/255,this.g=Math.min(255,parseInt(a[2],10))/255,this.b=Math.min(255,parseInt(a[3],10))/255,this;if(/^rgb\((\d+)\%,(\d+)\%,(\d+)\%\)$/i.test(a))return a= +/^rgb\((\d+)\%,(\d+)\%,(\d+)\%\)$/i.exec(a),this.r=Math.min(100,parseInt(a[1],10))/100,this.g=Math.min(100,parseInt(a[2],10))/100,this.b=Math.min(100,parseInt(a[3],10))/100,this;if(/^\#([0-9a-f]{6})$/i.test(a))return a=/^\#([0-9a-f]{6})$/i.exec(a),this.setHex(parseInt(a[1],16)),this;if(/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(a))return a=/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(a),this.setHex(parseInt(a[1]+a[1]+a[2]+a[2]+a[3]+a[3],16)),this;if(/^(\w+)$/i.test(a))return this.setHex(THREE.ColorKeywords[a]), +this},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a){this.r=a.r*a.r;this.g=a.g*a.g;this.b=a.b*a.b;return this},copyLinearToGamma:function(a){this.r=Math.sqrt(a.r);this.g=Math.sqrt(a.g);this.b=Math.sqrt(a.b);return this},convertGammaToLinear:function(){var a=this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255* +this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(){var a={h:0,s:0,l:0};return function(){var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var i=e-f,f=0.5>=h?i/(e+f):i/(2-e-f);switch(e){case b:g=(c-d)/i+(cf&&c>b?(c=2*Math.sqrt(1+c-f-b),this.w=(i-g)/c,this.x=0.25*c,this.y=(a+e)/c,this.z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this.w=(d-h)/c,this.x=(a+e)/c,this.y=0.25*c,this.z=(g+i)/c):(c=2*Math.sqrt(1+b-c-f),this.w=(e-a)/c,this.x=(d+h)/c,this.y=(g+i)/c,this.z=0.25*c);return this},inverse:function(){this.conjugate().normalize(); +return this},conjugate:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a=this.length();0===a?(this.z=this.y=this.x=0,this.w=1):(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), +this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a.x,d=a.y,e=a.z,f=a.w,g=b.x,h=b.y,i=b.z,k=b.w;this.x=c*k+f*g+d*i-e*h;this.y=d*k+f*h+e*g-c*i;this.z=e*k+f*i+c*h-d*g;this.w=f*k-c*g-d*h-e*i;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)},slerp:function(a,b){var c=this.x,d=this.y,e=this.z, +f=this.w,g=f*a.w+c*a.x+d*a.y+e*a.z;0>g?(this.w=-a.w,this.x=-a.x,this.y=-a.y,this.z=-a.z,g=-g):this.copy(a);if(1<=g)return this.w=f,this.x=c,this.y=d,this.z=e,this;var h=Math.acos(g),i=Math.sqrt(1-g*g);if(0.001>Math.abs(i))return this.w=0.5*(f+this.w),this.x=0.5*(c+this.x),this.y=0.5*(d+this.y),this.z=0.5*(e+this.z),this;g=Math.sin((1-b)*h)/i;h=Math.sin(b*h)/i;this.w=f*g+this.w*h;this.x=c*g+this.x*h;this.y=d*g+this.y*h;this.z=e*g+this.z*h;return this},equals:function(a){return a.x===this.x&&a.y=== +this.y&&a.z===this.z&&a.w===this.w},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}});THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0}; +THREE.extend(THREE.Vector2.prototype,{set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!== +b)return console.warn("DEPRECATED: Vector2's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector2's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this}, +subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divideScalar:function(a){0!==a?(this.x/=a,this.y/=a):this.set(0,0);return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y);return this},negate:function(){return this.multiplyScalar(-1)}, +dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)* +b;this.y+=(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},toArray:function(){return[this.x,this.y]},clone:function(){return new THREE.Vector2(this.x,this.y)}});THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; +THREE.extend(THREE.Vector3.prototype,{set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+ +a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), +this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x* +b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14];return this},applyProjection:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements,e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]); +this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z,a=a.w,h=a*b+f*d-g*c,i=a*c+g*b-e*d,k=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+i*-g-k*-f;this.y=i*a+b*-f+k*-e-h*-g;this.z=k*a+b*-g+h*-f-i*-e;return this},applyEuler:function(){var a=new THREE.Quaternion;return function(b,c){var d=a.setFromEuler(b,c);this.applyQuaternion(d);return this}}(),applyAxisAngle:function(){var a= +new THREE.Quaternion;return function(b,c){var d=a.setFromAxisAngle(b,c);this.applyQuaternion(d);return this}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;this.normalize();return this},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){0!==a?(this.x/=a,this.y/=a,this.z/=a):this.z=this.y=this.x=0;return this},min:function(a){this.x>a.x&&(this.x= +a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y);this.zb.z&&(this.z=b.z);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y* +this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},cross:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector3's .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."), +this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},projectOnVector:function(){var a=new THREE.Vector3;return function(b){a.copy(b).normalize();b=this.dot(a);return this.copy(a).multiplyScalar(b)}}(),projectOnPlane:function(){var a=new THREE.Vector3;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(), +reflect:function(){var a=new THREE.Vector3;return function(b){a.copy(this).projectOnVector(b).multiplyScalar(2);return this.subVectors(a,this)}}(),angleTo:function(a){a=this.dot(a)/(this.length()*a.length());return Math.acos(THREE.Math.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y,a=this.z-a.z;return b*b+c*c+a*a},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14]; +return this},setEulerFromRotationMatrix:function(a,b){function c(a){return Math.min(Math.max(a,-1),1)}var d=a.elements,e=d[0],f=d[4],g=d[8],h=d[1],i=d[5],k=d[9],l=d[2],m=d[6],d=d[10];void 0===b||"XYZ"===b?(this.y=Math.asin(c(g)),0.99999>Math.abs(g)?(this.x=Math.atan2(-k,d),this.z=Math.atan2(-f,e)):(this.x=Math.atan2(m,i),this.z=0)):"YXZ"===b?(this.x=Math.asin(-c(k)),0.99999>Math.abs(k)?(this.y=Math.atan2(g,d),this.z=Math.atan2(h,i)):(this.y=Math.atan2(-l,e),this.z=0)):"ZXY"===b?(this.x=Math.asin(c(m)), +0.99999>Math.abs(m)?(this.y=Math.atan2(-l,d),this.z=Math.atan2(-f,i)):(this.y=0,this.z=Math.atan2(h,e))):"ZYX"===b?(this.y=Math.asin(-c(l)),0.99999>Math.abs(l)?(this.x=Math.atan2(m,d),this.z=Math.atan2(h,e)):(this.x=0,this.z=Math.atan2(-f,i))):"YZX"===b?(this.z=Math.asin(c(h)),0.99999>Math.abs(h)?(this.x=Math.atan2(-k,i),this.y=Math.atan2(-l,e)):(this.x=0,this.y=Math.atan2(g,d))):"XZY"===b&&(this.z=Math.asin(-c(f)),0.99999>Math.abs(f)?(this.x=Math.atan2(m,i),this.y=Math.atan2(g,e)):(this.x=Math.atan2(-k, +d),this.y=0));return this},setEulerFromQuaternion:function(a,b){function c(a){return Math.min(Math.max(a,-1),1)}var d=a.x*a.x,e=a.y*a.y,f=a.z*a.z,g=a.w*a.w;void 0===b||"XYZ"===b?(this.x=Math.atan2(2*(a.x*a.w-a.y*a.z),g-d-e+f),this.y=Math.asin(c(2*(a.x*a.z+a.y*a.w))),this.z=Math.atan2(2*(a.z*a.w-a.x*a.y),g+d-e-f)):"YXZ"===b?(this.x=Math.asin(c(2*(a.x*a.w-a.y*a.z))),this.y=Math.atan2(2*(a.x*a.z+a.y*a.w),g-d-e+f),this.z=Math.atan2(2*(a.x*a.y+a.z*a.w),g-d+e-f)):"ZXY"===b?(this.x=Math.asin(c(2*(a.x*a.w+ +a.y*a.z))),this.y=Math.atan2(2*(a.y*a.w-a.z*a.x),g-d-e+f),this.z=Math.atan2(2*(a.z*a.w-a.x*a.y),g-d+e-f)):"ZYX"===b?(this.x=Math.atan2(2*(a.x*a.w+a.z*a.y),g-d-e+f),this.y=Math.asin(c(2*(a.y*a.w-a.x*a.z))),this.z=Math.atan2(2*(a.x*a.y+a.z*a.w),g+d-e-f)):"YZX"===b?(this.x=Math.atan2(2*(a.x*a.w-a.z*a.y),g-d+e-f),this.y=Math.atan2(2*(a.y*a.w-a.x*a.z),g+d-e-f),this.z=Math.asin(c(2*(a.x*a.y+a.z*a.w)))):"XZY"===b&&(this.x=Math.atan2(2*(a.x*a.w+a.y*a.z),g-d+e-f),this.y=Math.atan2(2*(a.x*a.z+a.y*a.w),g+d- +e-f),this.z=Math.asin(c(2*(a.z*a.w-a.x*a.y))));return this},getScaleFromMatrix:function(a){var b=this.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},toArray:function(){return[this.x,this.y,this.z]},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}});THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; +THREE.extend(THREE.Vector4.prototype,{set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y; +case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a, +b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},sub:function(a,b){if(void 0!==b)return console.warn("DEPRECATED: Vector4's .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b= +this.x,c=this.y,d=this.z,e=this.w,a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){0!==a?(this.x/=a,this.y/=a,this.z/=a,this.w/=a):(this.z=this.y=this.x=0,this.w=1);return this},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this}, +setAxisAngleFromRotationMatrix:function(a){var b,c,d,a=a.elements,e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],i=a[9];c=a[2];b=a[6];var k=a[10];if(0.01>Math.abs(d-g)&&0.01>Math.abs(f-c)&&0.01>Math.abs(i-b)){if(0.1>Math.abs(d+g)&&0.1>Math.abs(f+c)&&0.1>Math.abs(i+b)&&0.1>Math.abs(e+h+k-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;k=(k+1)/2;d=(d+g)/4;f=(f+c)/4;i=(i+b)/4;e>h&&e>k?0.01>e?(b=0,d=c=0.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>k?0.01>h?(b=0.707106781,c=0,d=0.707106781):(c=Math.sqrt(h), +b=d/c,d=i/c):0.01>k?(c=b=0.707106781,d=0):(d=Math.sqrt(k),b=f/d,c=i/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-i)*(b-i)+(f-c)*(f-c)+(g-d)*(g-d));0.001>Math.abs(a)&&(a=1);this.x=(b-i)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+k-1)/2);return this},min:function(a){this.x>a.x&&(this.x=a.x);this.y>a.y&&(this.y=a.y);this.z>a.z&&(this.z=a.z);this.w>a.w&&(this.w=a.w);return this},max:function(a){this.xb.x&&(this.x=b.x);this.yb.y&&(this.y=b.y);this.zb.z&&(this.z=b.z);this.wb.w&&(this.w=b.w);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+ +this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},toArray:function(){return[this.x, +this.y,this.z,this.w]},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}});THREE.Line3=function(a,b){this.start=void 0!==a?a:new THREE.Vector3;this.end=void 0!==b?b:new THREE.Vector3}; +THREE.extend(THREE.Line3.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},center:function(a){return(a||new THREE.Vector3).addVectors(this.start,this.end).multiplyScalar(0.5)},delta:function(a){return(a||new THREE.Vector3).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a, +b){var c=b||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=THREE.Math.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a); +this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)},clone:function(){return(new THREE.Line3).copy(this)}});THREE.Box2=function(a,b){this.min=void 0!==a?a:new THREE.Vector2(Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector2(-Infinity,-Infinity)}; +THREE.extend(THREE.Box2.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){if(0this.max.x&&(this.max.x=b.x),b.ythis.max.y&&(this.max.y=b.y)}else this.makeEmpty();return this},setFromCenterAndSize:function(){var a=new THREE.Vector2;return function(b,c){var d=a.copy(c).multiplyScalar(0.5);this.min.copy(b).sub(d); +this.max.copy(b).add(d);return this}}(),copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},empty:function(){return this.max.xthis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y?!0:!1},getParameter:function(a){return new THREE.Vector2((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/ +(this.max.y-this.min.y))},isIntersectionBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector2).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector2;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max); +return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)},clone:function(){return(new THREE.Box2).copy(this)}});THREE.Box3=function(a,b){this.min=void 0!==a?a:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector3(-Infinity,-Infinity,-Infinity)}; +THREE.extend(THREE.Box3.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){if(0this.max.x&&(this.max.x=b.x),b.ythis.max.y&&(this.max.y=b.y),b.zthis.max.z&&(this.max.z=b.z)}else this.makeEmpty();return this},setFromCenterAndSize:function(){var a=new THREE.Vector3; +return function(b,c){var d=a.copy(c).multiplyScalar(0.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},empty:function(){return this.max.xthis.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<= +this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z?!0:!1},getParameter:function(a){return new THREE.Vector3((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector3).copy(a).clamp(this.min, +this.max)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new THREE.Vector3;return function(b){b=b||new THREE.Sphere;b.center=this.center();b.radius=0.5*this.size(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new THREE.Vector3, +new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(b){a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x, +this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.makeEmpty();this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)},clone:function(){return(new THREE.Box3).copy(this)}});THREE.Matrix3=function(a,b,c,d,e,f,g,h,i){this.elements=new Float32Array(9);this.set(void 0!==a?a:1,b||0,c||0,d||0,void 0!==e?e:1,f||0,g||0,h||0,void 0!==i?i:1)}; +THREE.extend(THREE.Matrix3.prototype,{set:function(a,b,c,d,e,f,g,h,i){var k=this.elements;k[0]=a;k[3]=b;k[6]=c;k[1]=d;k[4]=e;k[7]=f;k[2]=g;k[5]=h;k[8]=i;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);return this},multiplyVector3:function(a){console.warn("DEPRECATED: Matrix3's .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){var a= +new THREE.Vector3;return function(b){for(var c=0,d=b.length;c=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)- +this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new THREE.Vector3;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new THREE.Box3;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a); +this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius},clone:function(){return(new THREE.Sphere).copy(this)}});THREE.Frustum=function(a,b,c,d,e,f){this.planes=[void 0!==a?a:new THREE.Plane,void 0!==b?b:new THREE.Plane,void 0!==c?c:new THREE.Plane,void 0!==d?d:new THREE.Plane,void 0!==e?e:new THREE.Plane,void 0!==f?f:new THREE.Plane]}; +THREE.extend(THREE.Frustum.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements,a=c[0],d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],i=c[6],k=c[7],l=c[8],m=c[9],n=c[10],s=c[11],r=c[12],p=c[13],q=c[14],c=c[15];b[0].setComponents(f-a,k-g,s-l,c-r).normalize();b[1].setComponents(f+ +a,k+g,s+l,c+r).normalize();b[2].setComponents(f+d,k+h,s+m,c+p).normalize();b[3].setComponents(f-d,k-h,s-m,c-p).normalize();b[4].setComponents(f-e,k-i,s-n,c-q).normalize();b[5].setComponents(f+e,k+i,s+n,c+q).normalize();return this},intersectsObject:function(){var a=new THREE.Vector3;return function(b){var c=b.matrixWorld,d=this.planes,b=-b.geometry.boundingSphere.radius*c.getMaxScaleOnAxis();a.getPositionFromMatrix(c);for(c=0;6>c;c++)if(d[c].distanceToPoint(a)d;d++)if(b[d].distanceToPoint(c)c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0},clone:function(){return(new THREE.Frustum).copy(this)}});THREE.Plane=function(a,b){this.normal=void 0!==a?a:new THREE.Vector3(1,0,0);this.constant=void 0!==b?b:0}; +THREE.extend(THREE.Plane.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(), +copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a, +b){var c=this.distanceToPoint(a);return(b||new THREE.Vector3).copy(this.normal).multiplyScalar(c)},isIntersectionLine:function(a){var b=this.distanceToPoint(a.start),a=this.distanceToPoint(a.end);return 0>b&&0a&&0f||1c?c:a},clampBottom:function(a,b){return a=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a, +b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return 0>a?-1:0this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1: +f+2;k=this.points[c[0]];l=this.points[c[1]];m=this.points[c[2]];n=this.points[c[3]];h=g*g;i=g*h;d.x=b(k.x,l.x,m.x,n.x,g,h,i);d.y=b(k.y,l.y,m.y,n.y,g,h,i);d.z=b(k.z,l.z,m.z,n.z,g,h,i);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a=b.x+b.y}}(); +THREE.extend(THREE.Triangle.prototype,{constructor:THREE.Triangle,set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return 0.5*a.cross(b).length()}}(), +midpoint:function(a){return(a||new THREE.Vector3).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return THREE.Triangle.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new THREE.Plane).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return THREE.Triangle.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return THREE.Triangle.containsPoint(a,this.a,this.b,this.c)},equals:function(a){return a.a.equals(this.a)&& +a.b.equals(this.b)&&a.c.equals(this.c)},clone:function(){return(new THREE.Triangle).copy(this)}});THREE.Vertex=function(a){console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");return a};THREE.UV=function(a,b){console.warn("THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.");return new THREE.Vector2(a,b)};THREE.Clock=function(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}; +THREE.extend(THREE.Clock.prototype,{start:function(){this.oldTime=this.startTime=void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now();this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now(), +a=0.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime+=a}return a}});THREE.EventDispatcher=function(){var a={};this.addEventListener=function(b,c){void 0===a[b]&&(a[b]=[]);-1===a[b].indexOf(c)&&a[b].push(c)};this.removeEventListener=function(b,c){var d=a[b].indexOf(c);-1!==d&&a[b].splice(d,1)};this.dispatchEvent=function(b){var c=a[b.type];if(void 0!==c){b.target=this;for(var d=0,e=c.length;dh.scale.x)return k;k.push({distance:i,point:h.position,face:null,object:h})}else if(h instanceof +a.Mesh){f.getPositionFromMatrix(h.matrixWorld);b.set(f,h.geometry.boundingSphere.radius*h.matrixWorld.getMaxScaleOnAxis());if(!i.ray.isIntersectionSphere(b))return k;var s=h.geometry,r=s.vertices,p=h.material instanceof a.MeshFaceMaterial,q=!0===p?h.material.materials:null,y=h.material.side,v,z,t,A=i.precision;h.matrixRotationWorld.extractRotation(h.matrixWorld);g.getInverse(h.matrixWorld);c.copy(i.ray).applyMatrix4(g);for(var I=0,C=s.faces.length;IG)){y=y.side;if(y!==a.DoubleSide&&(v=c.direction.dot(d.normal),!(y===a.FrontSide?0>v:0i.far)){e=c.at(G,e);if(x instanceof a.Face3){if(y=r[x.a],v=r[x.b],z=r[x.c],!a.Triangle.containsPoint(e,y,v,z))continue}else if(x instanceof a.Face4){if(y=r[x.a],v=r[x.b],z=r[x.c],t=r[x.d],!a.Triangle.containsPoint(e,y,v,t)&&!a.Triangle.containsPoint(e,v,z,t))continue}else throw Error("face type not supported"); +k.push({distance:G,point:i.ray.at(G),face:x,faceIndex:I,object:h})}}}}}},k=function(a,b,c){for(var a=a.getDescendants(),d=0,e=a.length;de&&0>f||0>g&&0>h)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h)));if(d< +c)return!1;a.lerp(b,c);b.lerp(a,1-d);return!0}var e,f,g=[],h=0,i,k,l=[],m=0,n,s,r=[],p=0,q,y=[],v=0,z,t,A=[],I=0,C,x,G=[],J=0,E={objects:[],sprites:[],lights:[],elements:[]},H=new THREE.Vector3,B=new THREE.Vector4,W=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),F=new THREE.Box3,K=Array(3),L=Array(4),U=new THREE.Matrix4,fa=new THREE.Matrix4,Ca,$a=new THREE.Matrix4,M=new THREE.Matrix3,ca=new THREE.Matrix3,qa=new THREE.Vector3,ha=new THREE.Frustum,ra=new THREE.Vector4,N=new THREE.Vector4; +this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);fa.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);return a.applyProjection(fa)};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);fa.multiplyMatrices(b.matrixWorld,b.projectionMatrixInverse);return a.applyProjection(fa)};this.pickingRay=function(a,b){a.z=-1;var c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.sub(a).normalize();return new THREE.Raycaster(a, +c)};this.projectScene=function(g,h,m,Pa){var ta=!1,ka,aa,pa,Y,da,la,Z,oa,gb,nb,ia,Wa,ab;x=t=q=s=0;E.elements.length=0;g.updateMatrixWorld();void 0===h.parent&&h.updateMatrixWorld();U.copy(h.matrixWorldInverse.getInverse(h.matrixWorld));fa.multiplyMatrices(h.projectionMatrix,U);ca.getInverse(U);ca.transpose();ha.setFromMatrix(fa);f=0;E.objects.length=0;E.sprites.length=0;E.lights.length=0;var Fa=function(b){for(var c=0,d=b.children.length;ci.positionScreen.x||1i.positionScreen.y||1i.positionScreen.z||1(Z.positionScreen.x-Y.positionScreen.x)*(da.positionScreen.y-Y.positionScreen.y)-(Z.positionScreen.y-Y.positionScreen.y)*(da.positionScreen.x-Y.positionScreen.x),la===THREE.DoubleSide||ta===(la===THREE.FrontSide))s===p?(ia=new THREE.RenderableFace3,r.push(ia),p++,s++,n=ia):n=r[s++],n.v1.copy(Y),n.v2.copy(da),n.v3.copy(Z);else continue; +else continue;else if(aa instanceof THREE.Face4)if(Y=l[aa.a],da=l[aa.b],Z=l[aa.c],ia=l[aa.d],L[0]=Y.positionScreen,L[1]=da.positionScreen,L[2]=Z.positionScreen,L[3]=ia.positionScreen,!0===Y.visible||!0===da.visible||!0===Z.visible||!0===ia.visible||W.isIntersectionBox(F.setFromPoints(L)))if(ta=0>(ia.positionScreen.x-Y.positionScreen.x)*(da.positionScreen.y-Y.positionScreen.y)-(ia.positionScreen.y-Y.positionScreen.y)*(da.positionScreen.x-Y.positionScreen.x)||0>(da.positionScreen.x-Z.positionScreen.x)* +(ia.positionScreen.y-Z.positionScreen.y)-(da.positionScreen.y-Z.positionScreen.y)*(ia.positionScreen.x-Z.positionScreen.x),la===THREE.DoubleSide||ta===(la===THREE.FrontSide)){if(q===v){var ub=new THREE.RenderableFace4;y.push(ub);v++;q++;n=ub}else n=y[q++];n.v1.copy(Y);n.v2.copy(da);n.v3.copy(Z);n.v4.copy(ia)}else continue;else continue;n.normalModel.copy(aa.normal);!1===ta&&(la===THREE.BackSide||la===THREE.DoubleSide)&&n.normalModel.negate();n.normalModel.applyMatrix3(M).normalize();n.normalModelView.copy(n.normalModel).applyMatrix3(ca); +n.centroidModel.copy(aa.centroid).applyMatrix4(Ca);Z=aa.vertexNormals;Y=0;for(da=Z.length;YB.z&&(x===J?(ta=new THREE.RenderableParticle,G.push(ta),J++,x++,C=ta):C=G[x++],C.object=oa,C.x=B.x/B.w,C.y=B.y/B.w,C.z=B.z,C.rotation=oa.rotation.z,C.scale.x=oa.scale.x*Math.abs(C.x-(B.x+h.projectionMatrix.elements[0])/ +(B.w+h.projectionMatrix.elements[12])),C.scale.y=oa.scale.y*Math.abs(C.y-(B.y+h.projectionMatrix.elements[5])/(B.w+h.projectionMatrix.elements[13])),C.material=oa.material,E.elements.push(C)));!0===Pa&&E.elements.sort(c);return E}};THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=void 0!==f?f:0;this.centroid=new THREE.Vector3}; +THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;be?-1:1,f.vertexTangents[d]=new THREE.Vector4(B.x,B.y,B.z,e)}this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;ci;i++)if(h[i]==h[(i+1)%3]){e.push(f);break}}else if(a instanceof THREE.Face4){a.a=c[a.a];a.b=c[a.b];a.c=c[a.c];a.d=c[a.d];h=[a.a,a.b,a.c,a.d];d=-1;for(i=0;4>i;i++)h[i]==h[(i+1)%4]&&(0<=d&&e.push(f),d=i);if(0<=d){h.splice(d,1);var l=new THREE.Face3(h[0],h[1],h[2],a.normal,a.color,a.materialIndex);h=0;for(i=this.faceVertexUvs.length;hb.max.x&&(b.max.x=c),db.max.y&&(b.max.y=d),eb.max.z&&(b.max.z=e)}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere= +new THREE.Sphere);var a=this.attributes.position.array;if(a){for(var b,c=0,d,e,f=0,g=a.length;fc&&(c=b);this.boundingSphere.radius=Math.sqrt(c)}},computeVertexNormals:function(){if(this.attributes.position){var a,b,c,d;a=this.attributes.position.array.length;if(void 0===this.attributes.normal)this.attributes.normal={itemSize:3,array:new Float32Array(a),numItems:a};else{a=0;for(b=this.attributes.normal.array.length;aqa?-1:1;h[4*a]=U.x;h[4*a+1]=U.y;h[4*a+2]=U.z;h[4*a+3]=M}if(void 0===this.attributes.index||void 0===this.attributes.position|| +void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var b=this.attributes.index.array,c=this.attributes.position.array,d=this.attributes.normal.array,e=this.attributes.uv.array,f=c.length/3;if(void 0===this.attributes.tangent){var g=4*f;this.attributes.tangent={itemSize:4,array:new Float32Array(g),numItems:g}}for(var h=this.attributes.tangent.array,i=[],k=[],g=0;ga.length?".":a.join("/"))+"/"},initMaterials:function(a,b){for(var c=[],d=0;da.opacity)i.transparent=a.transparent;void 0!==a.depthTest&&(i.depthTest=a.depthTest);void 0!==a.depthWrite&&(i.depthWrite=a.depthWrite);void 0!==a.visible&&(i.visible=a.visible);void 0!==a.flipSided&&(i.side=THREE.BackSide); +void 0!==a.doubleSided&&(i.side=THREE.DoubleSide);void 0!==a.wireframe&&(i.wireframe=a.wireframe);void 0!==a.vertexColors&&("face"===a.vertexColors?i.vertexColors=THREE.FaceColors:a.vertexColors&&(i.vertexColors=THREE.VertexColors));a.colorDiffuse?i.color=f(a.colorDiffuse):a.DbgColor&&(i.color=a.DbgColor);a.colorSpecular&&(i.specular=f(a.colorSpecular));a.colorAmbient&&(i.ambient=f(a.colorAmbient));a.transparency&&(i.opacity=a.transparency);a.specularCoef&&(i.shininess=a.specularCoef);a.mapDiffuse&& +b&&e(i,"map",a.mapDiffuse,a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap,a.mapDiffuseAnisotropy);a.mapLight&&b&&e(i,"lightMap",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap,a.mapLightAnisotropy);a.mapBump&&b&&e(i,"bumpMap",a.mapBump,a.mapBumpRepeat,a.mapBumpOffset,a.mapBumpWrap,a.mapBumpAnisotropy);a.mapNormal&&b&&e(i,"normalMap",a.mapNormal,a.mapNormalRepeat,a.mapNormalOffset,a.mapNormalWrap,a.mapNormalAnisotropy);a.mapSpecular&&b&&e(i,"specularMap",a.mapSpecular,a.mapSpecularRepeat, +a.mapSpecularOffset,a.mapSpecularWrap,a.mapSpecularAnisotropy);a.mapBumpScale&&(i.bumpScale=a.mapBumpScale);a.mapNormal?(h=THREE.ShaderLib.normalmap,k=THREE.UniformsUtils.clone(h.uniforms),k.tNormal.value=i.normalMap,a.mapNormalFactor&&k.uNormalScale.value.set(a.mapNormalFactor,a.mapNormalFactor),i.map&&(k.tDiffuse.value=i.map,k.enableDiffuse.value=!0),i.specularMap&&(k.tSpecular.value=i.specularMap,k.enableSpecular.value=!0),i.lightMap&&(k.tAO.value=i.lightMap,k.enableAO.value=!0),k.uDiffuseColor.value.setHex(i.color), +k.uSpecularColor.value.setHex(i.specular),k.uAmbientColor.value.setHex(i.ambient),k.uShininess.value=i.shininess,void 0!==i.opacity&&(k.uOpacity.value=i.opacity),h=new THREE.ShaderMaterial({fragmentShader:h.fragmentShader,vertexShader:h.vertexShader,uniforms:k,lights:!0,fog:!0}),i.transparent&&(h.transparent=!0)):h=new THREE[h](i);void 0!==a.DbgName&&(h.name=a.DbgName);return h}};THREE.ImageLoader=function(){THREE.EventDispatcher.call(this);this.crossOrigin=null};THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b){var c=this;void 0===b&&(b=new Image);b.addEventListener("load",function(){c.dispatchEvent({type:"load",content:b})},!1);b.addEventListener("error",function(){c.dispatchEvent({type:"error",message:"Couldn't load URL ["+a+"]"})},!1);c.crossOrigin&&(b.crossOrigin=c.crossOrigin);b.src=a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(a,b,c){c=c&&"string"===typeof c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)}; +THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(200===f.status||0===f.status){if(f.responseText){var h=JSON.parse(f.responseText);a.createModel(h,c,d)}else console.warn("THREE.JSONLoader: ["+b+"] seems to be unreachable or file there is empty");a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load ["+b+"] ["+f.status+"]");else f.readyState===f.LOADING?e&&(0===g&&(g=f.getResponseHeader("Content-Length")), +e({total:g,loaded:f.responseText.length})):f.readyState===f.HEADERS_RECEIVED&&(g=f.getResponseHeader("Content-Length"))};f.open("GET",b,!0);f.withCredentials=this.withCredentials;f.send(null)}; +THREE.JSONLoader.prototype.createModel=function(a,b,c){var d=new THREE.Geometry,e=void 0!==a.scale?1/a.scale:1,f,g,h,i,k,l,m,n,s,r,p,q,y,v,z,t=a.faces;r=a.vertices;var A=a.normals,I=a.colors,C=0;for(f=0;fF.parameters.opacity&& +(F.parameters.transparent=!0);F.parameters.normalMap?(E=THREE.ShaderLib.normalmap,B=THREE.UniformsUtils.clone(E.uniforms),q=F.parameters.color,W=F.parameters.specular,p=F.parameters.ambient,H=F.parameters.shininess,B.tNormal.value=x.textures[F.parameters.normalMap],F.parameters.normalScale&&B.uNormalScale.value.set(F.parameters.normalScale[0],F.parameters.normalScale[1]),F.parameters.map&&(B.tDiffuse.value=F.parameters.map,B.enableDiffuse.value=!0),F.parameters.envMap&&(B.tCube.value=F.parameters.envMap, +B.enableReflection.value=!0,B.uReflectivity.value=F.parameters.reflectivity),F.parameters.lightMap&&(B.tAO.value=F.parameters.lightMap,B.enableAO.value=!0),F.parameters.specularMap&&(B.tSpecular.value=x.textures[F.parameters.specularMap],B.enableSpecular.value=!0),F.parameters.displacementMap&&(B.tDisplacement.value=x.textures[F.parameters.displacementMap],B.enableDisplacement.value=!0,B.uDisplacementBias.value=F.parameters.displacementBias,B.uDisplacementScale.value=F.parameters.displacementScale), +B.uDiffuseColor.value.setHex(q),B.uSpecularColor.value.setHex(W),B.uAmbientColor.value.setHex(p),B.uShininess.value=H,F.parameters.opacity&&(B.uOpacity.value=F.parameters.opacity),s=new THREE.ShaderMaterial({fragmentShader:E.fragmentShader,vertexShader:E.vertexShader,uniforms:B,lights:!0,fog:!0})):s=new THREE[F.type](F.parameters);x.materials[K]=s}for(K in J.materials)if(F=J.materials[K],F.parameters.materials){L=[];for(q=0;qh.end&&(h.end=e);b||(b=g)}}a.firstAnimation=b}; +THREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){this.geometry.animations||(this.geometry.animations={});this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];c?(this.setFrameRange(c.start,c.end),this.duration=1E3*((c.end-c.start)/b),this.time=0):console.warn("animation["+a+"] undefined")}; +THREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time+=this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||0>this.time)this.direction*=-1,this.time>this.duration&&(this.time=this.duration,this.directionBackwards=!0),0>this.time&&(this.time=0,this.directionBackwards=!1)}else this.time%=this.duration,0>this.time&&(this.time+=this.duration);a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/b),0,this.length-1);a!==this.currentKeyframe&& +(this.morphTargetInfluences[this.lastKeyframe]=0,this.morphTargetInfluences[this.currentKeyframe]=1,this.morphTargetInfluences[a]=0,this.lastKeyframe=this.currentKeyframe,this.currentKeyframe=a);b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b}; +THREE.MorphAnimMesh.prototype.clone=function(a){void 0===a&&(a=new THREE.MorphAnimMesh(this.geometry,this.material));a.duration=this.duration;a.mirroredLoop=this.mirroredLoop;a.time=this.time;a.lastKeyframe=this.lastKeyframe;a.currentKeyframe=this.currentKeyframe;a.direction=this.direction;a.directionBackwards=this.directionBackwards;THREE.Mesh.prototype.clone.call(this,a);return a};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b};THREE.Ribbon.prototype=Object.create(THREE.Object3D.prototype);THREE.Ribbon.prototype.clone=function(a){void 0===a&&(a=new THREE.Ribbon(this.geometry,this.material));THREE.Object3D.prototype.clone.call(this,a);return a};THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=Object.create(THREE.Object3D.prototype);THREE.LOD.prototype.addLevel=function(a,b){void 0===b&&(b=0);for(var b=Math.abs(b),c=0;c=this.LODs[b].visibleAtDistance)this.LODs[b-1].object3D.visible=!1,this.LODs[b].object3D.visible=!0;else break;for(;bI&&t.clearRect(Ka.min.x|0,Ka.min.y|0,Ka.max.x-Ka.min.x|0,Ka.max.y-Ka.min.y|0),0=j||(j*=f.intensity,c.add(gb.multiplyScalar(j)))}else f instanceof THREE.PointLight&&(g=bb.getPositionFromMatrix(f.matrixWorld),j=b.dot(bb.subVectors(g,a).normalize()),0>=j||(j*=0==f.distance?1:1-Math.min(a.distanceTo(g)/f.distance,1),0!=j&&(j*=f.intensity,c.add(gb.multiplyScalar(j)))))}}function x(a,d,e,f,g,j,h,i){l.info.render.vertices+= +3;l.info.render.faces++;b(i.opacity);c(i.blending);M=a.positionScreen.x;ca=a.positionScreen.y;qa=d.positionScreen.x;ha=d.positionScreen.y;ra=e.positionScreen.x;N=e.positionScreen.y;y(M,ca,qa,ha,ra,N);(i instanceof THREE.MeshLambertMaterial||i instanceof THREE.MeshPhongMaterial)&&null===i.map?(Z.copy(i.color),oa.copy(i.emissive),i.vertexColors===THREE.FaceColors&&Z.multiply(h.color),!0===gc?!1===i.wireframe&&i.shading==THREE.SmoothShading&&3==h.vertexNormalsLength?(pa.copy(vb),Y.copy(vb),da.copy(vb), +q(h.v1.positionWorld,h.vertexNormalsModel[0],pa),q(h.v2.positionWorld,h.vertexNormalsModel[1],Y),q(h.v3.positionWorld,h.vertexNormalsModel[2],da),pa.multiply(Z).add(oa),Y.multiply(Z).add(oa),da.multiply(Z).add(oa),la.addColors(Y,da).multiplyScalar(0.5),Fa=E(pa,Y,da,la),G(M,ca,qa,ha,ra,N,0,0,1,0,0,1,Fa)):(aa.copy(vb),q(h.centroidModel,h.normalModel,aa),aa.multiply(Z).add(oa),!0===i.wireframe?C(aa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):A(aa)):!0===i.wireframe?C(i.color,i.wireframeLinewidth, +i.wireframeLinecap,i.wireframeLinejoin):A(i.color)):i instanceof THREE.MeshBasicMaterial||i instanceof THREE.MeshLambertMaterial||i instanceof THREE.MeshPhongMaterial?null!==i.map?i.map.mapping instanceof THREE.UVMapping&&(Xa=h.uvs[0],F(M,ca,qa,ha,ra,N,Xa[f].x,Xa[f].y,Xa[g].x,Xa[g].y,Xa[j].x,Xa[j].y,i.map)):null!==i.envMap?i.envMap.mapping instanceof THREE.SphericalReflectionMapping&&(bb.copy(h.vertexNormalsModelView[f]),ub=0.5*bb.x+0.5,Ib=0.5*bb.y+0.5,bb.copy(h.vertexNormalsModelView[g]),Jb=0.5* +bb.x+0.5,fc=0.5*bb.y+0.5,bb.copy(h.vertexNormalsModelView[j]),Ab=0.5*bb.x+0.5,mc=0.5*bb.y+0.5,F(M,ca,qa,ha,ra,N,ub,Ib,Jb,fc,Ab,mc,i.envMap)):(aa.copy(i.color),i.vertexColors===THREE.FaceColors&&aa.multiply(h.color),!0===i.wireframe?C(aa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):A(aa)):i instanceof THREE.MeshDepthMaterial?(Wa=p.near,ab=p.far,pa.r=pa.g=pa.b=1-k(a.positionScreen.z*a.positionScreen.w,Wa,ab),Y.r=Y.g=Y.b=1-k(d.positionScreen.z*d.positionScreen.w,Wa,ab),da.r=da.g=da.b= +1-k(e.positionScreen.z*e.positionScreen.w,Wa,ab),la.addColors(Y,da).multiplyScalar(0.5),Fa=E(pa,Y,da,la),G(M,ca,qa,ha,ra,N,0,0,1,0,0,1,Fa)):i instanceof THREE.MeshNormalMaterial&&(i.shading==THREE.FlatShading?(a=h.normalModelView,aa.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),!0===i.wireframe?C(aa,i.wireframeLinewidth,i.wireframeLinecap,i.wireframeLinejoin):A(aa)):i.shading==THREE.SmoothShading&&(a=h.vertexNormalsModelView[f],pa.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a= +h.vertexNormalsModelView[g],Y.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),a=h.vertexNormalsModelView[j],da.setRGB(a.x,a.y,a.z).multiplyScalar(0.5).addScalar(0.5),la.addColors(Y,da).multiplyScalar(0.5),Fa=E(pa,Y,da,la),G(M,ca,qa,ha,ra,N,0,0,1,0,0,1,Fa)))}function y(a,b,c,d,e,f){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.closePath()}function B(a,b,c,d,e,f,g,j){t.beginPath();t.moveTo(a,b);t.lineTo(c,d);t.lineTo(e,f);t.lineTo(g,j);t.closePath()}function C(a,b,c,j){d(b);e(c); +f(j);g(a.getStyle());t.stroke();Va.expandByScalar(2*b)}function A(a){h(a.getStyle());t.fill()}function F(a,b,c,d,e,f,g,j,i,wa,k,l,n){if(!(n instanceof THREE.DataTexture||void 0===n.image||0==n.image.width)){if(!0===n.needsUpdate){var m=n.wrapS==THREE.RepeatWrapping,hb=n.wrapT==THREE.RepeatWrapping;nb[n.id]=t.createPattern(n.image,!0===m&&!0===hb?"repeat":!0===m&&!1===hb?"repeat-x":!1===m&&!0===hb?"repeat-y":"no-repeat");n.needsUpdate=!1}void 0===nb[n.id]?h("rgba(0,0,0,1)"):h(nb[n.id]);var m=n.offset.x/ +n.repeat.x,hb=n.offset.y/n.repeat.y,p=n.image.width*n.repeat.x,q=n.image.height*n.repeat.y,g=(g+m)*p,j=(1-j+hb)*q,c=c-a,d=d-b,e=e-a,f=f-b,i=(i+m)*p-g,wa=(1-wa+hb)*q-j,k=(k+m)*p-g,l=(1-l+hb)*q-j,m=i*l-k*wa;0===m?(void 0===ia[n.id]&&(b=document.createElement("canvas"),b.width=n.image.width,b.height=n.image.height,b=b.getContext("2d"),b.drawImage(n.image,0,0),ia[n.id]=b.getImageData(0,0,n.image.width,n.image.height).data),b=ia[n.id],g=4*(Math.floor(g)+Math.floor(j)*n.image.width),aa.setRGB(b[g]/255, +b[g+1]/255,b[g+2]/255),A(aa)):(m=1/m,n=(l*c-wa*e)*m,wa=(l*d-wa*f)*m,c=(i*e-k*c)*m,d=(i*f-k*d)*m,a=a-n*g-c*j,g=b-wa*g-d*j,t.save(),t.transform(n,wa,c,d,a,g),t.fill(),t.restore())}}function G(a,b,c,d,e,f,g,j,i,h,wa,k,n){var l,m;l=n.width-1;m=n.height-1;g*=l;j*=m;c-=a;d-=b;e-=a;f-=b;i=i*l-g;h=h*m-j;wa=wa*l-g;k=k*m-j;m=1/(i*k-wa*h);l=(k*c-h*e)*m;h=(k*d-h*f)*m;c=(i*e-wa*c)*m;d=(i*f-wa*d)*m;a=a-l*g-c*j;b=b-h*g-d*j;t.save();t.transform(l,h,c,d,a,b);t.clip();t.drawImage(n,0,0);t.restore()}function E(a,b, +c,d){Ra[0]=255*a.r|0;Ra[1]=255*a.g|0;Ra[2]=255*a.b|0;Ra[4]=255*b.r|0;Ra[5]=255*b.g|0;Ra[6]=255*b.b|0;Ra[8]=255*c.r|0;Ra[9]=255*c.g|0;Ra[10]=255*c.b|0;Ra[12]=255*d.r|0;Ra[13]=255*d.g|0;Ra[14]=255*d.b|0;j.putImageData(yb,0,0);Sa.drawImage(xb,0,0);return cb}function I(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;0!==e&&(e=1/Math.sqrt(e),c*=e,d*=e,b.x+=c,b.y+=d,a.x-=c,a.y-=d)}if(!1===p instanceof THREE.Camera)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{!0=== +this.autoClear&&this.clear();t.setTransform(1,0,0,-1,v,z);l.info.render.vertices=0;l.info.render.faces=0;m=r.projectScene(a,p,this.sortObjects,this.sortElements);n=m.elements;s=m.lights;gc=0>1,nd=H.height>>1,Cb=wa.scale.x*v,Db=wa.scale.y*z,Bb=Cb*md,hb=Db*nd,Va.min.set(X.x-Bb,X.y-hb),Va.max.set(X.x+Bb,X.y+hb),!1!==pb.isIntersectionBox(Va)&&(t.save(),t.translate(X.x,X.y),t.rotate(-wa.rotation),t.scale(Cb,-Db),t.translate(-md,-nd),t.drawImage(H,0,0),t.restore())):P instanceof THREE.ParticleCanvasMaterial&&(Bb=wa.scale.x*v,hb=wa.scale.y*z,Va.min.set(X.x-Bb,X.y-hb),Va.max.set(X.x+Bb,X.y+hb),!1!==pb.isIntersectionBox(Va)&&(g(P.color.getStyle()), +h(P.color.getStyle()),t.save(),t.translate(X.x,X.y),t.rotate(-wa.rotation),t.scale(Bb,hb),P.program(t),t.restore()))}else if(H instanceof THREE.RenderableLine)K=H.v1,L=H.v2,K.positionScreen.x*=v,K.positionScreen.y*=z,L.positionScreen.x*=v,L.positionScreen.y*=z,Va.setFromPoints([K.positionScreen,L.positionScreen]),!0===pb.isIntersectionBox(Va)&&(X=K,wa=L,b(P.opacity),c(P.blending),t.beginPath(),t.moveTo(X.positionScreen.x,X.positionScreen.y),t.lineTo(wa.positionScreen.x,wa.positionScreen.y),P instanceof +THREE.LineBasicMaterial?(d(P.linewidth),e(P.linecap),f(P.linejoin),g(P.color.getStyle()),i(null,null),t.stroke(),Va.expandByScalar(2*P.linewidth)):P instanceof THREE.LineDashedMaterial&&(d(P.linewidth),e(P.linecap),f(P.linejoin),g(P.color.getStyle()),i(P.dashSize,P.gapSize),t.stroke(),Va.expandByScalar(2*P.linewidth)));else if(H instanceof THREE.RenderableFace3){K=H.v1;L=H.v2;U=H.v3;if(-1>K.positionScreen.z||1L.positionScreen.z||1 +U.positionScreen.z||1K.positionScreen.z|| +1L.positionScreen.z||1U.positionScreen.z||1fa.positionScreen.z||1 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif", +lights_lambert_vertex:"vLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\nvLightBack = vec3( 0.0 );\n#endif\ntransformedNormal = normalize( transformedNormal );\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, dirVector );\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\n#ifdef DOUBLE_SIDED\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\n#endif\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\n#ifdef DOUBLE_SIDED\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\n#ifdef DOUBLE_SIDED\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nfloat hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\nvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n#ifdef DOUBLE_SIDED\nvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n#endif\n}\n#endif\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\n#ifdef DOUBLE_SIDED\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\n#endif", +lights_phong_pars_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif", +lights_phong_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nvSpotLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvWorldPosition = worldPosition.xyz;\n#endif", +lights_phong_pars_fragment:"uniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#else\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#else\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\nvarying vec3 vWorldPosition;\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;", +lights_phong_fragment:"vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#ifdef DOUBLE_SIDED\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n#endif\n#ifdef USE_NORMALMAP\nnormal = perturbNormal2Arb( -viewPosition, normal );\n#elif defined( USE_BUMPMAP )\nnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vPointLight[ i ].xyz );\nfloat lDistance = vPointLight[ i ].w;\n#endif\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\n#endif\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\nvec3 pointHalfVector = normalize( lVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\n#else\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\nfloat lDistance = vSpotLight[ i ].w;\n#endif\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\n#endif\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\nvec3 spotHalfVector = normalize( lVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, dirVector );\n#ifdef WRAP_AROUND\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\n#endif\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += diffuse * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\n#endif", +color_pars_fragment:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_fragment:"#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\n#endif",color_pars_vertex:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n#ifdef GAMMA_INPUT\nvColor = color * color;\n#else\nvColor = color;\n#endif\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n#ifdef BONE_TEXTURE\nuniform sampler2D boneTexture;\nmat4 getBoneMatrix( const in float i ) {\nfloat j = i * 4.0;\nfloat x = mod( j, N_BONE_PIXEL_X );\nfloat y = floor( j / N_BONE_PIXEL_X );\nconst float dx = 1.0 / N_BONE_PIXEL_X;\nconst float dy = 1.0 / N_BONE_PIXEL_Y;\ny = dy * ( y + 0.5 );\nvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\nvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\nvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\nvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\nmat4 bone = mat4( v1, v2, v3, v4 );\nreturn bone;\n}\n#else\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\nmat4 getBoneMatrix( const in float i ) {\nmat4 bone = boneGlobalMatrices[ int(i) ];\nreturn bone;\n}\n#endif\n#endif", +skinbase_vertex:"#ifdef USE_SKINNING\nmat4 boneMatX = getBoneMatrix( skinIndex.x );\nmat4 boneMatY = getBoneMatrix( skinIndex.y );\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n#ifdef USE_MORPHTARGETS\nvec4 skinVertex = vec4( morphed, 1.0 );\n#else\nvec4 skinVertex = vec4( position, 1.0 );\n#endif\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n#ifndef USE_MORPHNORMALS\nuniform float morphTargetInfluences[ 8 ];\n#else\nuniform float morphTargetInfluences[ 4 ];\n#endif\n#endif", +morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n#ifndef USE_MORPHNORMALS\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n#endif\nmorphed += position;\n#endif", +default_vertex:"vec4 mvPosition;\n#ifdef USE_SKINNING\nmvPosition = modelViewMatrix * skinned;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( morphed, 1.0 );\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )\nmvPosition = modelViewMatrix * vec4( position, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\nvec3 morphedNormal = vec3( 0.0 );\nmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\nmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\nmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\nmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\nmorphedNormal += normal;\n#endif", +skinnormal_vertex:"#ifdef USE_SKINNING\nmat4 skinMatrix = skinWeight.x * boneMatX;\nskinMatrix \t+= skinWeight.y * boneMatY;\n#ifdef USE_MORPHNORMALS\nvec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\n#else\nvec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\n#endif\n#endif",defaultnormal_vertex:"vec3 objectNormal;\n#ifdef USE_SKINNING\nobjectNormal = skinnedNormal.xyz;\n#endif\n#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )\nobjectNormal = morphedNormal;\n#endif\n#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )\nobjectNormal = normal;\n#endif\n#ifdef FLIP_SIDED\nobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;", +shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\nuniform float shadowDarkness[ MAX_SHADOWS ];\nuniform float shadowBias[ MAX_SHADOWS ];\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nfloat unpackDepth( const in vec4 rgba_depth ) {\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\nfloat depth = dot( rgba_depth, bit_shift );\nreturn depth;\n}\n#endif",shadowmap_fragment:"#ifdef USE_SHADOWMAP\n#ifdef SHADOWMAP_DEBUG\nvec3 frustumColors[3];\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\n#endif\n#ifdef SHADOWMAP_CASCADE\nint inFrustumCount = 0;\n#endif\nfloat fDepth;\nvec3 shadowColor = vec3( 1.0 );\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\nbool inFrustum = all( inFrustumVec );\n#ifdef SHADOWMAP_CASCADE\ninFrustumCount += int( inFrustum );\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\n#else\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n#endif\nbool frustumTest = all( frustumTestVec );\nif ( frustumTest ) {\nshadowCoord.z += shadowBias[ i ];\n#if defined( SHADOWMAP_TYPE_PCF )\nfloat shadow = 0.0;\nconst float shadowDelta = 1.0 / 9.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.25 * xPixelOffset;\nfloat dy0 = -1.25 * yPixelOffset;\nfloat dx1 = 1.25 * xPixelOffset;\nfloat dy1 = 1.25 * yPixelOffset;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\nfloat shadow = 0.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.0 * xPixelOffset;\nfloat dy0 = -1.0 * yPixelOffset;\nfloat dx1 = 1.0 * xPixelOffset;\nfloat dy1 = 1.0 * yPixelOffset;\nmat3 shadowKernel;\nmat3 depthKernel;\ndepthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( depthKernel[0][0] < shadowCoord.z ) shadowKernel[0][0] = 0.25;\nelse shadowKernel[0][0] = 0.0;\ndepthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( depthKernel[0][1] < shadowCoord.z ) shadowKernel[0][1] = 0.25;\nelse shadowKernel[0][1] = 0.0;\ndepthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( depthKernel[0][2] < shadowCoord.z ) shadowKernel[0][2] = 0.25;\nelse shadowKernel[0][2] = 0.0;\ndepthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( depthKernel[1][0] < shadowCoord.z ) shadowKernel[1][0] = 0.25;\nelse shadowKernel[1][0] = 0.0;\ndepthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( depthKernel[1][1] < shadowCoord.z ) shadowKernel[1][1] = 0.25;\nelse shadowKernel[1][1] = 0.0;\ndepthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( depthKernel[1][2] < shadowCoord.z ) shadowKernel[1][2] = 0.25;\nelse shadowKernel[1][2] = 0.0;\ndepthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( depthKernel[2][0] < shadowCoord.z ) shadowKernel[2][0] = 0.25;\nelse shadowKernel[2][0] = 0.0;\ndepthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( depthKernel[2][1] < shadowCoord.z ) shadowKernel[2][1] = 0.25;\nelse shadowKernel[2][1] = 0.0;\ndepthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( depthKernel[2][2] < shadowCoord.z ) shadowKernel[2][2] = 0.25;\nelse shadowKernel[2][2] = 0.0;\nvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\nshadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\nshadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\nvec4 shadowValues;\nshadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\nshadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\nshadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\nshadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\nshadow = dot( shadowValues, vec4( 1.0 ) );\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n#endif\n}\n#ifdef SHADOWMAP_DEBUG\n#ifdef SHADOWMAP_CASCADE\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\n#else\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\n#endif\n#endif\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif", +shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif",alphatest_fragment:"#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif",linear_to_gamma_fragment:"#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"}; +THREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b dashSize ) {\ndiscard;\n}\ngl_FragColor = vec4( diffuse, opacity );",THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2E3},opacity:{type:"f", +value:1}},vertexShader:"void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform float mNear;\nuniform float mFar;\nuniform float opacity;\nvoid main() {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\ngl_FragColor = vec4( vec3( color ), opacity );\n}"},normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:"varying vec3 vNormal;\nvoid main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvNormal = normalize( normalMatrix * normal );\ngl_Position = projectionMatrix * mvPosition;\n}", +fragmentShader:"uniform float opacity;\nvarying vec3 vNormal;\nvoid main() {\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\n}"},normalmap:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{enableAO:{type:"i",value:0},enableDiffuse:{type:"i",value:0},enableSpecular:{type:"i",value:0},enableReflection:{type:"i",value:0},enableDisplacement:{type:"i",value:0},tDisplacement:{type:"t",value:null},tDiffuse:{type:"t",value:null}, +tCube:{type:"t",value:null},tNormal:{type:"t",value:null},tSpecular:{type:"t",value:null},tAO:{type:"t",value:null},uNormalScale:{type:"v2",value:new THREE.Vector2(1,1)},uDisplacementBias:{type:"f",value:0},uDisplacementScale:{type:"f",value:1},uDiffuseColor:{type:"c",value:new THREE.Color(16777215)},uSpecularColor:{type:"c",value:new THREE.Color(1118481)},uAmbientColor:{type:"c",value:new THREE.Color(16777215)},uShininess:{type:"f",value:30},uOpacity:{type:"f",value:1},useRefract:{type:"i",value:0}, +uRefractionRatio:{type:"f",value:0.98},uReflectivity:{type:"f",value:0.5},uOffset:{type:"v2",value:new THREE.Vector2(0,0)},uRepeat:{type:"v2",value:new THREE.Vector2(1,1)},wrapRGB:{type:"v3",value:new THREE.Vector3(1,1,1)}}]),fragmentShader:["uniform vec3 uAmbientColor;\nuniform vec3 uDiffuseColor;\nuniform vec3 uSpecularColor;\nuniform float uShininess;\nuniform float uOpacity;\nuniform bool enableDiffuse;\nuniform bool enableSpecular;\nuniform bool enableAO;\nuniform bool enableReflection;\nuniform sampler2D tDiffuse;\nuniform sampler2D tNormal;\nuniform sampler2D tSpecular;\nuniform sampler2D tAO;\nuniform samplerCube tCube;\nuniform vec2 uNormalScale;\nuniform bool useRefract;\nuniform float uRefractionRatio;\nuniform float uReflectivity;\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nuniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_HEMI_LIGHTS > 0\nuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\nuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;", +THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,"void main() {\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\nvec3 specularTex = vec3( 1.0 );\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\nnormalTex.xy *= uNormalScale;\nnormalTex = normalize( normalTex );\nif( enableDiffuse ) {\n#ifdef GAMMA_INPUT\nvec4 texelColor = texture2D( tDiffuse, vUv );\ntexelColor.xyz *= texelColor.xyz;\ngl_FragColor = gl_FragColor * texelColor;\n#else\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\n#endif\n}\nif( enableAO ) {\n#ifdef GAMMA_INPUT\nvec4 aoColor = texture2D( tAO, vUv );\naoColor.xyz *= aoColor.xyz;\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\n#endif\n}\nif( enableSpecular )\nspecularTex = texture2D( tSpecular, vUv ).xyz;\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\nvec3 finalNormal = tsb * normalTex;\n#ifdef FLIP_SIDED\nfinalNormal = -finalNormal;\n#endif\nvec3 normal = normalize( finalNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 pointVector = lPosition.xyz + vViewPosition.xyz;\nfloat pointDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\npointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );\npointVector = normalize( pointVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\n#endif\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\n#else\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 spotVector = lPosition.xyz + vViewPosition.xyz;\nfloat spotDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nspotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );\nspotVector = normalize( spotVector );\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngleCos[ i ] ) {\nspotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );\n#endif\nspotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;\nvec3 spotHalfVector = normalize( spotVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\n#endif\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_HEMI_LIGHTS > 0\nvec3 hemiDiffuse = vec3( 0.0 );\nvec3 hemiSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\nvec3 lVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, lVector );\nfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\nvec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\nhemiDiffuse += uDiffuseColor * hemiColor;\nvec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\nfloat hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\nfloat hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );\nvec3 lVectorGround = -lVector;\nvec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\nfloat hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\nfloat hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat dotProductGround = dot( normal, lVectorGround );\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\nvec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\nhemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\n#else\nhemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_HEMI_LIGHTS > 0\ntotalDiffuse += hemiDiffuse;\ntotalSpecular += hemiSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;\n#endif\nif ( enableReflection ) {\nvec3 vReflect;\nvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\nif ( useRefract ) {\nvReflect = refract( cameraToVertex, normal, uRefractionRatio );\n} else {\nvReflect = reflect( cameraToVertex, normal );\n}\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\n}", +THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n"),vertexShader:["attribute vec4 tangent;\nuniform vec2 uOffset;\nuniform vec2 uRepeat;\nuniform bool enableDisplacement;\n#ifdef VERTEX_TEXTURES\nuniform sampler2D tDisplacement;\nuniform float uDisplacementScale;\nuniform float uDisplacementBias;\n#endif\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vWorldPosition;\nvarying vec3 vViewPosition;", +THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,"#ifdef USE_SKINNING\nvNormal = normalize( normalMatrix * skinnedNormal.xyz );\nvec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );\nvTangent = normalize( normalMatrix * skinnedTangent.xyz );\n#else\nvNormal = normalize( normalMatrix * normal );\nvTangent = normalize( normalMatrix * tangent.xyz );\n#endif\nvBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );\nvUv = uv * uRepeat + uOffset;\nvec3 displacedPosition;\n#ifdef VERTEX_TEXTURES\nif ( enableDisplacement ) {\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\ndisplacedPosition = position + normalize( normal ) * df;\n} else {\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n}\n#else\n#ifdef USE_SKINNING\nvec4 skinVertex = vec4( position, 1.0 );\nvec4 skinned = boneMatX * skinVertex * skinWeight.x;\nskinned \t += boneMatY * skinVertex * skinWeight.y;\ndisplacedPosition = skinned.xyz;\n#else\ndisplacedPosition = position;\n#endif\n#endif\nvec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\nvec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\nvWorldPosition = worldPosition.xyz;\nvViewPosition = -mvPosition.xyz;\n#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n}\n#endif\n}"].join("\n")}, +cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:"varying vec3 vWorldPosition;\nvoid main() {\nvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\nvWorldPosition = worldPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\nvoid main() {\ngl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n}"}, +depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.default_vertex,"}"].join("\n"),fragmentShader:"vec4 pack_depth( const in float depth ) {\nconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\nconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\nvec4 res = fract( depth * bit_shift );\nres -= res.xxyz * bit_mask;\nreturn res;\n}\nvoid main() {\ngl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n}"}};THREE.WebGLRenderer=function(a){function b(a){if(a.__webglCustomAttributesList)for(var b in a.__webglCustomAttributesList)j.deleteBuffer(a.__webglCustomAttributesList[b].buffer)}function c(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=!0;var g=1;"v2"===f.type?g=2:"v3"===f.type?g=3:"v4"===f.type? +g=4:"c"===f.type&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=j.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=!0}a.__webglCustomAttributesList.push(f)}}}function d(a,b){var c=b.geometry,d=a.faces3,h=a.faces4,i=3*d.length+4*h.length,k=1*d.length+2*h.length,h=3*d.length+4*h.length,d=e(b,a),n=g(d),l=f(d),m=d.vertexColors?d.vertexColors:!1;a.__vertexArray=new Float32Array(3*i);l&&(a.__normalArray=new Float32Array(3*i));c.hasTangents&&(a.__tangentArray=new Float32Array(4*i));m&& +(a.__colorArray=new Float32Array(3*i));if(n){if(0l;l++)N.autoScaleCubemaps&&!f?(m=k,r=l,t=c.image[l],y=gd,t.width<=y&&t.height<=y||(z=Math.max(t.width,t.height),v=Math.floor(t.width*y/z),y=Math.floor(t.height*y/z),z=document.createElement("canvas"),z.width=v,z.height=y,z.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,v,y),t=z),m[r]=t):k[l]=c.image[l];l=k[0];m=0===(l.width&l.width-1)&&0===(l.height&l.height-1);r=L(c.format); +t=L(c.type);W(j.TEXTURE_CUBE_MAP,c,m);for(l=0;6>l;l++)if(f){y=k[l].mipmaps;z=0;for(B=y.length;z=Mc&&console.warn("WebGLRenderer: trying to use "+ +a+" texture units while this GPU supports only "+Mc);Y+=1;return a}function C(a,b){a._modelViewMatrix.multiplyMatrices(b.matrixWorldInverse,a.matrixWorld);a._normalMatrix.getInverse(a._modelViewMatrix);a._normalMatrix.transpose()}function x(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function G(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function J(a){a!==ub&&(j.lineWidth(a),ub=a)}function E(a,b,c){ab!==a&&(a?j.enable(j.POLYGON_OFFSET_FILL):j.disable(j.POLYGON_OFFSET_FILL),ab=a);if(a&& +(Fa!==b||Xa!==c))j.polygonOffset(b,c),Fa=b,Xa=c}function H(a){for(var a=a.split("\n"),b=0,c=a.length;bb;b++)j.deleteFramebuffer(a.__webglFramebuffer[b]),j.deleteRenderbuffer(a.__webglRenderbuffer[b]); +else j.deleteFramebuffer(a.__webglFramebuffer),j.deleteRenderbuffer(a.__webglRenderbuffer);N.info.memory.textures--},X=function(a){a=a.target;a.removeEventListener("dispose",X);Pc(a)},Pc=function(a){var b=a.program;if(void 0!==b){a.program=void 0;var c,d,e=!1,a=0;for(c=Ma.length;ad.numSupportedMorphTargets?(i.sort(n),i.length=d.numSupportedMorphTargets):i.length>d.numSupportedMorphNormals?i.sort(n):0===i.length&&i.push([0,0]);for(h=0;hxa;xa++)nc=ab[xa],Fb[kb]=nc.x,Fb[kb+1]=nc.y,Fb[kb+2]=nc.z,kb+=3;else for(xa=0;3>xa;xa++)Fb[kb]=Xa.x,Fb[kb+1]=Xa.y,Fb[kb+2]=Xa.z,kb+=3;D=0;for(V=va.length;Dxa;xa++)nc= +ab[xa],Fb[kb]=nc.x,Fb[kb+1]=nc.y,Fb[kb+2]=nc.z,kb+=3;else for(xa=0;4>xa;xa++)Fb[kb]=Xa.x,Fb[kb+1]=Xa.y,Fb[kb+2]=Xa.z,kb+=3;j.bindBuffer(j.ARRAY_BUFFER,sa.__webglNormalBuffer);j.bufferData(j.ARRAY_BUFFER,Fb,Pa)}if(Cc&&pd&&bb){D=0;for(V=ua.length;Dxa;xa++)Ab=pb[xa],Dc[ic]=Ab.x,Dc[ic+1]=Ab.y,ic+=2;D=0;for(V=va.length;Dxa;xa++)Ab=pb[xa],Dc[ic]=Ab.x,Dc[ic+1]=Ab.y,ic+=2;0xa;xa++)yc=ub[xa],Ec[jc]=yc.x,Ec[jc+1]=yc.y,jc+=2;D=0;for(V=va.length;Dxa;xa++)yc=ub[xa],Ec[jc]=yc.x,Ec[jc+1]=yc.y,jc+=2;0f;f++){a.__webglFramebuffer[f]=j.createFramebuffer();a.__webglRenderbuffer[f]=j.createRenderbuffer();j.texImage2D(j.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,i=j.TEXTURE_CUBE_MAP_POSITIVE_X+f;j.bindFramebuffer(j.FRAMEBUFFER, +a.__webglFramebuffer[f]);j.framebufferTexture2D(j.FRAMEBUFFER,j.COLOR_ATTACHMENT0,i,g.__webglTexture,0);F(a.__webglRenderbuffer[f],a)}c&&j.generateMipmap(j.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=j.createFramebuffer(),a.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:j.createRenderbuffer(),j.bindTexture(j.TEXTURE_2D,a.__webglTexture),W(j.TEXTURE_2D,a,c),j.texImage2D(j.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=j.TEXTURE_2D,j.bindFramebuffer(j.FRAMEBUFFER,a.__webglFramebuffer), +j.framebufferTexture2D(j.FRAMEBUFFER,j.COLOR_ATTACHMENT0,d,a.__webglTexture,0),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?j.framebufferRenderbuffer(j.FRAMEBUFFER,j.DEPTH_ATTACHMENT,j.RENDERBUFFER,a.__webglRenderbuffer):a.depthBuffer&&a.stencilBuffer&&j.framebufferRenderbuffer(j.FRAMEBUFFER,j.DEPTH_STENCIL_ATTACHMENT,j.RENDERBUFFER,a.__webglRenderbuffer):F(a.__webglRenderbuffer,a),c&&j.generateMipmap(j.TEXTURE_2D);b?j.bindTexture(j.TEXTURE_CUBE_MAP,null):j.bindTexture(j.TEXTURE_2D,null);j.bindRenderbuffer(j.RENDERBUFFER, +null);j.bindFramebuffer(j.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=fc,a=Ab,d=Ib,e=Jb);b!==Pa&&(j.bindFramebuffer(j.FRAMEBUFFER,b),j.viewport(d,e,c,a),Pa=b);mc=c;pb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(a,b,c){THREE.EventDispatcher.call(this);this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1); +this.format=void 0!==c.format?c.format:THREE.RGBAFormat;this.type=void 0!==c.type?c.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0;this.shareDepthFrom=null}; +THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.anisotropy=this.anisotropy;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps;a.shareDepthFrom=this.shareDepthFrom;return a}; +THREE.WebGLRenderTarget.prototype.dispose=function(){this.dispatchEvent({type:"dispose"})};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)};THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.material=this.color=null;this.uvs=[[]];this.z=null};THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]; +this.material=this.color=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null};THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=this.object=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};THREE.GeometryUtils={merge:function(a,b){var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,i=a.faces,k=f.faces,l=a.faceVertexUvs[0],f=f.faceVertexUvs[0];b instanceof THREE.Mesh&&(b.matrixAutoUpdate&&b.updateMatrix(),c=b.matrix,d=new THREE.Matrix3,d.getInverse(c),d.transpose());for(var m=0,n=h.length;ma?b(c,e-1):k[e]>8&255,i>>16&255,i>>24&255)),d}d.mipmapCount=1;h[2]&131072&&!1!==b&&(d.mipmapCount=Math.max(1,h[7]));d.isCubemap=h[28]&512?!0:!1;d.width=h[4];d.height=h[3];for(var h=h[1]+4,f=d.width,g=d.height,i=d.isCubemap? +6:1,k=0;km-1?0:m-1,s=m+1>e-1?e-1:m+1,r=0>l-1?0:l-1,p=l+1>d-1?d-1:l+1,q=[],y=[0,0,h[4*(m*d+l)]/255*b];q.push([-1,0,h[4*(m*d+r)]/255*b]);q.push([-1,-1,h[4*(n*d+r)]/255*b]);q.push([0,-1,h[4*(n*d+l)]/255*b]);q.push([1,-1,h[4*(n*d+p)]/255*b]);q.push([1,0,h[4*(m*d+p)]/255*b]);q.push([1,1,h[4*(s*d+p)]/255*b]);q.push([0,1,h[4*(s*d+l)]/255*b]);q.push([-1,1,h[4*(s*d+r)]/255*b]);n=[];r=q.length;for(s=0;se)return null;var f=[],g=[],h=[],i,k,l;if(0=m--){console.log("Warning, unable to triangulate polygon!");break}i=k;e<=i&&(i=0);k=i+1;e<=k&&(k=0);l=k+1;e<=l&&(l=0);var n;a:{var s=n=void 0,r=void 0,p=void 0,q=void 0,y=void 0,v=void 0,z=void 0,t= +void 0,s=a[g[i]].x,r=a[g[i]].y,p=a[g[k]].x,q=a[g[k]].y,y=a[g[l]].x,v=a[g[l]].y;if(1E-10>(p-s)*(v-r)-(q-r)*(y-s))n=!1;else{var A=void 0,I=void 0,C=void 0,x=void 0,G=void 0,J=void 0,E=void 0,H=void 0,B=void 0,W=void 0,B=H=E=t=z=void 0,A=y-p,I=v-q,C=s-y,x=r-v,G=p-s,J=q-r;for(n=0;ni)g=d+1;else if(0b&&(b=0);1d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b}; +THREE.EllipseCurve=function(a,b,c,d,e,f,g){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype);THREE.EllipseCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.xRadius*Math.cos(b);b=this.aY+this.yRadius*Math.sin(b);return new THREE.Vector2(a,b)}; +THREE.ArcCurve=function(a,b,c,d,e,f){THREE.EllipseCurve.call(this,a,b,c,c,d,e,f)};THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype); +THREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=0.5*(c-a),d=0.5*(d-b),f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}}; +THREE.Curve.create=function(a,b){a.prototype=Object.create(THREE.Curve.prototype);a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b}); +THREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)}); +THREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)}); +THREE.SplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a-=e;c[0]=0==e?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b}); +THREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e-=a;a+=0=b)return b=c[a]-b,a=this.curves[a],b=1-b/a.getLength(),a.getPointAt(b);a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]}; +THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;cb?b=h.x:h.xc?c=h.y:h.yd?d=h.z:h.zMath.abs(d.x-c[0].x)&&1E-10>Math.abs(d.y-c[0].y)&&c.splice(c.length-1,1);b&&c.push(c[0]);return c}; +THREE.Path.prototype.toShapes=function(){var a,b,c,d,e=[],f=new THREE.Path;a=0;for(b=this.actions.length;a +h&&(h+=c.length);h%=c.length;0>g&&(g+=k.length);g%=k.length;e=0<=h-1?h-1:c.length-1;f=0<=g-1?g-1:k.length-1;p=[k[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(p);q=[k[g],k[f],c[h]];q=THREE.FontUtils.Triangulate.area(q);m+n>p+q&&(h=s,g=l,0>h&&(h+=c.length),h%=c.length,0>g&&(g+=k.length),g%=k.length,e=0<=h-1?h-1:c.length-1,f=0<=g-1?g-1:k.length-1);m=c.slice(0,h);n=c.slice(h);s=k.slice(g);l=k.slice(0,g);f=[k[g],k[f],c[h]];r.push([k[g],c[h],c[e]]);r.push(f);c=m.concat(s).concat(l).concat(n)}return{shape:c, +isolatedPts:r,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,!1),f,g,h,i,k={};f=0;for(g=d.length;fd;d++)i=h[d].x+":"+h[d].y,i=k[i],void 0!==i&&(h[d]=i)}f=0;for(g=e.length;fd;d++)i=h[d].x+":"+h[d].y,i=k[i],void 0!==i&&(h[d]=i)}return c.concat(e)}, +isClockWise:function(a){return 0>THREE.FontUtils.Triangulate.area(a)},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a,b)+this.b3p1(a,c)+this.b3p2(a,d)+ +this.b3p3(a,e)}};THREE.AnimationHandler=function(){var a=[],b={},c={update:function(b){for(var c=0;ca.hierarchy[c].keys[d].time&& +(a.hierarchy[c].keys[d].time=0),void 0!==a.hierarchy[c].keys[d].rot&&!(a.hierarchy[c].keys[d].rot instanceof THREE.Quaternion)){var h=a.hierarchy[c].keys[d].rot;a.hierarchy[c].keys[d].rot=new THREE.Quaternion(h[0],h[1],h[2],h[3])}if(a.hierarchy[c].keys.length&&void 0!==a.hierarchy[c].keys[0].morphTargets){h={};for(d=0;ds;s++){c=b[s];g=i.prevKey[c];h=i.nextKey[c];if(h.time<=l){if(kd||1d?0:1;if("pos"===c)if(c=a.position,this.interpolationType===THREE.AnimationHandler.LINEAR)c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+ +(f[2]-e[2])*d;else{if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD)this.points[0]=this.getPrevKeyWith("pos",m,g.index-1).pos,this.points[1]=e,this.points[2]=f,this.points[3]=this.getNextKeyWith("pos",m,h.index+1).pos,d=0.33*d+0.33,e=this.interpolateCatmullRom(this.points,d),c.x=e[0],c.y=e[1],c.z=e[2],this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD&&(d=this.interpolateCatmullRom(this.points,1.01*d), +this.target.set(d[0],d[1],d[2]),this.target.sub(c),this.target.y=0,this.target.normalize(),d=Math.atan2(this.target.x,this.target.z),a.rotation.set(0,d,0))}else"rot"===c?THREE.Quaternion.slerp(e,f,a.quaternion,d):"scl"===c&&(c=a.scale,c.x=e[0]+(f[0]-e[0])*d,c.y=e[1]+(f[1]-e[1])*d,c.z=e[2]+(f[2]-e[2])*d)}}}}; +THREE.Animation.prototype.interpolateCatmullRom=function(a,b){var c=[],d=[],e,f,g,h,i,k;e=(a.length-1)*b;f=Math.floor(e);e-=f;c[0]=0===f?f:f-1;c[1]=f;c[2]=f>a.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];i=a[c[2]];k=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],i[0],k[0],e,c,g);d[1]=this.interpolate(f[1],h[1],i[1],k[1],e,c,g);d[2]=this.interpolate(f[2],h[2],i[2],k[2],e,c,g);return d}; +THREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=0.5*(c-a);d=0.5*(d-b);return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=!0}}if(this.JITCompile&&void 0===f[0][e]){this.hierarchy[0].updateMatrixWorld(!0);for(a=0;ag?(b=Math.atan2(b.y-a.y,b.x-a.x),a=Math.atan2(c.y-a.y,c.x-a.x),b>a&&(a+=2*Math.PI),c=(b+a)/2,a=-Math.cos(c),c=-Math.sin(c),new THREE.Vector2(a,c)):d.multiplyScalar(g).add(i).sub(a).clone()}function e(c,d){var e,f;for(M=c.length;0<=--M;){e=M;f=M-1;0>f&&(f=c.length-1);for(var g=0,i=s+2*l, +g=0;gMath.abs(c-i)?[new THREE.Vector2(b,1-e),new THREE.Vector2(d,1-f),new THREE.Vector2(k,1-g),new THREE.Vector2(m,1-a)]:[new THREE.Vector2(c,1-e),new THREE.Vector2(i,1-f),new THREE.Vector2(l,1-g),new THREE.Vector2(n,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2; +THREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(a,b){THREE.Geometry.call(this);!1===a instanceof Array&&(a=[a]);this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeCentroids();this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;cd?(d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()]),d.centroid.add(a).add(b).add(c).divideScalar(3),d.normal=d.centroid.clone().normalize(),i.faces.push(d),d=Math.atan2(d.centroid.z,-d.centroid.x),i.faceVertexUvs[0].push([h(a.uv, +a,d),h(b.uv,b,d),h(c.uv,c,d)])):(d-=1,f(a,g(a,b),g(a,c),d),f(g(a,b),b,g(b,c),d),f(g(a,c),g(b,c),c,d),f(g(a,b),g(b,c),g(a,c),d))}function g(a,b){m[a.index]||(m[a.index]=[]);m[b.index]||(m[b.index]=[]);var c=m[a.index][b.index];void 0===c&&(m[a.index][b.index]=m[b.index][a.index]=c=e((new THREE.Vector3).addVectors(a,b).divideScalar(2)));return c}function h(a,b,c){0>c&&1===a.x&&(a=new THREE.Vector2(a.x-1,a.y));0===b.x&&0===b.z&&(a=new THREE.Vector2(c/2/Math.PI+0.5,a.y));return a}THREE.Geometry.call(this); +for(var c=c||1,d=d||0,i=this,k=0,l=a.length;k=l){for(k=0;3>k;k++){l=[i[k],i[(k+1)%3]];m=!0;for(n=0;nh;h++)void 0===f[g[h]]&&(f[g[h]]=e++,this.vertices.push(a[g[h]])),g[h]=f[g[h]]}for(d=0;db.y?this.rotation.set(Math.PI,0,0):(a=THREE.ArrowHelper.__v2.set(b.z,0,-b.x).normalize(),b=Math.acos(b.y),a=THREE.ArrowHelper.__q1.setFromAxisAngle(a,b),this.rotation.setEulerFromQuaternion(a,this.eulerOrder))}; +THREE.ArrowHelper.prototype.setLength=function(a){this.scale.set(a,a,a)};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.setHex(a);this.cone.material.color.setHex(a)};THREE.ArrowHelper.__v1=new THREE.Vector3;THREE.ArrowHelper.__v2=new THREE.Vector3;THREE.ArrowHelper.__q1=new THREE.Quaternion;THREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.geometry.vertices.push(new THREE.Vector3);d.geometry.colors.push(new THREE.Color(b));void 0===d.pointMap[a]&&(d.pointMap[a]=[]);d.pointMap[a].push(d.geometry.vertices.length-1)}THREE.Line.call(this);var d=this;this.geometry=new THREE.Geometry;this.material=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.type=THREE.LinePieces;this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap= +{};b("n1","n2",16755200);b("n2","n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200);b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680);b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1", +"cf2",3355443);b("cf3","cf4",3355443);this.camera=a;this.update(a)};THREE.CameraHelper.prototype=Object.create(THREE.Line.prototype); +THREE.CameraHelper.prototype.update=function(){function a(a,d,e,f){THREE.CameraHelper.__v.set(d,e,f);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);a=b.pointMap[a];if(void 0!==a){d=0;for(e=a.length;dh.end&&(h.end=f);c||(c=i)}}for(i in d)h=d[i],this.createAnimation(i,h.start,h.end,a);this.firstAnimation=c}; +THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)}; +THREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b}; +THREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("animation["+a+"] undefined")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1}; +THREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;bd.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight; +f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};THREE.LensFlarePlugin=function(){function a(a,c){var d=b.createProgram(),e=b.createShader(b.FRAGMENT_SHADER),f=b.createShader(b.VERTEX_SHADER),g="precision "+c+" float;\n";b.shaderSource(e,g+a.fragmentShader);b.shaderSource(f,g+a.vertexShader);b.compileShader(e);b.compileShader(f);b.attachShader(d,e);b.attachShader(d,f);b.linkProgram(d);return d}var b,c,d,e,f,g,h,i,k,l,m,n,s;this.init=function(r){b=r.context;c=r;d=r.getPrecision();e=new Float32Array(16);f=new Uint16Array(6);r=0;e[r++]=-1;e[r++]=-1; +e[r++]=0;e[r++]=0;e[r++]=1;e[r++]=-1;e[r++]=1;e[r++]=0;e[r++]=1;e[r++]=1;e[r++]=1;e[r++]=1;e[r++]=-1;e[r++]=1;e[r++]=0;e[r++]=1;r=0;f[r++]=0;f[r++]=1;f[r++]=2;f[r++]=0;f[r++]=2;f[r++]=3;g=b.createBuffer();h=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,g);b.bufferData(b.ARRAY_BUFFER,e,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.bufferData(b.ELEMENT_ARRAY_BUFFER,f,b.STATIC_DRAW);i=b.createTexture();k=b.createTexture();b.bindTexture(b.TEXTURE_2D,i);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16, +0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,k);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE); +b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);0>=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(l=!1,m=a(THREE.ShaderFlares.lensFlare,d)):(l=!0,m=a(THREE.ShaderFlares.lensFlareVertexTexture,d));n={};s={};n.vertex=b.getAttribLocation(m,"position");n.uv=b.getAttribLocation(m,"uv");s.renderType=b.getUniformLocation(m,"renderType");s.map=b.getUniformLocation(m,"map");s.occlusionMap=b.getUniformLocation(m,"occlusionMap");s.opacity= +b.getUniformLocation(m,"opacity");s.color=b.getUniformLocation(m,"color");s.scale=b.getUniformLocation(m,"scale");s.rotation=b.getUniformLocation(m,"rotation");s.screenPosition=b.getUniformLocation(m,"screenPosition")};this.render=function(a,d,e,f){var a=a.__webglFlares,v=a.length;if(v){var z=new THREE.Vector3,t=f/e,A=0.5*e,I=0.5*f,C=16/f,x=new THREE.Vector2(C*t,C),G=new THREE.Vector3(1,1,0),J=new THREE.Vector2(1,1),E=s,C=n;b.useProgram(m);b.enableVertexAttribArray(n.vertex);b.enableVertexAttribArray(n.uv); +b.uniform1i(E.occlusionMap,0);b.uniform1i(E.map,1);b.bindBuffer(b.ARRAY_BUFFER,g);b.vertexAttribPointer(C.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(C.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.disable(b.CULL_FACE);b.depthMask(!1);var H,B,W,F,K;for(H=0;Hx;x++)t[x]=new THREE.Vector3,v[x]=new THREE.Vector3;t=A.shadowCascadeNearZ[z];A=A.shadowCascadeFarZ[z];v[0].set(-1,-1,t);v[1].set(1,-1,t);v[2].set(-1, +1,t);v[3].set(1,1,t);v[4].set(-1,-1,A);v[5].set(1,-1,A);v[6].set(-1,1,A);v[7].set(1,1,A);C.originalCamera=n;v=new THREE.Gyroscope;v.position=p.shadowCascadeOffset;v.add(C);v.add(C.target);n.add(v);p.shadowCascadeArray[y]=C;console.log("Created virtualLight",C)}z=p;t=y;A=z.shadowCascadeArray[t];A.position.copy(z.position);A.target.position.copy(z.target.position);A.lookAt(A.target);A.shadowCameraVisible=z.shadowCameraVisible;A.shadowDarkness=z.shadowDarkness;A.shadowBias=z.shadowCascadeBias[t];v=z.shadowCascadeNearZ[t]; +z=z.shadowCascadeFarZ[t];A=A.pointsFrustum;A[0].z=v;A[1].z=v;A[2].z=v;A[3].z=v;A[4].z=z;A[5].z=z;A[6].z=z;A[7].z=z;I[q]=C;q++}else I[q]=p,q++;s=0;for(r=I.length;sz;z++)t=A[z],t.copy(v[z]),THREE.ShadowMapPlugin.__projector.unprojectVector(t,y),t.applyMatrix4(q.matrixWorldInverse),t.xk.x&&(k.x=t.x),t.yk.y&&(k.y=t.y),t.zk.z&& +(k.z=t.z);q.left=i.x;q.right=k.x;q.top=k.y;q.bottom=i.y;q.updateProjectionMatrix()}q=p.shadowMap;v=p.shadowMatrix;y=p.shadowCamera;y.position.getPositionFromMatrix(p.matrixWorld);l.getPositionFromMatrix(p.target.matrixWorld);y.lookAt(l);y.updateMatrixWorld();y.matrixWorldInverse.getInverse(y.matrixWorld);p.cameraHelper&&(p.cameraHelper.visible=p.shadowCameraVisible);p.shadowCameraVisible&&p.cameraHelper.update();v.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);v.multiply(y.projectionMatrix);v.multiply(y.matrixWorldInverse); +h.multiplyMatrices(y.projectionMatrix,y.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(q);b.clear();A=m.__webglObjects;p=0;for(q=A.length;p 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"}}; diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js new file mode 100644 index 0000000000..0d9c7a02d5 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/ajax_handler.js @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var ajax_handler = function () { + var api = this; + api.response = "v"; + api.ajaxRequest = function (url, type, data, dataType, callback) { + var response; + $.ajax({ + url: url, + type: type, + dataType: dataType, + success: function (data, success) { + api.response = data; + console.log(" success " + JSON.stringify(success)); + console.log(" data " + JSON.stringify(data)); + callback(data, success); + }, + error: function (jqxhr, textStatus, error) { + var err = textStatus + ', ' + error; + console.log("Request Failed: " + err); + callback(data, error); + api.response = data; + }, + data: data + }); + return api.response; + }; + api.makeJSONObject = function () { + var object = {}; + for (var i = 0; i < arguments.length - 1; i = i + 2) { + object[arguments[i]] = arguments[i + 1]; + } + return object; + } +}; \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler new file mode 100644 index 0000000000..2e8f4b172b --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/general_handler @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +$('.btn-minimize').click(function (e) { + e.preventDefault(); + var $target = $(this).parent().parent().next('.box-content'); + if ($target.is(':visible')) { + $('i', $(this)).removeClass('glyphicon-chevron-up').addClass('glyphicon-chevron-down'); + checkAndDisable($(this).parent().attr('id')); + + } + else { + $('i', $(this)).removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-up'); + checkAndEnable($(this).parent().attr('id')); + } + $target.slideToggle(); +}); + +function checkAndEnable(id) { + + //console.log("enable: " + id); + if (id === "RealtimePlotting") { + config_api.modules_status.realtimePlotting = true; + } + else if (id === "SensorReadings") { + config_api.modules_status.sensorReadings = true; + } else if (id === "AngleOfRotation_2") { + config_api.modules_status.angleOfRotation_2 = true; + } else if (id === "AngleOfRotation_1") { + config_api.modules_status.angleOfRotation_1 = true; + } +} + +function checkAndDisable(id) { + //console.log("disable: " + id); + if (id === "RealtimePlotting") { + config_api.modules_status.realtimePlotting = false; + } + else if (id === "SensorReadings") { + config_api.modules_status.sensorReadings = false; + } else if (id === "AngleOfRotation_2") { + config_api.modules_status.angleOfRotation_2 = false; + } else if (id === "AngleOfRotation_1") { + config_api.modules_status.angleOfRotation_1 = false; + } +} + +function isJSON(data) { + try { + return JSON.parse(data); + } + catch (error) { + return null; + } +} + +function Queue() { + var a = [], b = ''; + this.enqueue = function (b) { + a.push([this.getLength() - 1 <= 0 ? 0 : this.getLength() - 1, b]); + }; + this.dequeue = function () { + if (0 != a.length) { + var c = a[b]; + 2 * ++b >= a.length && (a = a.slice(b), b = 0); + return c + } + }; + this.getLength = function () { + return a.length - b; + }; + this.isEmpty = function () { + return 0 == a.length; + }; + + this.peek = function () { + return 0 < a.length ? a[b] : void 0 + }; + this.getData = function () { + return a; + }; + this.make_fixed_size = function (start, end) { + a = a.slice(start, end); + } +} + diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api new file mode 100644 index 0000000000..6dc690c6c3 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/common/websocket_api @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +var webSocket_api = function () { + var api = this; + api.wekSocket; + api.message = function (holder) { + return $("#" + holder + ""); + }, + api.openSocket = function (url, callback) { + if (api.wekSocket !== undefined && api.wekSocket.readyState !== WebSocket.CLOSED) { + console.log("WebSocket is already opened."); + + } else { + api.wekSocket = new WebSocket(url); + } + api.wekSocket.onopen = function (event) { + if (event.data === undefined) + return; + api.writeResponse(event.data); + callback(event.data); + }; + api.wekSocket.onmessage = function (event) { + api.writeResponse(event.data); + }; + + api.wekSocket.onclose = function (event) { + api.writeResponse(event.data); + }; + }, + api.send = function (message) { + api.wekSocket.send(message); + }, + + api.closeSocket = function () { + api.wekSocket.close(); + }, + + api.writeResponse = function (arg) { + console.log(arg); + } +} + + diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js new file mode 100644 index 0000000000..1b472786cb --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/config/config.js @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +//TODO this needs to a private resource +var config_api = function () { + var config_api = this; + var domain = "localhost"; + var port = "9793"; + var context_controller = "/drone_analyzer/DroneAnalyzerServiceUnitManager/controller/send_command"; + config_api.config_3dobject_holder = "#virtualDrone"; + config_api.realtime_plotting_update_interval = 30; + config_api.realtime_plotting_totalPoints = 30; + config_api.realtime_plotting_data_window = {}; + config_api.effectController = {uy: 70.0, uz: 15.0, ux: 10.0, fx: 2.0, fz: 15.0, Tmax: 1}; + config_api.drone_control = "http://" + domain + ":" + port + "/" + context_controller; + config_api.drone_controlType = "POST"; + config_api.drone_controlDataType = "json"; + config_api.web_socket_endpoint = "ws://localhost:9763/drone_analyzer/datastream/drone_status"; + config_api.modules_status = { + "realtimePlotting": false, + "sensorReadings": false, + "angleOfRotation_2": false, + "angleOfRotation_1": false + }; +}; \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js new file mode 100644 index 0000000000..5ae5160f2d --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/d3.min.js @@ -0,0 +1,5 @@ +!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function a(n){return n.length}function o(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function s(n){return(n+="")===xa||n[0]===ba?ba+n:n}function f(n){return(n+="")[0]===ba?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=_a.length;r>e;++e){var u=_a[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function Z(n){return Sa(n,za),n}function V(n){var t,e;return function(r,u,i){var a,o=n[i].update,l=o.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(a=o[t])&&++t0&&(n=n.slice(0,o));var c=La.get(n);return c&&(n=c,l=B),o?t?u:r:t?b:i}function $(n,t){return function(e){var r=oa.event;oa.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{oa.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Ta,u="click"+r,i=oa.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==qa&&(qa="onselectstart"in e?!1:x(e.style,"userSelect")),qa){var a=n(e).style,o=a[qa];a[qa]="none"}return function(n){if(i.on(r,null),qa&&(a[qa]=o),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Ra){var i=t(n);if(i.scrollX||i.scrollY){r=oa.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var o=n.getBoundingClientRect();return[e.clientX-o.left-n.clientLeft,e.clientY-o.top-n.clientTop]}function G(){return oa.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?ja:Math.acos(n)}function tn(n){return n>1?Ha:-1>n?-Ha:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function an(n){return(n=Math.sin(n/2))*n}function on(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,new yn(u(n+120),u(n),u(n-120))}function sn(n,t,e){return this instanceof sn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof sn?new sn(n.h,n.c,n.l):n instanceof hn?pn(n.l,n.a,n.b):pn((n=Sn((n=oa.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new sn(n,t,e)}function fn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Oa)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof sn?fn(n.h,n.c,n.l):Sn((n=yn(n)).r,n.g,n.b):new hn(n,t,e)}function gn(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=vn(u)*Ka,r=vn(r)*Qa,i=vn(i)*no,new yn(mn(3.2404542*u-1.5371385*r-.4985314*i),mn(-.969266*u+1.8760108*r+.041556*i),mn(.0556434*u-.2040259*r+1.0572252*i))}function pn(n,t,e){return n>0?new sn(Math.atan2(e,t)*Ia,Math.sqrt(t*t+e*e),n):new sn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function mn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function yn(n,t,e){return this instanceof yn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof yn?new yn(n.r,n.g,n.b):_n(""+n,yn,cn):new yn(n,t,e)}function Mn(n){return new yn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,u,i,a=0,o=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Nn(u[0]),Nn(u[1]),Nn(u[2]))}return(i=ro.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(a=(3840&i)>>4,a=a>>4|a,o=240&i,o=o>>4|o,l=15&i,l=l<<4|l):7===n.length&&(a=(16711680&i)>>16,o=(65280&i)>>8,l=255&i)),t(a,o,l))}function wn(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,l=(a+i)/2;return o?(u=.5>l?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=NaN,u=l>0&&1>l?0:r),new ln(r,u,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/Ka),u=dn((.2126729*n+.7151522*t+.072175*e)/Qa),i=dn((.0193339*n+.119192*t+.9503041*e)/no);return hn(116*u-16,500*(r-u),200*(u-i))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function u(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(i,l)}catch(r){return void a.error.call(i,r)}a.load.call(i,n)}else a.error.call(i,l)}var i={},a=oa.dispatch("beforesend","progress","load","error"),o={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=u:l.onreadystatechange=function(){l.readyState>3&&u()},l.onprogress=function(n){var t=oa.event;oa.event=n;try{a.progress.call(i,l)}finally{oa.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(c=n,i):c},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ca(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),l.open(e,n,!0),null==t||"accept"in o||(o.accept=t+",*/*"),l.setRequestHeader)for(var s in o)l.setRequestHeader(s,o[s]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),a.beforesend.call(i,l),l.send(null==r?null:r),i},i.abort=function(){return l.abort(),i},oa.rebind(i,a,"on"),null==r?i:i.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,n:null};return io?io.n=i:uo=i,io=i,ao||(oo=clearTimeout(oo),ao=1,lo(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(oo),oo=setTimeout(Tn,t)),ao=0):(ao=1,lo(Tn))}function Rn(){for(var n=Date.now(),t=uo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=uo,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],a=0,o=r[0],l=0;u>0&&o>0&&(l+o+1>t&&(o=Math.max(1,t-l)),i.push(n.substring(u-=o,u+o)),!((l+=o+1)>t));)o=r[a=(a+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=so.exec(n),r=e[1]||" ",a=e[2]||">",o=e[3]||"-",l=e[4]||"",c=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===a)&&(c=r="0",a="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===l&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=fo.get(g)||Fn;var M=c&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===o?"":o;if(0>p){var l=oa.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===a?u+n+k:">"===a?k+u+n:"^"===a?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new go(e-1)),1),e}function i(n,e){return t(n=new go(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{go=Hn;var r=new Hn;return r._=n,a(r,t,e)}finally{go=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(u),l.offset=In(i),l.range=o,n}function In(n){return function(t,e){try{go=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{go=Date}}}function Yn(n){function t(n){function t(t){for(var e,u,i,a=[],o=-1,l=0;++oo;){if(r>=c)return-1;if(u=t.charCodeAt(o++),37===u){if(a=t.charAt(o++),i=C[a in vo?t.charAt(o++):a],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{go=Hn;var t=new go;return t._=n,r(t)}finally{go=Date}}var r=t(n);return e.parse=function(n){try{go=Hn;var t=r.parse(n);return t&&t._}finally{go=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=oa.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(m),k=Xn(m),N=Vn(y),E=Xn(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ho.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ho.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ho.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:ot,"%":function(){return"%"}},C={a:r,A:u,b:i,B:a,c:o,d:tt,e:tt,H:rt,I:rt,j:et,L:at,m:nt,M:ut,p:s,S:it,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Vn(n){return new RegExp("^(?:"+n.map(oa.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ut(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function it(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function at(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ot(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=Ma(t)/60|0,u=Ma(t)%60;return e+Zn(r,"0",2)+Zn(u,"0",2)}function lt(n,t,e){yo.lastIndex=0;var r=yo.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,o=a*e,l=Math.cos(t),c=Math.sin(t),s=i*c,f=u*l+s*Math.cos(o),h=s*a*Math.sin(o);So.add(Math.atan2(h,f)),r=n,u=l,i=c}var t,e,r,u,i;ko.point=function(a,o){ko.point=n,r=(t=a)*Oa,u=Math.cos(o=(e=o)*Oa/2+ja/4),i=Math.sin(o)},ko.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function mt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function yt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return Ma(n[0]-t[0])o;++o)u.point((e=n[o])[0],e[1]);return void u.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,i.push(l),a.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,i.push(l),a.push(c)}}),a.sort(t),qt(i),qt(a),i.length){for(var o=0,l=e,c=a.length;c>o;++o)a[o].e=l=!l;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var o=0,c=s.length;c>o;++o)u.point((f=s[o])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var o=s.length-1;o>=0;--o)u.point((f=s[o])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r0){for(b||(i.polygonStart(),b=!0),i.lineStart();++a1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Dt))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:a,lineStart:l,lineEnd:c,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=a,y.lineStart=l,y.lineEnd=c,g=oa.merge(g);var n=Ot(m,p);g.length?(b||(i.polygonStart(),b=!0),Lt(g,jt,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Pt(),x=t(M),b=!1;return y}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ha-Da:Ha-n[1])-((t=t.x)[0]<0?t[1]-Ha-Da:Ha-t[1])}function Ut(n){var t,e=NaN,r=NaN,u=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?ja:-ja,l=Ma(i-e);Ma(l-ja)0?Ha:-Ha),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&l>=ja&&(Ma(e-u)Da?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Ht(n,t,e,r){var u;if(null==n)u=e*Ha,r.point(-ja,u),r.point(0,u),r.point(ja,u),r.point(ja,0),r.point(ja,-u),r.point(0,-u),r.point(-ja,-u),r.point(-ja,0),r.point(-ja,u);else if(Ma(n[0]-t[0])>Da){var i=n[0]o;++o){var c=t[o],s=c.length;if(s)for(var f=c[0],h=f[0],g=f[1]/2+ja/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=c[d];var m=n[0],y=n[1]/2+ja/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>ja,k=p*M;if(So.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Ua:b,S^h>=e^m>=e){var N=yt(dt(f),dt(n));bt(N);var E=yt(u,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(a+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Da>i||Da>i&&0>So)^1&a}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,l,c,s;return{lineStart:function(){c=l=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=a?v?0:u(f,h):v?u(f+(0>f?ja:-ja),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(g=r(e,p),(wt(e,g)||wt(p,g))&&(p[0]+=Da,p[1]+=Da,v=t(p[0],p[1]))),v!==l)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^v){var m;d&i||!(m=r(p,e,!0))||(s=0,a?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&wt(e,p)||n.point(p[0],p[1]),e=p,l=v,i=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return s|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),u=dt(t),a=[1,0,0],o=yt(r,u),l=mt(o,o),c=o[0],s=l-c*c;if(!s)return!e&&n;var f=i*l/s,h=-i*c/s,g=yt(a,o),p=xt(a,f),v=xt(o,h);Mt(p,v);var d=g,m=mt(p,d),y=mt(d,d),M=m*m-y*(mt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-m-x)/y);if(Mt(b,p),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=Ma(E-ja)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(Ma(b[0]-w)ja^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-m+x)/y);return Mt(z,p),[b,_t(z)]}}}function u(t,e){var r=a?n:ja-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=Ma(i)>Da,l=ve(n,6*Oa);return Rt(t,e,l,a?[0,-n]:[-ja,n-ja])}function Yt(n,t,e,r){return function(u){var i,a=u.a,o=u.b,l=a.x,c=a.y,s=o.x,f=o.y,h=0,g=1,p=s-l,v=f-c;if(i=n-l,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-l,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-c,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-c,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:l+h*p,y:c+h*v}),1>g&&(u.b={x:l+g*p,y:c+g*v}),u}}}}}}function Zt(n,t,e,r){function u(r,u){return Ma(r[0]-n)0?0:3:Ma(r[0]-e)0?2:1:Ma(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return a(n.x,t.x)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(o){function l(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,a=1,o=d[u],l=o.length,c=o[0];l>a;++a)i=o[a],c[1]<=r?i[1]>r&&Q(c,i,n)>0&&++t:i[1]<=r&&Q(c,i,n)<0&&--t,c=i;return 0!==t}function c(i,o,l,c){var s=0,f=0;if(null==i||(s=u(i,l))!==(f=u(o,l))||a(i,o)<0^l>0){do c.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+l+4)%4)!==f)}else c.point(o[0],o[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&o.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=NaN}function g(){v&&(p(y,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=f,w&&o.lineEnd()}function p(n,t){n=Math.max(-Fo,Math.min(Fo,n)),t=Math.max(-Fo,Math.min(Fo,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(o.lineStart(),o.point(n,t));else if(e&&w)o.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(o.lineStart(),o.point(r.a.x,r.a.y)),o.point(r.b.x,r.b.y),e||o.lineEnd(),k=!1):e&&(o.lineStart(),o.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,N=o,E=Pt(),A=Yt(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){o=E,v=[],d=[],k=!0},polygonEnd:function(){o=N,v=oa.merge(v);var t=l([n,r]),e=k&&t,u=v.length;(e||u)&&(o.polygonStart(),e&&(o.lineStart(),c(null,null,1,o),o.lineEnd()),u&&Lt(v,i,t,c,o),o.polygonEnd()),v=d=m=null}};return C}}function Vt(n){var t=0,e=ja/3,r=oe(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ja/180,e=n[1]*ja/180):[t/ja*180,e/ja*180]},u}function Xt(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,tn((i-(n*n+e*e)*u*u)/(2*u))]},e}function $t(){function n(n,t){Oo+=u*n-r*t,r=n,u=t}var t,e,r,u;Xo.point=function(i,a){Xo.point=n,t=r=i,e=u=a},Xo.lineEnd=function(){n(t,e)}}function Bt(n,t){Io>n&&(Io=n),n>Zo&&(Zo=n),Yo>t&&(Yo=t),t>Vo&&(Vo=t)}function Wt(){function n(n,t){a.push("M",n,",",t,i)}function t(n,t){a.push("M",n,",",t),o.point=e}function e(n,t){a.push("L",n,",",t)}function r(){o.point=n}function u(){a.push("Z")}var i=Jt(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=Jt(n),o},result:function(){if(a.length){var n=a.join("");return a=[],n}}};return o}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ao+=n,Co+=t,++zo}function Kt(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);Lo+=a*(t+n)/2,qo+=a*(e+r)/2,To+=a,Gt(t=n,e=r)}var t,e;Bo.point=function(r,u){Bo.point=n,Gt(t=r,e=u)}}function Qt(){Bo.point=Gt}function ne(){function n(n,t){var e=n-r,i=t-u,a=Math.sqrt(e*e+i*i);Lo+=a*(r+n)/2,qo+=a*(u+t)/2,To+=a,a=u*n-r*t,Ro+=a*(r+n),Do+=a*(u+t),Po+=3*a,Gt(r=n,u=t)}var t,e,r,u;Bo.point=function(i,a){Bo.point=n,Gt(t=r=i,e=u=a)},Bo.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+a,e),n.arc(t,e,a,0,Ua)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:b};return o}function ee(n){function t(n){return(o?r:e)(n)}function e(t){return ie(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=i,t.lineStart()}function i(e,r){var i=dt([e,r]),a=n(e,r);u(M,x,y,b,_,w,M=a[0],x=a[1],y=e,b=i[0],_=i[1],w=i[2],o,t),t.point(M,x)}function a(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=s}function c(n,t){ +i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,o,t),S.lineEnd=a,a()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,o,l,c,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=o+g,_=l+p,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=Ma(Ma(w)-1)i||Ma((y*z+M*L)/x-.5)>.3||a>o*g+l*p+c*v)&&(u(t,e,r,o,l,c,A,C,N,b/=S,_/=S,w,d,m),m.point(A,C),u(A,C,N,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,a=Math.cos(30*Oa),o=16;return t.precision=function(n){return arguments.length?(o=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function re(n){var t=ee(function(t,e){return n([t*Ia,e*Ia])});return function(n){return le(t(n))}}function ue(n){this.stream=n}function ie(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ae(n){return oe(function(){return n})()}function oe(n){function t(n){return n=o(n[0]*Oa,n[1]*Oa),[n[0]*h+l,c-n[1]*h]}function e(n){return n=o.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Ia,n[1]*Ia]}function r(){o=Ct(a=fe(m,M,x),i);var n=i(v,d);return l=g-n[0]*h,c=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,a,o,l,c,s,f=ee(function(n,t){return n=i(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Uo,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=le(b(a,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Uo):It((w=+n)*Oa),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Oa,d=n[1]%360*Oa,r()):[v*Ia,d*Ia]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Oa,M=n[1]%360*Oa,x=n.length>2?n[2]%360*Oa:0,r()):[m*Ia,M*Ia,x*Ia]},oa.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function le(n){return ie(n,function(t,e){n.point(t*Oa,e*Oa)})}function ce(n,t){return[n,t]}function se(n,t){return[n>ja?n-Ua:-ja>n?n+Ua:n,t]}function fe(n,t,e){return n?t||e?Ct(ge(n),pe(t,e)):ge(n):t||e?pe(t,e):se}function he(n){return function(t,e){return t+=n,[t>ja?t-Ua:-ja>t?t+Ua:t,e]}}function ge(n){var t=he(n);return t.invert=he(-n),t}function pe(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*r+o*u;return[Math.atan2(l*i-s*a,o*r-c*u),tn(s*i+l*a)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*i-l*a;return[Math.atan2(l*i+c*a,o*r+s*u),tn(s*r-o*u)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){var l=a*t;null!=u?(u=de(e,u),i=de(e,i),(a>0?i>u:u>i)&&(u+=a*Ua)):(u=n+a*Ua,i=n-.5*l);for(var c,s=u;a>0?s>i:i>s;s-=l)o.point((c=_t([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ye(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),l=u*Math.cos(n),c=u*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(an(r-t)+u*a*an(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*l+t*s,u=e*c+t*f,a=e*i+t*o;return[Math.atan2(u,r)*Ia,Math.atan2(a,Math.sqrt(r*r+u*u))*Ia]}:function(){return[n*Ia,t*Ia]};return p.distance=h,p}function _e(){function n(n,u){var i=Math.sin(u*=Oa),a=Math.cos(u),o=Ma((n*=Oa)-t),l=Math.cos(o);Wo+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*l)*o),e*i+r*a*l),t=n,e=i,r=a}var t,e,r;Jo.point=function(u,i){t=u*Oa,e=Math.sin(i*=Oa),r=Math.cos(i),Jo.point=n},Jo.lineEnd=function(){Jo.point=Jo.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function Se(n,t){function e(n,t){a>0?-Ha+Da>t&&(t=-Ha+Da):t>Ha-Da&&(t=Ha-Da);var e=a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ja/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-Ha]},e):Ne}function ke(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Ma(u)u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,l=n[1],c=e[1],s=t[1]-l,f=r[1]-c,h=(o*(l-c)-f*(u-i))/(f*a-o*s);return[u+h*a,l+h*s]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=ll.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),il.remove(n),ll.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,a=n.N,o=[n];Ue(n);for(var l=i;l.circle&&Ma(e-l.circle.x)s;++s)c=o[s],l=o[s-1],nr(c.edge,l.site,c.site,u);l=o[0],c=o[f-1],c.edge=Ke(l.site,c.site,null,u),$e(l),$e(c)}function He(n){for(var t,e,r,u,i=n.x,a=n.y,o=il._;o;)if(r=Oe(o,a)-i,r>Da)o=o.L;else{if(u=i-Ie(o,a),!(u>Da)){r>-Da?(t=o.P,e=o):u>-Da?(t=o,e=o.N):t=e=o;break}if(!o.R){t=o;break}o=o.R}var l=je(n);if(il.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),il.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,s=c.x,f=c.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};nr(e.edge,c,p,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,p,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var a=n.P;if(!a)return-(1/0);e=a.site;var o=e.x,l=e.y,c=l-t;if(!c)return o;var s=o-r,f=1/i-1/c,h=s/c;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*c)-l+c/2+u-i/2)))/f+r:(r+o)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,u,i,a,o,l,c,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=ul,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(o=i.edges,l=o.length,a=0;l>a;)s=o[a].end(),r=s.x,u=s.y,c=o[++a%l].start(),t=c.x,e=c.y,(Ma(r-t)>Da||Ma(u-e)>Da)&&(o.splice(a,0,new tr(Qe(i.site,s,Ma(r-f)Da?{x:f,y:Ma(t-f)Da?{x:Ma(e-p)Da?{x:h,y:Ma(t-h)Da?{x:Ma(e-g)=-Pa)){var g=l*l+c*c,p=s*s+f*f,v=(f*g-c*p)/h,d=(l*p-s*g)/h,f=d+o,m=cl.pop()||new Xe;m.arc=n,m.site=u,m.x=v+a,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=ol._;M;)if(m.yd||d>=o)return;if(h>p){if(i){if(i.y>=c)return}else i={x:d,y:l};e={x:d,y:c}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else{if(i){if(i.yg){if(i){if(i.x>=o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}else{if(i){if(i.xi||f>a||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(l>m){var y=Math.sqrt(l=m);r=t-y,u=e-y,i=t+y,a=e+y,o=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,s,f,x,b);break;case 1:c(n,x,f,h,b);break;case 2:c(n,s,b,x,g);break;case 3:c(n,x,b,h,g)}}}(n,r,u,i,a),o}function vr(n,t){n=oa.rgb(n),t=oa.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return"#"+bn(Math.round(e+i*n))+bn(Math.round(r+a*n))+bn(Math.round(u+o*n))}}function dr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function mr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function yr(n,t){var e,r,u,i=fl.lastIndex=hl.lastIndex=0,a=-1,o=[],l=[];for(n+="",t+="";(e=fl.exec(n))&&(r=hl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),o[a]?o[a]+=u:o[++a]=u),(e=e[0])===(r=r[0])?o[a]?o[a]+=r:o[++a]=r:(o[++a]=null,l.push({i:a,x:mr(e,r)})),i=hl.lastIndex;return ir;++r)o[(e=l[r]).i]=e.x(n);return o.join("")})}function Mr(n,t){for(var e,r=oa.interpolators.length;--r>=0&&!(e=oa.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Mr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Ha)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ua*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ua/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=oa.hcl(n),t=oa.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return fn(e+i*n,r+a*n,u+o*n)+""}}function Dr(n,t){n=oa.hsl(n),t=oa.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return cn(e+i*n,r+a*n,u+o*n)+""}}function Pr(n,t){n=oa.lab(n),t=oa.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return gn(e+i*n,r+a*n,u+o*n)+""}}function jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ur(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),u=Fr(t,e),i=Hr(Or(e,t,-u))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:mr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:mr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(1!==t[0]||1!==t[1])&&e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=oa.transform(n),t=oa.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,u=-1,i=r.length;++u=0;)e.push(u[r])}function au(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,a=-1;++ae;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function mu(n){return n.reduce(yu,0)}function yu(n,t){return n+t[1]}function Mu(n,t){return xu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function bu(n){return[oa.min(n),oa.max(n)]}function _u(n,t){return n.value-t.value}function wu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Su(n,t){n._pack_next=t,t._pack_prev=n}function ku(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Nu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(c=e.length)){var e,r,u,i,a,o,l,c,s=1/0,f=-(1/0),h=1/0,g=-(1/0);if(e.forEach(Eu),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(u=e[1],u.x=u.r,u.y=0,t(u),c>2))for(i=e[2],zu(r,u,i),t(i),wu(r,i),r._pack_prev=i,wu(i,u),u=r._pack_next,a=3;c>a;a++){zu(r,u,i=e[a]);var p=0,v=1,d=1;for(o=u._pack_next;o!==u;o=o._pack_next,v++)if(ku(o,i)){p=1;break}if(1==p)for(l=r._pack_prev;l!==o._pack_prev&&!ku(l,i);l=l._pack_prev,d++);p?(d>v||v==d&&u.ra;a++)i=e[a],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Au)}}function Eu(n){n._pack_next=n._pack_prev=n}function Au(n){delete n._pack_next,delete n._pack_prev}function Cu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pu(n,t,e){return n.a.parent===t.parent?n.a:e}function ju(n){return 1+oa.max(n,function(n){return n.y})}function Uu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fu(n){var t=n.children;return t&&t.length?Fu(t[0]):n}function Hu(n){var t,e=n.children;return e&&(t=e.length)?Hu(e[t-1]):n}function Ou(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Iu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Yu(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zu(n){return n.rangeExtent?n.rangeExtent():Yu(n.range())}function Vu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Xu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),n[r]=t.floor(i),n[u]=t.ceil(a),n}function $u(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:wl}function Bu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]2?Bu:Vu,l=r?Wr:Br;return a=u(n,t,l,e),o=u(t,n,l,Mr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Qu(n,t)},i.tickFormat=function(t,e){return ni(n,t,e)},i.nice=function(t){return Gu(n,t),u()},i.copy=function(){return Wu(n,t,e,r)},u()}function Ju(n,t){return oa.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gu(n,t){return Xu(n,$u(Ku(n,t)[2]))}function Ku(n,t){null==t&&(t=10);var e=Yu(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Qu(n,t){return oa.range.apply(oa,Ku(n,t))}function ni(n,t,e){var r=Ku(n,t);if(e){var u=so.exec(e);if(u.shift(),"s"===u[8]){var i=oa.formatPrefix(Math.max(Ma(r[0]),Ma(r[1])));return u[7]||(u[7]="."+ti(i.scale(r[2]))),u[8]="f",e=oa.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+ei(u[8],r)),e=u.join("")}else e=",."+ti(r[2])+"f";return oa.format(e)}function ti(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function ei(n,t){var e=ti(t[2]);return n in Sl?Math.abs(e-ti(Math.max(Ma(t[0]),Ma(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ri(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(u(t))}return a.invert=function(t){return i(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),a):t},a.nice=function(){var t=Xu(r.map(u),e?Math:Nl);return n.domain(t),r=t.map(i),a},a.ticks=function(){var n=Yu(r),a=[],o=n[0],l=n[1],c=Math.floor(u(o)),s=Math.ceil(u(l)),f=t%1?2:t;if(isFinite(s-c)){if(e){for(;s>c;c++)for(var h=1;f>h;h++)a.push(i(c)*h);a.push(i(c))}else for(a.push(i(c));c++0;h--)a.push(i(c)*h);for(c=0;a[c]l;s--);a=a.slice(c,s)}return a},a.tickFormat=function(n,t){if(!arguments.length)return kl;arguments.length<2?t=kl:"function"!=typeof t&&(t=oa.format(t));var r,o=Math.max(.1,n/a.ticks().length),l=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(l(u(n)+r))<=o?t(n):""}},a.copy=function(){return ri(n.copy(),t,e,r)},Ju(a,n)}function ui(n,t,e){function r(t){return n(u(t))}var u=ii(t),i=ii(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Qu(e,n)},r.tickFormat=function(n,t){return ni(e,n,t)},r.nice=function(n){return r.domain(Gu(e,n))},r.exponent=function(a){return arguments.length?(u=ii(t=a),i=ii(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return ui(n.copy(),t,e)},Ju(r,n)}function ii(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ai(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):NaN))-1)%i.length]}function r(t,e){return oa.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new c;for(var i,a=-1,o=r.length;++ae?[NaN,NaN]:[e>0?o[e-1]:n[0],et?NaN:t/i+n,[t,t+1/i]},r.copy=function(){return li(n,t,e)},u()}function ci(n,t){function e(e){return e>=e?t[oa.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ci(n,t)},e}function si(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qu(n,t)},t.tickFormat=function(t,e){return ni(n,t,e)},t.copy=function(){return si(n)},t}function fi(){return 0}function hi(n){return n.innerRadius}function gi(n){return n.outerRadius}function pi(n){return n.startAngle}function vi(n){return n.endAngle}function di(n){return n&&n.padAngle}function mi(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function yi(n,t,e,r,u){var i=n[0]-t[0],a=n[1]-t[1],o=(u?r:-r)/Math.sqrt(i*i+a*a),l=o*a,c=-o*i,s=n[0]+l,f=n[1]+c,h=t[0]+l,g=t[1]+c,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(Math.max(0,M*M*y-x*x)),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,N=_-p,E=w-v,A=S-p,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mi(n){function t(t){function a(){c.push("M",i(n(s),o))}for(var l,c=[],s=[],f=-1,h=t.length,g=En(e),p=En(r);++f1?n.join("L"):n+"Z"}function bi(n){return n.join("L")+"Z"}function _i(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1&&u.push("H",r[0]),u.join("")}function wi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){o=t[1],i=n[l],l++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var c=2;c9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=l;)u=(n[Math.min(l,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function Fi(n){return n.length<3?xi(n):n[0]+Ai(n,Ui(n))}function Hi(n){for(var t,e,r,u=-1,i=n.length;++u=t?a(n-t):void(s.c=a)}function a(e){var u=p.active,i=p[u];i&&(i.timer.c=null,i.timer.t=NaN,--p.count,delete p[u],i.event&&i.event.interrupt.call(n,n.__data__,i.index));for(var a in p)if(r>+a){var c=p[a];c.timer.c=null,c.timer.t=NaN,--p.count,delete p[a]}s.c=o,qn(function(){return s.c&&o(e||1)&&(s.c=null,s.t=NaN),1},0,l),p.active=r,v.event&&v.event.start.call(n,n.__data__,t),g=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&g.push(r)}),h=v.ease,f=v.duration}function o(u){for(var i=u/f,a=h(i),o=g.length;o>0;)g[--o].call(n,a);return i>=1?(v.event&&v.event.end.call(n,n.__data__,t),--p.count?delete p[r]:delete n[e],1):void 0}var l,s,f,h,g,p=n[e]||(n[e]={active:0,count:0}),v=p[r];v||(l=u.time,s=qn(i,0,l),v=p[r]={tween:new c,time:l,timer:s,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++p.count)}function na(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function ta(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function ea(n){return n.toISOString()}function ra(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=oa.bisect(Gl,u);return i==Gl.length?[t.year,Ku(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Gl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=ua(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ua(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yu(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ua(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ra(n.copy(),t,e)},Ju(r,n)}function ua(n){return new Date(n)}function ia(n){return JSON.parse(n.responseText)}function aa(n){var t=sa.createRange();return t.selectNode(sa.body),t.createContextualFragment(n.responseText)}var oa={version:"3.5.10"},la=[].slice,ca=function(n){return la.call(n)},sa=this.document;if(sa)try{ca(sa.documentElement.childNodes)[0].nodeType}catch(fa){ca=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),sa)try{sa.createElement("DIV").style.setProperty("opacity",0,"")}catch(ha){var ga=this.Element.prototype,pa=ga.setAttribute,va=ga.setAttributeNS,da=this.CSSStyleDeclaration.prototype,ma=da.setProperty;ga.setAttribute=function(n,t){pa.call(this,n,t+"")},ga.setAttributeNS=function(n,t,e){va.call(this,n,t,e+"")},da.setProperty=function(n,t,e){ma.call(this,n,t+"",e)}}oa.ascending=e,oa.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},oa.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ur&&(e=r)}else{for(;++u=r){e=r;break}for(;++ur&&(e=r)}return e},oa.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ue&&(e=r)}else{for(;++u=r){e=r;break}for(;++ue&&(e=r)}return e},oa.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(1===arguments.length){for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},oa.sum=function(n,t){var e,r=0,i=n.length,a=-1;if(1===arguments.length)for(;++a1?l/(s-1):void 0},oa.deviation=function(){var n=oa.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ya=i(e);oa.bisectLeft=ya.left,oa.bisect=oa.bisectRight=ya.right,oa.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},oa.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},oa.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},oa.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},oa.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=oa.min(arguments,a),e=new Array(t);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--a]=r[t];return e};var Ma=Math.abs;oa.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=o(Ma(e)),a=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++a)>t;)u.push(r/i);else for(;(r=n+e*++a)=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,v=i[o++],d=new c;++g=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(oa.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},oa.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),oa.behavior={},oa.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},oa.event=null,oa.requote=function(n){return n.replace(wa,"\\$&")};var wa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ka=function(n,t){return t.querySelector(n)},Na=function(n,t){return t.querySelectorAll(n)},Ea=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ea=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(ka=function(n,t){return Sizzle(n,t)[0]||null},Na=Sizzle,Ea=Sizzle.matchesSelector),oa.selection=function(){return oa.select(sa.documentElement)};var Aa=oa.selection.prototype=[];Aa.select=function(n){var t,e,r,u,i=[];n=A(n);for(var a=-1,o=this.length;++a=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Ca.hasOwnProperty(e)?{space:Ca[e],local:n}:n}},Aa.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=oa.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Aa.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++uu){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Aa.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(j(t,n[t]));return this}return this.each(j(n,t))},Aa.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Aa.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Aa.append=function(n){return n=U(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Aa.insert=function(n,t){return n=U(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Aa.remove=function(){return this.each(F)},Aa.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new c,y=new Array(a);for(r=-1;++rr;++r)p[r]=H(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,o.push(p),l.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++ii;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return E(u)},Aa.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Aa.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Aa.size=function(){var n=0;return Y(this,function(){++n}),n};var za=[];oa.selection.enter=Z,oa.selection.enter.prototype=za,za.append=Aa.append,za.empty=Aa.empty,za.node=Aa.node,za.call=Aa.call,za.size=Aa.size,za.select=function(n){for(var t,e,r,u,i,a=[],o=-1,l=this.length;++or){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var La=oa.map({mouseenter:"mouseover",mouseleave:"mouseout"});sa&&La.forEach(function(n){"on"+n in sa&&La.remove(n)});var qa,Ta=0;oa.mouse=function(n){return J(n,k())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;oa.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},oa.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",a)}function e(n,t,e,i,a){return function(){function o(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(m.on(i+d,null).on(a+d,null),y(p),g({type:"dragend"}))}var c,s=this,f=oa.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=oa.select(e(f)).on(i+d,o).on(a+d,l),y=W(f),M=t(h,v);u?(c=u.apply(s,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],g({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),u=null,i=e(b,oa.mouse,t,"mousemove","mouseup"),a=e(G,oa.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},oa.rebind(n,r,"on")},oa.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ca(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Da=1e-6,Pa=Da*Da,ja=Math.PI,Ua=2*ja,Fa=Ua-Da,Ha=ja/2,Oa=ja/180,Ia=180/ja,Ya=Math.SQRT2,Za=2,Va=4;oa.interpolateZoom=function(n,t){var e,r,u=n[0],i=n[1],a=n[2],o=t[0],l=t[1],c=t[2],s=o-u,f=l-i,h=s*s+f*f;if(Pa>h)r=Math.log(c/a)/Ya,e=function(n){return[u+n*s,i+n*f,a*Math.exp(Ya*n*r)]};else{var g=Math.sqrt(h),p=(c*c-a*a+Va*h)/(2*a*Za*g),v=(c*c-a*a-Va*h)/(2*c*Za*g),d=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-d)/Ya,e=function(n){var t=n*r,e=rn(d),o=a/(Za*g)*(e*un(Ya*t+d)-en(d));return[u+o*s,i+o*f,a*e/rn(Ya*t+d)]}}return e.duration=1e3*r,e},oa.behavior.zoom=function(){function n(n){n.on(L,f).on($a+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(A[0],Math.min(A[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function a(t,e,r,a){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,a)),i(d=e,r),t=oa.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function o(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){o(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:"zoomend"}),d=null)}function f(){function n(){o=1,i(oa.mouse(u),h),c(a)}function r(){f.on(q,null).on(T,null),g(o),s(a)}var u=this,a=D.of(u,arguments),o=0,f=oa.select(t(u)).on(q,n).on(T,r),h=e(oa.mouse(u)),g=W(u);Ol.call(u),l(a)}function h(){function n(){var n=oa.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=oa.event.target;oa.select(t).on(x,r).on(b,o),_.push(t);for(var e=oa.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var s=l[0];a(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var s=l[0],f=l[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,a=oa.touches(p);Ol.call(p);for(var o=0,l=a.length;l>o;++o,r=null)if(e=a[o],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),c(v)}function o(){if(oa.event.touches.length){for(var t=oa.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}oa.selectAll(_).on(y,null),w.on(L,f).on(R,h),N(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+oa.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=oa.select(p),N=W(p);t(),l(v),w.on(L,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Ol.call(this),v=e(d=m||oa.mouse(this)),l(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Xa())*k.k),i(d,v),c(n)}function p(){var n=oa.mouse(this),t=Math.log(k.k)/Math.LN2;a(this,n,e(n),oa.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Ba,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return $a||($a="onwheel"in sa?(Xa=function(){return-oa.event.deltaY*(oa.event.deltaMode?120:1)},"wheel"):"onmousewheel"in sa?(Xa=function(){return oa.event.wheelDelta},"mousewheel"):(Xa=function(){return-oa.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Fl?oa.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],u=d?d[0]:e/2,i=d?d[1]:r/2,a=oa.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=a(t),o=e/r[2];this.__chart__=k={x:u-r[0]*o,y:i-r[1]*o,k:o},c(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,l(n),c(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},u(+t),o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Ba:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},oa.rebind(n,D,"on")};var Xa,$a,Ba=[0,1/0];oa.color=on,on.prototype.toString=function(){return this.rgb()+""},oa.hsl=ln;var Wa=ln.prototype=new on;Wa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Wa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Wa.rgb=function(){return cn(this.h,this.s,this.l)},oa.hcl=sn;var Ja=sn.prototype=new on;Ja.brighter=function(n){return new sn(this.h,this.c,Math.min(100,this.l+Ga*(arguments.length?n:1)))},Ja.darker=function(n){return new sn(this.h,this.c,Math.max(0,this.l-Ga*(arguments.length?n:1)))},Ja.rgb=function(){return fn(this.h,this.c,this.l).rgb()},oa.lab=hn;var Ga=18,Ka=.95047,Qa=1,no=1.08883,to=hn.prototype=new on;to.brighter=function(n){return new hn(Math.min(100,this.l+Ga*(arguments.length?n:1)),this.a,this.b)},to.darker=function(n){return new hn(Math.max(0,this.l-Ga*(arguments.length?n:1)),this.a,this.b)},to.rgb=function(){return gn(this.l,this.a,this.b)},oa.rgb=yn;var eo=yn.prototype=new on;eo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new yn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new yn(u,u,u)},eo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new yn(n*this.r,n*this.g,n*this.b)},eo.hsl=function(){return wn(this.r,this.g,this.b)},eo.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ro=oa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ro.forEach(function(n,t){ro.set(n,Mn(t))}),oa.functor=En,oa.xhr=An(y),oa.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=Cn(n,t,null==e?r:u(e),i);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:u(n)):e},a}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(a).join(n)}function a(n){return o.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var o=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++s;){var r=n.charCodeAt(s++),o=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.slice(t,s-o)}return n.slice(t)}for(var r,u,i={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();t&&null==(h=t(h,f++))||o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},oa.csv=oa.dsv(",","text/csv"),oa.tsv=oa.dsv(" ","text/tab-separated-values");var uo,io,ao,oo,lo=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};oa.timer=function(){qn.apply(this,arguments)},oa.timer.flush=function(){Rn(),Dn()},oa.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var co=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(jn);oa.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=oa.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),co[8+e/3]};var so=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,fo=oa.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=oa.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ho=oa.time={},go=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){po.setUTCDate.apply(this._,arguments)},setDay:function(){po.setUTCDay.apply(this._,arguments)},setFullYear:function(){po.setUTCFullYear.apply(this._,arguments)},setHours:function(){po.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){po.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){po.setUTCMinutes.apply(this._,arguments)},setMonth:function(){po.setUTCMonth.apply(this._,arguments)},setSeconds:function(){po.setUTCSeconds.apply(this._,arguments)},setTime:function(){po.setTime.apply(this._,arguments)}};var po=Date.prototype;ho.year=On(function(n){return n=ho.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ho.years=ho.year.range,ho.years.utc=ho.year.utc.range,ho.day=On(function(n){var t=new go(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ho.days=ho.day.range,ho.days.utc=ho.day.utc.range,ho.dayOfYear=function(n){var t=ho.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ho[n]=On(function(n){return(n=ho.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ho[n+"s"]=e.range,ho[n+"s"].utc=e.utc.range,ho[n+"OfYear"]=function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)}}),ho.week=ho.sunday,ho.weeks=ho.sunday.range,ho.weeks.utc=ho.sunday.utc.range,ho.weekOfYear=ho.sundayOfYear;var vo={"-":"",_:" ",0:"0"},mo=/^\s*\d+/,yo=/^%/;oa.locale=function(n){return{numberFormat:Un(n),timeFormat:Yn(n)}};var Mo=oa.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], +shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});oa.format=Mo.numberFormat,oa.geo={},st.prototype={s:0,t:0,add:function(n){ft(n,this.t,xo),ft(xo.s,this.s,this),this.s?this.t+=xo.t:this.s=xo.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xo=new st;oa.geo.stream=function(n,t){n&&bo.hasOwnProperty(n.type)?bo[n.type](n,t):ht(n,t)};var bo={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*ja+n:n,ko.lineStart=ko.lineEnd=ko.point=b}};oa.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=dt([t*Oa,e*Oa]);if(m){var u=yt(m,r),i=[u[1],-u[0],0],a=yt(i,u);bt(a),a=_t(a);var l=t-p,c=l>0?1:-1,v=a[0]*Ia*c,d=Ma(l)>180;if(d^(v>c*p&&c*t>v)){var y=a[1]*Ia;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>c*p&&c*t>v)){var y=-a[1]*Ia;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Ma(r)>180?r+(r>0?360:-360):r}else v=n,d=e;ko.point(n,e),t(n,e)}function i(){ko.lineStart()}function a(){u(v,d),ko.lineEnd(),Ma(y)>Da&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function o(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nSo?(s=-(h=180),f=-(g=90)):y>Da?g=90:-Da>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],oa.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],c(e[0],u)||c(e[1],u)?(o(u[0],e[1])>o(u[0],u[1])&&(u[1]=e[1]),o(e[0],u[1])>o(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var a,e,p=-(1/0),t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(a=o(u[1],e[0]))>p&&(p=a,s=e[0],h=u[1])}return M=x=null,s===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[s,f],[h,g]]}}(),oa.geo.centroid=function(n){No=Eo=Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,jo);var t=Ro,e=Do,r=Po,u=t*t+e*e+r*r;return Pa>u&&(t=Lo,e=qo,r=To,Da>Eo&&(t=Ao,e=Co,r=zo),u=t*t+e*e+r*r,Pa>u)?[NaN,NaN]:[Math.atan2(e,t)*Ia,tn(r/Math.sqrt(u))*Ia]};var No,Eo,Ao,Co,zo,Lo,qo,To,Ro,Do,Po,jo={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){jo.lineStart=At},polygonEnd:function(){jo.lineStart=Nt}},Uo=Rt(zt,Ut,Ht,[-ja,-ja/2]),Fo=1e9;oa.geo.clipExtent=function(){var n,t,e,r,u,i,a={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(o){return arguments.length?(i=Zt(n=+o[0][0],t=+o[0][1],e=+o[1][0],r=+o[1][1]),u&&(u.valid=!1,u=null),a):[[n,t],[e,r]]}};return a.extent([[0,0],[960,500]])},(oa.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,oa.geo.albers=function(){return oa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},oa.geo.albersUsa=function(){function n(n){var i=n[0],a=n[1];return t=null,e(i,a),t||(r(i,a),t)||u(i,a),t}var t,e,r,u,i=oa.geo.albers(),a=oa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=oa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?a:u>=.166&&.234>u&&r>=-.214&&-.115>r?o:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),a.precision(t),o.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.35*t),o.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var c=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*c,f-.238*c],[s+.455*c,f+.238*c]]).stream(l).point,r=a.translate([s-.307*c,f+.201*c]).clipExtent([[s-.425*c+Da,f+.12*c+Da],[s-.214*c-Da,f+.234*c-Da]]).stream(l).point,u=o.translate([s-.205*c,f+.212*c]).clipExtent([[s-.214*c+Da,f+.166*c+Da],[s-.115*c-Da,f+.234*c-Da]]).stream(l).point,n},n.scale(1070)};var Ho,Oo,Io,Yo,Zo,Vo,Xo={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Oo=0,Xo.lineStart=$t},polygonEnd:function(){Xo.lineStart=Xo.lineEnd=Xo.point=b,Ho+=Ma(Oo/2)}},$o={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Bo={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Bo.lineStart=ne},polygonEnd:function(){Bo.point=Gt,Bo.lineStart=Kt,Bo.lineEnd=Qt}};oa.geo.path=function(){function n(n){return n&&("function"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=u(i)),oa.geo.stream(n,a)),i.result()}function t(){return a=null,n}var e,r,u,i,a,o=4.5;return n.area=function(n){return Ho=0,oa.geo.stream(n,u(Xo)),Ho},n.centroid=function(n){return Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,u(Bo)),Po?[Ro/Po,Do/Po]:To?[Lo/To,qo/To]:zo?[Ao/zo,Co/zo]:[NaN,NaN]},n.bounds=function(n){return Zo=Vo=-(Io=Yo=1/0),oa.geo.stream(n,u($o)),[[Io,Yo],[Zo,Vo]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||re(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Wt:new te(n),"function"!=typeof o&&i.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o="function"==typeof t?t:(i.pointRadius(+t),+t),n):o},n.projection(oa.geo.albersUsa()).context(null)},oa.geo.transform=function(n){return{stream:function(t){var e=new ue(t);for(var r in n)e[r]=n[r];return e}}},ue.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},oa.geo.projection=ae,oa.geo.projectionMutator=oe,(oa.geo.equirectangular=function(){return ae(ce)}).raw=ce.invert=ce,oa.geo.rotation=function(n){function t(t){return t=n(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t}return n=fe(n[0]%360*Oa,n[1]*Oa,n.length>2?n[2]*Oa:0),t.invert=function(t){return t=n.invert(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t},t},se.invert=ce,oa.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=fe(-n[0]*Oa,-n[1]*Oa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ia,n[1]*=Ia}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Oa,u*Oa),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Oa,(u=+r)*Oa),n):u},n.angle(90)},oa.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Oa,u=n[1]*Oa,i=t[1]*Oa,a=Math.sin(r),o=Math.cos(r),l=Math.sin(u),c=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*a)*e+(e=c*s-l*f*o)*e),l*s+c*f*o)},oa.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return oa.range(Math.ceil(i/d)*d,u,d).map(h).concat(oa.range(Math.ceil(c/m)*m,l,m).map(g)).concat(oa.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Ma(n%d)>Da}).map(s)).concat(oa.range(Math.ceil(o/v)*v,a,v).filter(function(n){return Ma(n%m)>Da}).map(f))}var e,r,u,i,a,o,l,c,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(l).slice(1),h(u).reverse().slice(1),g(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],c=+t[0][1],l=+t[1][1],i>u&&(t=i,i=u,u=t),c>l&&(t=c,c=l,l=t),n.precision(y)):[[i,c],[u,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=me(o,a,90),f=ye(r,e,y),h=me(c,l,90),g=ye(i,u,y),n):y},n.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},oa.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Me,u=xe;return n.distance=function(){return oa.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},oa.geo.interpolate=function(n,t){return be(n[0]*Oa,n[1]*Oa,t[0]*Oa,t[1]*Oa)},oa.geo.length=function(n){return Wo=0,oa.geo.stream(n,Jo),Wo};var Wo,Jo={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Go=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(oa.geo.azimuthalEqualArea=function(){return ae(Go)}).raw=Go;var Ko=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(oa.geo.azimuthalEquidistant=function(){return ae(Ko)}).raw=Ko,(oa.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(oa.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Qo=we(function(n){return 1/n},Math.atan);(oa.geo.gnomonic=function(){return ae(Qo)}).raw=Qo,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ha]},(oa.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var nl=we(function(){return 1},Math.asin);(oa.geo.orthographic=function(){return ae(nl)}).raw=nl;var tl=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(oa.geo.stereographic=function(){return ae(tl)}).raw=tl,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ha]},(oa.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,oa.geom={},oa.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=En(e),i=En(r),a=n.length,o=[],l=[];for(t=0;a>t;t++)o.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(o.sort(qe),t=0;a>t;t++)l.push([o[t][0],-o[t][1]]);var c=Le(o),s=Le(l),f=s[0]===c[0],h=s[s.length-1]===c[c.length-1],g=[];for(t=c.length-1;t>=0;--t)g.push(n[o[c[t]][2]]);for(t=+f;t=r&&c.x<=i&&c.y>=u&&c.y<=a?[[r,a],[i,a],[i,u],[r,u]]:[];s.point=n[o]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Da)*Da,y:Math.round(a(n,t)/Da)*Da,i:t}})}var r=Ce,u=ze,i=r,a=u,o=sl;return n?t(n):(t.links=function(n){return or(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return or(e(n)).cells.forEach(function(e,r){for(var u,i,a=e.site,o=e.edges.sort(Ve),l=-1,c=o.length,s=o[c-1].edge,f=s.l===a?s.r:s.l;++l=c,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=hr()),f?u=c:o=c,h?a=s:l=s,i(n,t,e,r,u,a,o,l)}var s,f,h,g,p,v,d,m,y,M=En(o),x=En(l);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.xm&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=hr();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){gr(n,k,v,d,m,y)},k.find=function(n){return pr(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=pl.get(e)||gl,r=vl.get(r)||y,br(r(e.apply(null,la.call(arguments,1))))},oa.interpolateHcl=Rr,oa.interpolateHsl=Dr,oa.interpolateLab=Pr,oa.interpolateRound=jr,oa.transform=function(n){var t=sa.createElementNS(oa.ns.prefix.svg,"g");return(oa.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Ur(e?e.matrix:dl)})(n)},Ur.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var dl={a:1,b:0,c:0,d:1,e:0,f:0};oa.interpolateTransform=$r,oa.layout={},oa.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++eo*o/m){if(v>l){var c=t.charge/l;n.px-=i*c,n.py-=a*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=i*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=oa.event.x,n.py=oa.event.y,l.resume()}var e,r,u,i,a,o,l={},c=oa.dispatch("start","tick","end"),s=[1,1],f=.9,h=ml,g=yl,p=-30,v=Ml,d=.1,m=.64,M=[],x=[];return l.tick=function(){if((u*=.99)<.005)return e=null,c.end({type:"end",alpha:u=0}),!0;var t,r,l,h,g,v,m,y,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,g=l.target,y=g.x-h.x,b=g.y-h.y,(v=y*y+b*b)&&(v=u*a[r]*((v=Math.sqrt(v))-i[r])/v,y*=v,b*=v,g.x-=y*(m=h.weight+g.weight?h.weight/(h.weight+g.weight):.5),g.y-=b*m,h.x+=y*(m=1-m),h.y+=b*m);if((m=u*d)&&(y=s[0]/2,b=s[1]/2,r=-1,m))for(;++r<_;)l=M[r],l.x+=(y-l.x)*m,l.y+=(b-l.y)*m;if(p)for(ru(t=oa.geom.quadtree(M),u,o),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*f,l.y-=(l.py-(l.py=l.y))*f);c.tick({type:"tick",alpha:u})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(s=n,l):s},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.friction=function(n){return arguments.length?(f=+n,l):f},l.charge=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(m=n*n,l):Math.sqrt(m)},l.alpha=function(n){return arguments.length?(n=+n,u?n>0?u=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:u=0})):n>0&&(c.start({type:"start",alpha:u=n}),e=qn(l.tick)),l):u},l.start=function(){function n(n,r){if(!e){for(e=new Array(u),l=0;u>l;++l)e[l]=[];for(l=0;c>l;++l){var i=x[l];e[i.source.index].push(i.target),e[i.target.index].push(i.source)}}for(var a,o=e[t],l=-1,s=o.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;u>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",f)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(i=[],"function"==typeof h)for(t=0;c>t;++t)i[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)i[t]=h;if(a=[],"function"==typeof g)for(t=0;c>t;++t)a[t]=+g.call(this,x[t],t);else for(t=0;c>t;++t)a[t]=g;if(o=[],"function"==typeof p)for(t=0;u>t;++t)o[t]=+p.call(this,M[t],t);else for(t=0;u>t;++t)o[t]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=oa.behavior.drag().origin(y).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",nu)),arguments.length?void this.on("mouseover.force",tu).on("mouseout.force",eu).call(r):r},oa.rebind(l,c,"on")};var ml=20,yl=1,Ml=1/0;oa.layout.hierarchy=function(){function n(u){var i,a=[u],o=[];for(u.depth=0;null!=(i=a.pop());)if(o.push(i),(c=e.call(n,i,i.depth))&&(l=c.length)){for(var l,c,s;--l>=0;)a.push(s=c[l]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=c}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return au(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),o}var t=cu,e=ou,r=lu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(iu(t,function(n){n.children&&(n.value=0)}),au(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},oa.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,l,c=-1;for(r=t.value?r/t.value:0;++cf?-1:1),p=oa.sum(c),v=p?(f-l*g)/p:0,d=oa.range(l),m=[];return null!=e&&d.sort(e===xl?function(n,t){return c[t]-c[n]}:function(n,t){return e(a[n],a[t])}),d.forEach(function(n){m[n]={data:a[n],value:o=c[n],startAngle:s,endAngle:s+=o*v+g,padAngle:h}}),m}var t=Number,e=xl,r=0,u=Ua,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var xl={};oa.layout.stack=function(){function n(o,l){if(!(h=o.length))return o;var c=o.map(function(e,r){return t.call(n,e,r)}),s=c.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,l);c=oa.permute(c,f),s=oa.permute(s,f);var h,g,p,v,d=r.call(n,s,l),m=c[0].length;for(p=0;m>p;++p)for(u.call(n,c[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,c[g][p],v+=s[g-1][p][1],s[g][p][1]);return o}var t=y,e=pu,r=vu,u=gu,i=fu,a=hu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:bl.get(t)||pu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:_l.get(t)||vu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var bl=oa.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(mu),a=oa.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,l=0,c=[],s=[];for(t=0;r>t;++t)e=a[t],l>o?(o+=i[e],c.push(e)):(l+=i[e],s.push(e));return s.reverse().concat(c)},reverse:function(n){return oa.range(n.length).reverse()},"default":pu}),_l=oa.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,l=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)l[e]=(o-a[e])/2;return l},wiggle:function(n){var t,e,r,u,i,a,o,l,c,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=l=c=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=l-=u?i/u*o:0,c>l&&(c=l)}for(e=0;h>e;++e)g[e]-=c;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:vu});oa.layout.histogram=function(){function n(n,i){for(var a,o,l=[],c=n.map(e,this),s=r.call(this,c,i),f=u.call(this,s,c,i),i=-1,h=c.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=s[0]&&o<=s[1]&&(a=l[oa.bisect(f,o,1,g)-1],a.y+=p,a.push(n[i]));return l}var t=!0,e=Number,r=bu,u=Mu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return xu(n,t)}:En(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},oa.layout.pack=function(){function n(n,i){var a=e.call(this,n,i),o=a[0],l=u[0],c=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(o.x=o.y=0,au(o,function(n){n.r=+s(n.value)}),au(o,Nu),r){var f=r*(t?1:Math.max(2*o.r/l,2*o.r/c))/2;au(o,function(n){n.r+=f}),au(o,Nu),au(o,function(n){n.r-=f})}return Cu(o,l/2,c/2,t?1:1/Math.max(2*o.r/l,2*o.r/c)),a}var t,e=oa.layout.hierarchy().sort(_u),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},uu(n,e)},oa.layout.tree=function(){function n(n,u){var s=a.call(this,n,u),f=s[0],h=t(f);if(au(h,e),h.parent.m=-h.z,iu(h,r),c)iu(f,i);else{var g=f,p=f,v=f;iu(f,function(n){n.xp.x&&(p=n),n.depth>v.depth&&(v=n)});var d=o(g,p)/2-g.x,m=l[0]/(p.x+o(p,g)/2+d),y=l[1]/(v.depth||1);iu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,a=0,o=i.length;o>a;++a)r.push((i[a]=u={_:i[a],parent:t,children:(u=i[a].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Du(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+o(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+o(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,a=t,l=u.parent.children[0],c=u.m,s=i.m,f=a.m,h=l.m;a=Tu(a),u=qu(u),a&&u;)l=qu(l),i=Tu(i),i.a=n,r=a.z+f-u.z-c+o(a._,u._),r>0&&(Ru(Pu(a,n,e),n,r),c+=r,s+=r),f+=a.m,c+=u.m,h+=l.m,s+=i.m;a&&!Tu(i)&&(i.t=a,i.m+=f-s),u&&!qu(l)&&(l.t=u,l.m+=c-h,e=n)}return e}function i(n){n.x*=l[0],n.y=n.depth*l[1]}var a=oa.layout.hierarchy().sort(null).value(null),o=Lu,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(o=t,n):o},n.size=function(t){return arguments.length?(c=null==(l=t)?i:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:i,n):c?l:null},uu(n,a)},oa.layout.cluster=function(){function n(n,i){var a,o=t.call(this,n,i),l=o[0],c=0;au(l,function(n){var t=n.children;t&&t.length?(n.x=Uu(t),n.y=ju(t)):(n.x=a?c+=e(n,a):0,n.y=0,a=n)});var s=Fu(l),f=Hu(l),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return au(l,u?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),o}var t=oa.layout.hierarchy().sort(null).value(null),e=Lu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},uu(n,t)},oa.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,l,c=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?c.dx:"dice"===g?c.dy:"slice-dice"===g?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),s.area=0;(l=h.length)>0;)s.push(a=h[l-1]),s.area+=a.area,"squarify"!==g||(o=r(s,v))<=p?(h.pop(),p=o):(s.area-=s.pop().area,u(s,v,c,!1),v=Math.min(c.dx,c.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,c,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=f(t),o=r.slice(),l=[];for(n(o,a.dx*a.dy/t.value),l.area=0;i=o.pop();)l.push(i),l.area+=i.area,null!=i.z&&(u(l,i.z?a.dx:a.dy,a,!o.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++ae&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,c=e.y,s=t?l(n.area/t):0; +if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++ie.dx)&&(s=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=oa.random.normal.apply(oa,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=oa.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},oa.scale={};var wl={floor:y,ceil:y};oa.scale.linear=function(){return Wu([0,1],[0,1],Mr,!1)};var Sl={s:1,g:1,p:1,r:1,e:1};oa.scale.log=function(){return ri(oa.scale.linear().domain([0,1]),10,!0,[1,10])};var kl=oa.format(".0e"),Nl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};oa.scale.pow=function(){return ui(oa.scale.linear(),1,[0,1])},oa.scale.sqrt=function(){return oa.scale.pow().exponent(.5)},oa.scale.ordinal=function(){return ai([],{t:"range",a:[[]]})},oa.scale.category10=function(){return oa.scale.ordinal().range(El)},oa.scale.category20=function(){return oa.scale.ordinal().range(Al)},oa.scale.category20b=function(){return oa.scale.ordinal().range(Cl)},oa.scale.category20c=function(){return oa.scale.ordinal().range(zl)};var El=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Al=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),Cl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),zl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);oa.scale.quantile=function(){return oi([],[])},oa.scale.quantize=function(){return li(0,1,[0,1])},oa.scale.threshold=function(){return ci([.5],[0,1])},oa.scale.identity=function(){return si([0,1])},oa.svg={},oa.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),s=a.apply(this,arguments)-Ha,f=o.apply(this,arguments)-Ha,h=Math.abs(f-s),g=s>f?0:1;if(n>c&&(p=c,c=n,n=p),h>=Fa)return t(c,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,N=0,E=0,A=[];if((m=(+l.apply(this,arguments)||0)/2)&&(d=i===Ll?Math.sqrt(n*n+c*c):+i.apply(this,arguments),g||(E*=-1),c&&(E=tn(d/c*Math.sin(m))),n&&(N=tn(d/n*Math.sin(m)))),c){y=c*Math.cos(s+E),M=c*Math.sin(s+E),x=c*Math.cos(f-E),b=c*Math.sin(f-E);var C=Math.abs(f-s-2*E)<=ja?0:1;if(E&&mi(y,M,x,b)===g^C){var z=(s+f)/2;y=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-N),w=n*Math.sin(f-N),S=n*Math.cos(s+N),k=n*Math.sin(s+N);var L=Math.abs(s-f+2*N)<=ja?0:1;if(N&&mi(_,w,S,k)===1-g^L){var q=(s+f)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Da&&(p=Math.min(Math.abs(c-n)/2,+u.apply(this,arguments)))>.001){v=c>n^g?0:1;var T=p,R=p;if(ja>h){var D=null==S?[_,w]:null==x?[y,M]:Re([y,M],[S,k],[x,b],[_,w]),P=y-D[0],j=M-D[1],U=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*U+j*F)/(Math.sqrt(P*P+j*j)*Math.sqrt(U*U+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(p,(n-O)/(H-1)),T=Math.min(p,(c-O)/(H+1))}if(null!=x){var I=yi(null==S?[_,w]:[S,k],[y,M],c,T,g),Y=yi([x,b],[_,w],c,T,g);p===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-g^mi(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",g," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",y,",",M);if(null!=S){var Z=yi([y,M],[S,k],n,-R,g),V=yi([_,w],null==x?[y,M]:[x,b],n,-R,g);p===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^mi(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",y,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",g," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-g," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hi,r=gi,u=fi,i=Ll,a=pi,o=vi,l=di;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=En(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Ll?Ll:En(t),n):i},n.startAngle=function(t){return arguments.length?(a=En(t),n):a},n.endAngle=function(t){return arguments.length?(o=En(t),n):o},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+a.apply(this,arguments)+ +o.apply(this,arguments))/2-Ha;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Ll="auto";oa.svg.line=function(){return Mi(y)};var ql=oa.map({linear:xi,"linear-closed":bi,step:_i,"step-before":wi,"step-after":Si,basis:zi,"basis-open":Li,"basis-closed":qi,bundle:Ti,cardinal:Ei,"cardinal-open":ki,"cardinal-closed":Ni,monotone:Fi});ql.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Tl=[0,2/3,1/3,0],Rl=[0,1/3,2/3,0],Dl=[0,1/6,2/3,1/6];oa.svg.line.radial=function(){var n=Mi(Hi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wi.reverse=Si,Si.reverse=wi,oa.svg.area=function(){return Oi(y)},oa.svg.area.radial=function(){var n=Oi(Hi);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},oa.svg.chord=function(){function n(n,o){var l=t(this,i,n,o),c=t(this,a,n,o);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?u(l.r,l.p1,l.r,l.p0):u(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+u(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=l.call(n,u,r)-Ha,s=c.call(n,u,r)-Ha;return{r:i,a0:a,a1:s,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>ja)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=Me,a=xe,o=Ii,l=pi,c=vi;return n.radius=function(t){return arguments.length?(o=En(t),n):o},n.source=function(t){return arguments.length?(i=En(t),n):i},n.target=function(t){return arguments.length?(a=En(t),n):a},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},oa.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,l=[i,{x:i.x,y:o},{x:a.x,y:o},a];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yi;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},oa.svg.diagonal.radial=function(){var n=oa.svg.diagonal(),t=Yi,e=n.projection;return n.projection=function(n){return arguments.length?e(Zi(t=n)):t},n},oa.svg.symbol=function(){function n(n,r){return(Pl.get(t.call(this,n,r))||$i)(e.call(this,n,r))}var t=Xi,e=Vi;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Pl=oa.map({circle:$i,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ul)),e=t*Ul;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});oa.svg.symbolTypes=Pl.keys();var jl=Math.sqrt(3),Ul=Math.tan(30*Oa);Aa.transition=function(n){for(var t,e,r=Fl||++Yl,u=Ki(n),i=[],a=Hl||{time:Date.now(),ease:Nr,delay:0,duration:250},o=-1,l=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return Wi(u,this.namespace,this.id)},Il.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Il.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a="transform"==n?$r:Mr,o=oa.ns.qualify(n);return Ji(this,"attr."+n,t,o.local?i:u)},Il.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=oa.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Il.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=Mr(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var a=arguments.length;if(3>a){if("string"!=typeof n){2>a&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ji(this,"style."+n,e,i)},Il.styleTween=function(n,e,r){function u(u,i){var a=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return a&&function(t){this.style.setProperty(n,a(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Il.text=function(n){return Ji(this,"text",n,Gi)},Il.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Il.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=oa.ease.apply(oa,arguments)),Y(this,function(r){r[e][t].ease=n}))},Il.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Il.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Il.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Hl,i=Fl;try{Fl=e,Y(this,function(t,u,i){Hl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Hl=u,Fl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=oa.dispatch("start","end","interrupt"))).on(n,t)});return this},Il.transition=function(){for(var n,t,e,r,u=this.id,i=++Yl,a=this.namespace,o=[],l=0,c=this.length;c>l;l++){o.push(n=[]);for(var t=this[l],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[a][u],Qi(e,s,a,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wi(o,a,i)},oa.svg.axis=function(){function n(n){n.each(function(){var n,c=oa.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==l?f.ticks?f.ticks.apply(f,o):f.domain():l,g=null==t?f.tickFormat?f.tickFormat.apply(f,o):y:t,p=c.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Da),d=oa.transition(p.exit()).style("opacity",Da).remove(),m=oa.transition(p.order()).style("opacity",1),M=Math.max(u,0)+a,x=Zu(f),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),oa.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=m.select("line"),C=p.select("text").text(g),z=v.select("text"),L=m.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=na,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*i+"V0H"+x[1]+"V"+q*i)):(n=ta,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*i+","+x[0]+"H0V"+x[1]+"H"+q*i)),E.attr(N,q*u),z.attr(k,q*M),A.attr(S,0).attr(N,q*u),L.attr(w,0).attr(k,q*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=oa.scale.linear(),r=Zl,u=6,i=6,a=3,o=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Vl?t+"":Zl,n):r},n.ticks=function(){return arguments.length?(o=ca(arguments),n):o},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(a=+t,n):a},n.tickSubdivide=function(){return arguments.length&&n},n};var Zl="bottom",Vl={top:1,right:1,bottom:1,left:1};oa.svg.brush=function(){function n(t){t.each(function(){var t=oa.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),a=t.selectAll(".background").data([0]);a.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var o=t.selectAll(".resize").data(v,y);o.exit().remove(),o.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Xl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),o.style("display",n.empty()?"none":null);var l,f=oa.transition(t),h=oa.transition(a);c&&(l=Zu(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(f)),s&&(l=Zu(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==oa.event.keyCode&&(C||(M=null,L[0]-=f[1],L[1]-=h[1],C=2),S())}function v(){32==oa.event.keyCode&&2==C&&(L[0]+=f[1],L[1]+=h[1],C=0,S())}function d(){var n=oa.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(oa.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),L[0]=f[+(n[0]s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?o=null:a=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),oa.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=oa.select(oa.event.target),w=l.of(b,arguments),k=oa.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&s,C=_.classed("extent"),z=W(b),L=oa.mouse(b),q=oa.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(oa.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",y):q.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)L[0]=f[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[f[1-T]-L[0],h[1-R]-L[1]],L[0]=f[T],L[1]=h[R]}else oa.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),oa.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var a,o,l=N(n,"brushstart","brush","brushend"),c=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=$l[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:f,y:h,i:a,j:o},e=this.__chart__||t;this.__chart__=t,Fl?oa.select(this).transition().each("start.brush",function(){a=e.i,o=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(f,t.x),r=xr(h,t.y);return a=o=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){a=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=$l[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,v=$l[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(g=!!t[0],p=!!t[1]):c?g=!!t:s&&(p=!!t),n):c&&s?[g,p]:c?g:s?p:null},n.extent=function(t){var e,r,u,i,l;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),a=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],c&&(u=u[1],i=i[1]),o=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(l=u,u=i,i=l),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(c&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),s&&(o?(u=o[0],i=o[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(l=u,u=i,i=l))),c&&s?[[e,u],[r,i]]:c?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],a=o=null),n},n.empty=function(){return!!c&&f[0]==f[1]||!!s&&h[0]==h[1]},oa.rebind(n,l,"on")};var Xl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},$l=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Bl=ho.format=Mo.timeFormat,Wl=Bl.utc,Jl=Wl("%Y-%m-%dT%H:%M:%S.%LZ");Bl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ea:Jl,ea.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ea.toString=Jl.toString,ho.second=On(function(n){return new go(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ho.seconds=ho.second.range,ho.seconds.utc=ho.second.utc.range,ho.minute=On(function(n){return new go(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ho.minutes=ho.minute.range,ho.minutes.utc=ho.minute.utc.range,ho.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new go(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ho.hours=ho.hour.range,ho.hours.utc=ho.hour.utc.range,ho.month=On(function(n){return n=ho.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ho.months=ho.month.range,ho.months.utc=ho.month.utc.range;var Gl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Kl=[[ho.second,1],[ho.second,5],[ho.second,15],[ho.second,30],[ho.minute,1],[ho.minute,5],[ho.minute,15],[ho.minute,30],[ho.hour,1],[ho.hour,3],[ho.hour,6],[ho.hour,12],[ho.day,1],[ho.day,2],[ho.week,1],[ho.month,1],[ho.month,3],[ho.year,1]],Ql=Bl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),nc={range:function(n,t,e){return oa.range(Math.ceil(n/e)*e,+t,e).map(ua)},floor:y,ceil:y};Kl.year=ho.year,ho.scale=function(){return ra(oa.scale.linear(),Kl,Ql)};var tc=Kl.map(function(n){return[n[0].utc,n[1]]}),ec=Wl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);tc.year=ho.year.utc,ho.scale.utc=function(){return ra(oa.scale.linear(),tc,ec)},oa.text=An(function(n){return n.responseText}),oa.json=function(n,t){return Cn(n,"application/json",ia,t)},oa.html=function(n,t){return Cn(n,"text/html",aa,t)},oa.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=oa,define(oa)):"object"==typeof module&&module.exports?module.exports=oa:this.d3=oa}(); \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js new file mode 100644 index 0000000000..deb75915e9 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/download.js @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +var modalPopup = ".wr-modalpopup"; +var modalPopupContainer = modalPopup + " .modalpopup-container"; +var modalPopupContent = modalPopup + " .modalpopup-content"; +var body = "body"; + +/* + * set popup maximum height function. + */ +function setPopupMaxHeight() { + $(modalPopupContent).css('max-height', ($(body).height() - ($(body).height() / 100 * 30))); + $(modalPopupContainer).css('margin-top', (-($(modalPopupContainer).height() / 2))); +} + +/* + * show popup function. + */ +function showPopup() { + $(modalPopup).show(); + setPopupMaxHeight(); + $('#downloadForm').validate({ + rules: { + deviceName: { + minlength: 4, + required: true + } + }, + highlight: function (element) { + $(element).closest('.control-group').removeClass('success').addClass('error'); + }, + success: function (element) { + $(element).closest('.control-group').removeClass('error').addClass('success'); + $('label[for=deviceName]').remove(); + } + }); + var deviceType = ""; + $('.deviceType').each(function () { + if (this.value != "") { + deviceType = this.value; + } + }); +} + +/* + * hide popup function. + */ +function hidePopup() { + $('label[for=deviceName]').remove(); + $('.control-group').removeClass('success').removeClass('error'); + $(modalPopupContent).html(''); + $(modalPopup).hide(); +} + +/* + * DOM ready functions. + */ +$(document).ready(function () { + attachEvents(); +}); + +function attachEvents() { + /** + * Following click function would execute + * when a user clicks on "Download" link + * on Device Management page in WSO2 DC Console. + */ + $("a.download-link").click(function () { + var sketchType = $(this).data("sketchtype"); + var deviceType = $(this).data("devicetype"); + var downloadDeviceAPI = "/devicemgt/api/devices/sketch/generate_link"; + var payload = {"sketchType": sketchType, "deviceType": deviceType}; + $(modalPopupContent).html($('#download-device-modal-content').html()); + showPopup(); + var deviceName; + $("a#download-device-download-link").click(function () { + $('.new-device-name').each(function () { + if (this.value != "") { + deviceName = this.value; + } + }); + $('label[for=deviceName]').remove(); + if (deviceName && deviceName.length >= 4) { + payload.deviceName = deviceName; + invokerUtil.post( + downloadDeviceAPI, + payload, + function (data, textStatus, jqxhr) { + doAction(data); + }, + function (data) { + doAction(data); + } + ); + }else if(deviceName){ + $('.controls').append(''); + $('.control-group').removeClass('success').addClass('error'); + } else { + $('.controls').append(''); + $('.control-group').removeClass('success').addClass('error'); + } + }); + + $("a#download-device-cancel-link").click(function () { + hidePopup(); + }); + + }); +} + +function downloadAgent() { + $('#downloadForm').submit(); + + var deviceName; + $('.new-device-name').each(function () { + if (this.value != "") { + deviceName = this.value; + } + }); + if (deviceName && deviceName.length >= 4) { + setTimeout(function () { + hidePopup(); + }, 1000); + } +} + +function doAction(data) { + //if it is saml redirection response + if (data.status == null) { + document.write(data); + } + + if (data.status == "200") { + $(modalPopupContent).html($('#download-device-modal-content-links').html()); + $("input#download-device-url").val(data.responseText); + $("input#download-device-url").focus(function () { + $(this).select(); + }); + showPopup(); + } else if (data.status == "401") { + $(modalPopupContent).html($('#device-401-content').html()); + $("#device-401-link").click(function () { + window.location = "/devicemgt/login"; + }); + showPopup(); + } else if (data == "403") { + $(modalPopupContent).html($('#device-403-content').html()); + $("#device-403-link").click(function () { + window.location = "/devicemgt/login"; + }); + showPopup(); + } else { + $(modalPopupContent).html($('#device-unexpected-error-content').html()); + $("a#device-unexpected-error-link").click(function () { + hidePopup(); + }); + } +} \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs new file mode 100644 index 0000000000..57f70e56ac --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/initJs @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var ajax_handler = new ajax_handler(); +var config_api = new config_api(); +var plotting = new plotting(); +var object_maker = new object_maker(); \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js new file mode 100644 index 0000000000..3b33c23482 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jQueryRotate.js @@ -0,0 +1,339 @@ +// VERSION: 2.3 LAST UPDATE: 11.07.2013 +/* + * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php + * + * Made by Wilq32, wilq32@gmail.com, Wroclaw, Poland, 01.2009 + * Website: http://jqueryrotate.com + */ + +(function($) { + var supportedCSS,supportedCSSOrigin, styles=document.getElementsByTagName("head")[0].style,toCheck="transformProperty WebkitTransform OTransform msTransform MozTransform".split(" "); + for (var a = 0; a < toCheck.length; a++) if (styles[toCheck[a]] !== undefined) { supportedCSS = toCheck[a]; } + if (supportedCSS) { + supportedCSSOrigin = supportedCSS.replace(/[tT]ransform/,"TransformOrigin"); + if (supportedCSSOrigin[0] == "T") supportedCSSOrigin[0] = "t"; + } + + // Bad eval to preven google closure to remove it from code o_O + eval('IE = "v"=="\v"'); + + jQuery.fn.extend({ + rotate:function(parameters) + { + if (this.length===0||typeof parameters=="undefined") return; + if (typeof parameters=="number") parameters={angle:parameters}; + var returned=[]; + for (var i=0,i0=this.length;i this._parameters.duration; + + // TODO: Bug for animatedGif for static rotation ? (to test) + if (checkEnd && !this._parameters.animatedGif) + { + clearTimeout(this._timer); + } + else + { + if (this._canvas||this._vimage||this._img) { + var angle = this._parameters.easing(0, actualTime - this._animateStartTime, this._animateStartAngle, this._parameters.animateTo - this._animateStartAngle, this._parameters.duration); + this._rotate((~~(angle*10))/10); + } + if (this._parameters.step) { + this._parameters.step(this._angle); + } + var self = this; + this._timer = setTimeout(function() + { + self._animate.call(self); + }, 10); + } + + // To fix Bug that prevents using recursive function in callback I moved this function to back + if (this._parameters.callback && checkEnd){ + this._angle = this._parameters.animateTo; + this._rotate(this._angle); + this._parameters.callback.call(this._rootObj); + } + }, + + _rotate : (function() + { + var rad = Math.PI/180; + if (IE) + return function(angle) + { + this._angle = angle; + this._container.style.rotation=(angle%360)+"deg"; + this._vimage.style.top = -(this._rotationCenterY - this._imgHeight/2) + "px"; + this._vimage.style.left = -(this._rotationCenterX - this._imgWidth/2) + "px"; + this._container.style.top = this._rotationCenterY - this._imgHeight/2 + "px"; + this._container.style.left = this._rotationCenterX - this._imgWidth/2 + "px"; + + } + else if (supportedCSS) + return function(angle){ + this._angle = angle; + this._img.style[supportedCSS]="rotate("+(angle%360)+"deg)"; + this._img.style[supportedCSSOrigin]=this._parameters.center.join(" "); + } + else + return function(angle) + { + this._angle = angle; + angle=(angle%360)* rad; + // clear canvas + this._canvas.width = this._width;//+this._widthAdd; + this._canvas.height = this._height;//+this._heightAdd; + + // REMEMBER: all drawings are read from backwards.. so first function is translate, then rotate, then translate, translate.. + this._cnv.translate(this._imgWidth*this._aspectW,this._imgHeight*this._aspectH); // at least center image on screen + this._cnv.translate(this._rotationCenterX,this._rotationCenterY); // we move image back to its orginal + this._cnv.rotate(angle); // rotate image + this._cnv.translate(-this._rotationCenterX,-this._rotationCenterY); // move image to its center, so we can rotate around its center + this._cnv.scale(this._aspectW,this._aspectH); // SCALE - if needed ;) + this._cnv.drawImage(this._img, 0, 0); // First - we draw image + } + + })() + } + + if (IE) + { + Wilq32.PhotoEffect.prototype.createVMLNode=(function(){ + document.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + try { + !document.namespaces.rvml && document.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + return function (tagName) { + return document.createElement(''); + }; + } catch (e) { + return function (tagName) { + return document.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + })(); + } + +})(jQuery); diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js new file mode 100644 index 0000000000..3c1ebb043b --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/jquery.validate.js @@ -0,0 +1,1220 @@ +/** + * jQuery Validation Plugin 1.11.0pre + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright 2013 Jörn Zaefferer + * Released under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + */ + +(function($) { + +$.extend($.fn, { + // http://docs.jquery.com/Plugins/Validation/validate + validate: function( options ) { + + // if nothing is selected, return nothing; can't chain anyway + if ( !this.length ) { + if ( options && options.debug && window.console ) { + console.warn( "Nothing selected, can't validate, returning nothing." ); + } + return; + } + + // check if a validator for this form was already created + var validator = $.data( this[0], "validator" ); + if ( validator ) { + return validator; + } + + // Add novalidate tag if HTML5. + this.attr( "novalidate", "novalidate" ); + + validator = new $.validator( options, this[0] ); + $.data( this[0], "validator", validator ); + + if ( validator.settings.onsubmit ) { + + this.validateDelegate( ":submit", "click", function( event ) { + if ( validator.settings.submitHandler ) { + validator.submitButton = event.target; + } + // allow suppressing validation by adding a cancel class to the submit button + if ( $(event.target).hasClass("cancel") ) { + validator.cancelSubmit = true; + } + }); + + // validate the form on submit + this.submit( function( event ) { + if ( validator.settings.debug ) { + // prevent form submit to be able to see console output + event.preventDefault(); + } + function handle() { + var hidden; + if ( validator.settings.submitHandler ) { + if ( validator.submitButton ) { + // insert a hidden input as a replacement for the missing submit button + hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); + } + validator.settings.submitHandler.call( validator, validator.currentForm, event ); + if ( validator.submitButton ) { + // and clean up afterwards; thanks to no-block-scope, hidden can be referenced + hidden.remove(); + } + return false; + } + return true; + } + + // prevent submit for invalid forms or custom submit handlers + if ( validator.cancelSubmit ) { + validator.cancelSubmit = false; + return handle(); + } + if ( validator.form() ) { + if ( validator.pendingRequest ) { + validator.formSubmitted = true; + return false; + } + return handle(); + } else { + validator.focusInvalid(); + return false; + } + }); + } + + return validator; + }, + // http://docs.jquery.com/Plugins/Validation/valid + valid: function() { + if ( $(this[0]).is("form")) { + return this.validate().form(); + } else { + var valid = true; + var validator = $(this[0].form).validate(); + this.each(function() { + valid &= validator.element(this); + }); + return valid; + } + }, + // attributes: space seperated list of attributes to retrieve and remove + removeAttrs: function( attributes ) { + var result = {}, + $element = this; + $.each(attributes.split(/\s/), function( index, value ) { + result[value] = $element.attr(value); + $element.removeAttr(value); + }); + return result; + }, + // http://docs.jquery.com/Plugins/Validation/rules + rules: function( command, argument ) { + var element = this[0]; + + if ( command ) { + var settings = $.data(element.form, "validator").settings; + var staticRules = settings.rules; + var existingRules = $.validator.staticRules(element); + switch(command) { + case "add": + $.extend(existingRules, $.validator.normalizeRule(argument)); + staticRules[element.name] = existingRules; + if ( argument.messages ) { + settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); + } + break; + case "remove": + if ( !argument ) { + delete staticRules[element.name]; + return existingRules; + } + var filtered = {}; + $.each(argument.split(/\s/), function( index, method ) { + filtered[method] = existingRules[method]; + delete existingRules[method]; + }); + return filtered; + } + } + + var data = $.validator.normalizeRules( + $.extend( + {}, + $.validator.classRules(element), + $.validator.attributeRules(element), + $.validator.dataRules(element), + $.validator.staticRules(element) + ), element); + + // make sure required is at front + if ( data.required ) { + var param = data.required; + delete data.required; + data = $.extend({required: param}, data); + } + + return data; + } +}); + +// Custom selectors +$.extend($.expr[":"], { + // http://docs.jquery.com/Plugins/Validation/blank + blank: function( a ) { return !$.trim("" + a.value); }, + // http://docs.jquery.com/Plugins/Validation/filled + filled: function( a ) { return !!$.trim("" + a.value); }, + // http://docs.jquery.com/Plugins/Validation/unchecked + unchecked: function( a ) { return !a.checked; } +}); + +// constructor for validator +$.validator = function( options, form ) { + this.settings = $.extend( true, {}, $.validator.defaults, options ); + this.currentForm = form; + this.init(); +}; + +$.validator.format = function( source, params ) { + if ( arguments.length === 1 ) { + return function() { + var args = $.makeArray(arguments); + args.unshift(source); + return $.validator.format.apply( this, args ); + }; + } + if ( arguments.length > 2 && params.constructor !== Array ) { + params = $.makeArray(arguments).slice(1); + } + if ( params.constructor !== Array ) { + params = [ params ]; + } + $.each(params, function( i, n ) { + source = source.replace( new RegExp("\\{" + i + "\\}", "g"), function() { + return n; + }); + }); + return source; +}; + +$.extend($.validator, { + + defaults: { + messages: {}, + groups: {}, + rules: {}, + errorClass: "error", + validClass: "valid", + errorElement: "label", + focusInvalid: true, + errorContainer: $([]), + errorLabelContainer: $([]), + onsubmit: true, + ignore: ":hidden", + ignoreTitle: false, + onfocusin: function( element, event ) { + this.lastActive = element; + + // hide error label and remove error class on focus if enabled + if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { + if ( this.settings.unhighlight ) { + this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); + } + this.addWrapper(this.errorsFor(element)).hide(); + } + }, + onfocusout: function( element, event ) { + if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { + this.element(element); + } + }, + onkeyup: function( element, event ) { + if ( event.which === 9 && this.elementValue(element) === "" ) { + return; + } else if ( element.name in this.submitted || element === this.lastElement ) { + this.element(element); + } + }, + onclick: function( element, event ) { + // click on selects, radiobuttons and checkboxes + if ( element.name in this.submitted ) { + this.element(element); + } + // or option elements, check parent select in that case + else if ( element.parentNode.name in this.submitted ) { + this.element(element.parentNode); + } + }, + highlight: function( element, errorClass, validClass ) { + if ( element.type === "radio" ) { + this.findByName(element.name).addClass(errorClass).removeClass(validClass); + } else { + $(element).addClass(errorClass).removeClass(validClass); + } + }, + unhighlight: function( element, errorClass, validClass ) { + if ( element.type === "radio" ) { + this.findByName(element.name).removeClass(errorClass).addClass(validClass); + } else { + $(element).removeClass(errorClass).addClass(validClass); + } + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults + setDefaults: function( settings ) { + $.extend( $.validator.defaults, settings ); + }, + + messages: { + required: "This field is required.", + remote: "Please fix this field.", + email: "Please enter a valid email address.", + url: "Please enter a valid URL.", + date: "Please enter a valid date.", + dateISO: "Please enter a valid date (ISO).", + number: "Please enter a valid number.", + digits: "Please enter only digits.", + creditcard: "Please enter a valid credit card number.", + equalTo: "Please enter the same value again.", + maxlength: $.validator.format("Please enter no more than {0} characters."), + minlength: $.validator.format("Please enter at least {0} characters."), + rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), + range: $.validator.format("Please enter a value between {0} and {1}."), + max: $.validator.format("Please enter a value less than or equal to {0}."), + min: $.validator.format("Please enter a value greater than or equal to {0}.") + }, + + autoCreateRanges: false, + + prototype: { + + init: function() { + this.labelContainer = $(this.settings.errorLabelContainer); + this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); + this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); + this.submitted = {}; + this.valueCache = {}; + this.pendingRequest = 0; + this.pending = {}; + this.invalid = {}; + this.reset(); + + var groups = (this.groups = {}); + $.each(this.settings.groups, function( key, value ) { + if ( typeof value === "string" ) { + value = value.split(/\s/); + } + $.each(value, function( index, name ) { + groups[name] = key; + }); + }); + var rules = this.settings.rules; + $.each(rules, function( key, value ) { + rules[key] = $.validator.normalizeRule(value); + }); + + function delegate(event) { + var validator = $.data(this[0].form, "validator"), + eventType = "on" + event.type.replace(/^validate/, ""); + if ( validator.settings[eventType] ) { + validator.settings[eventType].call(validator, this[0], event); + } + } + $(this.currentForm) + .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " + + "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + + "[type='email'], [type='datetime'], [type='date'], [type='month'], " + + "[type='week'], [type='time'], [type='datetime-local'], " + + "[type='range'], [type='color'] ", + "focusin focusout keyup", delegate) + .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); + + if ( this.settings.invalidHandler ) { + $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/form + form: function() { + this.checkForm(); + $.extend(this.submitted, this.errorMap); + this.invalid = $.extend({}, this.errorMap); + if ( !this.valid() ) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + } + this.showErrors(); + return this.valid(); + }, + + checkForm: function() { + this.prepareForm(); + for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { + this.check( elements[i] ); + } + return this.valid(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/element + element: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + this.lastElement = element; + this.prepareElement( element ); + this.currentElements = $(element); + var result = this.check( element ) !== false; + if ( result ) { + delete this.invalid[element.name]; + } else { + this.invalid[element.name] = true; + } + if ( !this.numberOfInvalids() ) { + // Hide error containers on last error + this.toHide = this.toHide.add( this.containers ); + } + this.showErrors(); + return result; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/showErrors + showErrors: function( errors ) { + if ( errors ) { + // add items to error list and map + $.extend( this.errorMap, errors ); + this.errorList = []; + for ( var name in errors ) { + this.errorList.push({ + message: errors[name], + element: this.findByName(name)[0] + }); + } + // remove items from success list + this.successList = $.grep( this.successList, function( element ) { + return !(element.name in errors); + }); + } + if ( this.settings.showErrors ) { + this.settings.showErrors.call( this, this.errorMap, this.errorList ); + } else { + this.defaultShowErrors(); + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/resetForm + resetForm: function() { + if ( $.fn.resetForm ) { + $(this.currentForm).resetForm(); + } + this.submitted = {}; + this.lastElement = null; + this.prepareForm(); + this.hideErrors(); + this.elements().removeClass( this.settings.errorClass ).removeData( "previousValue" ); + }, + + numberOfInvalids: function() { + return this.objectLength(this.invalid); + }, + + objectLength: function( obj ) { + var count = 0; + for ( var i in obj ) { + count++; + } + return count; + }, + + hideErrors: function() { + this.addWrapper( this.toHide ).hide(); + }, + + valid: function() { + return this.size() === 0; + }, + + size: function() { + return this.errorList.length; + }, + + focusInvalid: function() { + if ( this.settings.focusInvalid ) { + try { + $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) + .filter(":visible") + .focus() + // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find + .trigger("focusin"); + } catch(e) { + // ignore IE throwing errors when focusing hidden elements + } + } + }, + + findLastActive: function() { + var lastActive = this.lastActive; + return lastActive && $.grep(this.errorList, function( n ) { + return n.element.name === lastActive.name; + }).length === 1 && lastActive; + }, + + elements: function() { + var validator = this, + rulesCache = {}; + + // select all valid inputs inside the form (no submit or reset buttons) + return $(this.currentForm) + .find("input, select, textarea") + .not(":submit, :reset, :image, [disabled]") + .not( this.settings.ignore ) + .filter(function() { + if ( !this.name ) { + if ( window.console ) { + console.error( "%o has no name assigned", this ); + } + throw new Error( "Failed to validate, found an element with no name assigned. See console for element reference." ); + } + + // select only the first element for each name, and only those with rules specified + if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) { + return false; + } + + rulesCache[this.name] = true; + return true; + }); + }, + + clean: function( selector ) { + return $(selector)[0]; + }, + + errors: function() { + var errorClass = this.settings.errorClass.replace(" ", "."); + return $(this.settings.errorElement + "." + errorClass, this.errorContext); + }, + + reset: function() { + this.successList = []; + this.errorList = []; + this.errorMap = {}; + this.toShow = $([]); + this.toHide = $([]); + this.currentElements = $([]); + }, + + prepareForm: function() { + this.reset(); + this.toHide = this.errors().add( this.containers ); + }, + + prepareElement: function( element ) { + this.reset(); + this.toHide = this.errorsFor(element); + }, + + elementValue: function( element ) { + var type = $(element).attr("type"), + val = $(element).val(); + + if ( type === "radio" || type === "checkbox" ) { + return $("input[name='" + $(element).attr("name") + "']:checked").val(); + } + + if ( typeof val === "string" ) { + return val.replace(/\r/g, ""); + } + return val; + }, + + check: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + + var rules = $(element).rules(); + var dependencyMismatch = false; + var val = this.elementValue(element); + var result; + + for (var method in rules ) { + var rule = { method: method, parameters: rules[method] }; + try { + + result = $.validator.methods[method].call( this, val, element, rule.parameters ); + + // if a method indicates that the field is optional and therefore valid, + // don't mark it as valid when there are no other rules + if ( result === "dependency-mismatch" ) { + dependencyMismatch = true; + continue; + } + dependencyMismatch = false; + + if ( result === "pending" ) { + this.toHide = this.toHide.not( this.errorsFor(element) ); + return; + } + + if ( !result ) { + this.formatAndAdd( element, rule ); + return false; + } + } catch(e) { + if ( this.settings.debug && window.console ) { + console.log( "Exception occured when checking element " + element.id + ", check the '" + rule.method + "' method.", e ); + } + throw e; + } + } + if ( dependencyMismatch ) { + return; + } + if ( this.objectLength(rules) ) { + this.successList.push(element); + } + return true; + }, + + // return the custom message for the given element and validation method + // specified in the element's HTML5 data attribute + customDataMessage: function( element, method ) { + return $(element).data("msg-" + method.toLowerCase()) || (element.attributes && $(element).attr("data-msg-" + method.toLowerCase())); + }, + + // return the custom message for the given element name and validation method + customMessage: function( name, method ) { + var m = this.settings.messages[name]; + return m && (m.constructor === String ? m : m[method]); + }, + + // return the first defined argument, allowing empty strings + findDefined: function() { + for(var i = 0; i < arguments.length; i++) { + if ( arguments[i] !== undefined ) { + return arguments[i]; + } + } + return undefined; + }, + + defaultMessage: function( element, method ) { + return this.findDefined( + this.customMessage( element.name, method ), + this.customDataMessage( element, method ), + // title is never undefined, so handle empty string as undefined + !this.settings.ignoreTitle && element.title || undefined, + $.validator.messages[method], + "Warning: No message defined for " + element.name + "" + ); + }, + + formatAndAdd: function( element, rule ) { + var message = this.defaultMessage( element, rule.method ), + theregex = /\$?\{(\d+)\}/g; + if ( typeof message === "function" ) { + message = message.call(this, rule.parameters, element); + } else if (theregex.test(message)) { + message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters); + } + this.errorList.push({ + message: message, + element: element + }); + + this.errorMap[element.name] = message; + this.submitted[element.name] = message; + }, + + addWrapper: function( toToggle ) { + if ( this.settings.wrapper ) { + toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); + } + return toToggle; + }, + + defaultShowErrors: function() { + var i, elements; + for ( i = 0; this.errorList[i]; i++ ) { + var error = this.errorList[i]; + if ( this.settings.highlight ) { + this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); + } + this.showLabel( error.element, error.message ); + } + if ( this.errorList.length ) { + this.toShow = this.toShow.add( this.containers ); + } + if ( this.settings.success ) { + for ( i = 0; this.successList[i]; i++ ) { + this.showLabel( this.successList[i] ); + } + } + if ( this.settings.unhighlight ) { + for ( i = 0, elements = this.validElements(); elements[i]; i++ ) { + this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); + } + } + this.toHide = this.toHide.not( this.toShow ); + this.hideErrors(); + this.addWrapper( this.toShow ).show(); + }, + + validElements: function() { + return this.currentElements.not(this.invalidElements()); + }, + + invalidElements: function() { + return $(this.errorList).map(function() { + return this.element; + }); + }, + + showLabel: function( element, message ) { + var label = this.errorsFor( element ); + if ( label.length ) { + // refresh error/success class + label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); + + // check if we have a generated label, replace the message then + if ( label.attr("generated") ) { + label.html(message); + } + } else { + // create label + label = $("<" + this.settings.errorElement + "/>") + .attr({"for": this.idOrName(element), generated: true}) + .addClass(this.settings.errorClass) + .html(message || ""); + if ( this.settings.wrapper ) { + // make sure the element is visible, even in IE + // actually showing the wrapped element is handled elsewhere + label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); + } + if ( !this.labelContainer.append(label).length ) { + if ( this.settings.errorPlacement ) { + this.settings.errorPlacement(label, $(element) ); + } else { + label.insertAfter(element); + } + } + } + if ( !message && this.settings.success ) { + label.text(""); + if ( typeof this.settings.success === "string" ) { + label.addClass( this.settings.success ); + } else { + this.settings.success( label, element ); + } + } + this.toShow = this.toShow.add(label); + }, + + errorsFor: function( element ) { + var name = this.idOrName(element); + return this.errors().filter(function() { + return $(this).attr("for") === name; + }); + }, + + idOrName: function( element ) { + return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); + }, + + validationTargetFor: function( element ) { + // if radio/checkbox, validate first element in group instead + if ( this.checkable(element) ) { + element = this.findByName( element.name ).not(this.settings.ignore)[0]; + } + return element; + }, + + checkable: function( element ) { + return (/radio|checkbox/i).test(element.type); + }, + + findByName: function( name ) { + return $(this.currentForm).find("[name='" + name + "']"); + }, + + getLength: function( value, element ) { + switch( element.nodeName.toLowerCase() ) { + case "select": + return $("option:selected", element).length; + case "input": + if ( this.checkable( element) ) { + return this.findByName(element.name).filter(":checked").length; + } + } + return value.length; + }, + + depend: function( param, element ) { + return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true; + }, + + dependTypes: { + "boolean": function( param, element ) { + return param; + }, + "string": function( param, element ) { + return !!$(param, element.form).length; + }, + "function": function( param, element ) { + return param(element); + } + }, + + optional: function( element ) { + var val = this.elementValue(element); + return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch"; + }, + + startRequest: function( element ) { + if ( !this.pending[element.name] ) { + this.pendingRequest++; + this.pending[element.name] = true; + } + }, + + stopRequest: function( element, valid ) { + this.pendingRequest--; + // sometimes synchronization fails, make sure pendingRequest is never < 0 + if ( this.pendingRequest < 0 ) { + this.pendingRequest = 0; + } + delete this.pending[element.name]; + if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) { + $(this.currentForm).submit(); + this.formSubmitted = false; + } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + this.formSubmitted = false; + } + }, + + previousValue: function( element ) { + return $.data(element, "previousValue") || $.data(element, "previousValue", { + old: null, + valid: true, + message: this.defaultMessage( element, "remote" ) + }); + } + + }, + + classRuleSettings: { + required: {required: true}, + email: {email: true}, + url: {url: true}, + date: {date: true}, + dateISO: {dateISO: true}, + number: {number: true}, + digits: {digits: true}, + creditcard: {creditcard: true} + }, + + addClassRules: function( className, rules ) { + if ( className.constructor === String ) { + this.classRuleSettings[className] = rules; + } else { + $.extend(this.classRuleSettings, className); + } + }, + + classRules: function( element ) { + var rules = {}; + var classes = $(element).attr("class"); + if ( classes ) { + $.each(classes.split(" "), function() { + if ( this in $.validator.classRuleSettings ) { + $.extend(rules, $.validator.classRuleSettings[this]); + } + }); + } + return rules; + }, + + attributeRules: function( element ) { + var rules = {}; + var $element = $(element); + + for (var method in $.validator.methods) { + var value; + + // support for in both html5 and older browsers + if ( method === "required" ) { + value = $element.get(0).getAttribute(method); + // Some browsers return an empty string for the required attribute + // and non-HTML5 browsers might have required="" markup + if ( value === "" ) { + value = true; + } + // force non-HTML5 browsers to return bool + value = !!value; + } else { + value = $element.attr(method); + } + + if ( value ) { + rules[method] = value; + } else if ( $element[0].getAttribute("type") === method ) { + rules[method] = true; + } + } + + // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs + if ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) { + delete rules.maxlength; + } + + return rules; + }, + + dataRules: function( element ) { + var method, value, + rules = {}, $element = $(element); + for (method in $.validator.methods) { + value = $element.data("rule-" + method.toLowerCase()); + if ( value !== undefined ) { + rules[method] = value; + } + } + return rules; + }, + + staticRules: function( element ) { + var rules = {}; + var validator = $.data(element.form, "validator"); + if ( validator.settings.rules ) { + rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; + } + return rules; + }, + + normalizeRules: function( rules, element ) { + // handle dependency check + $.each(rules, function( prop, val ) { + // ignore rule when param is explicitly false, eg. required:false + if ( val === false ) { + delete rules[prop]; + return; + } + if ( val.param || val.depends ) { + var keepRule = true; + switch (typeof val.depends) { + case "string": + keepRule = !!$(val.depends, element.form).length; + break; + case "function": + keepRule = val.depends.call(element, element); + break; + } + if ( keepRule ) { + rules[prop] = val.param !== undefined ? val.param : true; + } else { + delete rules[prop]; + } + } + }); + + // evaluate parameters + $.each(rules, function( rule, parameter ) { + rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; + }); + + // clean number parameters + $.each(["minlength", "maxlength", "min", "max"], function() { + if ( rules[this] ) { + rules[this] = Number(rules[this]); + } + }); + $.each(["rangelength", "range"], function() { + var parts; + if ( rules[this] ) { + if ( $.isArray(rules[this]) ) { + rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; + } else if ( typeof rules[this] === "string" ) { + parts = rules[this].split(/[\s,]+/); + rules[this] = [Number(parts[0]), Number(parts[1])]; + } + } + }); + + if ( $.validator.autoCreateRanges ) { + // auto-create ranges + if ( rules.min && rules.max ) { + rules.range = [rules.min, rules.max]; + delete rules.min; + delete rules.max; + } + if ( rules.minlength && rules.maxlength ) { + rules.rangelength = [rules.minlength, rules.maxlength]; + delete rules.minlength; + delete rules.maxlength; + } + } + + return rules; + }, + + // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} + normalizeRule: function( data ) { + if ( typeof data === "string" ) { + var transformed = {}; + $.each(data.split(/\s/), function() { + transformed[this] = true; + }); + data = transformed; + } + return data; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/addMethod + addMethod: function( name, method, message ) { + $.validator.methods[name] = method; + $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name]; + if ( method.length < 3 ) { + $.validator.addClassRules(name, $.validator.normalizeRule(name)); + } + }, + + methods: { + + // http://docs.jquery.com/Plugins/Validation/Methods/required + required: function( value, element, param ) { + // check if dependency is met + if ( !this.depend(param, element) ) { + return "dependency-mismatch"; + } + if ( element.nodeName.toLowerCase() === "select" ) { + // could be an array for select-multiple or a string, both are fine this way + var val = $(element).val(); + return val && val.length > 0; + } + if ( this.checkable(element) ) { + return this.getLength(value, element) > 0; + } + return $.trim(value).length > 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/remote + remote: function( value, element, param ) { + if ( this.optional(element) ) { + return "dependency-mismatch"; + } + + var previous = this.previousValue(element); + if (!this.settings.messages[element.name] ) { + this.settings.messages[element.name] = {}; + } + previous.originalMessage = this.settings.messages[element.name].remote; + this.settings.messages[element.name].remote = previous.message; + + param = typeof param === "string" && {url:param} || param; + + if ( previous.old === value ) { + return previous.valid; + } + + previous.old = value; + var validator = this; + this.startRequest(element); + var data = {}; + data[element.name] = value; + $.ajax($.extend(true, { + url: param, + mode: "abort", + port: "validate" + element.name, + dataType: "json", + data: data, + success: function( response ) { + validator.settings.messages[element.name].remote = previous.originalMessage; + var valid = response === true || response === "true"; + if ( valid ) { + var submitted = validator.formSubmitted; + validator.prepareElement(element); + validator.formSubmitted = submitted; + validator.successList.push(element); + delete validator.invalid[element.name]; + validator.showErrors(); + } else { + var errors = {}; + var message = response || validator.defaultMessage( element, "remote" ); + errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; + validator.invalid[element.name] = true; + validator.showErrors(errors); + } + previous.valid = valid; + validator.stopRequest(element, valid); + } + }, param)); + return "pending"; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/minlength + minlength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || length >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/maxlength + maxlength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || length <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/rangelength + rangelength: function( value, element, param ) { + var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element); + return this.optional(element) || ( length >= param[0] && length <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/min + min: function( value, element, param ) { + return this.optional(element) || value >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/max + max: function( value, element, param ) { + return this.optional(element) || value <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/range + range: function( value, element, param ) { + return this.optional(element) || ( value >= param[0] && value <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/email + email: function( value, element ) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ + return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/url + url: function( value, element ) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ + return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/date + date: function( value, element ) { + return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString()); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/dateISO + dateISO: function( value, element ) { + return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/number + number: function( value, element ) { + return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/digits + digits: function( value, element ) { + return this.optional(element) || /^\d+$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/creditcard + // based on http://en.wikipedia.org/wiki/Luhn + creditcard: function( value, element ) { + if ( this.optional(element) ) { + return "dependency-mismatch"; + } + // accept only spaces, digits and dashes + if ( /[^0-9 \-]+/.test(value) ) { + return false; + } + var nCheck = 0, + nDigit = 0, + bEven = false; + + value = value.replace(/\D/g, ""); + + for (var n = value.length - 1; n >= 0; n--) { + var cDigit = value.charAt(n); + nDigit = parseInt(cDigit, 10); + if ( bEven ) { + if ( (nDigit *= 2) > 9 ) { + nDigit -= 9; + } + } + nCheck += nDigit; + bEven = !bEven; + } + + return (nCheck % 10) === 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/equalTo + equalTo: function( value, element, param ) { + // bind to the blur event of the target in order to revalidate whenever the target field is updated + // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead + var target = $(param); + if ( this.settings.onfocusout ) { + target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { + $(element).valid(); + }); + } + return value === target.val(); + } + + } + +}); + +// deprecated, use $.validator.format instead +$.format = $.validator.format; + +}(jQuery)); + +// ajax mode: abort +// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); +// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() +(function($) { + var pendingRequests = {}; + // Use a prefilter if available (1.5+) + if ( $.ajaxPrefilter ) { + $.ajaxPrefilter(function( settings, _, xhr ) { + var port = settings.port; + if ( settings.mode === "abort" ) { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + pendingRequests[port] = xhr; + } + }); + } else { + // Proxy ajax + var ajax = $.ajax; + $.ajax = function( settings ) { + var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, + port = ( "port" in settings ? settings : $.ajaxSettings ).port; + if ( mode === "abort" ) { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + return (pendingRequests[port] = ajax.apply(this, arguments)); + } + return ajax.apply(this, arguments); + }; + } +}(jQuery)); + +// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation +// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target +(function($) { + $.extend($.fn, { + validateDelegate: function( delegate, type, handler ) { + return this.bind(type, function( event ) { + var target = $(event.target); + if ( target.is(delegate) ) { + return handler.apply(target, arguments); + } + }); + } + }); +}(jQuery)); diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler new file mode 100644 index 0000000000..ffe2636eef --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/mainHandler @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +object_maker.init(config_api.config_3dobject_holder, $("#objectHolder").width(), $("#objectHolder").width()/2); +object_maker.animate(); +var flight_dynamics = new flight_dynamics(); +$("#window_size").slider({ + range: "min", + value: 37, + min: 10, + max: 300, + slide: function (event, ui) { + $("#window_size_current_value").html($("#window_size").slider("value")); + + } +}); +$("#window_update").slider({ + range: "min", + value: 234, + min: 100, + max: 1000, + slide: function (event, ui) { + $("#window_update_value").html($("#window_update").slider("value")); + } +}); +$("#replotting").click(function () { + plotting.finishPlotting(function (status) { + if (status) { + plotting.initPlotting(function (status) { + d3.select("#realtimechart").select("svg").remove(); + plotting.realtime_plotting("#realtimechart", "#range_min", "#range_max", "#window_update_value", + 600, $("#realtimechart").height(), "#window_size_current_value", + '#plotting_attribute'); + }); + } else { + $("#realtimechart").html("There is no data to plot"); + } + }); +}); +$('.btn-minimize').click(function (e) { + e.preventDefault(); + var $target = $(this).parent().parent().next('.box-content'); + if ($target.is(':visible')) { + if ($(this).parent().attr('id') === "RealtimePlotting") { + plotting.forceToRedraw(function (status) { + + d3.select("#realtimechart").select("svg").remove(); + plotting.realtime_plotting("#realtimechart", "#range_min", "#range_max", "#window_update_value", + 600, $("#realtimechart").height(), "#window_size_current_value", + '#plotting_attribute'); + }); + } + } else { + } +}); +$('#connectionOpen').on('click', function () { + $('#connectionOpen').toggleClass('active'); +}); + + +$("#xmppConnectionOpen").on('click', function () { + $('#xmppConnectionOpen').toggleClass('active'); + if ($('#xmppConnectionOpen').html() === "Start") { + sendMessage(); + $('#xmppConnectionOpen').html("Stop"); + } else if ($('#xmppConnectionOpen').html() === "Stop") { + closeSocket(); + $('#xmppConnectionOpen').html("Start"); + $("#connectionOpen").html("Connect to server").removeClass("btn btn-info").addClass("btn btn-primary"); + } +}); + +$('.btn-minimize').parent().parent().next('.box-content').hide(); + + +var webSocket; +config_api.realtime_plotting_data_window["attitude"] = new Queue(); + +var current_status = {}; + +function openSocket() { + if (webSocket !== undefined && webSocket.readyState !== WebSocket.CLOSED) { + writeResponse("WebSocket is already opened."); + } else { + webSocket = new WebSocket(config_api.web_socket_endpoint); + } + webSocket.onopen = function (event) { + if (event === undefined) { + writeResponse("WebSocket cant open " + event); + $("#connectionOpen").html("Connect to server").removeClass("btn btn-info").addClass("btn btn-primary"); + } else { + + if (event["isTrusted"] == true) { + $("#connectionOpen").html("Connected").removeClass("btn btn-primary").addClass("btn btn-info"); + } + writeResponse(JSON.stringify(event)); + + } + }; + webSocket.onmessage = function (event) { + var sender_message = event.data; + sender_message = isJSON(sender_message); + if (sender_message != null) { + flight_dynamics.processingMessage(sender_message); + } else { + writeResponse("Message has been corrupted."); + } + }; + +} + +function sendMessage(message) { + webSocket.send(message); +} + +function closeSocket() { + webSocket.close(); +} + +function writeResponse(text) { + console.log(text); +} + +window.onbeforeunload = function () { + webSocket.onclose = function () { + }; + webSocket.close() +}; + diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js new file mode 100644 index 0000000000..a45b65b73b --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/controller.js @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +$("#module_control button").click(function (index) { + console.log("Asking Server to send the " + $(this).attr('id') + " command to Ar Drone"); + var url = config_api.drone_control + "?action=" + $(this).attr('id') + "&speed=6&duration=7"; + ajax_handler.ajaxRequest(url, config_api.drone_controlType, {action: $(this).attr('id'), speed: 7, duration: 7}, + config_api.drone_controlDataType, function (data, status) { + console.log(JSON.stringify(data)); + } + ); +}); + + + diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js new file mode 100644 index 0000000000..926fec9027 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/flight_dynamics.js @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var flight_dynamics = function () { + var api = this; + api.processingMessage = function (sender_message) { + + JSON.stringify(sender_message); + + if (sender_message.quatanium_val != undefined) { + current_status = object_maker.get_heading_attitude_bank(sender_message.quatanium_val); + object_maker.set_heading_attitude_bank(current_status); + $("#imageTop").animate({rotate: '' + (180 / Math.PI) * 2.890456 + 'deg'}, 2); + } + + $("#imageTop").delay(2).animate({rotate: '45deg'}, 2); + if (config_api.modules_status.angleOfRotation_2 || config_api.modules_status.angleOfRotation_1) { + console.log(JSON.stringify(current_status)); + object_maker.set_bank("#imageTop", current_status.bank); + object_maker.set_heading("#imageBackSecond", current_status.heading); + + } + + if (config_api.modules_status.realtimePlotting) { + if (current_status[$('#plotting_attribute').val()] != undefined) { + plotting.pushData(current_status[$('#plotting_attribute').val()]); + } + } + + if (sender_message.basicParam != undefined) { + if (sender_message.basicParam.velocity != undefined) { + var velocity = sender_message.basicParam.velocity; + if (velocity.length == 3) { + $("#velocityx").html(velocity[0]); + $("#velocityy").html(velocity[1]); + $("#velocityz").html(velocity[2]); + } + } else { + $("#velocityx").html(NaN); + $("#velocityy").html(NaN); + $("#velocityz").html(NaN); + } + if (sender_message.basicParam.global_location != undefined) { + var location = sender_message.basicParam.global_location; + if (location.length == 3) { + $("#locationLog").html(location[0]); + $("#locationAlt").html(location[1]); + $("#locationLat").html(location[2]); + } + } else { + $("#locationLog").html(NaN); + $("#locationAlt").html(NaN); + $("#locationLat").html(NaN); + } + } + if (sender_message.battery_voltage != undefined) { + $("#battery_voltage").html(sender_message.battery_voltage); + } else { + $("#battery_voltage").html(NaN); + } + } + +}; + + diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting new file mode 100644 index 0000000000..064ff2e109 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/public/js/modules/realtime_plotting @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +var plotting = function () { + var api = this; + api.isDone = false; + api.current_value = 0; + api.finishPlotting = function (callBack) { + api.isDone = true; + callBack(true); + }, + api.initPlotting = function (callback) { + api.isDone = false; + callback(true); + }, + api.forceToRedraw = function (callback) { + api.isDone == true; + callback(true); + }, + api.pushData = function (new_value) { + console.log(new_value); + api.current_value = new_value; + }, + api.realtime_plotting = function (holder, y_min_hollder, y_max_holder, update_interval_holder, holder_width, + holder_height, window_size_holder, title) { + $(holder).html(); + var init_window = function () { + return 0; + } + api.data = d3.range(parseInt($(window_size_holder).html())).map(init_window); + var margin = {top: 20, right: 20, bottom: 20, left: 40}, + width = holder_width - margin.left - margin.right, + height = holder_height - margin.top - margin.bottom; + var x = d3.scale.linear() + .domain([1, parseInt($(window_size_holder).html()) - 2]) + .range([0, width]); + + var y = d3.scale.linear() + .domain([parseInt($(y_min_hollder).val()), parseInt($(y_max_holder).val())]) + .range([height, 0]); + var line = d3.svg.line() + .interpolate("basis") + .x(function (d, i) { + return x(i); + }) + .y(function (d, i) { + return y(d); + }); + + var svg = d3.select(holder).append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + svg.append("defs").append("clipPath") + .attr("id", "clip") + .append("rect") + .attr("width", width) + .attr("height", height); + var axis_x = svg.append("g") + .attr("class", "x_axis") + .attr("transform", "translate(0," + y(0) + ")") + .call(d3.svg.axis().scale(x).orient("bottom")); + var axis_y = svg.append("g") + .attr("class", "y_axis") + .call(d3.svg.axis().scale(y).orient("left")); + var path = svg.append("g") + .attr("clip-path", "url(#clip)") + .append("path") + .datum(api.data) + .attr("class", "line") + .attr("d", line); + svg.append("text") + .attr("class", "yaxis_label") + .attr("transform", "rotate(-90)") + .attr("y", 0 - margin.left - 4) + .attr("x", (0 - (height / 2))) + .attr("dy", "1em") + .style("text-anchor", "middle") + .text($(title).val()); + svg.append("text") + .attr("class", "xaixs_label") + .attr("transform", + "translate(" + (width / 2) + " ," + + (height + margin.bottom) + ")") + .style("text-anchor", "middle") + .text("Window Size"); + svg.append("text") + .attr("class", "title_label") + .attr("x", (width / 2)) + .attr("y", 0 - (margin.top / 4)) + .attr("text-anchor", "middle") + .style("font-size", "16px") + .style("text-decoration", "underline") + .text($(title).val() + " variation within last " + $(window_size_holder).html() + " frames"); + + updateAgain(); + + function updateAgain() { + if (api.isDone)return; + api.data.push(api.current_value); + path + .attr("d", line) + .attr("transform", null) + .transition() + .duration($(update_interval_holder).html()) + .ease("linear") + .attr("transform", "translate(" + x(0) + ",0)") + .each("end", updateAgain); + api.data.shift(); + } + + function rescale() { + y.domain([parseInt($(y_min_hollder).val()), parseInt($(y_max_holder).val())]) + + svg.select(".title_label") + .text($(title).val() + " variation within last " + $(window_size_holder).html() + " frames"); + svg.select(".yaxis_label") + .text($(title).val()); + + } + + function rescale_x() { + x.domain([1, parseInt($(window_size_holder).html()) - 2]).range([0, width]) + svg.select(".x_axis").transition().call(axis_x); + } + + $("#plotting_attribute").change(function () { + rescale(); + }); + + } +} + diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs new file mode 100644 index 0000000000..27176171c3 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.hbs @@ -0,0 +1,332 @@ +{{#zone "topCss"}} + {{css "css/main-app.css" }} + +{{/zone}} +

+
+
+
+ +
+
+ +
+
+

Battery Level

+
+
+
+
+ 0% +
+
+
+
+
+
+
+
+
+
+

Controller

+ +
+ + + +
+
+
+ + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+

Angle of Rotation

+ +
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+ +
+ + + +
+
+
+
+ + + +
+
+
+
+
+
+
+ +
+ + + +
+
+
+
+ + + +
+
+
+
+ +
+
+
+

Live Video Stream

+ +
+ + + +
+
+
+ video stream +
+
+
+
+
+ +
+
+
+
+
+

Sensor Readings

+
+ + + +
+
+
+
+

Location latitude:
+ longitude:
+ altitudes:

+

Velocity: x :
+ y :
+ z :

+

Battery Voltage:

+
+
+
+
+
+
+
+

Realtime Plotting

+ +
+ + + +
+
+
+
+
+
+ Window size : +

+ Update period : +
+

+
Y-axis: +
+

+
+ +
+
+
+
+
+
+
+
+
+ + +{{#zone "bottomJs"}} + {{js "/js/d3.min.js" }} + {{js "/js/3dobject_controller/three.min.js" }} + {{js "/js/3dobject_controller/Coordinates.js" }} + {{js "/js/3dobject_controller/OrbitAndPanControls.js" }} + {{js "/js/3dobject_controller/3dObjectControler.js" }} + {{js "/js/jQueryRotate.js" }} + {{js "/js/config/config.js" }} + {{js "/js/common/ajax_handler.js" }} + {{js "/js/modules/realtime_plotting" }} + {{js "/js/initJs" }} + {{js "/js/common/general_handler" }} + {{js "/js/common/websocket_api" }} + {{js "/js/modules/controller.js" }} + {{js "/js/modules/flight_dynamics.js" }} + {{js "/js/mainHandler" }} +{{/zone}} + diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js new file mode 100644 index 0000000000..dc92c0e900 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.js @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +function onRequest (context) { + /*var log = new Log("detail.js"); + var deviceType = request.getParameter("type"); + var deviceId = request.getParameter("id"); + + if (deviceType != null && deviceType != undefined && deviceId != null && deviceId != undefined) { + var deviceModule = require("/modules/device.js").deviceModule; + var device = deviceModule.viewDevice(deviceType, deviceId); + + if (device) { + var viewModel = {}; + var deviceInfo = device.properties.DEVICE_INFO; + if (deviceInfo != undefined && String(deviceInfo.toString()).length > 0) { + deviceInfo = parse(stringify(deviceInfo)); + viewModel.system = device.properties.IMEI; + viewModel.machine = "Virtual Firealarm"; + viewModel.vendor = device.properties.VENDOR; + } + device.viewModel = viewModel; + } + context.device = device; + + return context; + }*/ +} \ No newline at end of file diff --git a/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json new file mode 100644 index 0000000000..688e939808 --- /dev/null +++ b/features/device-mgt-iot-droneanalyzer-feature/org.wso2.carbon.device.mgt.iot.droneanalyzer.feature/src/main/resources/jaggeryapps/devicemgt/app/units/iot.unit.device.droneanalyzer.statistics/statistics.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.0" +} \ No newline at end of file