From 1df257ea917e916dda02f7d0e03d8f8b19abd3f7 Mon Sep 17 00:00:00 2001 From: jiannibang <271381693@qq.com> Date: Mon, 17 Oct 2022 10:54:38 +0800 Subject: [PATCH] init --- .DS_Store | Bin 0 -> 8196 bytes .gitignore | 2 + app.js | 89 + app.json | 21 + app.wxss | 16 + data-helper.js | 387 ++ getMapData.js | 114 + images/2dmap.jpg | Bin 0 -> 53140 bytes images/location.png | Bin 0 -> 1129 bytes loader/gltfLoader.js | 3498 ++++++++++ miniprogram_npm/ais-h5-location/index.js | 14 + miniprogram_npm/ais-h5-location/index.js.map | 1 + miniprogram_npm/crypto-js/CONTRIBUTING.md | 28 + miniprogram_npm/crypto-js/LICENSE | 24 + miniprogram_npm/crypto-js/README.md | 261 + miniprogram_npm/crypto-js/aes.js | 234 + miniprogram_npm/crypto-js/bower.json | 39 + miniprogram_npm/crypto-js/cipher-core.js | 890 +++ miniprogram_npm/crypto-js/core.js | 807 +++ miniprogram_npm/crypto-js/crypto-js.js | 6191 +++++++++++++++++ .../crypto-js/docs/QuickStartGuide.wiki | 470 ++ miniprogram_npm/crypto-js/enc-base64.js | 136 + miniprogram_npm/crypto-js/enc-base64url.js | 140 + miniprogram_npm/crypto-js/enc-hex.js | 18 + miniprogram_npm/crypto-js/enc-latin1.js | 18 + miniprogram_npm/crypto-js/enc-utf16.js | 149 + miniprogram_npm/crypto-js/enc-utf8.js | 18 + miniprogram_npm/crypto-js/evpkdf.js | 134 + miniprogram_npm/crypto-js/format-hex.js | 66 + miniprogram_npm/crypto-js/format-openssl.js | 18 + miniprogram_npm/crypto-js/hmac-md5.js | 18 + miniprogram_npm/crypto-js/hmac-ripemd160.js | 18 + miniprogram_npm/crypto-js/hmac-sha1.js | 18 + miniprogram_npm/crypto-js/hmac-sha224.js | 18 + miniprogram_npm/crypto-js/hmac-sha256.js | 18 + miniprogram_npm/crypto-js/hmac-sha3.js | 18 + miniprogram_npm/crypto-js/hmac-sha384.js | 18 + miniprogram_npm/crypto-js/hmac-sha512.js | 18 + miniprogram_npm/crypto-js/hmac.js | 143 + miniprogram_npm/crypto-js/index.js | 18 + miniprogram_npm/crypto-js/lib-typedarrays.js | 76 + miniprogram_npm/crypto-js/md5.js | 268 + miniprogram_npm/crypto-js/mode-cfb.js | 80 + miniprogram_npm/crypto-js/mode-ctr-gladman.js | 116 + miniprogram_npm/crypto-js/mode-ctr.js | 58 + miniprogram_npm/crypto-js/mode-ecb.js | 40 + miniprogram_npm/crypto-js/mode-ofb.js | 54 + miniprogram_npm/crypto-js/package.json | 45 + miniprogram_npm/crypto-js/pad-ansix923.js | 49 + miniprogram_npm/crypto-js/pad-iso10126.js | 44 + miniprogram_npm/crypto-js/pad-iso97971.js | 40 + miniprogram_npm/crypto-js/pad-nopadding.js | 30 + miniprogram_npm/crypto-js/pad-pkcs7.js | 18 + miniprogram_npm/crypto-js/pad-zeropadding.js | 47 + miniprogram_npm/crypto-js/pbkdf2.js | 145 + miniprogram_npm/crypto-js/rabbit-legacy.js | 190 + miniprogram_npm/crypto-js/rabbit.js | 192 + miniprogram_npm/crypto-js/rc4.js | 139 + miniprogram_npm/crypto-js/ripemd160.js | 267 + miniprogram_npm/crypto-js/sha1.js | 150 + miniprogram_npm/crypto-js/sha224.js | 80 + miniprogram_npm/crypto-js/sha256.js | 199 + miniprogram_npm/crypto-js/sha3.js | 326 + miniprogram_npm/crypto-js/sha384.js | 83 + miniprogram_npm/crypto-js/sha512.js | 326 + miniprogram_npm/crypto-js/tripledes.js | 779 +++ miniprogram_npm/crypto-js/x64-core.js | 304 + miniprogram_npm/dijkstrajs/index.js | 178 + miniprogram_npm/dijkstrajs/index.js.map | 1 + miniprogram_npm/threejs-miniprogram/index.js | 3 + package.json | 34 + pages/.DS_Store | Bin 0 -> 6148 bytes pages/agreement/index.js | 84 + pages/agreement/index.json | 6 + pages/agreement/index.wxml | 21 + pages/agreement/index.wxss | 91 + pages/agreement/logo.png | Bin 0 -> 2911 bytes pages/destination/destination.js | 19 + pages/destination/destination.json | 4 + pages/destination/destination.wxml | 6 + pages/destination/destination.wxss | 58 + pages/gesture/gesture.js | 17 + pages/gesture/gesture.json | 5 + pages/gesture/gesture.wxml | 12 + pages/gesture/gesture.wxs | 263 + pages/h5map/index.js | 147 + pages/h5map/index.json | 3 + pages/h5map/index.wxml | 2 + pages/h5map/index.wxss | 1 + pages/h5map/share.png | Bin 0 -> 223324 bytes pages/index/.DS_Store | Bin 0 -> 6148 bytes pages/index/VPASSDK-1.2.2.js | 1 + pages/index/config.js | 303 + pages/index/corner.png | Bin 0 -> 3880 bytes pages/index/elevator-down.png | Bin 0 -> 3749 bytes pages/index/elevator-up.png | Bin 0 -> 3752 bytes pages/index/end.png | Bin 0 -> 11674 bytes pages/index/escalator-down.png | Bin 0 -> 2720 bytes pages/index/escalator-up.png | Bin 0 -> 2609 bytes pages/index/flashoff.png | Bin 0 -> 2528 bytes pages/index/flashon.png | Bin 0 -> 2405 bytes pages/index/floor-bg.png | Bin 0 -> 72343 bytes pages/index/index-helper.js | 110 + pages/index/index.js | 758 ++ pages/index/index.json | 9 + pages/index/index.wxml | 85 + pages/index/index.wxss | 621 ++ pages/index/left.png | Bin 0 -> 1981 bytes pages/index/leftyaw.png | Bin 0 -> 3205 bytes pages/index/logo.png | Bin 0 -> 975 bytes pages/index/mask.png | Bin 0 -> 3382 bytes pages/index/right.png | Bin 0 -> 1870 bytes pages/index/rightyaw.png | Bin 0 -> 3207 bytes pages/index/scanning-tip.png | Bin 0 -> 31309 bytes pages/index/share.png | Bin 0 -> 2578 bytes pages/index/straight.png | Bin 0 -> 1116 bytes pages/index/success.png | Bin 0 -> 4341 bytes pages/index/tomap.png | Bin 0 -> 3982 bytes pages/map2d/L1.png | Bin 0 -> 236043 bytes pages/map2d/L2.png | Bin 0 -> 205743 bytes pages/map2d/MAPAPP.js | 450 ++ pages/map2d/arrow.png | Bin 0 -> 17287 bytes pages/map2d/end.png | Bin 0 -> 3404 bytes pages/map2d/events.js | 64 + pages/map2d/map2d.js | 118 + pages/map2d/map2d.json | 6 + pages/map2d/map2d.wxml | 5 + pages/map2d/map2d.wxss | 33 + pages/map2d/start.png | Bin 0 -> 2860 bytes pages/map2d/util.js | 42 + pages/nav/bubble.png | Bin 0 -> 865 bytes pages/nav/close.png | Bin 0 -> 482 bytes pages/nav/nav.js | 33 + pages/nav/nav.json | 4 + pages/nav/nav.wxml | 13 + pages/nav/nav.wxss | 115 + pages/privacy/index.js | 66 + pages/privacy/index.json | 6 + pages/privacy/index.wxml | 180 + pages/privacy/index.wxss | 4 + pages/prompt/bluetooth.png | Bin 0 -> 6299 bytes pages/prompt/elevator.png | Bin 0 -> 4409 bytes pages/prompt/end.png | Bin 0 -> 9798 bytes pages/prompt/escalator.png | Bin 0 -> 1641 bytes pages/prompt/info.png | Bin 0 -> 4251 bytes pages/prompt/mall.png | Bin 0 -> 3695 bytes pages/prompt/park.png | Bin 0 -> 3634 bytes pages/prompt/prompt.js | 34 + pages/prompt/prompt.json | 4 + pages/prompt/prompt.wxml | 10 + pages/prompt/prompt.wxss | 142 + pages/prompt/question.png | Bin 0 -> 4969 bytes pages/prompt/tomap.png | Bin 0 -> 5286 bytes pages/tabs/relocate.png | Bin 0 -> 6945 bytes pages/tabs/tabs.js | 32 + pages/tabs/tabs.json | 4 + pages/tabs/tabs.wxml | 14 + pages/tabs/tabs.wxss | 105 + project.config.json | 54 + project.private.config.json | 8 + sitemap.json | 7 + utils/util.js | 25 + wasm/module_basic.wasm | Bin 0 -> 34328 bytes 163 files changed, 22653 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 app.js create mode 100644 app.json create mode 100644 app.wxss create mode 100644 data-helper.js create mode 100644 getMapData.js create mode 100644 images/2dmap.jpg create mode 100644 images/location.png create mode 100644 loader/gltfLoader.js create mode 100644 miniprogram_npm/ais-h5-location/index.js create mode 100644 miniprogram_npm/ais-h5-location/index.js.map create mode 100644 miniprogram_npm/crypto-js/CONTRIBUTING.md create mode 100644 miniprogram_npm/crypto-js/LICENSE create mode 100644 miniprogram_npm/crypto-js/README.md create mode 100644 miniprogram_npm/crypto-js/aes.js create mode 100644 miniprogram_npm/crypto-js/bower.json create mode 100644 miniprogram_npm/crypto-js/cipher-core.js create mode 100644 miniprogram_npm/crypto-js/core.js create mode 100644 miniprogram_npm/crypto-js/crypto-js.js create mode 100644 miniprogram_npm/crypto-js/docs/QuickStartGuide.wiki create mode 100644 miniprogram_npm/crypto-js/enc-base64.js create mode 100644 miniprogram_npm/crypto-js/enc-base64url.js create mode 100644 miniprogram_npm/crypto-js/enc-hex.js create mode 100644 miniprogram_npm/crypto-js/enc-latin1.js create mode 100644 miniprogram_npm/crypto-js/enc-utf16.js create mode 100644 miniprogram_npm/crypto-js/enc-utf8.js create mode 100644 miniprogram_npm/crypto-js/evpkdf.js create mode 100644 miniprogram_npm/crypto-js/format-hex.js create mode 100644 miniprogram_npm/crypto-js/format-openssl.js create mode 100644 miniprogram_npm/crypto-js/hmac-md5.js create mode 100644 miniprogram_npm/crypto-js/hmac-ripemd160.js create mode 100644 miniprogram_npm/crypto-js/hmac-sha1.js create mode 100644 miniprogram_npm/crypto-js/hmac-sha224.js create mode 100644 miniprogram_npm/crypto-js/hmac-sha256.js create mode 100644 miniprogram_npm/crypto-js/hmac-sha3.js create mode 100644 miniprogram_npm/crypto-js/hmac-sha384.js create mode 100644 miniprogram_npm/crypto-js/hmac-sha512.js create mode 100644 miniprogram_npm/crypto-js/hmac.js create mode 100644 miniprogram_npm/crypto-js/index.js create mode 100644 miniprogram_npm/crypto-js/lib-typedarrays.js create mode 100644 miniprogram_npm/crypto-js/md5.js create mode 100644 miniprogram_npm/crypto-js/mode-cfb.js create mode 100644 miniprogram_npm/crypto-js/mode-ctr-gladman.js create mode 100644 miniprogram_npm/crypto-js/mode-ctr.js create mode 100644 miniprogram_npm/crypto-js/mode-ecb.js create mode 100644 miniprogram_npm/crypto-js/mode-ofb.js create mode 100644 miniprogram_npm/crypto-js/package.json create mode 100644 miniprogram_npm/crypto-js/pad-ansix923.js create mode 100644 miniprogram_npm/crypto-js/pad-iso10126.js create mode 100644 miniprogram_npm/crypto-js/pad-iso97971.js create mode 100644 miniprogram_npm/crypto-js/pad-nopadding.js create mode 100644 miniprogram_npm/crypto-js/pad-pkcs7.js create mode 100644 miniprogram_npm/crypto-js/pad-zeropadding.js create mode 100644 miniprogram_npm/crypto-js/pbkdf2.js create mode 100644 miniprogram_npm/crypto-js/rabbit-legacy.js create mode 100644 miniprogram_npm/crypto-js/rabbit.js create mode 100644 miniprogram_npm/crypto-js/rc4.js create mode 100644 miniprogram_npm/crypto-js/ripemd160.js create mode 100644 miniprogram_npm/crypto-js/sha1.js create mode 100644 miniprogram_npm/crypto-js/sha224.js create mode 100644 miniprogram_npm/crypto-js/sha256.js create mode 100644 miniprogram_npm/crypto-js/sha3.js create mode 100644 miniprogram_npm/crypto-js/sha384.js create mode 100644 miniprogram_npm/crypto-js/sha512.js create mode 100644 miniprogram_npm/crypto-js/tripledes.js create mode 100644 miniprogram_npm/crypto-js/x64-core.js create mode 100644 miniprogram_npm/dijkstrajs/index.js create mode 100644 miniprogram_npm/dijkstrajs/index.js.map create mode 100644 miniprogram_npm/threejs-miniprogram/index.js create mode 100644 package.json create mode 100644 pages/.DS_Store create mode 100644 pages/agreement/index.js create mode 100644 pages/agreement/index.json create mode 100644 pages/agreement/index.wxml create mode 100644 pages/agreement/index.wxss create mode 100644 pages/agreement/logo.png create mode 100644 pages/destination/destination.js create mode 100644 pages/destination/destination.json create mode 100644 pages/destination/destination.wxml create mode 100644 pages/destination/destination.wxss create mode 100644 pages/gesture/gesture.js create mode 100644 pages/gesture/gesture.json create mode 100644 pages/gesture/gesture.wxml create mode 100644 pages/gesture/gesture.wxs create mode 100644 pages/h5map/index.js create mode 100644 pages/h5map/index.json create mode 100644 pages/h5map/index.wxml create mode 100644 pages/h5map/index.wxss create mode 100644 pages/h5map/share.png create mode 100644 pages/index/.DS_Store create mode 100644 pages/index/VPASSDK-1.2.2.js create mode 100644 pages/index/config.js create mode 100644 pages/index/corner.png create mode 100644 pages/index/elevator-down.png create mode 100644 pages/index/elevator-up.png create mode 100644 pages/index/end.png create mode 100644 pages/index/escalator-down.png create mode 100644 pages/index/escalator-up.png create mode 100644 pages/index/flashoff.png create mode 100644 pages/index/flashon.png create mode 100644 pages/index/floor-bg.png create mode 100644 pages/index/index-helper.js create mode 100644 pages/index/index.js create mode 100644 pages/index/index.json create mode 100644 pages/index/index.wxml create mode 100644 pages/index/index.wxss create mode 100644 pages/index/left.png create mode 100644 pages/index/leftyaw.png create mode 100644 pages/index/logo.png create mode 100644 pages/index/mask.png create mode 100644 pages/index/right.png create mode 100644 pages/index/rightyaw.png create mode 100644 pages/index/scanning-tip.png create mode 100644 pages/index/share.png create mode 100644 pages/index/straight.png create mode 100644 pages/index/success.png create mode 100644 pages/index/tomap.png create mode 100644 pages/map2d/L1.png create mode 100644 pages/map2d/L2.png create mode 100644 pages/map2d/MAPAPP.js create mode 100644 pages/map2d/arrow.png create mode 100644 pages/map2d/end.png create mode 100644 pages/map2d/events.js create mode 100644 pages/map2d/map2d.js create mode 100644 pages/map2d/map2d.json create mode 100644 pages/map2d/map2d.wxml create mode 100644 pages/map2d/map2d.wxss create mode 100644 pages/map2d/start.png create mode 100644 pages/map2d/util.js create mode 100644 pages/nav/bubble.png create mode 100644 pages/nav/close.png create mode 100644 pages/nav/nav.js create mode 100644 pages/nav/nav.json create mode 100644 pages/nav/nav.wxml create mode 100644 pages/nav/nav.wxss create mode 100644 pages/privacy/index.js create mode 100644 pages/privacy/index.json create mode 100644 pages/privacy/index.wxml create mode 100644 pages/privacy/index.wxss create mode 100644 pages/prompt/bluetooth.png create mode 100644 pages/prompt/elevator.png create mode 100644 pages/prompt/end.png create mode 100644 pages/prompt/escalator.png create mode 100644 pages/prompt/info.png create mode 100644 pages/prompt/mall.png create mode 100644 pages/prompt/park.png create mode 100644 pages/prompt/prompt.js create mode 100644 pages/prompt/prompt.json create mode 100644 pages/prompt/prompt.wxml create mode 100644 pages/prompt/prompt.wxss create mode 100644 pages/prompt/question.png create mode 100644 pages/prompt/tomap.png create mode 100644 pages/tabs/relocate.png create mode 100644 pages/tabs/tabs.js create mode 100644 pages/tabs/tabs.json create mode 100644 pages/tabs/tabs.wxml create mode 100644 pages/tabs/tabs.wxss create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 sitemap.json create mode 100644 utils/util.js create mode 100644 wasm/module_basic.wasm diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8edf28114c5ce8b0df23b2f0da916b291f037680 GIT binary patch literal 8196 zcmeHM-EPw`6h7YCk(Qwq0qQPugTzHatpp5&kg75+c86317l69-hb~*2R82|;rKmT& z!*~SVgg4+pcmVj0ZK5=3xT8YFuI%I3=Zlx`v*R3(h(u%3tr6`Lk%i2*bQ#5p#QmI8 zX-l`0<;+`sc5E?3Uh#?dl{WiP9*0o(I ztKcLQoP-`(=m(E~&Cm%aLBkop;;Uy)c+%GO=e|FP>Q4KG+ncsZ*Pr-a=(t{QEWvKK z2bb3`U9am;8~()W2J${l)nQo$tI#TyXS2Jtid}nne_pX?2M5)PeeXeSJ}+41o3+PB z$HVs@W*_IDF7P}^Lch{zPhCgl7u1&cc-I_z1K;a2NcIh&fJ0qyHD1<1{6K$Pw>_}x zl7~E^F;IP!4%%918_{qXEmgmWseTnc4t3~ED|4H8WWJVjCOr?NuJJqUChm}hV~yju zyu_`V4g7=|o*OzBVq7F9oB^2LhpW-My#^1Vk+-qeY!yR>;oMM9$-O|g1{RclS0$5e>?Hk6_0`4aqKIh(Xr z2Da5``yBs2%|8EM>)&JsGYl98*2{p%9X1ae81wgsXmWUtwQb~MWKQh2P*y@v$Z#B1 xhU2i&KMYZ~;mVl0whLv^g0%L7fWP~_9{Uzb>~GP&m;Tl^`@ftDrdT5bzW|OaG35XN literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5726835 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/node_modules +./package-lock.json \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..814b880 --- /dev/null +++ b/app.js @@ -0,0 +1,89 @@ +import { getMapData } from "./getMapData"; +export const post = (url, data) => + new Promise((resolve, reject) => { + wx.request({ + url: "https://huiju.mapais.com/bjyj" + url, + method: "POST", + data, + success({ data, statusCode }) { + if (statusCode !== 200) return reject(); + resolve(data); + }, + }); + }); +const floors = [ + { + name: "-3F", + floorOrder: 0, + url: true, + floorId: "B3", + isPark: true, + }, + { + name: "-2F", + floorOrder: 1, + url: true, + floorId: "B2", + isPark: true, + }, + { + name: "-1F", + floorOrder: 2, + url: true, + floorId: "B1", + isPark: true, + }, + { + name: "1F", + floorOrder: 3, + url: true, + floorId: "F1", + isPark: false, + }, + { + name: "2F", + floorOrder: 4, + url: true, + floorId: "F2", + isPark: false, + }, + { + name: "3F", + floorOrder: 5, + url: true, + floorId: "F3", + isPark: false, + }, +]; +App({ + async onLaunch() { + // 展示本地存储能力 + getMapData(); + try { + const { code } = await new Promise((resolve, reject) => { + wx.login({ + success: resolve, + fail: reject, + }); + }); + const { data } = await post("/api/wxmp/session", { + code, + }); + this.globalData.openid = data ? data.openid : null; + } catch (error) { + console.warn(error); + } + this.openidCbs.forEach((cb) => cb(this.globalData.openid)); + }, + onOpenid(cb) { + this.openidCbs.push(cb); + }, + openidCbs: [], + globalData: { + floors, + floorIdFloorOrderMap: floors.reduce( + (acc, nxt) => ({ ...acc, [nxt.floorId]: nxt.floorOrder }), + {} + ), + }, +}); diff --git a/app.json b/app.json new file mode 100644 index 0000000..533ed0b --- /dev/null +++ b/app.json @@ -0,0 +1,21 @@ +{ + "pages": [ + "pages/h5map/index", + "pages/index/index", + "pages/agreement/index", + "pages/privacy/index" + ], + "window": { + "navigationStyle": "custom", + "navigationBarBackgroundColor": "#F0F0F0", + "navigationBarTitleText": "无锡荟聚", + "navigationBarTextStyle": "black" + }, + "style": "v2", + "sitemapLocation": "sitemap.json", + "permission": { + "scope.userLocation": { + "desc": "你的位置信息将用于小程序位置接口的效果展示" + } + } +} diff --git a/app.wxss b/app.wxss new file mode 100644 index 0000000..e2c30fa --- /dev/null +++ b/app.wxss @@ -0,0 +1,16 @@ +/**app.wxss**/ +.container { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + padding: 200rpx 0; + box-sizing: border-box; +} + +view, +input, +scroll-view { + box-sizing: border-box; +} diff --git a/data-helper.js b/data-helper.js new file mode 100644 index 0000000..2a1b554 --- /dev/null +++ b/data-helper.js @@ -0,0 +1,387 @@ +const FacilityCodeMap = { + ft: 0, + upft: 0, + downft: 0, + mys: 3, + xsj: 4, + fwt: 7, + dt: 5, + lt: 88, + dit: 89, + cjr: 10, + tcc: 8, + xsjn: 12, + xsjv: 13, + xxt: 14, + tczl: 8, + fcjcg: 7, + door: 39, + czc: 500, + vip: 34, + pq: 40, + ksgj: 30, + xcgc: 57, + tthy: 58, + bc: 26, + etxsj: 69, + sjcd: 25, +}; +const defaultFacilityTypeMap = { + 0: "扶梯", + 1: "扶梯", + 2: "扶梯", + 3: "母婴室", + 4: "卫生间", + 5: "直梯", + 6: "厕所", + 7: "服务台", + 8: "停车场", + 9: "儿童厕所", + 10: "无障碍卫生间", + 11: "吸烟室", + 12: "男洗手间", + 13: "女洗手间", + 14: "信息台", + 16: "饮水处", + 21: "地铁", + 25: "新能源充电站", + 26: "泊车", + 28: "家庭洗手间(男)", + 29: "家庭洗手间", + 30: "公交", + 34: "VIP", + 39: "出入口", + 40: "喷泉", + 35: "男洗手间", + 36: "女洗手间", + 57: "下沉广场", + 58: "天台花园", + 69: "儿童洗手间", + 88: "楼梯", + 89: "地铁", + 93: "男更衣室", + 94: "女更衣室", + 500: "出租车", +}; +export const attachGraphSingle = ({ graph, key, value }) => { + graph[key] = { + ...graph[key], + ...value, + }; +}; +export const attachGraph = ({ + graph, + leftKey, + rightKey, + leftValue, + rightValue, +}) => { + graph[leftKey] = { + ...graph[leftKey], + ...leftValue, + }; + graph[rightKey] = { + ...graph[rightKey], + ...rightValue, + }; +}; + +export const getDataNew = async (map) => { + const { + mall: { shopInfo, mapData }, + } = map; + return { + serverShopInfo: shopInfo, + mapData, + }; +}; + +export const handleData = ( + shopInfo, + mapData, + ftData, + excludeNodes, + extraCosts, + portals, + mall +) => { + const { floors } = mall; + let shopMap = {}; + let shopNavSet = new Set(); + const parkingSpaceByFloor = []; + const excludeSet = excludeNodes + ? excludeNodes.reduce((acc, nxt) => { + acc.add(nxt); + return acc; + }, new Set()) + : new Set(); + shopInfo.forEach(({ shopList }, floorOrder) => { + shopList.forEach((shop) => { + shopMap[shop.houseNum] = shop; + shopNavSet.add(floorOrder + "_" + shop.yaxis); + }); + }); + const noUpMap = {}; + const noDownMap = {}; + const list = mapData.buildArr + .map(({ mapData }) => mapData) + .map(({ icons, path, stairs, shopArea, floorArea, parkArea }, i) => { + const nodes = path ? path.nodes : []; + let points = []; + let routes = []; + let height = Number(floorArea ? floorArea.toHeight : 0); + nodes.forEach(({ id, list, x, y }) => { + points[id] = { + name: id, + position: [x, height + 0.1, y], + }; + list.forEach((node) => { + const needIncrease = extraCosts[`${i}_${id}_${node.id}`]; + routes.push({ + src: id, + des: node.id, + cost: needIncrease ? 1000 : node.cost, + }); + }); + }); + let facilities = []; + icons.forEach(({ navCode, facCode, Type }) => { + if (points[Number(navCode)]) + facilities.push({ + Escalator: 0, + NavPoint: Number(navCode), + Type: FacilityCodeMap[facCode], + Images: facCode, + point: points[Number(navCode)].position, + }); + }); + stairs.forEach(({ navCode, facCode, no, downState, upState }) => { + if (points[Number(navCode)]) { + const NavPoint = Number(navCode); + const key = `${i}_${NavPoint}`; + const value = ftData[key]; + if (downState) noDownMap[key] = true; + if (upState) noUpMap[key] = true; + facilities.push({ + Escalator: Number(no), + NavPoint: NavPoint, + Type: FacilityCodeMap[facCode], + Images: facCode, + point: points[Number(navCode)].position, + entrances: value ? Object.keys(value) : [], + }); + } + }); + shopArea.forEach(({ name, shopNav, xaxis, yaxis }) => { + if (shopMap[name]) { + shopMap[name].yaxis = shopNav; + shopMap[name].xaxis = [xaxis, height, yaxis]; + } + }); + parkingSpaceByFloor[i] = parkArea; + return { + facilities, + points, + routes, + }; + }); + + const facilities = list.map(({ facilities }) => facilities); + facilities.forEach((facilitiesOnSameFloor, floorOrder) => { + facilitiesOnSameFloor.forEach((facility) => { + facility.floorOrder = floorOrder; + }); + }); + + const flatFacilities = facilities.reduce((acc, nxt) => acc.concat(nxt), []); + flatFacilities.forEach((fac) => { + fac.isFac = true; + fac.floorName = floors[fac.floorOrder][1]; + fac.name = fac.floorName + defaultFacilityTypeMap[fac.Type]; + fac.xaxis = fac.point; + fac.yaxis = Number(fac.NavPoint); + fac.id = `${fac.floorOrder}_${fac.Type}_${fac.NavPoint}`; + }); + + const facilityLiftMap = flatFacilities.reduce( + (acc, nxt) => + !(nxt.Type === 0 || nxt.Type === 5) + ? acc + : { + ...acc, + [`${nxt.floorOrder}_${nxt.NavPoint}`]: nxt, + }, + {} + ); + const facilityMap = flatFacilities.reduce( + (acc, nxt) => ({ + ...acc, + [nxt.id]: nxt, + }), + {} + ); + const routes = list.map(({ routes }) => routes); + const points = list.map(({ points }) => points); + const graph = {}; + routes.forEach((route, floorOrder) => { + route.forEach(({ src, des, cost }) => { + const srcId = floorOrder + "_" + src; + const desId = floorOrder + "_" + des; + if (excludeSet.has(srcId) || excludeSet.has(desId)) return; + graph[srcId] = { + ...graph[srcId], + [desId]: cost, + }; + graph[desId] = { + ...graph[desId], + [srcId]: cost, + }; + }); + }); + const graphDt = JSON.parse(JSON.stringify(graph)); + const graphFt = JSON.parse(JSON.stringify(graph)); + let escalatorMap = flatFacilities.reduce( + (acc, { NavPoint, Escalator, Type, floorOrder }) => { + if (NavPoint !== undefined && (Type === 0 || Type === 5)) { + if (acc[`${Type}_${Escalator}`]) + acc[`${Type}_${Escalator}`].push({ + NavPoint, + floorOrder, + Type, + }); + else + acc[`${Type}_${Escalator}`] = [ + { + NavPoint, + floorOrder, + Type, + }, + ]; + acc[`${Type}_${Escalator}`].isEscalator = Type === 0; + } + return acc; + }, + {} + ); + + Object.values(ftData).forEach((value) => { + Object.entries(value).forEach(([key, dsts]) => { + dsts.forEach((dst) => { + const value = { + [dst]: 6000, + }; + attachGraphSingle({ + graph, + key, + value, + }); + attachGraphSingle({ + graph: graphFt, + key, + value, + }); + }); + }); + }); + Object.values(escalatorMap).forEach((list) => { + for (let i = 0; i < list.length - 1; i++) { + for (let j = i + 1; j < list.length; j++) { + const { floorOrder: floorOrderI, NavPoint: src } = list[i]; + const { floorOrder: floorOrderJ, NavPoint: des } = list[j]; + const leftKey = floorOrderI + "_" + src; + const rightKey = floorOrderJ + "_" + des; + const floorDiff = Math.abs(floorOrderI - floorOrderJ); + const isUp = Number(floorOrderJ) > Number(floorOrderI); + if (ftData[leftKey]) return; + if (ftData[rightKey]) return; + const leftValue = { + [rightKey]: + (isUp && noUpMap[leftKey]) || (!isUp && noDownMap[leftKey]) + ? Infinity + : list.isEscalator + ? 7000 * floorDiff + : 10000 + floorDiff * 1000, + }; + const rightValue = { + [leftKey]: + (!isUp && noUpMap[rightKey]) || (isUp && noDownMap[rightKey]) + ? Infinity + : list.isEscalator + ? 7000 * floorDiff + : 10000 + floorDiff * 1000, + }; + attachGraph({ + graph, + leftKey, + rightKey, + leftValue, + rightValue, + }); + if (list.isEscalator) + attachGraph({ + graph: graphFt, + leftKey, + rightKey, + leftValue, + rightValue, + }); + else + attachGraph({ + graph: graphDt, + leftKey, + rightKey, + leftValue, + rightValue, + }); + } + } + }); + const grahps = [graph, graphDt, graphFt]; + portals.forEach(({ leftKey, rightKey, leftValue, rightValue }) => + grahps.forEach((graph) => + attachGraph({ + graph, + leftKey, + rightKey, + leftValue, + rightValue, + }) + ) + ); + return { + points, + routes, + graph, + graphDt, + graphFt, + facilities, + flatFacilities, + excludeSet, + parkingSpaceByFloor, + facilityLiftMap, + facilityMap, + }; +}; + +const dataHelper = async (map) => { + const { + ftData = {}, + excludeNodes, + extraCosts = {}, + portals = [], + serverShopInfo, + mapData, + mall, + } = map; + + return handleData( + serverShopInfo, + mapData, + ftData, + excludeNodes, + extraCosts, + portals, + mall + ); +}; +export default dataHelper; diff --git a/getMapData.js b/getMapData.js new file mode 100644 index 0000000..3d97220 --- /dev/null +++ b/getMapData.js @@ -0,0 +1,114 @@ +import { get, post } from "./pages/map2d/util"; +import dataHelper from "./data-helper"; +let mapDataAndShop = null; +export const mall = { + isNew: true, + name: "荟聚", + city: "无锡", + code: "ef2c0bd1-6751-41be-86b7-df4b9ef49bad", + mapFileUrl: `https://hjcdn.cdn.bcebos.com/livatbeijing/Aeditor/Aeditor.json?t=${new Date().getTime()}`, + mapDataUrl: "https://huiju.mapais.com/bjyj/api/CDN/GetMapInfo", + shopInfoUrl: `https://hjcdn.cdn.bcebos.com/livatbeijing/QueryShopListForMap/QueryShopListForMap.json?t=${new Date().getTime()}`, + groundFloorIndex: 1, + floors: [ + [true, "-3F"], + [true, "-2F"], + [true, "-1F"], + [true, "1F"], + [true, "2F"], + [true, "3F"], + ], +}; +export const getMapData = async () => { + if (mapDataAndShop) return mapDataAndShop; + try { + const { mapUrl, shopUrl } = await get( + `https://hjcdn.cdn.bcebos.com/livatbeijing/config.json?t=${new Date().getTime()}` + ); + if (mapUrl) mall.mapFileUrl = mapUrl; + if (shopUrl) mall.shopInfoUrl = shopUrl; + } catch (error) { + console.log("获取config失败"); + } + + let [mapData, serverShopInfo, ...rest] = await Promise.all([ + get(mall.mapFileUrl), + get(mall.shopInfoUrl), + ...mall.floors.map((_, i) => + post(mall.mapDataUrl, { + mallCode: mall.code, + key: i, + }) + ), + ]); + mapData = JSON.parse(mapData.data.mapData)[0]; + const map2dData = rest.map(({ data: { mapData } }) => JSON.parse(mapData)); + mall.floors.forEach((floor, i) => { + floor[2] = map2dData[i]; + }); + serverShopInfo = serverShopInfo.data; + const floors = mall.floors; + console.log(mall.floors); + let shopMap = {}; + serverShopInfo.forEach(({ shopList }) => { + shopList.forEach((shop) => { + shop.floorName = floors[shop.floorOrder][1]; + shopMap[shop.houseNum] = shop; + }); + }); + mapData.buildArr.forEach(({ mapData: { path } }, i) => { + if (i <= 2) + path.nodes.forEach((node) => + node.list.forEach((adj) => { + adj.cost *= 3; + }) + ); + }); + const dataHelperResponse = await dataHelper({ + serverShopInfo, + mapData, + mall, + }); + const pMap = mapData.buildArr + .map(({ mapData: { parkArea } }, i) => { + return Object.entries( + parkArea.reduce((acc, { parkNum, shopNav }) => { + const key = `${i}_${shopNav}`; + return { + ...acc, + [key]: [...(acc[key] ? acc[key] : []), parkNum], + }; + }, {}) + ).map(([key, parkNo]) => { + const [floorOrder, pathNo] = key.split("_"); + return { floorOrder, pathNo, parkNo }; + }); + }) + .reduce((acc, nxt) => [...acc, ...nxt], []) + .reduce((acc, { floorOrder, pathNo, parkNo }) => { + if (pathNo == -1 || !pathNo) return acc; + acc = { ...acc }; + parkNo.forEach((name) => { + acc[name] = { + name, + navPoint: pathNo, + floorOrder, + floorName: floors[floorOrder][1], + xaxis: dataHelperResponse.points[floorOrder][pathNo] + ? dataHelperResponse.points[floorOrder][pathNo].position + : null, + yaxis: pathNo, + }; + }); + return acc; + }, {}); + mapDataAndShop = { + ...dataHelperResponse, + serverShopInfo, + mapData, + mall, + shopMap, + pMap, + }; + return mapDataAndShop; +}; diff --git a/images/2dmap.jpg b/images/2dmap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e686b12d9b4a25af03d646a9fe85af485a18300 GIT binary patch literal 53140 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 literal 0 HcmV?d00001 diff --git a/images/location.png b/images/location.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e731ea6a3c2d1660047e4d868bb601f3557453 GIT binary patch literal 1129 zcmV-v1eW`WP)Px(BS}O-RA>e5SW9RVK^UG{o07(2p;V}%SOnjoAcC(pYCTA74;A#{(Tj-SNd&=z zo`k9wK@U9$f+$kK9&FQs)f%-H1flq-4-l+^f<;hj8k%&+|4Ta|ZfABkv#X~an9l6~ z`2PRVn@*;`s}ankp%F=qq!#h~@6&>b6GE_rTRNPxENA?(h%G#y-j@F5X6siM3X!&F z$#r%?^bmp7egngf2)(zect`K{%vdFUD%-$BQklK$1hfee!iXY*4qEH zb%kx`KhVh(n-6Os;Vf@iu~mILAABBo(BH zsWos{RJp75TKXom>9k0=wyI`R_l|)dWj43yJs6lQOpVeJy{t@Ln$BTfDhVo>7_SIt zVx=w)ee_N_NEA&WgHG$`f~oV7a$_P)@J0#Z9OE_ikW(g~-E?l4(qA_k6QOO8(}9}G zgJ2pHq2q2`mvC;%+HIn9!_?tPxiJyC1wNM`&QS=_srtYbKcJ*@+LxYPFiSR?iSemL zH>Do>7#>mK;#9)vwEyw0Q}Ug_Dv_*HcVf-r0Mo1)6IoufrvG#H?F1#(pbCwIX=QF^ zvr=oziE^YPdjgn@JyPnugvMK|YfD#NaCX}(fL}eZfa%xXX=h9XKntqa6}pPMm)aRo z@eB-LDOA2ifr!lhj^HlE6d|uD0GfL;HNZve3n!y5sPz)K6s}3X$#&Lz9B@W2yjdGWfvP z&Bm`T6e0-L-<;{AZF1djVA#UPuf3ODXhaaGp)P)$Ufy?JL19z0^)&QvK=-uJS`n-L z@t%zZF*8Efm$(|4)2%tSwLdxda!yZ|-ry~)6_Ewu_gWsl5(Rctml||L;x*|@K04b< zK4-7PlInz>_7+ZSm5SAz^X65<~gu!WEGr>S`hg9xG{nFZ95Ts8IhaL4Ec zd&(}|#W05qx;Y!z!Uw*ATTl?`kA%=sX%Hz^Jl+_OHDB9&k)GL;BQH+ozU6QOC{V{Z zJvYwKh>m9bzQ{yoVJiPC{gp%ruDs$%5()nkB3Rxa4atEFMs(bSktiDG@*Tjl)JrnZ zOFyZ{Xw-rdkwKA=+#ZsQBq3K#CJnvp@PRyVlR<(4NgRyMUXCrvl#kE{CL=2.0 are supported. Use LegacyGLTFLoader instead.' + )); + } + return; + + } + + if (json.extensionsUsed) { + + for (let i = 0; i < json.extensionsUsed.length; ++i) { + + let extensionName = json.extensionsUsed[i]; + let extensionsRequired = json.extensionsRequired || []; + + switch (extensionName) { + + case EXTENSIONS.KHR_LIGHTS_PUNCTUAL: + extensions[extensionName] = + new GLTFLightsExtension(json); + break; + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[extensionName] = + new GLTFMaterialsUnlitExtension(); + break; + + case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: + extensions[extensionName] = + new GLTFMaterialsPbrSpecularGlossinessExtension(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[extensionName] = + new GLTFDracoMeshCompressionExtension(json, this.dracoLoader); + break; + + case EXTENSIONS.MSFT_TEXTURE_DDS: + extensions[EXTENSIONS.MSFT_TEXTURE_DDS] = + new GLTFTextureDDSExtension(this.ddsLoader); + break; + + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] = + new GLTFTextureTransformExtension(); + break; + + default: + + if (extensionsRequired.indexOf(extensionName) >= 0) { + + console.warn('THREE.GLTFLoader: Unknown extension "' + extensionName + '".'); + + } + + } + + } + + } + + let parser = new GLTFParser(json, extensions, { + + path: path || this.resourcePath || '', + crossOrigin: this.crossOrigin, + manager: this.manager, + + }); + + parser.parse(onLoad, onError); + + }, + + }; + + /* GLTFREGISTRY */ + + function GLTFRegistry() { + + let objects = {}; + + return { + + get: function (key) { + + return objects[key]; + + }, + + add: function (key, object) { + + objects[key] = object; + + }, + + remove: function (key) { + + delete objects[key]; + + }, + + removeAll: function () { + + objects = {}; + + }, + + }; + + } + + // /** ****************************** */ + // /** ******** EXTENSIONS ********** */ + // /** ****************************** */ + + // var EXTENSIONS = { + // KHR_BINARY_GLTF: 'KHR_binary_glTF', + // KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + // KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', + // KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', + // KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + // KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', + // MSFT_TEXTURE_DDS: 'MSFT_texture_dds', + // }; + + /** + * DDS Texture Extension + * + * Specification: + * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds + * + */ + function GLTFTextureDDSExtension(ddsLoader) { + + if (!ddsLoader) { + + throw new Error('THREE.GLTFLoader: Attempting to load .dds texture without importing THREE.DDSLoader'); + + } + + this.name = EXTENSIONS.MSFT_TEXTURE_DDS; + this.ddsLoader = ddsLoader; + + } + + /** + * Lights Extension + * + * Specification: PENDING + */ + function GLTFLightsExtension(json) { + + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + + let extension = (json.extensions && + json.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL]) || {}; + this.lightDefs = extension.lights || []; + + } + + GLTFLightsExtension.prototype.loadLight = function (lightIndex) { + + let lightDef = this.lightDefs[lightIndex]; + let lightNode; + + let color = new THREE.Color(0xffffff); + if (lightDef.color !== undefined) { + color.fromArray(lightDef.color); + } + + let range = lightDef.range !== undefined ? lightDef.range : 0; + + switch (lightDef.type) { + + case 'directional': + lightNode = new THREE.DirectionalLight(color); + lightNode.target.position.set(0, 0, -1); + lightNode.add(lightNode.target); + break; + + case 'point': + lightNode = new THREE.PointLight(color); + lightNode.distance = range; + break; + + case 'spot': + lightNode = new THREE.SpotLight(color); + lightNode.distance = range; + // Handle spotlight properties. + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== + undefined ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== + undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set(0, 0, -1); + lightNode.add(lightNode.target); + break; + + default: + throw new Error('THREE.GLTFLoader: Unexpected light type, "' + lightDef.type + '".'); + + } + + // Some lights (e.g. spot) default to a position other than the origin. Reset the position + // here, because node-level parsing will only override position if explicitly specified. + lightNode.position.set(0, 0, 0); + + lightNode.decay = 2; + + if (lightDef.intensity !== undefined) { + lightNode.intensity = lightDef.intensity; + } + + lightNode.name = lightDef.name || ('light_' + lightIndex); + + return Promise.resolve(lightNode); + + }; + + /** + * Unlit Materials Extension (pending) + * + * PR: https://github.com/KhronosGroup/glTF/pull/1163 + */ + function GLTFMaterialsUnlitExtension() { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + GLTFMaterialsUnlitExtension.prototype.getMaterialType = function () { + + return THREE.MeshBasicMaterial; + + }; + + GLTFMaterialsUnlitExtension.prototype.extendParams = + function (materialParams, materialDef, parser) { + + let pending = []; + + materialParams.color = new THREE.Color(1.0, 1.0, 1.0); + materialParams.opacity = 1.0; + + let metallicRoughness = materialDef.pbrMetallicRoughness; + + if (metallicRoughness) { + + if (Array.isArray(metallicRoughness.baseColorFactor)) { + + let array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray(array); + materialParams.opacity = array[3]; + + } + + if (metallicRoughness.baseColorTexture !== undefined) { + + pending.push(parser.assignTexture(materialParams, + 'map', metallicRoughness.baseColorTexture)); + + } + + } + + return Promise.all(pending); + + }; + + // /* BINARY EXTENSION */ + // var BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; + // let BINARY_EXTENSION_HEADER_LENGTH = 12; + // let BINARY_EXTENSION_CHUNK_TYPES = { + // JSON: 0x4E4F534A, + // BIN: 0x004E4942, + // }; + + function GLTFBinaryExtension(data) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + let headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH); + + this.header = { + magic: THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))), + version: headerView.getUint32(4, true), + length: headerView.getUint32(8, true), + }; + + if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) { + + throw new Error('THREE.GLTFLoader: Unsupported glTF-Binary header.'); + + } else if (this.header.version < 2.0) { + + throw new Error('THREE.GLTFLoader: Legacy binary file detected. Use LegacyGLTFLoader instead.'); + + } + + let chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH); + let chunkIndex = 0; + + while (chunkIndex < chunkView.byteLength) { + + let chunkLength = chunkView.getUint32(chunkIndex, true); + chunkIndex += 4; + + let chunkType = chunkView.getUint32(chunkIndex, true); + chunkIndex += 4; + + if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) { + + let contentArray = new Uint8Array(data, + BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength); + this.content = THREE.LoaderUtils.decodeText(contentArray); + + } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) { + + let byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice(byteOffset, byteOffset + chunkLength); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if (this.content === null) { + + throw new Error('THREE.GLTFLoader: JSON content not found.'); + + } + + } + + /** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/pull/874 + */ + function GLTFDracoMeshCompressionExtension(json, dracoLoader) { + + if (!dracoLoader) { + + throw new Error('THREE.GLTFLoader: No DRACOLoader instance provided.'); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + + } + + GLTFDracoMeshCompressionExtension.prototype.decodePrimitive = + function (primitive, parser) { + + let json = this.json; + let dracoLoader = this.dracoLoader; + let bufferViewIndex = primitive.extensions[this.name].bufferView; + let gltfAttributeMap = primitive.extensions[this.name].attributes; + let threeAttributeMap = {}; + let attributeNormalizedMap = {}; + let attributeTypeMap = {}; + + for (var attributeName in gltfAttributeMap) { + + var threeAttributeName = ATTRIBUTES[attributeName] || + attributeName.toLowerCase(); + + threeAttributeMap[threeAttributeName] = gltfAttributeMap[attributeName]; + + } + + for (attributeName in primitive.attributes) { + + var threeAttributeName = ATTRIBUTES[attributeName] || + attributeName.toLowerCase(); + + if (gltfAttributeMap[attributeName] !== undefined) { + + let accessorDef = json.accessors[primitive.attributes[attributeName]]; + let componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; + + attributeTypeMap[threeAttributeName] = componentType; + attributeNormalizedMap[threeAttributeName] = + accessorDef.normalized === true; + + } + + } + + return parser.getDependency('bufferView', + bufferViewIndex).then(function (bufferView) { + + return new Promise(function (resolve) { + + dracoLoader.decodeDracoFile(bufferView, function (geometry) { + + for (let attributeName in geometry.attributes) { + + let attribute = geometry.attributes[attributeName]; + let normalized = attributeNormalizedMap[attributeName]; + + if (normalized !== undefined) { + attribute.normalized = normalized; + } + + } + + resolve(geometry); + + }, threeAttributeMap, attributeTypeMap); + + }); + + }); + + }; + + /** + * Texture Transform Extension + * + * Specification: + */ + function GLTFTextureTransformExtension() { + + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + + } + + GLTFTextureTransformExtension.prototype.extendTexture = + function (texture, transform) { + + texture = texture.clone(); + + if (transform.offset !== undefined) { + + texture.offset.fromArray(transform.offset); + + } + + if (transform.rotation !== undefined) { + + texture.rotation = transform.rotation; + + } + + if (transform.scale !== undefined) { + + texture.repeat.fromArray(transform.scale); + + } + + if (transform.texCoord !== undefined) { + + console.warn('THREE.GLTFLoader: Custom UV sets in "' + + this.name + '" extension not yet supported.'); + + } + + texture.needsUpdate = true; + + return texture; + + }; + + /** + * Specular-Glossiness Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness + */ + function GLTFMaterialsPbrSpecularGlossinessExtension() { + + return { + + name: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS, + + specularGlossinessParams: [ + 'color', + 'map', + 'lightMap', + 'lightMapIntensity', + 'aoMap', + 'aoMapIntensity', + 'emissive', + 'emissiveIntensity', + 'emissiveMap', + 'bumpMap', + 'bumpScale', + 'normalMap', + 'displacementMap', + 'displacementScale', + 'displacementBias', + 'specularMap', + 'specular', + 'glossinessMap', + 'glossiness', + 'alphaMap', + 'envMap', + 'envMapIntensity', + 'refractionRatio', + ], + + getMaterialType: function () { + + return THREE.ShaderMaterial; + + }, + + extendParams: function (materialParams, materialDef, parser) { + + let pbrSpecularGlossiness = materialDef.extensions[this.name]; + + let shader = THREE.ShaderLib.standard; + + let uniforms = THREE.UniformsUtils.clone(shader.uniforms); + + let specularMapParsFragmentChunk = [ + '#ifdef USE_SPECULARMAP', + ' uniform sampler2D specularMap;', + '#endif', + ].join('\n'); + + let glossinessMapParsFragmentChunk = [ + '#ifdef USE_GLOSSINESSMAP', + ' uniform sampler2D glossinessMap;', + '#endif', + ].join('\n'); + + let specularMapFragmentChunk = [ + 'vec3 specularFactor = specular;', + '#ifdef USE_SPECULARMAP', + ' vec4 texelSpecular = texture2D( specularMap, vUv );', + ' texelSpecular = sRGBToLinear( texelSpecular );', + ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' specularFactor *= texelSpecular.rgb;', + '#endif', + ].join('\n'); + + let glossinessMapFragmentChunk = [ + 'float glossinessFactor = glossiness;', + '#ifdef USE_GLOSSINESSMAP', + ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', + ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' glossinessFactor *= texelGlossiness.a;', + '#endif', + ].join('\n'); + + let lightPhysicalFragmentChunk = [ + 'PhysicalMaterial material;', + 'material.diffuseColor = diffuseColor.rgb;', + 'material.specularRoughness = clamp( 1.0 - glossinessFactor, 0.04, 1.0 );', + 'material.specularColor = specularFactor.rgb;', + ].join('\n'); + + let fragmentShader = shader.fragmentShader + .replace('uniform float roughness;', 'uniform vec3 specular;') + .replace('uniform float metalness;', 'uniform float glossiness;') + .replace('#include ', specularMapParsFragmentChunk) + .replace('#include ', glossinessMapParsFragmentChunk) + .replace('#include ', specularMapFragmentChunk) + .replace('#include ', glossinessMapFragmentChunk) + .replace('#include ', lightPhysicalFragmentChunk); + + delete uniforms.roughness; + delete uniforms.metalness; + delete uniforms.roughnessMap; + delete uniforms.metalnessMap; + + uniforms.specular = { + value: new THREE.Color().setHex(0x111111), + }; + uniforms.glossiness = { + value: 0.5, + }; + uniforms.specularMap = { + value: null, + }; + uniforms.glossinessMap = { + value: null, + }; + + materialParams.vertexShader = shader.vertexShader; + materialParams.fragmentShader = fragmentShader; + materialParams.uniforms = uniforms; + materialParams.defines = { + 'STANDARD': '', + }; + + materialParams.color = new THREE.Color(1.0, 1.0, 1.0); + materialParams.opacity = 1.0; + + let pending = []; + + if (Array.isArray(pbrSpecularGlossiness.diffuseFactor)) { + + let array = pbrSpecularGlossiness.diffuseFactor; + + materialParams.color.fromArray(array); + materialParams.opacity = array[3]; + + } + + if (pbrSpecularGlossiness.diffuseTexture !== undefined) { + + pending.push(parser.assignTexture(materialParams, + 'map', pbrSpecularGlossiness.diffuseTexture)); + + } + + materialParams.emissive = new THREE.Color(0.0, 0.0, 0.0); + materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== + undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; + materialParams.specular = new THREE.Color(1.0, 1.0, 1.0); + + if (Array.isArray(pbrSpecularGlossiness.specularFactor)) { + + materialParams.specular.fromArray(pbrSpecularGlossiness.specularFactor); + + } + + if (pbrSpecularGlossiness.specularGlossinessTexture !== undefined) { + + let specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; + pending.push(parser.assignTexture(materialParams, + 'glossinessMap', specGlossMapDef)); + pending.push(parser.assignTexture(materialParams, + 'specularMap', specGlossMapDef)); + + } + + return Promise.all(pending); + + }, + + createMaterial: function (params) { + + // setup material properties based on MeshStandardMaterial for Specular-Glossiness + + let material = new THREE.ShaderMaterial({ + defines: params.defines, + vertexShader: params.vertexShader, + fragmentShader: params.fragmentShader, + uniforms: params.uniforms, + fog: true, + lights: true, + opacity: params.opacity, + transparent: params.transparent, + }); + + material.isGLTFSpecularGlossinessMaterial = true; + + material.color = params.color; + + material.map = params.map === undefined ? null : params.map; + + material.lightMap = null; + material.lightMapIntensity = 1.0; + + material.aoMap = params.aoMap === undefined ? null : params.aoMap; + material.aoMapIntensity = 1.0; + + material.emissive = params.emissive; + material.emissiveIntensity = 1.0; + material.emissiveMap = params.emissiveMap === + undefined ? null : params.emissiveMap; + + material.bumpMap = params.bumpMap === undefined ? null : params.bumpMap; + material.bumpScale = 1; + + material.normalMap = params.normalMap === + undefined ? null : params.normalMap; + + if (params.normalScale) { + material.normalScale = params.normalScale; + } + + material.displacementMap = null; + material.displacementScale = 1; + material.displacementBias = 0; + + material.specularMap = params.specularMap === + undefined ? null : params.specularMap; + material.specular = params.specular; + + material.glossinessMap = params.glossinessMap === + undefined ? null : params.glossinessMap; + material.glossiness = params.glossiness; + + material.alphaMap = null; + + material.envMap = params.envMap === undefined ? null : params.envMap; + material.envMapIntensity = 1.0; + + material.refractionRatio = 0.98; + + material.extensions.derivatives = true; + + return material; + + }, + + /** + * Clones a GLTFSpecularGlossinessMaterial instance. The ShaderMaterial.copy() method can + * copy only properties it knows about or inherits, and misses many properties that would + * normally be defined by MeshStandardMaterial. + * + * This method allows GLTFSpecularGlossinessMaterials to be cloned in the process of + * loading a glTF model, but cloning later (e.g. by the user) would require these changes + * AND also updating `.onBeforeRender` on the parent mesh. + * + * @param {THREE.ShaderMaterial} source + * @return {THREE.ShaderMaterial} + */ + cloneMaterial: function (source) { + + let target = source.clone(); + + target.isGLTFSpecularGlossinessMaterial = true; + + let params = this.specularGlossinessParams; + + for (let i = 0, il = params.length; i < il; i++) { + + let value = source[params[i]]; + target[params[i]] = (value && value.isColor) ? value.clone() : value; + + } + + return target; + + }, + + // Here's based on refreshUniformsCommon() and refreshUniformsStandard() in WebGLRenderer. + refreshUniforms: function (renderer, scene, camera, geometry, material) { + + if (material.isGLTFSpecularGlossinessMaterial !== true) { + + return; + + } + + let uniforms = material.uniforms; + let defines = material.defines; + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value.copy(material.color); + uniforms.emissive.value.copy(material.emissive) + .multiplyScalar(material.emissiveIntensity); + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + let uvScaleMap; + + if (material.map) { + + uvScaleMap = material.map; + + } else if (material.specularMap) { + + uvScaleMap = material.specularMap; + + } else if (material.displacementMap) { + + uvScaleMap = material.displacementMap; + + } else if (material.normalMap) { + + uvScaleMap = material.normalMap; + + } else if (material.bumpMap) { + + uvScaleMap = material.bumpMap; + + } else if (material.glossinessMap) { + + uvScaleMap = material.glossinessMap; + + } else if (material.alphaMap) { + + uvScaleMap = material.alphaMap; + + } else if (material.emissiveMap) { + + uvScaleMap = material.emissiveMap; + + } + + if (uvScaleMap !== undefined) { + + // backwards compatibility + if (uvScaleMap.isWebGLRenderTarget) { + + uvScaleMap = uvScaleMap.texture; + + } + + if (uvScaleMap.matrixAutoUpdate === true) { + + uvScaleMap.updateMatrix(); + + } + + uniforms.uvTransform.value.copy(uvScaleMap.matrix); + + } + + if (material.envMap) { + + uniforms.envMap.value = material.envMap; + uniforms.envMapIntensity.value = material.envMapIntensity; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = material.envMap.isCubeTexture ? -1 : 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + uniforms.maxMipLevel.value = renderer.properties + .get(material.envMap).__maxMipLevel; + + } + + uniforms.specular.value.copy(material.specular); + uniforms.glossiness.value = material.glossiness; + + uniforms.glossinessMap.value = material.glossinessMap; + + uniforms.emissiveMap.value = material.emissiveMap; + uniforms.bumpMap.value = material.bumpMap; + uniforms.normalMap.value = material.normalMap; + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + if (uniforms.glossinessMap.value !== null && + defines.USE_GLOSSINESSMAP === undefined) { + + defines.USE_GLOSSINESSMAP = ''; + // set USE_ROUGHNESSMAP to enable vUv + defines.USE_ROUGHNESSMAP = ''; + + } + + if (uniforms.glossinessMap.value === null && + defines.USE_GLOSSINESSMAP !== undefined) { + + delete defines.USE_GLOSSINESSMAP; + delete defines.USE_ROUGHNESSMAP; + + } + + }, + + }; + + } + + /** ****************************** */ + /** ******** INTERPOLATION ******* */ + /** ****************************** */ + + // Spline Interpolation + // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation + function GLTFCubicSplineInterpolant(parameterPositions, sampleValues, + sampleSize, resultBuffer) { + + THREE.Interpolant.call(this, parameterPositions, + sampleValues, sampleSize, resultBuffer); + + } + + GLTFCubicSplineInterpolant.prototype = Object.create(THREE.Interpolant.prototype); + GLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant; + + GLTFCubicSplineInterpolant.prototype.copySampleValue_ = function (index) { + + // Copies a sample value to the result buffer. See description of glTF + // CUBICSPLINE values layout in interpolate_() function below. + + let result = this.resultBuffer; + let values = this.sampleValues; + let valueSize = this.valueSize; + let offset = index * valueSize * 3 + valueSize; + + for (let i = 0; i !== valueSize; i++) { + + result[i] = values[offset + i]; + + } + + return result; + + }; + + GLTFCubicSplineInterpolant.prototype.beforeStart_ = + GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.afterEnd_ = + GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.interpolate_ = function (i1, t0, t, t1) { + + let result = this.resultBuffer; + let values = this.sampleValues; + let stride = this.valueSize; + + let stride2 = stride * 2; + let stride3 = stride * 3; + + let td = t1 - t0; + + let p = (t - t0) / td; + let pp = p * p; + let ppp = pp * p; + + let offset1 = i1 * stride3; + let offset0 = offset1 - stride3; + + let s2 = -2 * ppp + 3 * pp; + let s3 = ppp - pp; + let s0 = 1 - s2; + let s1 = s3 - pp + p; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for (let i = 0; i !== stride; i++) { + + let p0 = values[offset0 + i + stride]; // splineVertex_k + let m0 = values[offset0 + i + stride2] * td; // outTangent_k * (t_k+1 - t_k) + let p1 = values[offset1 + i + stride]; // splineVertex_k+1 + let m1 = values[offset1 + i] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + + }; + + /** ****************************** */ + /** ******** INTERNALS *********** */ + /** ****************************** */ + + /* CONSTANTS */ + + let WEBGL_CONSTANTS = { + FLOAT: 5126, + // FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + LINEAR: 9729, + REPEAT: 10497, + SAMPLER_2D: 35678, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + UNSIGNED_BYTE: 5121, + UNSIGNED_SHORT: 5123, + }; + + // var WEBGL_COMPONENT_TYPES = { + // 5120: Int8Array, + // 5121: Uint8Array, + // 5122: Int16Array, + // 5123: Uint16Array, + // 5125: Uint32Array, + // 5126: Float32Array, + // }; + + let WEBGL_FILTERS = { + 9728: THREE.NearestFilter, + 9729: THREE.LinearFilter, + 9984: THREE.NearestMipmapNearestFilter, + 9985: THREE.LinearMipmapNearestFilter, + 9986: THREE.NearestMipmapLinearFilter, + 9987: THREE.LinearMipmapLinearFilter, + }; + + let WEBGL_WRAPPINGS = { + 33071: THREE.ClampToEdgeWrapping, + 33648: THREE.MirroredRepeatWrapping, + 10497: THREE.RepeatWrapping, + }; + + let WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16, + }; + + // var ATTRIBUTES = { + // POSITION: 'position', + // NORMAL: 'normal', + // TANGENT: 'tangent', + // TEXCOORD_0: 'uv', + // TEXCOORD_1: 'uv2', + // COLOR_0: 'color', + // WEIGHTS_0: 'skinWeight', + // JOINTS_0: 'skinIndex', + // }; + + let PATH_PROPERTIES = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences', + }; + + let INTERPOLATION = { + CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: THREE.InterpolateLinear, + STEP: THREE.InterpolateDiscrete, + }; + + let ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND', + }; + + let MIME_TYPE_FORMATS = { + 'image/png': THREE.RGBAFormat, + 'image/jpeg': THREE.RGBFormat, + }; + + /* UTILITY FUNCTIONS */ + + function resolveURL(url, path) { + + // Invalid URL + if (typeof url !== 'string' || url === '') { + return ''; + } + + // Host Relative URL + if (/^https?:\/\//i.test(path) && /^\//.test(url)) { + + path = path.replace(/(^https?:\/\/[^\/]+).*/i, '$1'); + + } + + // Absolute URL http://,https://,// + if (/^(https?:)?\/\//i.test(url)) { + return url; + } + + // Data URI + if (/^data:.*,.*$/i.test(url)) { + return url; + } + + // Blob URL + if (/^blob:.*$/i.test(url)) { + return url; + } + + // Relative URL + return path + url; + + } + + let defaultMaterial; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + */ + function createDefaultMaterial() { + + defaultMaterial = defaultMaterial || new THREE.MeshStandardMaterial({ + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: THREE.FrontSide, + }); + + return defaultMaterial; + + } + + function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) { + + // Add unknown glTF extensions to an object's userData. + + for (let name in objectDef.extensions) { + + if (knownExtensions[name] === undefined) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[name] = objectDef.extensions[name]; + + } + + } + + } + + /** + * @param {THREE.Object3D|THREE.Material|THREE.BufferGeometry} object + * @param {GLTF.definition} gltfDef + */ + function assignExtrasToUserData(object, gltfDef) { + + if (gltfDef.extras !== undefined) { + + if (typeof gltfDef.extras === 'object') { + + Object.assign(object.userData, gltfDef.extras); + + } else { + + console.warn('THREE.GLTFLoader: Ignoring primitive type .extras, ' + + gltfDef.extras); + + } + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {THREE.BufferGeometry} geometry + * @param {Array} targets + * @param {GLTFParser} parser + * @return {Promise} + */ + function addMorphTargets(geometry, targets, parser) { + + let hasMorphPosition = false; + let hasMorphNormal = false; + + for (var i = 0, il = targets.length; i < il; i++) { + + var target = targets[i]; + + if (target.POSITION !== undefined) { + hasMorphPosition = true; + } + if (target.NORMAL !== undefined) { + hasMorphNormal = true; + } + + if (hasMorphPosition && hasMorphNormal) { + break; + } + + } + + if (!hasMorphPosition && !hasMorphNormal) { + return Promise.resolve(geometry); + } + + let pendingPositionAccessors = []; + let pendingNormalAccessors = []; + + for (var i = 0, il = targets.length; i < il; i++) { + + var target = targets[i]; + + if (hasMorphPosition) { + + var pendingAccessor = target.POSITION !== undefined ? + parser.getDependency('accessor', target.POSITION) : + geometry.attributes.position; + + pendingPositionAccessors.push(pendingAccessor); + + } + + if (hasMorphNormal) { + + var pendingAccessor = target.NORMAL !== undefined ? + parser.getDependency('accessor', target.NORMAL) : + geometry.attributes.normal; + + pendingNormalAccessors.push(pendingAccessor); + + } + + } + + return Promise.all([ + Promise.all(pendingPositionAccessors), + Promise.all(pendingNormalAccessors), + ]).then(function (accessors) { + + let morphPositions = accessors[0]; + let morphNormals = accessors[1]; + + // Clone morph target accessors before modifying them. + + for (var i = 0, il = morphPositions.length; i < il; i++) { + + if (geometry.attributes.position === morphPositions[i]) { + continue; + } + + morphPositions[i] = cloneBufferAttribute(morphPositions[i]); + + } + + for (var i = 0, il = morphNormals.length; i < il; i++) { + + if (geometry.attributes.normal === morphNormals[i]) { + continue; + } + + morphNormals[i] = cloneBufferAttribute(morphNormals[i]); + + } + + for (var i = 0, il = targets.length; i < il; i++) { + + let target = targets[i]; + let attributeName = 'morphTarget' + i; + + if (hasMorphPosition) { + + // Three.js morph position is absolute value. The formula is + // basePosition + // + weight0 * ( morphPosition0 - basePosition ) + // + weight1 * ( morphPosition1 - basePosition ) + // ... + // while the glTF one is relative + // basePosition + // + weight0 * glTFmorphPosition0 + // + weight1 * glTFmorphPosition1 + // ... + // then we need to convert from relative to absolute here. + + if (target.POSITION !== undefined) { + + let positionAttribute = morphPositions[i]; + positionAttribute.name = attributeName; + + let position = geometry.attributes.position; + + for (var j = 0, jl = positionAttribute.count; j < jl; j++) { + + positionAttribute.setXYZ( + j, + positionAttribute.getX(j) + position.getX(j), + positionAttribute.getY(j) + position.getY(j), + positionAttribute.getZ(j) + position.getZ(j) + ); + + } + + } + + } + + if (hasMorphNormal) { + + // see target.POSITION's comment + + if (target.NORMAL !== undefined) { + + let normalAttribute = morphNormals[i]; + normalAttribute.name = attributeName; + + let normal = geometry.attributes.normal; + + for (var j = 0, jl = normalAttribute.count; j < jl; j++) { + + normalAttribute.setXYZ( + j, + normalAttribute.getX(j) + normal.getX(j), + normalAttribute.getY(j) + normal.getY(j), + normalAttribute.getZ(j) + normal.getZ(j) + ); + + } + + } + + } + + } + + if (hasMorphPosition) { + geometry.morphAttributes.position = morphPositions; + } + if (hasMorphNormal) { + geometry.morphAttributes.normal = morphNormals; + } + + return geometry; + + }); + + } + + /** + * @param {THREE.Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ + function updateMorphTargets(mesh, meshDef) { + + mesh.updateMorphTargets(); + + if (meshDef.weights !== undefined) { + + for (var i = 0, il = meshDef.weights.length; i < il; i++) { + + mesh.morphTargetInfluences[i] = meshDef.weights[i]; + + } + + } + + // .extras has user-defined data, so check that .extras.targetNames is an array. + if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) { + + let targetNames = meshDef.extras.targetNames; + + if (mesh.morphTargetInfluences.length === targetNames.length) { + + mesh.morphTargetDictionary = {}; + + for (var i = 0, il = targetNames.length; i < il; i++) { + + mesh.morphTargetDictionary[targetNames[i]] = i; + + } + + } else { + + console.warn('THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.'); + + } + + } + + } + + function createPrimitiveKey(primitiveDef) { + + let dracoExtension = primitiveDef.extensions && + primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]; + let geometryKey; + + if (dracoExtension) { + + geometryKey = 'draco:' + dracoExtension.bufferView + + ':' + dracoExtension.indices + + ':' + createAttributesKey(dracoExtension.attributes); + + } else { + + geometryKey = primitiveDef.indices + ':' + + createAttributesKey(primitiveDef.attributes) + ':' + primitiveDef.mode; + + } + + return geometryKey; + + } + + function createAttributesKey(attributes) { + + let attributesKey = ''; + + let keys = Object.keys(attributes).sort(); + + for (let i = 0, il = keys.length; i < il; i++) { + + attributesKey += keys[i] + ':' + attributes[keys[i]] + ';'; + + } + + return attributesKey; + + } + + function cloneBufferAttribute(attribute) { + + if (attribute.isInterleavedBufferAttribute) { + + let count = attribute.count; + let itemSize = attribute.itemSize; + let array = attribute.array.slice(0, count * itemSize); + + for (let i = 0, j = 0; i < count; ++i) { + + array[j++] = attribute.getX(i); + if (itemSize >= 2) { + array[j++] = attribute.getY(i); + } + if (itemSize >= 3) { + array[j++] = attribute.getZ(i); + } + if (itemSize >= 4) { + array[j++] = attribute.getW(i); + } + + } + + return new THREE.BufferAttribute(array, itemSize, attribute.normalized); + + } + + return attribute.clone(); + + } + + /* GLTF PARSER */ + + function GLTFParser(json, extensions, options) { + + this.json = json || {}; + this.extensions = extensions || {}; + this.options = options || {}; + + // loader object cache + this.cache = new GLTFRegistry(); + + // BufferGeometry caching + this.primitiveCache = {}; + + this.textureLoader = new THREE.TextureLoader(this.options.manager); + this.textureLoader.setCrossOrigin(this.options.crossOrigin); + + this.fileLoader = new THREE.FileLoader(this.options.manager); + this.fileLoader.setResponseType('arraybuffer'); + + if (this.options.crossOrigin === 'use-credentials') { + + this.fileLoader.setWithCredentials(true); + + } + + } + + GLTFParser.prototype.parse = function (onLoad, onError) { + + let parser = this; + let json = this.json; + let extensions = this.extensions; + + // Clear the loader cache + this.cache.removeAll(); + + // Mark the special nodes/meshes in json for efficient parse + this.markDefs(); + + Promise.all([ + + this.getDependencies('scene'), + this.getDependencies('animation'), + this.getDependencies('camera'), + + ]).then(function (dependencies) { + + let result = { + scene: dependencies[0][json.scene || 0], + scenes: dependencies[0], + animations: dependencies[1], + cameras: dependencies[2], + asset: json.asset, + parser: parser, + userData: {}, + }; + + addUnknownExtensionsToUserData(extensions, result, json); + + assignExtrasToUserData(result, json); + + onLoad(result); + + }).catch(onError); + + }; + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + GLTFParser.prototype.markDefs = function () { + + let nodeDefs = this.json.nodes || []; + let skinDefs = this.json.skins || []; + let meshDefs = this.json.meshes || []; + + let meshReferences = {}; + let meshUses = {}; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for (let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) { + + let joints = skinDefs[skinIndex].joints; + + for (let i = 0, il = joints.length; i < il; i++) { + + nodeDefs[joints[i]].isBone = true; + + } + + } + + // Meshes can (and should) be reused by multiple nodes in a glTF asset. To + // avoid having more than one THREE.Mesh with the same name, count + // references and rename instances below. + // + // Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) { + + let nodeDef = nodeDefs[nodeIndex]; + + if (nodeDef.mesh !== undefined) { + + if (meshReferences[nodeDef.mesh] === undefined) { + + meshReferences[nodeDef.mesh] = meshUses[nodeDef.mesh] = 0; + + } + + meshReferences[nodeDef.mesh]++; + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if (nodeDef.skin !== undefined) { + + meshDefs[nodeDef.mesh].isSkinnedMesh = true; + + } + + } + + } + + this.json.meshReferences = meshReferences; + this.json.meshUses = meshUses; + + }; + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + GLTFParser.prototype.getDependency = function (type, index) { + + let cacheKey = type + ':' + index; + let dependency = this.cache.get(cacheKey); + + if (!dependency) { + + switch (type) { + + case 'scene': + dependency = this.loadScene(index); + break; + + case 'node': + dependency = this.loadNode(index); + break; + + case 'mesh': + dependency = this.loadMesh(index); + break; + + case 'accessor': + dependency = this.loadAccessor(index); + break; + + case 'bufferView': + dependency = this.loadBufferView(index); + break; + + case 'buffer': + dependency = this.loadBuffer(index); + break; + + case 'material': + dependency = this.loadMaterial(index); + break; + + case 'texture': + dependency = this.loadTexture(index); + break; + + case 'skin': + dependency = this.loadSkin(index); + break; + + case 'animation': + dependency = this.loadAnimation(index); + break; + + case 'camera': + dependency = this.loadCamera(index); + break; + + case 'light': + dependency = this.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL] + .loadLight(index); + break; + + default: + throw new Error('Unknown type: ' + type); + + } + + this.cache.add(cacheKey, dependency); + + } + + return dependency; + + }; + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + GLTFParser.prototype.getDependencies = function (type) { + + let dependencies = this.cache.get(type); + + if (!dependencies) { + + let parser = this; + let defs = this.json[type + (type === 'mesh' ? 'es' : 's')] || []; + + dependencies = Promise.all(defs.map(function (def, index) { + + return parser.getDependency(type, index); + + })); + + this.cache.add(type, dependencies); + + } + + return dependencies; + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBuffer = function (bufferIndex) { + + let bufferDef = this.json.buffers[bufferIndex]; + let loader = this.fileLoader; + + if (bufferDef.type && bufferDef.type !== 'arraybuffer') { + + throw new Error('THREE.GLTFLoader: ' + + bufferDef.type + ' buffer type is not supported.'); + + } + + // If present, GLB container is required to be the first buffer. + if (bufferDef.uri === undefined && bufferIndex === 0) { + + return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body); + + } + + let options = this.options; + + return new Promise(function (resolve, reject) { + + loader.load(resolveURL(bufferDef.uri, options.path), + resolve, undefined, + function () { + + reject(new Error('THREE.GLTFLoader: Failed to load buffer "' + + bufferDef.uri + '".')); + + }); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBufferView = function (bufferViewIndex) { + + let bufferViewDef = this.json.bufferViews[bufferViewIndex]; + + return this.getDependency('buffer', bufferViewDef.buffer) + .then(function (buffer) { + + let byteLength = bufferViewDef.byteLength || 0; + let byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice(byteOffset, byteOffset + byteLength); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAccessor = function (accessorIndex) { + + let parser = this; + let json = this.json; + + let accessorDef = this.json.accessors[accessorIndex]; + + if (accessorDef.bufferView === undefined && + accessorDef.sparse === undefined) { + + // Ignore empty accessors, which may be used to declare runtime + // information about attributes coming from another source (e.g. Draco + // compression extension). + return Promise.resolve(null); + + } + + let pendingBufferViews = []; + + if (accessorDef.bufferView !== undefined) { + + pendingBufferViews.push(this.getDependency('bufferView', + accessorDef.bufferView)); + + } else { + + pendingBufferViews.push(null); + + } + + if (accessorDef.sparse !== undefined) { + + pendingBufferViews.push(this.getDependency('bufferView', + accessorDef.sparse.indices.bufferView)); + pendingBufferViews.push(this.getDependency('bufferView', + accessorDef.sparse.values.bufferView)); + + } + + return Promise.all(pendingBufferViews).then(function (bufferViews) { + + let bufferView = bufferViews[0]; + + let itemSize = WEBGL_TYPE_SIZES[accessorDef.type]; + let TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType]; + + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + let elementBytes = TypedArray.BYTES_PER_ELEMENT; + let itemBytes = elementBytes * itemSize; + let byteOffset = accessorDef.byteOffset || 0; + let byteStride = accessorDef.bufferView !== + undefined ? json.bufferViews[accessorDef.bufferView].byteStride : undefined; + let normalized = accessorDef.normalized === true; + let array; + let bufferAttribute; + + // The buffer is not interleaved if the stride is the item size in bytes. + if (byteStride && byteStride !== itemBytes) { + + // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer + // This makes sure that IBA.count reflects accessor.count properly + let ibSlice = Math.floor(byteOffset / byteStride); + let ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; + let ib = parser.cache.get(ibCacheKey); + + if (!ib) { + + array = new TypedArray(bufferView, ibSlice * byteStride, + accessorDef.count * byteStride / elementBytes); + + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new THREE.InterleavedBuffer(array, byteStride / elementBytes); + + parser.cache.add(ibCacheKey, ib); + + } + + bufferAttribute = new THREE.InterleavedBufferAttribute(ib, itemSize, + (byteOffset % byteStride) / elementBytes, normalized); + + } else { + + if (bufferView === null) { + + array = new TypedArray(accessorDef.count * itemSize); + + } else { + + array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize); + + } + + bufferAttribute = new THREE.BufferAttribute(array, itemSize, normalized); + + } + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if (accessorDef.sparse !== undefined) { + + let itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + let TypedArrayIndices = + WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType]; + + let byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + let byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + + let sparseIndices = new TypedArrayIndices(bufferViews[1], + byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices); + let sparseValues = new TypedArray(bufferViews[2], + byteOffsetValues, accessorDef.sparse.count * itemSize); + + if (bufferView !== null) { + + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute.setArray(bufferAttribute.array.slice()); + + } + + for (let i = 0, il = sparseIndices.length; i < il; i++) { + + let index = sparseIndices[i]; + + bufferAttribute.setX(index, sparseValues[i * itemSize]); + if (itemSize >= 2) { + bufferAttribute.setY(index, sparseValues[i * itemSize + 1]); + } + if (itemSize >= 3) { + bufferAttribute.setZ(index, sparseValues[i * itemSize + 2]); + } + if (itemSize >= 4) { + bufferAttribute.setW(index, sparseValues[i * itemSize + 3]); + } + if (itemSize >= 5) { + throw new Error('THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.'); + } + + } + + } + + return bufferAttribute; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + GLTFParser.prototype.loadTexture = function (textureIndex) { + + let parser = this; + let json = this.json; + let options = this.options; + let textureLoader = this.textureLoader; + + // var URL = window.URL || window.webkitURL; + + let URL = {}; + + let textureDef = json.textures[textureIndex]; + + let textureExtensions = textureDef.extensions || {}; + + let source; + + if (textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]) { + + source = json.images[textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS].source]; + + } else { + + source = json.images[textureDef.source]; + + } + + let sourceURI = source.uri; + let isObjectURL = false; + + if (source.bufferView !== undefined) { + + // Load binary image data from bufferView, if provided. + + sourceURI = parser.getDependency('bufferView', source.bufferView) + .then(function (bufferView) { + + isObjectURL = true; + let blob = new Blob([bufferView], { + type: source.mimeType, + }); + sourceURI = URL.createObjectURL(blob); + return sourceURI; + + }); + + } + + return Promise.resolve(sourceURI).then(function (sourceURI) { + + // Load Texture resource. + + let loader = THREE.Loader.Handlers.get(sourceURI); + + if (!loader) { + + loader = textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS] ? + parser.extensions[EXTENSIONS.MSFT_TEXTURE_DDS].ddsLoader : + textureLoader; + + } + + return new Promise(function (resolve, reject) { + + loader.load(resolveURL(sourceURI, options.path), + resolve, undefined, reject); + + }); + + }).then(function (texture) { + + // Clean up resources and configure Texture. + + if (isObjectURL === true) { + + URL.revokeObjectURL(sourceURI); + + } + + texture.flipY = false; + + if (textureDef.name !== undefined) { + texture.name = textureDef.name; + } + + // Ignore unknown mime types, like DDS files. + if (source.mimeType in MIME_TYPE_FORMATS) { + + texture.format = MIME_TYPE_FORMATS[source.mimeType]; + + } + + let samplers = json.samplers || {}; + let sampler = samplers[textureDef.sampler] || {}; + + texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || + THREE.LinearFilter; + texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || + THREE.LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || + THREE.RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || + THREE.RepeatWrapping; + + return texture; + + }); + + }; + + /** + * Asynchronously assigns a texture to the given material parameters. + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @return {Promise} + */ + GLTFParser.prototype.assignTexture = + function (materialParams, mapName, mapDef) { + + let parser = this; + + return this.getDependency('texture', mapDef.index) + .then(function (texture) { + + if (!texture.isCompressedTexture) { + + switch (mapName) { + + case 'aoMap': + case 'emissiveMap': + case 'metalnessMap': + case 'normalMap': + case 'roughnessMap': + texture.format = THREE.RGBFormat; + break; + + } + + } + + if (parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]) { + + let transform = mapDef.extensions !== + undefined ? + mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] : undefined; + + if (transform) { + + texture = parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] + .extendTexture(texture, transform); + + } + + } + + materialParams[mapName] = texture; + + }); + + }; + + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accomodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {THREE.Object3D} mesh Mesh, Line, or Points instance. + */ + GLTFParser.prototype.assignFinalMaterial = function (mesh) { + + let geometry = mesh.geometry; + let material = mesh.material; + let extensions = this.extensions; + + let useVertexTangents = geometry.attributes.tangent !== undefined; + let useVertexColors = geometry.attributes.color !== undefined; + let useFlatShading = geometry.attributes.normal === undefined; + let useSkinning = mesh.isSkinnedMesh === true; + let useMorphTargets = Object.keys(geometry.morphAttributes).length > 0; + let useMorphNormals = useMorphTargets && + geometry.morphAttributes.normal !== undefined; + + if (mesh.isPoints) { + + var cacheKey = 'PointsMaterial:' + material.uuid; + + let pointsMaterial = this.cache.get(cacheKey); + + if (!pointsMaterial) { + + pointsMaterial = new THREE.PointsMaterial(); + THREE.Material.prototype.copy.call(pointsMaterial, material); + pointsMaterial.color.copy(material.color); + pointsMaterial.map = material.map; + pointsMaterial.lights = false; // PointsMaterial doesn't support lights yet + pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px + + this.cache.add(cacheKey, pointsMaterial); + + } + + material = pointsMaterial; + + } else if (mesh.isLine) { + + var cacheKey = 'LineBasicMaterial:' + material.uuid; + + let lineMaterial = this.cache.get(cacheKey); + + if (!lineMaterial) { + + lineMaterial = new THREE.LineBasicMaterial(); + THREE.Material.prototype.copy.call(lineMaterial, material); + lineMaterial.color.copy(material.color); + lineMaterial.lights = false; // LineBasicMaterial doesn't support lights yet + + this.cache.add(cacheKey, lineMaterial); + + } + + material = lineMaterial; + + } + + // Clone the material if it will be modified + if (useVertexTangents || useVertexColors || + useFlatShading || useSkinning || useMorphTargets) { + + var cacheKey = 'ClonedMaterial:' + material.uuid + ':'; + + if (material.isGLTFSpecularGlossinessMaterial) { + cacheKey += 'specular-glossiness:'; + } + if (useSkinning) { + cacheKey += 'skinning:'; + } + if (useVertexTangents) { + cacheKey += 'vertex-tangents:'; + } + if (useVertexColors) { + cacheKey += 'vertex-colors:'; + } + if (useFlatShading) { + cacheKey += 'flat-shading:'; + } + if (useMorphTargets) { + cacheKey += 'morph-targets:'; + } + if (useMorphNormals) { + cacheKey += 'morph-normals:'; + } + + let cachedMaterial = this.cache.get(cacheKey); + + if (!cachedMaterial) { + + cachedMaterial = material.isGLTFSpecularGlossinessMaterial ? + extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS] + .cloneMaterial(material) : + material.clone(); + + if (useSkinning) { + cachedMaterial.skinning = true; + } + if (useVertexTangents) { + cachedMaterial.vertexTangents = true; + } + if (useVertexColors) { + cachedMaterial.vertexColors = THREE.VertexColors; + } + if (useFlatShading) { + cachedMaterial.flatShading = true; + } + if (useMorphTargets) { + cachedMaterial.morphTargets = true; + } + if (useMorphNormals) { + cachedMaterial.morphNormals = true; + } + + this.cache.add(cacheKey, cachedMaterial); + + } + + material = cachedMaterial; + + } + + // workarounds for mesh and geometry + + if (material.aoMap && geometry.attributes.uv2 === + undefined && geometry.attributes.uv !== undefined) { + + console.log('THREE.GLTFLoader: Duplicating UVs to support aoMap.'); + geometry.addAttribute('uv2', + new THREE.BufferAttribute(geometry.attributes.uv.array, 2)); + + } + + if (material.isGLTFSpecularGlossinessMaterial) { + + // for GLTFSpecularGlossinessMaterial(ShaderMaterial) uniforms runtime update + mesh.onBeforeRender = extensions[ + EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].refreshUniforms; + + } + + mesh.material = material; + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMaterial = function (materialIndex) { + + let parser = this; + let json = this.json; + let extensions = this.extensions; + let materialDef = json.materials[materialIndex]; + + let materialType; + let materialParams = {}; + let materialExtensions = materialDef.extensions || {}; + + let pending = []; + + if (materialExtensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]) { + + let sgExtension = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]; + materialType = sgExtension.getMaterialType(); + pending.push(sgExtension.extendParams(materialParams, materialDef, parser)); + + } else if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) { + + let kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT]; + materialType = kmuExtension.getMaterialType(); + pending.push(kmuExtension.extendParams(materialParams, materialDef, parser)); + + } else { + + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material + + materialType = THREE.MeshStandardMaterial; + + let metallicRoughness = materialDef.pbrMetallicRoughness || {}; + + materialParams.color = new THREE.Color(1.0, 1.0, 1.0); + materialParams.opacity = 1.0; + + if (Array.isArray(metallicRoughness.baseColorFactor)) { + + let array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray(array); + materialParams.opacity = array[3]; + + } + + if (metallicRoughness.baseColorTexture !== undefined) { + + pending.push(parser.assignTexture(materialParams, + 'map', metallicRoughness.baseColorTexture)); + + } + + materialParams.metalness = metallicRoughness.metallicFactor !== + undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = + metallicRoughness.roughnessFactor !== + undefined ? metallicRoughness.roughnessFactor : 1.0; + + if (metallicRoughness.metallicRoughnessTexture !== undefined) { + + pending.push(parser.assignTexture(materialParams, + 'metalnessMap', metallicRoughness.metallicRoughnessTexture)); + pending.push(parser.assignTexture(materialParams, + 'roughnessMap', metallicRoughness.metallicRoughnessTexture)); + + } + + } + + if (materialDef.doubleSided === true) { + + materialParams.side = THREE.DoubleSide; + + } + + let alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if (alphaMode === ALPHA_MODES.BLEND) { + + materialParams.transparent = true; + + } else { + + materialParams.transparent = false; + + if (alphaMode === ALPHA_MODES.MASK) { + + materialParams.alphaTest = materialDef.alphaCutoff !== + undefined ? materialDef.alphaCutoff : 0.5; + + } + + } + + if (materialDef.normalTexture !== undefined && + materialType !== THREE.MeshBasicMaterial) { + + pending.push(parser.assignTexture(materialParams, 'normalMap', + materialDef.normalTexture)); + + materialParams.normalScale = new THREE.Vector2(1, 1); + + if (materialDef.normalTexture.scale !== undefined) { + + materialParams.normalScale.set(materialDef.normalTexture.scale, + materialDef.normalTexture.scale); + + } + + } + + if (materialDef.occlusionTexture !== undefined && + materialType !== THREE.MeshBasicMaterial) { + + pending.push(parser.assignTexture(materialParams, 'aoMap', + materialDef.occlusionTexture)); + + if (materialDef.occlusionTexture.strength !== undefined) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + + } + + } + + if (materialDef.emissiveFactor !== undefined && + materialType !== THREE.MeshBasicMaterial) { + + materialParams.emissive = new THREE.Color().fromArray(materialDef.emissiveFactor); + + } + + if (materialDef.emissiveTexture !== undefined && + materialType !== THREE.MeshBasicMaterial) { + + pending.push(parser.assignTexture(materialParams, 'emissiveMap', materialDef.emissiveTexture)); + + } + + return Promise.all(pending).then(function () { + + let material; + + if (materialType === THREE.ShaderMaterial) { + + material = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS] + .createMaterial(materialParams); + + } else { + + material = new materialType(materialParams); + + } + + if (materialDef.name !== undefined) { + material.name = materialDef.name; + } + + // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. + if (material.map) { + material.map.encoding = THREE.sRGBEncoding; + } + if (material.emissiveMap) { + material.emissiveMap.encoding = THREE.sRGBEncoding; + } + if (material.specularMap) { + material.specularMap.encoding = THREE.sRGBEncoding; + } + + assignExtrasToUserData(material, materialDef); + + if (materialDef.extensions) { + addUnknownExtensionsToUserData(extensions, material, materialDef); + } + + return material; + + }); + + }; + + /** + * @param {THREE.BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + * @return {Promise} + */ + function addPrimitiveAttributes(geometry, primitiveDef, parser) { + + let attributes = primitiveDef.attributes; + + let pending = []; + + function assignAttributeAccessor(accessorIndex, attributeName) { + + return parser.getDependency('accessor', accessorIndex) + .then(function (accessor) { + + geometry.addAttribute(attributeName, accessor); + + }); + + } + + for (let gltfAttributeName in attributes) { + + let threeAttributeName = ATTRIBUTES[gltfAttributeName] || + gltfAttributeName.toLowerCase(); + + // Skip attributes already provided by e.g. Draco extension. + if (threeAttributeName in geometry.attributes) { + continue; + } + + pending.push(assignAttributeAccessor(attributes[gltfAttributeName], + threeAttributeName)); + + } + + if (primitiveDef.indices !== undefined && !geometry.index) { + + let accessor = parser.getDependency('accessor', primitiveDef.indices) + .then(function (accessor) { + + geometry.setIndex(accessor); + + }); + + pending.push(accessor); + + } + + assignExtrasToUserData(geometry, primitiveDef); + + return Promise.all(pending).then(function () { + + return primitiveDef.targets !== undefined ? + addMorphTargets(geometry, primitiveDef.targets, parser) : + geometry; + + }); + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + GLTFParser.prototype.loadGeometries = function (primitives) { + + let parser = this; + let extensions = this.extensions; + let cache = this.primitiveCache; + + function createDracoPrimitive(primitive) { + + return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION] + .decodePrimitive(primitive, parser) + .then(function (geometry) { + + return addPrimitiveAttributes(geometry, primitive, parser); + + }); + + } + + let pending = []; + + for (let i = 0, il = primitives.length; i < il; i++) { + + let primitive = primitives[i]; + let cacheKey = createPrimitiveKey(primitive); + + // See if we've already created this geometry + let cached = cache[cacheKey]; + + if (cached) { + + // Use the cached geometry if it exists + pending.push(cached.promise); + + } else { + + var geometryPromise; + + if (primitive.extensions && + primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) { + + // Use DRACO geometry if available + geometryPromise = createDracoPrimitive(primitive); + + } else { + + // Otherwise create a new geometry + geometryPromise = addPrimitiveAttributes(new THREE.BufferGeometry(), + primitive, parser); + + } + + // Cache this geometry + cache[cacheKey] = { + primitive: primitive, + promise: geometryPromise, + }; + + pending.push(geometryPromise); + + } + + } + + return Promise.all(pending); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMesh = function (meshIndex) { + + let parser = this; + let json = this.json; + + let meshDef = json.meshes[meshIndex]; + let primitives = meshDef.primitives; + + let pending = []; + + for (let i = 0, il = primitives.length; i < il; i++) { + + let material = primitives[i].material === undefined ? + createDefaultMaterial() : + this.getDependency('material', primitives[i].material); + + pending.push(material); + + } + + return Promise.all(pending).then(function (originalMaterials) { + + return parser.loadGeometries(primitives).then(function (geometries) { + + let meshes = []; + + for (var i = 0, il = geometries.length; i < il; i++) { + + let geometry = geometries[i]; + let primitive = primitives[i]; + + // 1. create Mesh + + var mesh; + + let material = originalMaterials[i]; + + if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || + primitive.mode === undefined) { + + // .isSkinnedMesh isn't in glTF spec. See .markDefs() + mesh = meshDef.isSkinnedMesh === true ? + new THREE.SkinnedMesh(geometry, material) : + new THREE.Mesh(geometry, material); + + if (mesh.isSkinnedMesh === true && !mesh.geometry.attributes.skinWeight.normalized) { + + // we normalize floating point skin weight array to fix malformed assets (see #15319) + // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs + mesh.normalizeSkinWeights(); + + } + + if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) { + + mesh.drawMode = THREE.TriangleStripDrawMode; + + } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) { + + mesh.drawMode = THREE.TriangleFanDrawMode; + + } + + } else if (primitive.mode === WEBGL_CONSTANTS.LINES) { + + mesh = new THREE.LineSegments(geometry, material); + + } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) { + + mesh = new THREE.Line(geometry, material); + + } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) { + + mesh = new THREE.LineLoop(geometry, material); + + } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) { + + mesh = new THREE.Points(geometry, material); + + } else { + + throw new Error('THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode); + + } + + if (Object.keys(mesh.geometry.morphAttributes).length > 0) { + + updateMorphTargets(mesh, meshDef); + + } + + mesh.name = meshDef.name || ('mesh_' + meshIndex); + + if (geometries.length > 1) { + mesh.name += '_' + i; + } + + assignExtrasToUserData(mesh, meshDef); + + parser.assignFinalMaterial(mesh); + + meshes.push(mesh); + + } + + if (meshes.length === 1) { + + return meshes[0]; + + } + + let group = new THREE.Group(); + + for (var i = 0, il = meshes.length; i < il; i++) { + + group.add(meshes[i]); + + } + + return group; + + }); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + GLTFParser.prototype.loadCamera = function (cameraIndex) { + + let camera; + let cameraDef = this.json.cameras[cameraIndex]; + let params = cameraDef[cameraDef.type]; + + if (!params) { + + console.warn('THREE.GLTFLoader: Missing camera parameters.'); + return; + + } + + if (cameraDef.type === 'perspective') { + + camera = new THREE.PerspectiveCamera( + THREE.Math.radToDeg(params.yfov), + params.aspectRatio || 1, + params.znear || 1, + params.zfar || 2e6); + + } else if (cameraDef.type === 'orthographic') { + + camera = new THREE.OrthographicCamera(params.xmag / -2, params.xmag / 2, + params.ymag / 2, params.ymag / -2, params.znear, params.zfar); + + } + + if (cameraDef.name !== undefined) { + camera.name = cameraDef.name; + } + + assignExtrasToUserData(camera, cameraDef); + + return Promise.resolve(camera); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + GLTFParser.prototype.loadSkin = function (skinIndex) { + + let skinDef = this.json.skins[skinIndex]; + + let skinEntry = { + joints: skinDef.joints, + }; + + if (skinDef.inverseBindMatrices === undefined) { + + return Promise.resolve(skinEntry); + + } + + return this.getDependency('accessor', skinDef.inverseBindMatrices) + .then(function (accessor) { + + skinEntry.inverseBindMatrices = accessor; + + return skinEntry; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAnimation = function (animationIndex) { + + let json = this.json; + + let animationDef = json.animations[animationIndex]; + + let pendingNodes = []; + let pendingInputAccessors = []; + let pendingOutputAccessors = []; + let pendingSamplers = []; + let pendingTargets = []; + + for (let i = 0, il = animationDef.channels.length; i < il; i++) { + + let channel = animationDef.channels[i]; + let sampler = animationDef.samplers[channel.sampler]; + let target = channel.target; + let name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. + let input = animationDef.parameters !== + undefined ? animationDef.parameters[sampler.input] : sampler.input; + let output = animationDef.parameters !== + undefined ? animationDef.parameters[sampler.output] : sampler.output; + + pendingNodes.push(this.getDependency('node', name)); + pendingInputAccessors.push(this.getDependency('accessor', input)); + pendingOutputAccessors.push(this.getDependency('accessor', output)); + pendingSamplers.push(sampler); + pendingTargets.push(target); + + } + + return Promise.all([ + + Promise.all(pendingNodes), + Promise.all(pendingInputAccessors), + Promise.all(pendingOutputAccessors), + Promise.all(pendingSamplers), + Promise.all(pendingTargets), + + ]).then(function (dependencies) { + + let nodes = dependencies[0]; + let inputAccessors = dependencies[1]; + let outputAccessors = dependencies[2]; + let samplers = dependencies[3]; + let targets = dependencies[4]; + + let tracks = []; + + for (let i = 0, il = nodes.length; i < il; i++) { + + let node = nodes[i]; + let inputAccessor = inputAccessors[i]; + let outputAccessor = outputAccessors[i]; + let sampler = samplers[i]; + let target = targets[i]; + + if (node === undefined) { + continue; + } + + node.updateMatrix(); + node.matrixAutoUpdate = true; + + var TypedKeyframeTrack; + + switch (PATH_PROPERTIES[target.path]) { + + case PATH_PROPERTIES.weights: + + TypedKeyframeTrack = THREE.NumberKeyframeTrack; + break; + + case PATH_PROPERTIES.rotation: + + TypedKeyframeTrack = THREE.QuaternionKeyframeTrack; + break; + + case PATH_PROPERTIES.position: + case PATH_PROPERTIES.scale: + default: + + TypedKeyframeTrack = THREE.VectorKeyframeTrack; + break; + + } + + let targetName = node.name ? node.name : node.uuid; + + let interpolation = sampler.interpolation !== + undefined ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear; + + var targetNames = []; + + if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) { + + // Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh. + node.traverse(function (object) { + + if (object.isMesh === true && object.morphTargetInfluences) { + + targetNames.push(object.name ? object.name : object.uuid); + + } + + }); + + } else { + + targetNames.push(targetName); + + } + + let outputArray = outputAccessor.array; + + if (outputAccessor.normalized) { + + var scale; + + if (outputArray.constructor === Int8Array) { + + scale = 1 / 127; + + } else if (outputArray.constructor === Uint8Array) { + + scale = 1 / 255; + + } else if (outputArray.constructor === Int16Array) { + + scale = 1 / 32767; + + } else if (outputArray.constructor === Uint16Array) { + + scale = 1 / 65535; + + } else { + + throw new Error('THREE.GLTFLoader: Unsupported output accessor component type.'); + + } + + let scaled = new Float32Array(outputArray.length); + + for (var j = 0, jl = outputArray.length; j < jl; j++) { + + scaled[j] = outputArray[j] * scale; + + } + + outputArray = scaled; + + } + + for (var j = 0, jl = targetNames.length; j < jl; j++) { + + let track = new TypedKeyframeTrack( + targetNames[j] + '.' + PATH_PROPERTIES[target.path], + inputAccessor.array, + outputArray, + interpolation + ); + + // Override interpolation with custom factory method. + if (sampler.interpolation === 'CUBICSPLINE') { + + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) { + + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. + + return new GLTFCubicSplineInterpolant(this.times, this.values, + this.getValueSize() / 3, result); + + }; + + // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + + } + + tracks.push(track); + + } + + } + + let name = animationDef.name !== + undefined ? animationDef.name : 'animation_' + animationIndex; + + return new THREE.AnimationClip(name, undefined, tracks); + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + GLTFParser.prototype.loadNode = function (nodeIndex) { + + let json = this.json; + let extensions = this.extensions; + let parser = this; + + let meshReferences = json.meshReferences; + let meshUses = json.meshUses; + + let nodeDef = json.nodes[nodeIndex]; + + return (function () { + + let pending = []; + + if (nodeDef.mesh !== undefined) { + + pending.push(parser.getDependency('mesh', nodeDef.mesh).then(function (mesh) { + + let node; + + if (meshReferences[nodeDef.mesh] > 1) { + + let instanceNum = meshUses[nodeDef.mesh]++; + + node = mesh.clone(); + node.name += '_instance_' + instanceNum; + + // onBeforeRender copy for Specular-Glossiness + node.onBeforeRender = mesh.onBeforeRender; + + for (let i = 0, il = node.children.length; i < il; i++) { + + node.children[i].name += '_instance_' + instanceNum; + node.children[i].onBeforeRender = mesh.children[i].onBeforeRender; + + } + + } else { + + node = mesh; + + } + + // if weights are provided on the node, override weights on the mesh. + if (nodeDef.weights !== undefined) { + + node.traverse(function (o) { + + if (!o.isMesh) { + return; + } + + for (let i = 0, il = nodeDef.weights.length; i < il; i++) { + + o.morphTargetInfluences[i] = nodeDef.weights[i]; + + } + + }); + + } + + return node; + + })); + + } + + if (nodeDef.camera !== undefined) { + + pending.push(parser.getDependency('camera', nodeDef.camera)); + + } + + if (nodeDef.extensions && + nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL] && + nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light !== undefined) { + + pending.push(parser.getDependency('light', + nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light)); + + } + + return Promise.all(pending); + + }()).then(function (objects) { + + let node; + + // .isBone isn't in glTF spec. See .markDefs + if (nodeDef.isBone === true) { + + node = new THREE.Bone(); + + } else if (objects.length > 1) { + + node = new THREE.Group(); + + } else if (objects.length === 1) { + + node = objects[0]; + + } else { + + node = new THREE.Object3D(); + + } + + if (node !== objects[0]) { + + for (let i = 0, il = objects.length; i < il; i++) { + + node.add(objects[i]); + + } + + } + + if (nodeDef.name !== undefined) { + + node.userData.name = nodeDef.name; + node.name = THREE.PropertyBinding.sanitizeNodeName(nodeDef.name); + + } + + assignExtrasToUserData(node, nodeDef); + + if (nodeDef.extensions) { + addUnknownExtensionsToUserData(extensions, node, nodeDef); + } + + if (nodeDef.matrix !== undefined) { + + let matrix = new THREE.Matrix4(); + matrix.fromArray(nodeDef.matrix); + node.applyMatrix(matrix); + + } else { + + if (nodeDef.translation !== undefined) { + + node.position.fromArray(nodeDef.translation); + + } + + if (nodeDef.rotation !== undefined) { + + node.quaternion.fromArray(nodeDef.rotation); + + } + + if (nodeDef.scale !== undefined) { + + node.scale.fromArray(nodeDef.scale); + + } + + } + + return node; + + }); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + GLTFParser.prototype.loadScene = (function () { + + // scene node hierachy builder + + function buildNodeHierachy(nodeId, parentObject, json, parser) { + + let nodeDef = json.nodes[nodeId]; + + return parser.getDependency('node', nodeId).then(function (node) { + + if (nodeDef.skin === undefined) { + return node; + } + + // build skeleton here as well + + let skinEntry; + + return parser.getDependency('skin', nodeDef.skin).then(function (skin) { + + skinEntry = skin; + + let pendingJoints = []; + + for (let i = 0, il = skinEntry.joints.length; i < il; i++) { + + pendingJoints.push(parser.getDependency('node', skinEntry.joints[i])); + + } + + return Promise.all(pendingJoints); + + }).then(function (jointNodes) { + + node.traverse(function (mesh) { + + if (!mesh.isMesh) { + return; + } + + let bones = []; + let boneInverses = []; + + for (let j = 0, jl = jointNodes.length; j < jl; j++) { + + let jointNode = jointNodes[j]; + + if (jointNode) { + + bones.push(jointNode); + + let mat = new THREE.Matrix4(); + + if (skinEntry.inverseBindMatrices !== undefined) { + + mat.fromArray(skinEntry.inverseBindMatrices.array, j * 16); + + } + + boneInverses.push(mat); + + } else { + + console.warn('THREE.GLTFLoader: Joint "%s" could not be found.', + skinEntry.joints[j]); + + } + + } + + mesh.bind(new THREE.Skeleton(bones, boneInverses), mesh.matrixWorld); + + }); + + return node; + + }); + + }).then(function (node) { + + // build node hierachy + + parentObject.add(node); + + let pending = []; + + if (nodeDef.children) { + + let children = nodeDef.children; + + for (let i = 0, il = children.length; i < il; i++) { + + let child = children[i]; + pending.push(buildNodeHierachy(child, node, json, parser)); + + } + + } + + return Promise.all(pending); + + }); + + } + + return function loadScene(sceneIndex) { + + let json = this.json; + let extensions = this.extensions; + let sceneDef = this.json.scenes[sceneIndex]; + let parser = this; + + let scene = new THREE.Scene(); + if (sceneDef.name !== undefined) { + scene.name = sceneDef.name; + } + + assignExtrasToUserData(scene, sceneDef); + + if (sceneDef.extensions) { + addUnknownExtensionsToUserData(extensions, scene, sceneDef); + } + + let nodeIds = sceneDef.nodes || []; + + let pending = []; + + for (let i = 0, il = nodeIds.length; i < il; i++) { + + pending.push(buildNodeHierachy(nodeIds[i], scene, json, parser)); + + } + + return Promise.all(pending).then(function () { + + return scene; + + }); + + }; + + }()); + + return GLTFLoader; + + })(); +} \ No newline at end of file diff --git a/miniprogram_npm/ais-h5-location/index.js b/miniprogram_npm/ais-h5-location/index.js new file mode 100644 index 0000000..1e1b65f --- /dev/null +++ b/miniprogram_npm/ais-h5-location/index.js @@ -0,0 +1,14 @@ +module.exports = (function() { +var __MODS__ = {}; +var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; }; +var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; +var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; +var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; +__DEFINE__(1657198795609, function(require, module, exports) { +var __TEMP__ = require('crypto-js');var enc = __TEMP__['enc'];var pad = __TEMP__['pad'];var AES = __TEMP__['AES'];const{encrypt,decrypt}=AES,encUtf8=enc.Utf8,padPkcs7=pad.Pkcs7,AESKey=4662573785223888,AESIv=0x9092593b7ae34,createrandkey=a=>{var t,o="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",n=o.length;let r="";for(let e=0;e{a=encUtf8.parse(a),t=encUtf8.parse(t);let o=encrypt(e,a,{iv:t,padding:padPkcs7});return o.toString()},decjson=(e,a=AESKey,t=AESIv)=>{a=encUtf8.parse(a),t=encUtf8.parse(t);let o=decrypt(e,a,{iv:t,padding:padPkcs7});return o.toString(encUtf8)},encparam=function(e,a,t){e=aesEncrypt(JSON.stringify(e),a,t),a=createrandkey(16);return{encparam:aesEncrypt(e,a,t),enckey:a}};let intervalTimer=null,beacons=null;const fakeImei=createrandkey(16),host="https://aispace.baidu.com",getProjectBasicInfo=o=>new Promise((a,t)=>{var e=encparam({project_id:o});wx.request({url:host+"/aispace/api/location/getprojectinfo",method:"GET",data:e,success:e=>{0===e.data.errno?e.data.data&&0{let o="";if(a.length{const{latitude:t,longitude:o}=e;e=[t,o,"wgs84"].join("|");let s="",n={ver:"1.0",trace:!1,prod:"test_loc_api",src:"baidu_loc_api",key:"5LONsKCadGA8T5r7gRPxoue37pFEXm8A",body:[{accesstype:3,imei:fakeImei,blelp:e,ctime:Math.ceil((new Date).getTime()/1e3).toString()}]};return a.forEach((e,a)=>{var t=e.major.toString(16).toUpperCase(),o=e.minor.toString(16).toUpperCase();const n=[e.uuid.toUpperCase(),addAddtionCodeLength(t),addAddtionCodeLength(o),e.accuracy].join("_"),r=Math.abs(e.rssi),c=Math.ceil((new Date).getTime()/1e3);s+=0{wx.startBeaconDiscovery({uuids:e,success:e=>{console.log("startBeaconDiscovery success >>>>>>")},fail:e=>{a(e)}})},realGetLocation=(a,e,t,o)=>{intervalTimer=setInterval(()=>{var e;!beacons||((e=processRequestQuery(a,beacons)).body[0].bleios||e.body[0].bleand)&&(e=encparam(e),wx.request({url:host+"/aispace/api/location/encrypt",method:"GET",data:e,success:e=>{e.data.data&&0{o(e)}}))},e)},getLocation=e=>{const{ak:a,intervalTime:t=1e3,successCb:o,failCb:n}=e;getProjectBasicInfo(a).then(e=>{startBeaconDiscovery(e.uuid,n),wx.onBeaconUpdate(e=>{beacons=e.beacons,console.log("onBeaconUpdate >>>>>>>>",beacons)}),realGetLocation(e,t,o,n)},e=>{n(e)})},stopBeaconScan=()=>{wx.stopBeaconDiscovery(),intervalTimer&&clearInterval(intervalTimer)};if (!exports.__esModule) Object.defineProperty(exports, "__esModule", { value: true });Object.defineProperty(exports, 'getLocation', { enumerable: true, configurable: true, get: function() { return getLocation; } });Object.defineProperty(exports, 'stopBeaconScan', { enumerable: true, configurable: true, get: function() { return stopBeaconScan; } }); + +}, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); }) +return __REQUIRE__(1657198795609); +})() +//miniprogram-npm-outsideDeps=["crypto-js"] +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/miniprogram_npm/ais-h5-location/index.js.map b/miniprogram_npm/ais-h5-location/index.js.map new file mode 100644 index 0000000..2a04150 --- /dev/null +++ b/miniprogram_npm/ais-h5-location/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.es.js"],"names":[],"mappings":";;;;;;;AAAA;AACA","file":"index.js","sourcesContent":["var __TEMP__ = require('crypto-js');var enc = __TEMP__['enc'];var pad = __TEMP__['pad'];var AES = __TEMP__['AES'];const{encrypt,decrypt}=AES,encUtf8=enc.Utf8,padPkcs7=pad.Pkcs7,AESKey=4662573785223888,AESIv=0x9092593b7ae34,createrandkey=a=>{var t,o=\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\",n=o.length;let r=\"\";for(let e=0;e{a=encUtf8.parse(a),t=encUtf8.parse(t);let o=encrypt(e,a,{iv:t,padding:padPkcs7});return o.toString()},decjson=(e,a=AESKey,t=AESIv)=>{a=encUtf8.parse(a),t=encUtf8.parse(t);let o=decrypt(e,a,{iv:t,padding:padPkcs7});return o.toString(encUtf8)},encparam=function(e,a,t){e=aesEncrypt(JSON.stringify(e),a,t),a=createrandkey(16);return{encparam:aesEncrypt(e,a,t),enckey:a}};let intervalTimer=null,beacons=null;const fakeImei=createrandkey(16),host=\"https://aispace.baidu.com\",getProjectBasicInfo=o=>new Promise((a,t)=>{var e=encparam({project_id:o});wx.request({url:host+\"/aispace/api/location/getprojectinfo\",method:\"GET\",data:e,success:e=>{0===e.data.errno?e.data.data&&0{let o=\"\";if(a.length{const{latitude:t,longitude:o}=e;e=[t,o,\"wgs84\"].join(\"|\");let s=\"\",n={ver:\"1.0\",trace:!1,prod:\"test_loc_api\",src:\"baidu_loc_api\",key:\"5LONsKCadGA8T5r7gRPxoue37pFEXm8A\",body:[{accesstype:3,imei:fakeImei,blelp:e,ctime:Math.ceil((new Date).getTime()/1e3).toString()}]};return a.forEach((e,a)=>{var t=e.major.toString(16).toUpperCase(),o=e.minor.toString(16).toUpperCase();const n=[e.uuid.toUpperCase(),addAddtionCodeLength(t),addAddtionCodeLength(o),e.accuracy].join(\"_\"),r=Math.abs(e.rssi),c=Math.ceil((new Date).getTime()/1e3);s+=0{wx.startBeaconDiscovery({uuids:e,success:e=>{console.log(\"startBeaconDiscovery success >>>>>>\")},fail:e=>{a(e)}})},realGetLocation=(a,e,t,o)=>{intervalTimer=setInterval(()=>{var e;!beacons||((e=processRequestQuery(a,beacons)).body[0].bleios||e.body[0].bleand)&&(e=encparam(e),wx.request({url:host+\"/aispace/api/location/encrypt\",method:\"GET\",data:e,success:e=>{e.data.data&&0{o(e)}}))},e)},getLocation=e=>{const{ak:a,intervalTime:t=1e3,successCb:o,failCb:n}=e;getProjectBasicInfo(a).then(e=>{startBeaconDiscovery(e.uuid,n),wx.onBeaconUpdate(e=>{beacons=e.beacons,console.log(\"onBeaconUpdate >>>>>>>>\",beacons)}),realGetLocation(e,t,o,n)},e=>{n(e)})},stopBeaconScan=()=>{wx.stopBeaconDiscovery(),intervalTimer&&clearInterval(intervalTimer)};if (!exports.__esModule) Object.defineProperty(exports, \"__esModule\", { value: true });Object.defineProperty(exports, 'getLocation', { enumerable: true, configurable: true, get: function() { return getLocation; } });Object.defineProperty(exports, 'stopBeaconScan', { enumerable: true, configurable: true, get: function() { return stopBeaconScan; } });\n"]} \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/CONTRIBUTING.md b/miniprogram_npm/crypto-js/CONTRIBUTING.md new file mode 100644 index 0000000..09bf774 --- /dev/null +++ b/miniprogram_npm/crypto-js/CONTRIBUTING.md @@ -0,0 +1,28 @@ +# Contribution + +# Git Flow + +The crypto-js project uses [git flow](https://github.com/nvie/gitflow) to manage branches. +Do your changes on the `develop` or even better on a `feature/*` branch. Don't do any changes on the `master` branch. + +# Pull request + +Target your pull request on `develop` branch. Other pull request won't be accepted. + +# How to build + +1. Clone + +2. Run + + ```sh + npm install + ``` + +3. Run + + ```sh + npm run build + ``` + +4. Check `build` folder \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/LICENSE b/miniprogram_npm/crypto-js/LICENSE new file mode 100644 index 0000000..b0828e5 --- /dev/null +++ b/miniprogram_npm/crypto-js/LICENSE @@ -0,0 +1,24 @@ +# License + +[The MIT License (MIT)](http://opensource.org/licenses/MIT) + +Copyright (c) 2009-2013 Jeff Mott +Copyright (c) 2013-2016 Evan Vosberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/miniprogram_npm/crypto-js/README.md b/miniprogram_npm/crypto-js/README.md new file mode 100644 index 0000000..23795aa --- /dev/null +++ b/miniprogram_npm/crypto-js/README.md @@ -0,0 +1,261 @@ +# crypto-js [![Build Status](https://travis-ci.org/brix/crypto-js.svg?branch=develop)](https://travis-ci.org/brix/crypto-js) + +JavaScript library of crypto standards. + +## Node.js (Install) + +Requirements: + +- Node.js +- npm (Node.js package manager) + +```bash +npm install crypto-js +``` + +### Usage + +ES6 import for typical API call signing use case: + +```javascript +import sha256 from 'crypto-js/sha256'; +import hmacSHA512 from 'crypto-js/hmac-sha512'; +import Base64 from 'crypto-js/enc-base64'; + +const message, nonce, path, privateKey; // ... +const hashDigest = sha256(nonce + message); +const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey)); +``` + +Modular include: + +```javascript +var AES = require("crypto-js/aes"); +var SHA256 = require("crypto-js/sha256"); +... +console.log(SHA256("Message")); +``` + +Including all libraries, for access to extra methods: + +```javascript +var CryptoJS = require("crypto-js"); +console.log(CryptoJS.HmacSHA1("Message", "Key")); +``` + +## Client (browser) + +Requirements: + +- Node.js +- Bower (package manager for frontend) + +```bash +bower install crypto-js +``` + +### Usage + +Modular include: + +```javascript +require.config({ + packages: [ + { + name: 'crypto-js', + location: 'path-to/bower_components/crypto-js', + main: 'index' + } + ] +}); + +require(["crypto-js/aes", "crypto-js/sha256"], function (AES, SHA256) { + console.log(SHA256("Message")); +}); +``` + +Including all libraries, for access to extra methods: + +```javascript +// Above-mentioned will work or use this simple form +require.config({ + paths: { + 'crypto-js': 'path-to/bower_components/crypto-js/crypto-js' + } +}); + +require(["crypto-js"], function (CryptoJS) { + console.log(CryptoJS.HmacSHA1("Message", "Key")); +}); +``` + +### Usage without RequireJS + +```html + + +``` + +## API + +See: https://cryptojs.gitbook.io/docs/ + +### AES Encryption + +#### Plain text encryption + +```javascript +var CryptoJS = require("crypto-js"); + +// Encrypt +var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123').toString(); + +// Decrypt +var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key 123'); +var originalText = bytes.toString(CryptoJS.enc.Utf8); + +console.log(originalText); // 'my message' +``` + +#### Object encryption + +```javascript +var CryptoJS = require("crypto-js"); + +var data = [{id: 1}, {id: 2}] + +// Encrypt +var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123').toString(); + +// Decrypt +var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key 123'); +var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); + +console.log(decryptedData); // [{id: 1}, {id: 2}] +``` + +### List of modules + + +- ```crypto-js/core``` +- ```crypto-js/x64-core``` +- ```crypto-js/lib-typedarrays``` + +--- + +- ```crypto-js/md5``` +- ```crypto-js/sha1``` +- ```crypto-js/sha256``` +- ```crypto-js/sha224``` +- ```crypto-js/sha512``` +- ```crypto-js/sha384``` +- ```crypto-js/sha3``` +- ```crypto-js/ripemd160``` + +--- + +- ```crypto-js/hmac-md5``` +- ```crypto-js/hmac-sha1``` +- ```crypto-js/hmac-sha256``` +- ```crypto-js/hmac-sha224``` +- ```crypto-js/hmac-sha512``` +- ```crypto-js/hmac-sha384``` +- ```crypto-js/hmac-sha3``` +- ```crypto-js/hmac-ripemd160``` + +--- + +- ```crypto-js/pbkdf2``` + +--- + +- ```crypto-js/aes``` +- ```crypto-js/tripledes``` +- ```crypto-js/rc4``` +- ```crypto-js/rabbit``` +- ```crypto-js/rabbit-legacy``` +- ```crypto-js/evpkdf``` + +--- + +- ```crypto-js/format-openssl``` +- ```crypto-js/format-hex``` + +--- + +- ```crypto-js/enc-latin1``` +- ```crypto-js/enc-utf8``` +- ```crypto-js/enc-hex``` +- ```crypto-js/enc-utf16``` +- ```crypto-js/enc-base64``` + +--- + +- ```crypto-js/mode-cfb``` +- ```crypto-js/mode-ctr``` +- ```crypto-js/mode-ctr-gladman``` +- ```crypto-js/mode-ofb``` +- ```crypto-js/mode-ecb``` + +--- + +- ```crypto-js/pad-pkcs7``` +- ```crypto-js/pad-ansix923``` +- ```crypto-js/pad-iso10126``` +- ```crypto-js/pad-iso97971``` +- ```crypto-js/pad-zeropadding``` +- ```crypto-js/pad-nopadding``` + + +## Release notes + +### 4.1.1 + +Fix module order in bundled release. + +Include the browser field in the released package.json. + +### 4.1.0 + +Added url safe variant of base64 encoding. [357](https://github.com/brix/crypto-js/pull/357) + +Avoid webpack to add crypto-browser package. [364](https://github.com/brix/crypto-js/pull/364) + +### 4.0.0 + +This is an update including breaking changes for some environments. + +In this version `Math.random()` has been replaced by the random methods of the native crypto module. + +For this reason CryptoJS might not run in some JavaScript environments without native crypto module. Such as IE 10 or before or React Native. + +### 3.3.0 + +Rollback, `3.3.0` is the same as `3.1.9-1`. + +The move of using native secure crypto module will be shifted to a new `4.x.x` version. As it is a breaking change the impact is too big for a minor release. + +### 3.2.1 + +The usage of the native crypto module has been fixed. The import and access of the native crypto module has been improved. + +### 3.2.0 + +In this version `Math.random()` has been replaced by the random methods of the native crypto module. + +For this reason CryptoJS might does not run in some JavaScript environments without native crypto module. Such as IE 10 or before. + +If it's absolute required to run CryptoJS in such an environment, stay with `3.1.x` version. Encrypting and decrypting stays compatible. But keep in mind `3.1.x` versions still use `Math.random()` which is cryptographically not secure, as it's not random enough. + +This version came along with `CRITICAL` `BUG`. + +DO NOT USE THIS VERSION! Please, go for a newer version! + +### 3.1.x + +The `3.1.x` are based on the original CryptoJS, wrapped in CommonJS modules. + + diff --git a/miniprogram_npm/crypto-js/aes.js b/miniprogram_npm/crypto-js/aes.js new file mode 100644 index 0000000..166e3ea --- /dev/null +++ b/miniprogram_npm/crypto-js/aes.js @@ -0,0 +1,234 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + var t; + + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + return CryptoJS.AES; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/bower.json b/miniprogram_npm/crypto-js/bower.json new file mode 100644 index 0000000..1e12fdc --- /dev/null +++ b/miniprogram_npm/crypto-js/bower.json @@ -0,0 +1,39 @@ +{ + "name": "crypto-js", + "version": "4.1.1", + "description": "JavaScript library of crypto standards.", + "license": "MIT", + "homepage": "http://github.com/brix/crypto-js", + "repository": { + "type": "git", + "url": "http://github.com/brix/crypto-js.git" + }, + "keywords": [ + "security", + "crypto", + "Hash", + "MD5", + "SHA1", + "SHA-1", + "SHA256", + "SHA-256", + "RC4", + "Rabbit", + "AES", + "DES", + "PBKDF2", + "HMAC", + "OFB", + "CFB", + "CTR", + "CBC", + "Base64", + "Base64url" + ], + "main": "index.js", + "dependencies": {}, + "browser": { + "crypto": false + }, + "ignore": [] +} diff --git a/miniprogram_npm/crypto-js/cipher-core.js b/miniprogram_npm/crypto-js/cipher-core.js new file mode 100644 index 0000000..c560c9e --- /dev/null +++ b/miniprogram_npm/crypto-js/cipher-core.js @@ -0,0 +1,890 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./evpkdf")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./evpkdf"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var block; + + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + var modeCreator; + + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + var finalProcessedBlocks; + + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + var wordArray; + + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + var salt; + + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/core.js b/miniprogram_npm/crypto-js/core.js new file mode 100644 index 0000000..e3a498b --- /dev/null +++ b/miniprogram_npm/crypto-js/core.js @@ -0,0 +1,807 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof global !== 'undefined' && global.crypto) { + crypto = global.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && typeof require === 'function') { + try { + crypto = require('crypto'); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/crypto-js.js b/miniprogram_npm/crypto-js/crypto-js.js new file mode 100644 index 0000000..27f0a62 --- /dev/null +++ b/miniprogram_npm/crypto-js/crypto-js.js @@ -0,0 +1,6191 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /*globals window, global, require*/ + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + + var crypto; + + // Native crypto from window (Browser) + if (typeof window !== 'undefined' && window.crypto) { + crypto = window.crypto; + } + + // Native crypto in web worker (Browser) + if (typeof self !== 'undefined' && self.crypto) { + crypto = self.crypto; + } + + // Native crypto from worker + if (typeof globalThis !== 'undefined' && globalThis.crypto) { + crypto = globalThis.crypto; + } + + // Native (experimental IE 11) crypto from window (Browser) + if (!crypto && typeof window !== 'undefined' && window.msCrypto) { + crypto = window.msCrypto; + } + + // Native crypto from global (NodeJS) + if (!crypto && typeof global !== 'undefined' && global.crypto) { + crypto = global.crypto; + } + + // Native crypto import via require (NodeJS) + if (!crypto && typeof require === 'function') { + try { + crypto = require('crypto'); + } catch (err) {} + } + + /* + * Cryptographically secure pseudorandom number generator + * + * As Math.random() is cryptographically not safe to use + */ + var cryptoSecureRandomInt = function () { + if (crypto) { + // Use getRandomValues method (Browser) + if (typeof crypto.getRandomValues === 'function') { + try { + return crypto.getRandomValues(new Uint32Array(1))[0]; + } catch (err) {} + } + + // Use randomBytes method (NodeJS) + if (typeof crypto.randomBytes === 'function') { + try { + return crypto.randomBytes(4).readInt32LE(); + } catch (err) {} + } + } + + throw new Error('Native crypto module could not be used to get secure random number.'); + }; + + /* + * Local polyfill of Object.create + + */ + var create = Object.create || (function () { + function F() {} + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()); + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var j = 0; j < thatSigBytes; j += 4) { + thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + for (var i = 0; i < nBytes; i += 4) { + words.push(cryptoSecureRandomInt()); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + var processedWords; + + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64url encoding strategy. + */ + var Base64url = C_enc.Base64url = { + /** + * Converts a word array to a Base64url string. + * + * @param {WordArray} wordArray The word array. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {string} The Base64url string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64url.stringify(wordArray); + */ + stringify: function (wordArray, urlSafe=true) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = urlSafe ? this._safe_map : this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64url string to a word array. + * + * @param {string} base64Str The Base64url string. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64url.parse(base64String); + */ + parse: function (base64Str, urlSafe=true) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = urlSafe ? this._safe_map : this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + var Wil; + var Wih; + + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + Wih = Wi.high = M[offset + i * 2] | 0; + Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + Wil = gamma0l + Wi7l; + Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + Wil = Wil + gamma1l; + Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + Wil = Wil + Wi16l; + Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + var tMsw; + var tLsw; + + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + var block; + + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + var block; + + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + var modeCreator; + + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + var finalProcessedBlocks; + + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + var wordArray; + + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + var salt; + + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + var keystream; + + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + for (var i = data.sigBytes - 1; i >= 0; i--) { + if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + data.sigBytes = i + 1; + break; + } + } + } + }; + + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + var t; + + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + // Make sure the key length is valid (64, 128 or >= 192 bit) + if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) { + throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.'); + } + + // Extend the key according to the keying options defined in 3DES standard + var key1 = keyWords.slice(0, 2); + var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4); + var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6); + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(key1)); + this._des2 = DES.createEncryptor(WordArray.create(key2)); + this._des3 = DES.createEncryptor(WordArray.create(key3)); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/docs/QuickStartGuide.wiki b/miniprogram_npm/crypto-js/docs/QuickStartGuide.wiki new file mode 100644 index 0000000..2bee35d --- /dev/null +++ b/miniprogram_npm/crypto-js/docs/QuickStartGuide.wiki @@ -0,0 +1,470 @@ + + +---- + += Quick-start Guide = + +== Hashers == + +=== The Hasher Algorithms === + +==== MD5 ==== + +MD5 is a widely used hash function. It's been used in a variety of security applications and is also commonly used to check the integrity of files. Though, MD5 is not collision resistant, and it isn't suitable for applications like SSL certificates or digital signatures that rely on this property. + +{{{ + + +}}} + +==== SHA-1 ==== + +The SHA hash functions were designed by the National Security Agency (NSA). SHA-1 is the most established of the existing SHA hash functions, and it's used in a variety of security applications and protocols. Though, SHA-1's collision resistance has been weakening as new attacks are discovered or improved. + +{{{ + + +}}} + +==== SHA-2 ==== + +SHA-256 is one of the four variants in the SHA-2 set. It isn't as widely used as SHA-1, though it appears to provide much better security. + +{{{ + + +}}} + +SHA-512 is largely identical to SHA-256 but operates on 64-bit words rather than 32. + +{{{ + + +}}} + +CryptoJS also supports SHA-224 and SHA-384, which are largely identical but truncated versions of SHA-256 and SHA-512 respectively. + +==== SHA-3 ==== + +SHA-3 is the winner of a five-year competition to select a new cryptographic hash algorithm where 64 competing designs were evaluated. + +{{{ + + +}}} + +SHA-3 can be configured to output hash lengths of one of 224, 256, 384, or 512 bits. The default is 512 bits. + +{{{ + + +}}} + +==== RIPEMD-160 ==== + +{{{ + + +}}} + +=== The Hasher Input === + +The hash algorithms accept either strings or instances of CryptoJS.lib.WordArray. A WordArray object represents an array of 32-bit words. When you pass a string, it's automatically converted to a WordArray encoded as UTF-8. + +=== The Hasher Output === + +The hash you get back isn't a string yet. It's a WordArray object. When you use a WordArray object in a string context, it's automatically converted to a hex string. + +{{{ + + +}}} + +You can convert a WordArray object to other formats by explicitly calling the toString method and passing an encoder. + +{{{ + + + +}}} + +=== Progressive Hashing === + +{{{ + + +}}} + +== HMAC == + +Keyed-hash message authentication codes (HMAC) is a mechanism for message authentication using cryptographic hash functions. + +HMAC can be used in combination with any iterated cryptographic hash function. + +{{{ + + + + + +}}} + +=== Progressive HMAC Hashing === + +{{{ + + +}}} + +== PBKDF2 == + +PBKDF2 is a password-based key derivation function. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required. + +A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack. + +{{{ + + +}}} + +== Ciphers == + +=== The Cipher Algorithms === + +==== AES ==== + +The Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated. + +{{{ + + +}}} + +CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key. + +==== DES, Triple DES ==== + +DES is a previously dominant algorithm for encryption, and was published as an official Federal Information Processing Standard (FIPS). DES is now considered to be insecure due to the small key size. + +{{{ + + +}}} + +Triple DES applies DES three times to each block to increase the key size. The algorithm is believed to be secure in this form. + +{{{ + + +}}} + +==== Rabbit ==== + +Rabbit is a high-performance stream cipher and a finalist in the eSTREAM Portfolio. It is one of the four designs selected after a 3 1/2-year process where 22 designs were evaluated. + +{{{ + + +}}} + +==== RC4, RC4Drop ==== + +RC4 is a widely-used stream cipher. It's used in popular protocols such as SSL and WEP. Although remarkable for its simplicity and speed, the algorithm's history doesn't inspire confidence in its security. + +{{{ + + +}}} + +It was discovered that the first few bytes of keystream are strongly non-random and leak information about the key. We can defend against this attack by discarding the initial portion of the keystream. This modified algorithm is traditionally called RC4-drop. + +By default, 192 words (768 bytes) are dropped, but you can configure the algorithm to drop any number of words. + +{{{ + + +}}} + +=== Custom Key and IV === + +{{{ + + +}}} + +=== Block Modes and Padding === + +{{{ + + + + +}}} + +CryptoJS supports the following modes: + + * CBC (the default) + * CFB + * CTR + * OFB + * ECB + +And CryptoJS supports the following padding schemes: + + * Pkcs7 (the default) + * Iso97971 + * AnsiX923 + * Iso10126 + * ZeroPadding + * NoPadding + +=== The Cipher Input === + +For the plaintext message, the cipher algorithms accept either strings or instances of CryptoJS.lib.WordArray. + +For the key, when you pass a string, it's treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key. If you pass the actual key, you must also pass the actual IV. + +For the ciphertext, the cipher algorithms accept either strings or instances of CryptoJS.lib.CipherParams. A CipherParams object represents a collection of parameters such as the IV, a salt, and the raw ciphertext itself. When you pass a string, it's automatically converted to a CipherParams object according to a configurable format strategy. + +=== The Cipher Output === + +The plaintext you get back after decryption is a WordArray object. See Hashers' Output for more detail. + +The ciphertext you get back after encryption isn't a string yet. It's a CipherParams object. A CipherParams object gives you access to all the parameters used during encryption. When you use a CipherParams object in a string context, it's automatically converted to a string according to a format strategy. The default is an OpenSSL-compatible format. + +{{{ + + +}}} + +You can define your own formats in order to be compatible with other crypto implementations. A format is an object with two methods—stringify and parse—that converts between CipherParams objects and ciphertext strings. + +Here's how you might write a JSON formatter: + +{{{ + + +}}} + +=== Progressive Ciphering === + +{{{ + + +}}} + +=== Interoperability === + +==== With OpenSSL ==== + +Encrypt with OpenSSL: + +{{{ +openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"Secret Passphrase" -e -base64 +}}} + +Decrypt with CryptoJS: + +{{{ + + +}}} + +== Encoders == + +CryptoJS can convert from encoding formats such as Base64, Latin1 or Hex to WordArray objects and vica versa. + +{{{ + + + + +}}} \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/enc-base64.js b/miniprogram_npm/crypto-js/enc-base64.js new file mode 100644 index 0000000..0ffcd53 --- /dev/null +++ b/miniprogram_npm/crypto-js/enc-base64.js @@ -0,0 +1,136 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + return CryptoJS.enc.Base64; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/enc-base64url.js b/miniprogram_npm/crypto-js/enc-base64url.js new file mode 100644 index 0000000..2468912 --- /dev/null +++ b/miniprogram_npm/crypto-js/enc-base64url.js @@ -0,0 +1,140 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64url encoding strategy. + */ + var Base64url = C_enc.Base64url = { + /** + * Converts a word array to a Base64url string. + * + * @param {WordArray} wordArray The word array. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {string} The Base64url string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64url.stringify(wordArray); + */ + stringify: function (wordArray, urlSafe=true) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = urlSafe ? this._safe_map : this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64url string to a word array. + * + * @param {string} base64Str The Base64url string. + * + * @param {boolean} urlSafe Whether to use url safe + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64url.parse(base64String); + */ + parse: function (base64Str, urlSafe=true) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = urlSafe ? this._safe_map : this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + var bitsCombined = bits1 | bits2; + words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + return CryptoJS.enc.Base64url; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/enc-hex.js b/miniprogram_npm/crypto-js/enc-hex.js new file mode 100644 index 0000000..88161ff --- /dev/null +++ b/miniprogram_npm/crypto-js/enc-hex.js @@ -0,0 +1,18 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.enc.Hex; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/enc-latin1.js b/miniprogram_npm/crypto-js/enc-latin1.js new file mode 100644 index 0000000..ade56dc --- /dev/null +++ b/miniprogram_npm/crypto-js/enc-latin1.js @@ -0,0 +1,18 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.enc.Latin1; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/enc-utf16.js b/miniprogram_npm/crypto-js/enc-utf16.js new file mode 100644 index 0000000..7de6245 --- /dev/null +++ b/miniprogram_npm/crypto-js/enc-utf16.js @@ -0,0 +1,149 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + return CryptoJS.enc.Utf16; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/enc-utf8.js b/miniprogram_npm/crypto-js/enc-utf8.js new file mode 100644 index 0000000..e7a251d --- /dev/null +++ b/miniprogram_npm/crypto-js/enc-utf8.js @@ -0,0 +1,18 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.enc.Utf8; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/evpkdf.js b/miniprogram_npm/crypto-js/evpkdf.js new file mode 100644 index 0000000..578974a --- /dev/null +++ b/miniprogram_npm/crypto-js/evpkdf.js @@ -0,0 +1,134 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha1", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + var block; + + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + return CryptoJS.EvpKDF; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/format-hex.js b/miniprogram_npm/crypto-js/format-hex.js new file mode 100644 index 0000000..2e9a861 --- /dev/null +++ b/miniprogram_npm/crypto-js/format-hex.js @@ -0,0 +1,66 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + return CryptoJS.format.Hex; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/format-openssl.js b/miniprogram_npm/crypto-js/format-openssl.js new file mode 100644 index 0000000..3373edc --- /dev/null +++ b/miniprogram_npm/crypto-js/format-openssl.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.format.OpenSSL; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-md5.js b/miniprogram_npm/crypto-js/hmac-md5.js new file mode 100644 index 0000000..ad7a90a --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-md5.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./md5"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./md5", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacMD5; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-ripemd160.js b/miniprogram_npm/crypto-js/hmac-ripemd160.js new file mode 100644 index 0000000..73d55a7 --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-ripemd160.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./ripemd160"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./ripemd160", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacRIPEMD160; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-sha1.js b/miniprogram_npm/crypto-js/hmac-sha1.js new file mode 100644 index 0000000..0b570cb --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-sha1.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha1", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA1; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-sha224.js b/miniprogram_npm/crypto-js/hmac-sha224.js new file mode 100644 index 0000000..3778863 --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-sha224.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256"), require("./sha224"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256", "./sha224", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA224; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-sha256.js b/miniprogram_npm/crypto-js/hmac-sha256.js new file mode 100644 index 0000000..33b0c9f --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-sha256.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA256; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-sha3.js b/miniprogram_npm/crypto-js/hmac-sha3.js new file mode 100644 index 0000000..1248804 --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-sha3.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha3"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha3", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA3; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-sha384.js b/miniprogram_npm/crypto-js/hmac-sha384.js new file mode 100644 index 0000000..0036e2b --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-sha384.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./sha384"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha512", "./sha384", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA384; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac-sha512.js b/miniprogram_npm/crypto-js/hmac-sha512.js new file mode 100644 index 0000000..c1005b6 --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac-sha512.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha512", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.HmacSHA512; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/hmac.js b/miniprogram_npm/crypto-js/hmac.js new file mode 100644 index 0000000..8c09851 --- /dev/null +++ b/miniprogram_npm/crypto-js/hmac.js @@ -0,0 +1,143 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/index.js b/miniprogram_npm/crypto-js/index.js new file mode 100644 index 0000000..7235391 --- /dev/null +++ b/miniprogram_npm/crypto-js/index.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./enc-base64url"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./enc-base64url", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/lib-typedarrays.js b/miniprogram_npm/crypto-js/lib-typedarrays.js new file mode 100644 index 0000000..264b210 --- /dev/null +++ b/miniprogram_npm/crypto-js/lib-typedarrays.js @@ -0,0 +1,76 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + return CryptoJS.lib.WordArray; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/md5.js b/miniprogram_npm/crypto-js/md5.js new file mode 100644 index 0000000..12b0fdd --- /dev/null +++ b/miniprogram_npm/crypto-js/md5.js @@ -0,0 +1,268 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + return CryptoJS.MD5; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/mode-cfb.js b/miniprogram_npm/crypto-js/mode-cfb.js new file mode 100644 index 0000000..444c9cb --- /dev/null +++ b/miniprogram_npm/crypto-js/mode-cfb.js @@ -0,0 +1,80 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + var keystream; + + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + return CryptoJS.mode.CFB; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/mode-ctr-gladman.js b/miniprogram_npm/crypto-js/mode-ctr-gladman.js new file mode 100644 index 0000000..bbc5687 --- /dev/null +++ b/miniprogram_npm/crypto-js/mode-ctr-gladman.js @@ -0,0 +1,116 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + return CryptoJS.mode.CTRGladman; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/mode-ctr.js b/miniprogram_npm/crypto-js/mode-ctr.js new file mode 100644 index 0000000..c3d470a --- /dev/null +++ b/miniprogram_npm/crypto-js/mode-ctr.js @@ -0,0 +1,58 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + return CryptoJS.mode.CTR; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/mode-ecb.js b/miniprogram_npm/crypto-js/mode-ecb.js new file mode 100644 index 0000000..ff06921 --- /dev/null +++ b/miniprogram_npm/crypto-js/mode-ecb.js @@ -0,0 +1,40 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + return CryptoJS.mode.ECB; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/mode-ofb.js b/miniprogram_npm/crypto-js/mode-ofb.js new file mode 100644 index 0000000..c01314c --- /dev/null +++ b/miniprogram_npm/crypto-js/mode-ofb.js @@ -0,0 +1,54 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + return CryptoJS.mode.OFB; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/package.json b/miniprogram_npm/crypto-js/package.json new file mode 100644 index 0000000..3ebde34 --- /dev/null +++ b/miniprogram_npm/crypto-js/package.json @@ -0,0 +1,45 @@ +{ + "name": "crypto-js", + "version": "4.1.1", + "description": "JavaScript library of crypto standards.", + "license": "MIT", + "author": { + "name": "Evan Vosberg", + "url": "http://github.com/evanvosberg" + }, + "homepage": "http://github.com/brix/crypto-js", + "repository": { + "type": "git", + "url": "http://github.com/brix/crypto-js.git" + }, + "keywords": [ + "security", + "crypto", + "Hash", + "MD5", + "SHA1", + "SHA-1", + "SHA256", + "SHA-256", + "RC4", + "Rabbit", + "AES", + "DES", + "PBKDF2", + "HMAC", + "OFB", + "CFB", + "CTR", + "CBC", + "Base64", + "Base64url" + ], + "main": "index.js", + "dependencies": {}, + "browser": { + "crypto": false + }, + "__npminstall_done": "Mon Oct 10 2022 16:06:55 GMT+0800 (中国标准时间)", + "_from": "crypto-js@4.1.1", + "_resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz" +} \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/pad-ansix923.js b/miniprogram_npm/crypto-js/pad-ansix923.js new file mode 100644 index 0000000..f01f21e --- /dev/null +++ b/miniprogram_npm/crypto-js/pad-ansix923.js @@ -0,0 +1,49 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + return CryptoJS.pad.Ansix923; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/pad-iso10126.js b/miniprogram_npm/crypto-js/pad-iso10126.js new file mode 100644 index 0000000..6e2aefd --- /dev/null +++ b/miniprogram_npm/crypto-js/pad-iso10126.js @@ -0,0 +1,44 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + return CryptoJS.pad.Iso10126; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/pad-iso97971.js b/miniprogram_npm/crypto-js/pad-iso97971.js new file mode 100644 index 0000000..41049b4 --- /dev/null +++ b/miniprogram_npm/crypto-js/pad-iso97971.js @@ -0,0 +1,40 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + return CryptoJS.pad.Iso97971; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/pad-nopadding.js b/miniprogram_npm/crypto-js/pad-nopadding.js new file mode 100644 index 0000000..c7787c9 --- /dev/null +++ b/miniprogram_npm/crypto-js/pad-nopadding.js @@ -0,0 +1,30 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + return CryptoJS.pad.NoPadding; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/pad-pkcs7.js b/miniprogram_npm/crypto-js/pad-pkcs7.js new file mode 100644 index 0000000..3555168 --- /dev/null +++ b/miniprogram_npm/crypto-js/pad-pkcs7.js @@ -0,0 +1,18 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + return CryptoJS.pad.Pkcs7; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/pad-zeropadding.js b/miniprogram_npm/crypto-js/pad-zeropadding.js new file mode 100644 index 0000000..a1a459e --- /dev/null +++ b/miniprogram_npm/crypto-js/pad-zeropadding.js @@ -0,0 +1,47 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + for (var i = data.sigBytes - 1; i >= 0; i--) { + if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + data.sigBytes = i + 1; + break; + } + } + } + }; + + + return CryptoJS.pad.ZeroPadding; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/pbkdf2.js b/miniprogram_npm/crypto-js/pbkdf2.js new file mode 100644 index 0000000..1258251 --- /dev/null +++ b/miniprogram_npm/crypto-js/pbkdf2.js @@ -0,0 +1,145 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha1", "./hmac"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + return CryptoJS.PBKDF2; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/rabbit-legacy.js b/miniprogram_npm/crypto-js/rabbit-legacy.js new file mode 100644 index 0000000..e118b6b --- /dev/null +++ b/miniprogram_npm/crypto-js/rabbit-legacy.js @@ -0,0 +1,190 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + return CryptoJS.RabbitLegacy; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/rabbit.js b/miniprogram_npm/crypto-js/rabbit.js new file mode 100644 index 0000000..1b06833 --- /dev/null +++ b/miniprogram_npm/crypto-js/rabbit.js @@ -0,0 +1,192 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + return CryptoJS.Rabbit; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/rc4.js b/miniprogram_npm/crypto-js/rc4.js new file mode 100644 index 0000000..0e4bdff --- /dev/null +++ b/miniprogram_npm/crypto-js/rc4.js @@ -0,0 +1,139 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + return CryptoJS.RC4; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/ripemd160.js b/miniprogram_npm/crypto-js/ripemd160.js new file mode 100644 index 0000000..24feb47 --- /dev/null +++ b/miniprogram_npm/crypto-js/ripemd160.js @@ -0,0 +1,267 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + return CryptoJS.RIPEMD160; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/sha1.js b/miniprogram_npm/crypto-js/sha1.js new file mode 100644 index 0000000..6691149 --- /dev/null +++ b/miniprogram_npm/crypto-js/sha1.js @@ -0,0 +1,150 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + return CryptoJS.SHA1; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/sha224.js b/miniprogram_npm/crypto-js/sha224.js new file mode 100644 index 0000000..d8ce988 --- /dev/null +++ b/miniprogram_npm/crypto-js/sha224.js @@ -0,0 +1,80 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./sha256")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./sha256"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + return CryptoJS.SHA224; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/sha256.js b/miniprogram_npm/crypto-js/sha256.js new file mode 100644 index 0000000..de2d7fc --- /dev/null +++ b/miniprogram_npm/crypto-js/sha256.js @@ -0,0 +1,199 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + return CryptoJS.SHA256; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/sha3.js b/miniprogram_npm/crypto-js/sha3.js new file mode 100644 index 0000000..34ad86c --- /dev/null +++ b/miniprogram_npm/crypto-js/sha3.js @@ -0,0 +1,326 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + var tMsw; + var tLsw; + + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + return CryptoJS.SHA3; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/sha384.js b/miniprogram_npm/crypto-js/sha384.js new file mode 100644 index 0000000..a0b95bf --- /dev/null +++ b/miniprogram_npm/crypto-js/sha384.js @@ -0,0 +1,83 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core", "./sha512"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + return CryptoJS.SHA384; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/sha512.js b/miniprogram_npm/crypto-js/sha512.js new file mode 100644 index 0000000..d274ab0 --- /dev/null +++ b/miniprogram_npm/crypto-js/sha512.js @@ -0,0 +1,326 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + var Wil; + var Wih; + + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + Wih = Wi.high = M[offset + i * 2] | 0; + Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + Wil = gamma0l + Wi7l; + Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + Wil = Wil + gamma1l; + Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + Wil = Wil + Wi16l; + Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + return CryptoJS.SHA512; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/tripledes.js b/miniprogram_npm/crypto-js/tripledes.js new file mode 100644 index 0000000..1a92477 --- /dev/null +++ b/miniprogram_npm/crypto-js/tripledes.js @@ -0,0 +1,779 @@ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + // Make sure the key length is valid (64, 128 or >= 192 bit) + if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) { + throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.'); + } + + // Extend the key according to the keying options defined in 3DES standard + var key1 = keyWords.slice(0, 2); + var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4); + var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6); + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(key1)); + this._des2 = DES.createEncryptor(WordArray.create(key2)); + this._des3 = DES.createEncryptor(WordArray.create(key3)); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + return CryptoJS.TripleDES; + +})); \ No newline at end of file diff --git a/miniprogram_npm/crypto-js/x64-core.js b/miniprogram_npm/crypto-js/x64-core.js new file mode 100644 index 0000000..57dcc14 --- /dev/null +++ b/miniprogram_npm/crypto-js/x64-core.js @@ -0,0 +1,304 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/miniprogram_npm/dijkstrajs/index.js b/miniprogram_npm/dijkstrajs/index.js new file mode 100644 index 0000000..18795fb --- /dev/null +++ b/miniprogram_npm/dijkstrajs/index.js @@ -0,0 +1,178 @@ +module.exports = (function() { +var __MODS__ = {}; +var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; }; +var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; }; +var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } }; +var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; }; +__DEFINE__(1629248775416, function(require, module, exports) { + + +/****************************************************************************** + * Created 2008-08-19. + * + * Dijkstra path-finding functions. Adapted from the Dijkstar Python project. + * + * Copyright (C) 2008 + * Wyatt Baldwin + * All rights reserved + * + * Licensed under the MIT license. + * + * http://www.opensource.org/licenses/mit-license.php + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + *****************************************************************************/ +var dijkstra = { + single_source_shortest_paths: function(graph, s, d) { + // Predecessor map for each node that has been encountered. + // node ID => predecessor node ID + var predecessors = {}; + + // Costs of shortest paths from s to all nodes encountered. + // node ID => cost + var costs = {}; + costs[s] = 0; + + // Costs of shortest paths from s to all nodes encountered; differs from + // `costs` in that it provides easy access to the node that currently has + // the known shortest path from s. + // XXX: Do we actually need both `costs` and `open`? + var open = dijkstra.PriorityQueue.make(); + open.push(s, 0); + + var closest, + u, v, + cost_of_s_to_u, + adjacent_nodes, + cost_of_e, + cost_of_s_to_u_plus_cost_of_e, + cost_of_s_to_v, + first_visit; + while (!open.empty()) { + // In the nodes remaining in graph that have a known cost from s, + // find the node, u, that currently has the shortest path from s. + closest = open.pop(); + u = closest.value; + cost_of_s_to_u = closest.cost; + + // Get nodes adjacent to u... + adjacent_nodes = graph[u] || {}; + + // ...and explore the edges that connect u to those nodes, updating + // the cost of the shortest paths to any or all of those nodes as + // necessary. v is the node across the current edge from u. + for (v in adjacent_nodes) { + if (adjacent_nodes.hasOwnProperty(v)) { + // Get the cost of the edge running from u to v. + cost_of_e = adjacent_nodes[v]; + + // Cost of s to u plus the cost of u to v across e--this is *a* + // cost from s to v that may or may not be less than the current + // known cost to v. + cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e; + + // If we haven't visited v yet OR if the current known cost from s to + // v is greater than the new cost we just found (cost of s to u plus + // cost of u to v across e), update v's cost in the cost list and + // update v's predecessor in the predecessor list (it's now u). + cost_of_s_to_v = costs[v]; + first_visit = (typeof costs[v] === 'undefined'); + if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) { + costs[v] = cost_of_s_to_u_plus_cost_of_e; + open.push(v, cost_of_s_to_u_plus_cost_of_e); + predecessors[v] = u; + } + } + } + } + + if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') { + var msg = ['Could not find a path from ', s, ' to ', d, '.'].join(''); + throw new Error(msg); + } + + return predecessors; + }, + + extract_shortest_path_from_predecessor_list: function(predecessors, d) { + var nodes = []; + var u = d; + var predecessor; + while (u) { + nodes.push(u); + predecessor = predecessors[u]; + u = predecessors[u]; + } + nodes.reverse(); + return nodes; + }, + + find_path: function(graph, s, d) { + var predecessors = dijkstra.single_source_shortest_paths(graph, s, d); + return dijkstra.extract_shortest_path_from_predecessor_list( + predecessors, d); + }, + + /** + * A very naive priority queue implementation. + */ + PriorityQueue: { + make: function (opts) { + var T = dijkstra.PriorityQueue, + t = {}, + key; + opts = opts || {}; + for (key in T) { + if (T.hasOwnProperty(key)) { + t[key] = T[key]; + } + } + t.queue = []; + t.sorter = opts.sorter || T.default_sorter; + return t; + }, + + default_sorter: function (a, b) { + return a.cost - b.cost; + }, + + /** + * Add a new item to the queue and ensure the highest priority element + * is at the front of the queue. + */ + push: function (value, cost) { + var item = {value: value, cost: cost}; + this.queue.push(item); + this.queue.sort(this.sorter); + }, + + /** + * Return the highest priority element in the queue. + */ + pop: function () { + return this.queue.shift(); + }, + + empty: function () { + return this.queue.length === 0; + } + } +}; + + +// node.js module exports +if (typeof module !== 'undefined') { + module.exports = dijkstra; +} + +}, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); }) +return __REQUIRE__(1629248775416); +})() +//miniprogram-npm-outsideDeps=[] +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/miniprogram_npm/dijkstrajs/index.js.map b/miniprogram_npm/dijkstrajs/index.js.map new file mode 100644 index 0000000..49ad7f7 --- /dev/null +++ b/miniprogram_npm/dijkstrajs/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["dijkstra.js"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.js","sourcesContent":["\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin \n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n"]} \ No newline at end of file diff --git a/miniprogram_npm/threejs-miniprogram/index.js b/miniprogram_npm/threejs-miniprogram/index.js new file mode 100644 index 0000000..6677109 --- /dev/null +++ b/miniprogram_npm/threejs-miniprogram/index.js @@ -0,0 +1,3 @@ +!function(t,e){for(var r in e)t[r]=e[r]}(exports,function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)r.d(n,i,function(e){return t[e]}.bind(null,i));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=4)}([function(t,e,r){"use strict";const n=r(1),i=r(2);t.exports={atob:n,btoa:i}},function(t,e,r){"use strict";function n(t){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(t);return e<0?void 0:e}t.exports=function(t){if((t=(t=""+t).replace(/[ \t\n\f\r]/g,"")).length%4==0&&(t=t.replace(/==?$/,"")),t.length%4==1||/[^+/0-9A-Za-z]/.test(t))return null;let e="",r=0,i=0;for(let a=0;a>16),e+=String.fromCharCode((65280&r)>>8),e+=String.fromCharCode(255&r),r=i=0);return 12===i?(r>>=4,e+=String.fromCharCode(r)):18===i&&(r>>=2,e+=String.fromCharCode((65280&r)>>8),e+=String.fromCharCode(255&r)),e}},function(t,e,r){"use strict";function n(t){if(t>=0&&t<64)return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[t]}t.exports=function(t){let e;for(t=""+t,e=0;e255)return null;let r="";for(e=0;e>2,i[1]=(3&t.charCodeAt(e))<<4,t.length>e+1&&(i[1]|=t.charCodeAt(e+1)>>4,i[2]=(15&t.charCodeAt(e+1))<<2),t.length>e+2&&(i[2]|=t.charCodeAt(e+2)>>6,i[3]=63&t.charCodeAt(e+2));for(let t=0;t2&&void 0!==arguments[2]?arguments[2]:{},n=l.get(this);n||(n={},l.set(this,n)),n[t]||(n[t]=[]),n[t].push(e),r.capture,r.once,r.passive}},{key:"removeEventListener",value:function(t,e){var r=l.get(this);if(r){var n=r[t];if(n&&n.length>0)for(var i=n.length;i--;i>0)if(n[i]===e){n.splice(i,1);break}}}},{key:"dispatchEvent",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};"function"!=typeof t.preventDefault&&(t.preventDefault=function(){}),"function"!=typeof t.stopPropagation&&(t.stopPropagation=function(){});var e=l.get(this)[t.type];if(e)for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:{},e=a({},this),r={changedTouches:t.changedTouches.map((function(t){return new h(t)})),touches:t.touches.map((function(t){return new h(t)})),targetTouches:Array.prototype.slice.call(t.touches.map((function(t){return new h(t)}))),timeStamp:t.timeStamp,target:e,currentTarget:e,type:t.type,cancelBubble:!1,cancelable:!1};this.dispatchEvent(r)}}])&&s(e.prototype,r),n&&s(e,n),t}();function p(t){return(p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function d(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};e.target=e.target||this,"function"==typeof this["on".concat(t)]&&this["on".concat(t)].call(this,e)}function M(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.readyState=t,e.readyState=t,_.call(this,"readystatechange",e)}function S(t){return!/^(http|https|ftp|wxfile):\/\/.*/i.test(t)}var T=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&f(t,e)}(a,t);var e,r,n,i=m(a);function a(){var t;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,a),(t=i.call(this)).onabort=null,t.onerror=null,t.onload=null,t.onloadstart=null,t.onprogress=null,t.ontimeout=null,t.onloadend=null,t.onreadystatechange=null,t.readyState=0,t.response=null,t.responseText=null,t.responseType="text",t.dataType="string",t.responseXML=null,t.status=0,t.statusText="",t.upload={},t.withCredentials=!1,x.set(v(t),{"content-type":"application/x-www-form-urlencoded"}),b.set(v(t),{}),t}return e=a,(r=[{key:"abort",value:function(){var t=w.get(this);t&&t.abort()}},{key:"getAllResponseHeaders",value:function(){var t=b.get(this);return Object.keys(t).map((function(e){return"".concat(e,": ").concat(t[e])})).join("\n")}},{key:"getResponseHeader",value:function(t){return b.get(this)[t]}},{key:"open",value:function(t,e){this._method=t,this._url=e,M.call(this,a.OPENED)}},{key:"overrideMimeType",value:function(){}},{key:"send",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(this.readyState!==a.OPENED)throw new Error("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.");var r,n=this._url,i=x.get(this),o=this.responseType,s=this.dataType,c=S(n);"arraybuffer"===o||(r="utf8"),delete this.response,this.response=null;var l=function(e){var r=e.data,n=e.statusCode,i=e.header;if(n=void 0===n?200:n,"string"!=typeof r&&!(r instanceof ArrayBuffer))try{r=JSON.stringify(r)}catch(t){}t.status=n,i&&b.set(t,i),_.call(t,"loadstart"),M.call(t,a.HEADERS_RECEIVED),M.call(t,a.LOADING),t.response=r,r instanceof ArrayBuffer?Object.defineProperty(t,"responseText",{enumerable:!0,configurable:!0,get:function(){throw"InvalidStateError : responseType is "+this.responseType}}):t.responseText=r,M.call(t,a.DONE),_.call(t,"load"),_.call(t,"loadend")},h=function(e){var r=e.errMsg;-1!==r.indexOf("abort")?_.call(t,"abort"):_.call(t,"error",{message:r}),_.call(t,"loadend"),c&&console.warn(r)};if(c){var u=wx.getFileSystemManager(),p={filePath:n,success:l,fail:h};return r&&(p.encoding=r),void u.readFile(p)}wx.request({data:e,url:n,method:this._method,header:i,dataType:s,responseType:o,success:l,fail:h})}},{key:"setRequestHeader",value:function(t,e){var r=x.get(this);r[t]=e,x.set(this,r)}},{key:"addEventListener",value:function(t,e){var r=this;"function"==typeof e&&(this["on"+t]=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t.target=t.target||r,e.call(r,t)})}},{key:"removeEventListener",value:function(t,e){this["on"+t]===e&&(this["on"+t]=null)}}])&&d(e.prototype,r),n&&d(e,n),a}(u);function E(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(!t)return;if("string"==typeof t)return A(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);"Object"===r&&t.constructor&&(r=t.constructor.name);if("Map"===r||"Set"===r)return Array.from(t);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return A(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,i=function(){};return{s:i,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,s=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var t=r.next();return o=t.done,t},e:function(t){s=!0,a=t},f:function(){try{o||null==r.return||r.return()}finally{if(s)throw a}}}}function A(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0?1:+t}),"name"in Function.prototype==0&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(t){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),r=1;r>8&255]+r[t>>16&255]+r[t>>24&255]+"-"+r[255&e]+r[e>>8&255]+"-"+r[e>>16&15|64]+r[e>>24&255]+"-"+r[63&n|128]+r[n>>8&255]+"-"+r[n>>16&255]+r[n>>24&255]+r[255&i]+r[i>>8&255]+r[i>>16&255]+r[i>>24&255]).toUpperCase()},clamp:function(t,e,r){return Math.max(e,Math.min(r,t))},euclideanModulo:function(t,e){return(t%e+e)%e},mapLinear:function(t,e,r,n,i){return n+(t-e)*(i-n)/(r-e)},lerp:function(t,e,r){return(1-r)*t+r*e},smoothstep:function(t,e,r){return t<=e?0:t>=r?1:(t=(t-e)/(r-e))*t*(3-2*t)},smootherstep:function(t,e,r){return t<=e?0:t>=r?1:(t=(t-e)/(r-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},degToRad:function(t){return t*s.DEG2RAD},radToDeg:function(t){return t*s.RAD2DEG},isPowerOfTwo:function(t){return 0==(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}};function l(t,e){this.x=t||0,this.y=e||0}function h(t,e,r,n){this._x=t||0,this._y=e||0,this._z=r||0,this._w=void 0!==n?n:1}Object.defineProperties(l.prototype,{width:{get:function(){return this.x},set:function(t){this.x=t}},height:{get:function(){return this.y},set:function(t){this.y=t}}}),Object.assign(l.prototype,{isVector2:!0,set:function(t,e){return this.x=t,this.y=e,this},setScalar:function(t){return this.x=t,this.y=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(t){return this.x=t.x,this.y=t.y,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)},addScalar:function(t){return this.x+=t,this.y+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)},subScalar:function(t){return this.x-=t,this.y-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this},multiplyScalar:function(t){return this.x*=t,this.y*=t,this},divide:function(t){return this.x/=t.x,this.y/=t.y,this},divideScalar:function(t){return this.multiplyScalar(1/t)},applyMatrix3:function(t){var e=this.x,r=this.y,n=t.elements;return this.x=n[0]*e+n[3]*r+n[6],this.y=n[1]*e+n[4]*r+n[7],this},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this},clampScalar:function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this},clampLength:function(t,e){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(t,Math.min(e,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(t){return this.x*t.x+this.y*t.y},cross:function(t){return this.x*t.y-this.y*t.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var t=Math.atan2(this.y,this.x);return t<0&&(t+=2*Math.PI),t},distanceTo:function(t){return Math.sqrt(this.distanceToSquared(t))},distanceToSquared:function(t){var e=this.x-t.x,r=this.y-t.y;return e*e+r*r},manhattanDistanceTo:function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},lerpVectors:function(t,e,r){return this.subVectors(e,t).multiplyScalar(r).add(t)},equals:function(t){return t.x===this.x&&t.y===this.y},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t},fromBufferAttribute:function(t,e,r){return void 0!==r&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this},rotateAround:function(t,e){var r=Math.cos(e),n=Math.sin(e),i=this.x-t.x,a=this.y-t.y;return this.x=i*r-a*n+t.x,this.y=i*n+a*r+t.y,this}}),Object.assign(h,{slerp:function(t,e,r,n){return r.copy(t).slerp(e,n)},slerpFlat:function(t,e,r,n,i,a,o){var s=r[n+0],c=r[n+1],l=r[n+2],h=r[n+3],u=i[a+0],p=i[a+1],d=i[a+2],f=i[a+3];if(h!==f||s!==u||c!==p||l!==d){var m=1-o,g=s*u+c*p+l*d+h*f,v=g>=0?1:-1,y=1-g*g;if(y>Number.EPSILON){var x=Math.sqrt(y),b=Math.atan2(x,g*v);m=Math.sin(m*b)/x,o=Math.sin(o*b)/x}var w=o*v;if(s=s*m+u*w,c=c*m+p*w,l=l*m+d*w,h=h*m+f*w,m===1-o){var _=1/Math.sqrt(s*s+c*c+l*l+h*h);s*=_,c*=_,l*=_,h*=_}}t[e]=s,t[e+1]=c,t[e+2]=l,t[e+3]=h}}),Object.defineProperties(h.prototype,{x:{get:function(){return this._x},set:function(t){this._x=t,this._onChangeCallback()}},y:{get:function(){return this._y},set:function(t){this._y=t,this._onChangeCallback()}},z:{get:function(){return this._z},set:function(t){this._z=t,this._onChangeCallback()}},w:{get:function(){return this._w},set:function(t){this._w=t,this._onChangeCallback()}}}),Object.assign(h.prototype,{isQuaternion:!0,set:function(t,e,r,n){return this._x=t,this._y=e,this._z=r,this._w=n,this._onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this},setFromEuler:function(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var r=t._x,n=t._y,i=t._z,a=t.order,o=Math.cos,s=Math.sin,c=o(r/2),l=o(n/2),h=o(i/2),u=s(r/2),p=s(n/2),d=s(i/2);return"XYZ"===a?(this._x=u*l*h+c*p*d,this._y=c*p*h-u*l*d,this._z=c*l*d+u*p*h,this._w=c*l*h-u*p*d):"YXZ"===a?(this._x=u*l*h+c*p*d,this._y=c*p*h-u*l*d,this._z=c*l*d-u*p*h,this._w=c*l*h+u*p*d):"ZXY"===a?(this._x=u*l*h-c*p*d,this._y=c*p*h+u*l*d,this._z=c*l*d+u*p*h,this._w=c*l*h-u*p*d):"ZYX"===a?(this._x=u*l*h-c*p*d,this._y=c*p*h+u*l*d,this._z=c*l*d-u*p*h,this._w=c*l*h+u*p*d):"YZX"===a?(this._x=u*l*h+c*p*d,this._y=c*p*h+u*l*d,this._z=c*l*d-u*p*h,this._w=c*l*h-u*p*d):"XZY"===a&&(this._x=u*l*h-c*p*d,this._y=c*p*h-u*l*d,this._z=c*l*d+u*p*h,this._w=c*l*h+u*p*d),!1!==e&&this._onChangeCallback(),this},setFromAxisAngle:function(t,e){var r=e/2,n=Math.sin(r);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(r),this._onChangeCallback(),this},setFromRotationMatrix:function(t){var e,r=t.elements,n=r[0],i=r[4],a=r[8],o=r[1],s=r[5],c=r[9],l=r[2],h=r[6],u=r[10],p=n+s+u;return p>0?(e=.5/Math.sqrt(p+1),this._w=.25/e,this._x=(h-c)*e,this._y=(a-l)*e,this._z=(o-i)*e):n>s&&n>u?(e=2*Math.sqrt(1+n-s-u),this._w=(h-c)/e,this._x=.25*e,this._y=(i+o)/e,this._z=(a+l)/e):s>u?(e=2*Math.sqrt(1+s-n-u),this._w=(a-l)/e,this._x=(i+o)/e,this._y=.25*e,this._z=(c+h)/e):(e=2*Math.sqrt(1+u-n-s),this._w=(o-i)/e,this._x=(a+l)/e,this._y=(c+h)/e,this._z=.25*e),this._onChangeCallback(),this},setFromUnitVectors:function(t,e){var r=t.dot(e)+1;return r<1e-6?(r=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=r):(this._x=0,this._y=-t.z,this._z=t.y,this._w=r)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=r),this.normalize()},angleTo:function(t){return 2*Math.acos(Math.abs(s.clamp(this.dot(t),-1,1)))},rotateTowards:function(t,e){var r=this.angleTo(t);if(0===r)return this;var n=Math.min(1,e/r);return this.slerp(t,n),this},inverse:function(){return this.conjugate()},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this},dot:function(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._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)},normalize:function(){var t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)},premultiply:function(t){return this.multiplyQuaternions(t,this)},multiplyQuaternions:function(t,e){var r=t._x,n=t._y,i=t._z,a=t._w,o=e._x,s=e._y,c=e._z,l=e._w;return this._x=r*l+a*o+n*c-i*s,this._y=n*l+a*s+i*o-r*c,this._z=i*l+a*c+r*s-n*o,this._w=a*l-r*o-n*s-i*c,this._onChangeCallback(),this},slerp:function(t,e){if(0===e)return this;if(1===e)return this.copy(t);var r=this._x,n=this._y,i=this._z,a=this._w,o=a*t._w+r*t._x+n*t._y+i*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=r,this._y=n,this._z=i,this;var s=1-o*o;if(s<=Number.EPSILON){var c=1-e;return this._w=c*a+e*this._w,this._x=c*r+e*this._x,this._y=c*n+e*this._y,this._z=c*i+e*this._z,this.normalize(),this._onChangeCallback(),this}var l=Math.sqrt(s),h=Math.atan2(l,o),u=Math.sin((1-e)*h)/l,p=Math.sin(e*h)/l;return this._w=a*u+this._w*p,this._x=r*u+this._x*p,this._y=n*u+this._y*p,this._z=i*u+this._z*p,this._onChangeCallback(),this},equals:function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w},fromArray:function(t,e){return void 0===e&&(e=0),this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t},_onChange:function(t){return this._onChangeCallback=t,this},_onChangeCallback:function(){}});var u=new d,p=new h;function d(t,e,r){this.x=t||0,this.y=e||0,this.z=r||0}Object.assign(d.prototype,{isVector3:!0,set:function(t,e,r){return this.x=t,this.y=e,this.z=r,this},setScalar:function(t){return this.x=t,this.y=t,this.z=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setZ:function(t){return this.z=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)},subScalar:function(t){return this.x-=t,this.y-=t,this.z-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)},multiplyScalar:function(t){return this.x*=t,this.y*=t,this.z*=t,this},multiplyVectors:function(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this},applyEuler:function(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(p.setFromEuler(t))},applyAxisAngle:function(t,e){return this.applyQuaternion(p.setFromAxisAngle(t,e))},applyMatrix3:function(t){var e=this.x,r=this.y,n=this.z,i=t.elements;return this.x=i[0]*e+i[3]*r+i[6]*n,this.y=i[1]*e+i[4]*r+i[7]*n,this.z=i[2]*e+i[5]*r+i[8]*n,this},applyMatrix4:function(t){var e=this.x,r=this.y,n=this.z,i=t.elements,a=1/(i[3]*e+i[7]*r+i[11]*n+i[15]);return this.x=(i[0]*e+i[4]*r+i[8]*n+i[12])*a,this.y=(i[1]*e+i[5]*r+i[9]*n+i[13])*a,this.z=(i[2]*e+i[6]*r+i[10]*n+i[14])*a,this},applyQuaternion:function(t){var e=this.x,r=this.y,n=this.z,i=t.x,a=t.y,o=t.z,s=t.w,c=s*e+a*n-o*r,l=s*r+o*e-i*n,h=s*n+i*r-a*e,u=-i*e-a*r-o*n;return this.x=c*s+u*-i+l*-o-h*-a,this.y=l*s+u*-a+h*-i-c*-o,this.z=h*s+u*-o+c*-a-l*-i,this},project:function(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)},unproject:function(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)},transformDirection:function(t){var e=this.x,r=this.y,n=this.z,i=t.elements;return this.x=i[0]*e+i[4]*r+i[8]*n,this.y=i[1]*e+i[5]*r+i[9]*n,this.z=i[2]*e+i[6]*r+i[10]*n,this.normalize()},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this},divideScalar:function(t){return this.multiplyScalar(1/t)},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this},clampScalar:function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this},clampLength:function(t,e){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(t,Math.min(e,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.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)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this},lerpVectors:function(t,e,r){return this.subVectors(e,t).multiplyScalar(r).add(t)},cross:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)},crossVectors:function(t,e){var r=t.x,n=t.y,i=t.z,a=e.x,o=e.y,s=e.z;return this.x=n*s-i*o,this.y=i*a-r*s,this.z=r*o-n*a,this},projectOnVector:function(t){var e=t.dot(this)/t.lengthSq();return this.copy(t).multiplyScalar(e)},projectOnPlane:function(t){return u.copy(this).projectOnVector(t),this.sub(u)},reflect:function(t){return this.sub(u.copy(t).multiplyScalar(2*this.dot(t)))},angleTo:function(t){var e=this.dot(t)/Math.sqrt(this.lengthSq()*t.lengthSq());return Math.acos(s.clamp(e,-1,1))},distanceTo:function(t){return Math.sqrt(this.distanceToSquared(t))},distanceToSquared:function(t){var e=this.x-t.x,r=this.y-t.y,n=this.z-t.z;return e*e+r*r+n*n},manhattanDistanceTo:function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)},setFromSpherical:function(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)},setFromSphericalCoords:function(t,e,r){var n=Math.sin(e)*t;return this.x=n*Math.sin(r),this.y=Math.cos(e)*t,this.z=n*Math.cos(r),this},setFromCylindrical:function(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)},setFromCylindricalCoords:function(t,e,r){return this.x=t*Math.sin(e),this.y=r,this.z=t*Math.cos(e),this},setFromMatrixPosition:function(t){var e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this},setFromMatrixScale:function(t){var e=this.setFromMatrixColumn(t,0).length(),r=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=r,this.z=n,this},setFromMatrixColumn:function(t,e){return this.fromArray(t.elements,4*e)},equals:function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t},fromBufferAttribute:function(t,e,r){return void 0!==r&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}});var f=new d;function m(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}Object.assign(m.prototype,{isMatrix3:!0,set:function(t,e,r,n,i,a,o,s,c){var l=this.elements;return l[0]=t,l[1]=n,l[2]=o,l[3]=e,l[4]=i,l[5]=s,l[6]=r,l[7]=a,l[8]=c,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(t){var e=this.elements,r=t.elements;return e[0]=r[0],e[1]=r[1],e[2]=r[2],e[3]=r[3],e[4]=r[4],e[5]=r[5],e[6]=r[6],e[7]=r[7],e[8]=r[8],this},setFromMatrix4:function(t){var e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this},applyToBufferAttribute:function(t){for(var e=0,r=t.count;e1)switch(this.wrapS){case 1e3:t.x=t.x-Math.floor(t.x);break;case 1001:t.x=t.x<0?0:1;break;case 1002:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case 1e3:t.y=t.y-Math.floor(t.y);break;case 1001:t.y=t.y<0?0:1;break;case 1002:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}}),Object.defineProperty(y.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.defineProperties(x.prototype,{width:{get:function(){return this.z},set:function(t){this.z=t}},height:{get:function(){return this.w},set:function(t){this.w=t}}}),Object.assign(x.prototype,{isVector4:!0,set:function(t,e,r,n){return this.x=t,this.y=e,this.z=r,this.w=n,this},setScalar:function(t){return this.x=t,this.y=t,this.z=t,this.w=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setZ:function(t){return this.z=t,this},setW:function(t){return this.w=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)},subScalar:function(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this},multiplyScalar:function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},applyMatrix4:function(t){var e=this.x,r=this.y,n=this.z,i=this.w,a=t.elements;return this.x=a[0]*e+a[4]*r+a[8]*n+a[12]*i,this.y=a[1]*e+a[5]*r+a[9]*n+a[13]*i,this.z=a[2]*e+a[6]*r+a[10]*n+a[14]*i,this.w=a[3]*e+a[7]*r+a[11]*n+a[15]*i,this},divideScalar:function(t){return this.multiplyScalar(1/t)},setAxisAngleFromQuaternion:function(t){this.w=2*Math.acos(t.w);var e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this},setAxisAngleFromRotationMatrix:function(t){var e,r,n,i,a=t.elements,o=a[0],s=a[4],c=a[8],l=a[1],h=a[5],u=a[9],p=a[2],d=a[6],f=a[10];if(Math.abs(s-l)<.01&&Math.abs(c-p)<.01&&Math.abs(u-d)<.01){if(Math.abs(s+l)<.1&&Math.abs(c+p)<.1&&Math.abs(u+d)<.1&&Math.abs(o+h+f-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;var m=(o+1)/2,g=(h+1)/2,v=(f+1)/2,y=(s+l)/4,x=(c+p)/4,b=(u+d)/4;return m>g&&m>v?m<.01?(r=0,n=.707106781,i=.707106781):(n=y/(r=Math.sqrt(m)),i=x/r):g>v?g<.01?(r=.707106781,n=0,i=.707106781):(r=y/(n=Math.sqrt(g)),i=b/n):v<.01?(r=.707106781,n=.707106781,i=0):(r=x/(i=Math.sqrt(v)),n=b/i),this.set(r,n,i,e),this}var w=Math.sqrt((d-u)*(d-u)+(c-p)*(c-p)+(l-s)*(l-s));return Math.abs(w)<.001&&(w=1),this.x=(d-u)/w,this.y=(c-p)/w,this.z=(l-s)/w,this.w=Math.acos((o+h+f-1)/2),this},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this},clampScalar:function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this},clampLength:function(t,e){var r=this.length();return this.divideScalar(r||1).multiplyScalar(Math.max(t,Math.min(e,r)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.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)},manhattanLength: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()||1)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this},lerpVectors:function(t,e,r){return this.subVectors(e,t).multiplyScalar(r).add(t)},equals:function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t},fromBufferAttribute:function(t,e,r){return void 0!==r&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}}),b.prototype=Object.assign(Object.create(e.prototype),{constructor:b,isWebGLRenderTarget:!0,setSize:function(t,e){this.width===t&&this.height===e||(this.width=t,this.height=e,this.texture.image.width=t,this.texture.image.height=e,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.width=t.width,this.height=t.height,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,this.depthTexture=t.depthTexture,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),w.prototype=Object.assign(Object.create(b.prototype),{constructor:w,isWebGLMultisampleRenderTarget:!0,copy:function(t){return b.prototype.copy.call(this,t),this.samples=t.samples,this}});var _=new d,M=new P,S=new d(0,0,0),T=new d(1,1,1),E=new d,A=new d,L=new d;function P(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}Object.assign(P.prototype,{isMatrix4:!0,set:function(t,e,r,n,i,a,o,s,c,l,h,u,p,d,f,m){var g=this.elements;return g[0]=t,g[4]=e,g[8]=r,g[12]=n,g[1]=i,g[5]=a,g[9]=o,g[13]=s,g[2]=c,g[6]=l,g[10]=h,g[14]=u,g[3]=p,g[7]=d,g[11]=f,g[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new P).fromArray(this.elements)},copy:function(t){var e=this.elements,r=t.elements;return e[0]=r[0],e[1]=r[1],e[2]=r[2],e[3]=r[3],e[4]=r[4],e[5]=r[5],e[6]=r[6],e[7]=r[7],e[8]=r[8],e[9]=r[9],e[10]=r[10],e[11]=r[11],e[12]=r[12],e[13]=r[13],e[14]=r[14],e[15]=r[15],this},copyPosition:function(t){var e=this.elements,r=t.elements;return e[12]=r[12],e[13]=r[13],e[14]=r[14],this},extractBasis:function(t,e,r){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this},makeBasis:function(t,e,r){return this.set(t.x,e.x,r.x,0,t.y,e.y,r.y,0,t.z,e.z,r.z,0,0,0,0,1),this},extractRotation:function(t){var e=this.elements,r=t.elements,n=1/_.setFromMatrixColumn(t,0).length(),i=1/_.setFromMatrixColumn(t,1).length(),a=1/_.setFromMatrixColumn(t,2).length();return e[0]=r[0]*n,e[1]=r[1]*n,e[2]=r[2]*n,e[3]=0,e[4]=r[4]*i,e[5]=r[5]*i,e[6]=r[6]*i,e[7]=0,e[8]=r[8]*a,e[9]=r[9]*a,e[10]=r[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},makeRotationFromEuler:function(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var e=this.elements,r=t.x,n=t.y,i=t.z,a=Math.cos(r),o=Math.sin(r),s=Math.cos(n),c=Math.sin(n),l=Math.cos(i),h=Math.sin(i);if("XYZ"===t.order){var u=a*l,p=a*h,d=o*l,f=o*h;e[0]=s*l,e[4]=-s*h,e[8]=c,e[1]=p+d*c,e[5]=u-f*c,e[9]=-o*s,e[2]=f-u*c,e[6]=d+p*c,e[10]=a*s}else if("YXZ"===t.order){var m=s*l,g=s*h,v=c*l,y=c*h;e[0]=m+y*o,e[4]=v*o-g,e[8]=a*c,e[1]=a*h,e[5]=a*l,e[9]=-o,e[2]=g*o-v,e[6]=y+m*o,e[10]=a*s}else if("ZXY"===t.order)m=s*l,g=s*h,v=c*l,y=c*h,e[0]=m-y*o,e[4]=-a*h,e[8]=v+g*o,e[1]=g+v*o,e[5]=a*l,e[9]=y-m*o,e[2]=-a*c,e[6]=o,e[10]=a*s;else if("ZYX"===t.order)u=a*l,p=a*h,d=o*l,f=o*h,e[0]=s*l,e[4]=d*c-p,e[8]=u*c+f,e[1]=s*h,e[5]=f*c+u,e[9]=p*c-d,e[2]=-c,e[6]=o*s,e[10]=a*s;else if("YZX"===t.order){var x=a*s,b=a*c,w=o*s,_=o*c;e[0]=s*l,e[4]=_-x*h,e[8]=w*h+b,e[1]=h,e[5]=a*l,e[9]=-o*l,e[2]=-c*l,e[6]=b*h+w,e[10]=x-_*h}else"XZY"===t.order&&(x=a*s,b=a*c,w=o*s,_=o*c,e[0]=s*l,e[4]=-h,e[8]=c*l,e[1]=x*h+_,e[5]=a*l,e[9]=b*h-w,e[2]=w*h-b,e[6]=o*l,e[10]=_*h+x);return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},makeRotationFromQuaternion:function(t){return this.compose(S,t,T)},lookAt:function(t,e,r){var n=this.elements;return L.subVectors(t,e),0===L.lengthSq()&&(L.z=1),L.normalize(),E.crossVectors(r,L),0===E.lengthSq()&&(1===Math.abs(r.z)?L.x+=1e-4:L.z+=1e-4,L.normalize(),E.crossVectors(r,L)),E.normalize(),A.crossVectors(L,E),n[0]=E.x,n[4]=A.x,n[8]=L.x,n[1]=E.y,n[5]=A.y,n[9]=L.y,n[2]=E.z,n[6]=A.z,n[10]=L.z,this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)},premultiply:function(t){return this.multiplyMatrices(t,this)},multiplyMatrices:function(t,e){var r=t.elements,n=e.elements,i=this.elements,a=r[0],o=r[4],s=r[8],c=r[12],l=r[1],h=r[5],u=r[9],p=r[13],d=r[2],f=r[6],m=r[10],g=r[14],v=r[3],y=r[7],x=r[11],b=r[15],w=n[0],_=n[4],M=n[8],S=n[12],T=n[1],E=n[5],A=n[9],L=n[13],R=n[2],P=n[6],C=n[10],O=n[14],D=n[3],N=n[7],I=n[11],z=n[15];return i[0]=a*w+o*T+s*R+c*D,i[4]=a*_+o*E+s*P+c*N,i[8]=a*M+o*A+s*C+c*I,i[12]=a*S+o*L+s*O+c*z,i[1]=l*w+h*T+u*R+p*D,i[5]=l*_+h*E+u*P+p*N,i[9]=l*M+h*A+u*C+p*I,i[13]=l*S+h*L+u*O+p*z,i[2]=d*w+f*T+m*R+g*D,i[6]=d*_+f*E+m*P+g*N,i[10]=d*M+f*A+m*C+g*I,i[14]=d*S+f*L+m*O+g*z,i[3]=v*w+y*T+x*R+b*D,i[7]=v*_+y*E+x*P+b*N,i[11]=v*M+y*A+x*C+b*I,i[15]=v*S+y*L+x*O+b*z,this},multiplyScalar:function(t){var e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this},applyToBufferAttribute:function(t){for(var e=0,r=t.count;e1){for(var e=0;e1){for(var e=0;e0)for(n.children=[],s=0;s0&&(r.geometries=u),p.length>0&&(r.materials=p),d.length>0&&(r.textures=d),f.length>0&&(r.images=f),o.length>0&&(r.shapes=o)}return r.object=n,r;function m(t){var e=[];for(var r in t){var n=t[r];delete n.metadata,e.push(n)}return e}},clone:function(t){return(new this.constructor).copy(this,t)},copy:function(t,e){if(void 0===e&&(e=!0),this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(var r=0;rs)return!1}return!0}Object.assign(ct.prototype,{isBox3:!0,set:function(t,e){return this.min.copy(t),this.max.copy(e),this},setFromArray:function(t){for(var e=1/0,r=1/0,n=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,c=t.length;si&&(i=l),h>a&&(a=h),u>o&&(o=u)}return this.min.set(e,r,n),this.max.set(i,a,o),this},setFromBufferAttribute:function(t){for(var e=1/0,r=1/0,n=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,c=t.count;si&&(i=l),h>a&&(a=h),u>o&&(o=u)}return this.min.set(e,r,n),this.max.set(i,a,o),this},setFromPoints:function(t){this.makeEmpty();for(var e=0,r=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)},containsBox:function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z},getParameter:function(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new d),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)},intersectsSphere:function(t){return this.clampPoint(t.center,Q),Q.distanceToSquared(t.center)<=t.radius*t.radius},intersectsPlane:function(t){var e,r;return t.normal.x>0?(e=t.normal.x*this.min.x,r=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,r=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,r+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,r+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,r+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,r+=t.normal.z*this.min.z),e<=-t.constant&&r>=-t.constant},intersectsTriangle:function(t){if(this.isEmpty())return!1;this.getCenter(it),at.subVectors(this.max,it),K.subVectors(t.a,it),$.subVectors(t.b,it),tt.subVectors(t.c,it),et.subVectors($,K),rt.subVectors(tt,$),nt.subVectors(K,tt);var e=[0,-et.z,et.y,0,-rt.z,rt.y,0,-nt.z,nt.y,et.z,0,-et.x,rt.z,0,-rt.x,nt.z,0,-nt.x,-et.y,et.x,0,-rt.y,rt.x,0,-nt.y,nt.x,0];return!!lt(e,K,$,tt,at)&&!!lt(e=[1,0,0,0,1,0,0,0,1],K,$,tt,at)&&(ot.crossVectors(et,rt),lt(e=[ot.x,ot.y,ot.z],K,$,tt,at))},clampPoint:function(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new d),e.copy(t).clamp(this.min,this.max)},distanceToPoint:function(t){return Q.copy(t).clamp(this.min,this.max).sub(t).length()},getBoundingSphere:function(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(Q).length(),t},intersect:function(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this},union:function(t){return this.min.min(t.min),this.max.max(t.max),this},applyMatrix4:function(t){return this.isEmpty()||(Z[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Z[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Z[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Z[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Z[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Z[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Z[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Z[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Z)),this},translate:function(t){return this.min.add(t),this.max.add(t),this},equals:function(t){return t.min.equals(this.min)&&t.max.equals(this.max)}});var ht=new ct;function ut(t,e){this.center=void 0!==t?t:new d,this.radius=void 0!==e?e:0}Object.assign(ut.prototype,{set:function(t,e){return this.center.copy(t),this.radius=e,this},setFromPoints:function(t,e){var r=this.center;void 0!==e?r.copy(e):ht.setFromPoints(t).getCenter(r);for(var n=0,i=0,a=t.length;ithis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e},getBoundingBox:function(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new ct),t.set(this.center,this.center),t.expandByScalar(this.radius),t},applyMatrix4:function(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this},translate:function(t){return this.center.add(t),this},equals:function(t){return t.center.equals(this.center)&&t.radius===this.radius}});var pt=new d,dt=new d,ft=new d,mt=new d,gt=new d,vt=new d,yt=new d;function xt(t,e){this.origin=void 0!==t?t:new d,this.direction=void 0!==e?e:new d}Object.assign(xt.prototype,{set:function(t,e){return this.origin.copy(t),this.direction.copy(e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this},at:function(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new d),e.copy(this.direction).multiplyScalar(t).add(this.origin)},lookAt:function(t){return this.direction.copy(t).sub(this.origin).normalize(),this},recast:function(t){return this.origin.copy(this.at(t,pt)),this},closestPointToPoint:function(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new d),e.subVectors(t,this.origin);var r=e.dot(this.direction);return r<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(r).add(this.origin)},distanceToPoint:function(t){return Math.sqrt(this.distanceSqToPoint(t))},distanceSqToPoint:function(t){var e=pt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(pt.copy(this.direction).multiplyScalar(e).add(this.origin),pt.distanceToSquared(t))},distanceSqToSegment:function(t,e,r,n){dt.copy(t).add(e).multiplyScalar(.5),ft.copy(e).sub(t).normalize(),mt.copy(this.origin).sub(dt);var i,a,o,s,c=.5*t.distanceTo(e),l=-this.direction.dot(ft),h=mt.dot(this.direction),u=-mt.dot(ft),p=mt.lengthSq(),d=Math.abs(1-l*l);if(d>0)if(a=l*h-u,s=c*d,(i=l*u-h)>=0)if(a>=-s)if(a<=s){var f=1/d;o=(i*=f)*(i+l*(a*=f)+2*h)+a*(l*i+a+2*u)+p}else a=c,o=-(i=Math.max(0,-(l*a+h)))*i+a*(a+2*u)+p;else a=-c,o=-(i=Math.max(0,-(l*a+h)))*i+a*(a+2*u)+p;else a<=-s?o=-(i=Math.max(0,-(-l*c+h)))*i+(a=i>0?-c:Math.min(Math.max(-c,-u),c))*(a+2*u)+p:a<=s?(i=0,o=(a=Math.min(Math.max(-c,-u),c))*(a+2*u)+p):o=-(i=Math.max(0,-(l*c+h)))*i+(a=i>0?c:Math.min(Math.max(-c,-u),c))*(a+2*u)+p;else a=l>0?-c:c,o=-(i=Math.max(0,-(l*a+h)))*i+a*(a+2*u)+p;return r&&r.copy(this.direction).multiplyScalar(i).add(this.origin),n&&n.copy(ft).multiplyScalar(a).add(dt),o},intersectSphere:function(t,e){pt.subVectors(t.center,this.origin);var r=pt.dot(this.direction),n=pt.dot(pt)-r*r,i=t.radius*t.radius;if(n>i)return null;var a=Math.sqrt(i-n),o=r-a,s=r+a;return o<0&&s<0?null:o<0?this.at(s,e):this.at(o,e)},intersectsSphere:function(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius},distanceToPlane:function(t){var e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;var r=-(this.origin.dot(t.normal)+t.constant)/e;return r>=0?r:null},intersectPlane:function(t,e){var r=this.distanceToPlane(t);return null===r?null:this.at(r,e)},intersectsPlane:function(t){var e=t.distanceToPoint(this.origin);return 0===e||t.normal.dot(this.direction)*e<0},intersectBox:function(t,e){var r,n,i,a,o,s,c=1/this.direction.x,l=1/this.direction.y,h=1/this.direction.z,u=this.origin;return c>=0?(r=(t.min.x-u.x)*c,n=(t.max.x-u.x)*c):(r=(t.max.x-u.x)*c,n=(t.min.x-u.x)*c),l>=0?(i=(t.min.y-u.y)*l,a=(t.max.y-u.y)*l):(i=(t.max.y-u.y)*l,a=(t.min.y-u.y)*l),r>a||i>n?null:((i>r||r!=r)&&(r=i),(a=0?(o=(t.min.z-u.z)*h,s=(t.max.z-u.z)*h):(o=(t.max.z-u.z)*h,s=(t.min.z-u.z)*h),r>s||o>n?null:((o>r||r!=r)&&(r=o),(s=0?r:n,e)))},intersectsBox:function(t){return null!==this.intersectBox(t,pt)},intersectTriangle:function(t,e,r,n,i){gt.subVectors(e,t),vt.subVectors(r,t),yt.crossVectors(gt,vt);var a,o=this.direction.dot(yt);if(o>0){if(n)return null;a=1}else{if(!(o<0))return null;a=-1,o=-o}mt.subVectors(this.origin,t);var s=a*this.direction.dot(vt.crossVectors(mt,vt));if(s<0)return null;var c=a*this.direction.dot(gt.cross(mt));if(c<0)return null;if(s+c>o)return null;var l=-a*mt.dot(yt);return l<0?null:this.at(l/o,i)},applyMatrix4:function(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this},equals:function(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}});var bt=new d,wt=new d,_t=new d,Mt=new d,St=new d,Tt=new d,Et=new d,At=new d,Lt=new d,Rt=new d;function Pt(t,e,r){this.a=void 0!==t?t:new d,this.b=void 0!==e?e:new d,this.c=void 0!==r?r:new d}Object.assign(Pt,{getNormal:function(t,e,r,n){void 0===n&&(console.warn("THREE.Triangle: .getNormal() target is now required"),n=new d),n.subVectors(r,e),bt.subVectors(t,e),n.cross(bt);var i=n.lengthSq();return i>0?n.multiplyScalar(1/Math.sqrt(i)):n.set(0,0,0)},getBarycoord:function(t,e,r,n,i){bt.subVectors(n,e),wt.subVectors(r,e),_t.subVectors(t,e);var a=bt.dot(bt),o=bt.dot(wt),s=bt.dot(_t),c=wt.dot(wt),l=wt.dot(_t),h=a*c-o*o;if(void 0===i&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),i=new d),0===h)return i.set(-2,-1,-1);var u=1/h,p=(c*s-o*l)*u,f=(a*l-o*s)*u;return i.set(1-p-f,f,p)},containsPoint:function(t,e,r,n){return Pt.getBarycoord(t,e,r,n,Mt),Mt.x>=0&&Mt.y>=0&&Mt.x+Mt.y<=1},getUV:function(t,e,r,n,i,a,o,s){return this.getBarycoord(t,e,r,n,Mt),s.set(0,0),s.addScaledVector(i,Mt.x),s.addScaledVector(a,Mt.y),s.addScaledVector(o,Mt.z),s},isFrontFacing:function(t,e,r,n){return bt.subVectors(r,e),wt.subVectors(t,e),bt.cross(wt).dot(n)<0}}),Object.assign(Pt.prototype,{set:function(t,e,r){return this.a.copy(t),this.b.copy(e),this.c.copy(r),this},setFromPointsAndIndices:function(t,e,r,n){return this.a.copy(t[e]),this.b.copy(t[r]),this.c.copy(t[n]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this},getArea:function(){return bt.subVectors(this.c,this.b),wt.subVectors(this.a,this.b),.5*bt.cross(wt).length()},getMidpoint:function(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new d),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(t){return Pt.getNormal(this.a,this.b,this.c,t)},getPlane:function(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new d),t.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(t,e){return Pt.getBarycoord(t,this.a,this.b,this.c,e)},getUV:function(t,e,r,n,i){return Pt.getUV(t,this.a,this.b,this.c,e,r,n,i)},containsPoint:function(t){return Pt.containsPoint(t,this.a,this.b,this.c)},isFrontFacing:function(t){return Pt.isFrontFacing(this.a,this.b,this.c,t)},intersectsBox:function(t){return t.intersectsTriangle(this)},closestPointToPoint:function(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new d);var r,n,i=this.a,a=this.b,o=this.c;St.subVectors(a,i),Tt.subVectors(o,i),At.subVectors(t,i);var s=St.dot(At),c=Tt.dot(At);if(s<=0&&c<=0)return e.copy(i);Lt.subVectors(t,a);var l=St.dot(Lt),h=Tt.dot(Lt);if(l>=0&&h<=l)return e.copy(a);var u=s*h-l*c;if(u<=0&&s>=0&&l<=0)return r=s/(s-l),e.copy(i).addScaledVector(St,r);Rt.subVectors(t,o);var p=St.dot(Rt),f=Tt.dot(Rt);if(f>=0&&p<=f)return e.copy(o);var m=p*c-s*f;if(m<=0&&c>=0&&f<=0)return n=c/(c-f),e.copy(i).addScaledVector(Tt,n);var g=l*f-p*h;if(g<=0&&h-l>=0&&p-f>=0)return Et.subVectors(o,a),n=(h-l)/(h-l+(p-f)),e.copy(a).addScaledVector(Et,n);var v=1/(g+m+u);return r=m*v,n=u*v,e.copy(i).addScaledVector(St,r).addScaledVector(Tt,n)},equals:function(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}});var Ct={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},Ot={h:0,s:0,l:0},Dt={h:0,s:0,l:0};function Nt(t,e,r){return void 0===e&&void 0===r?this.set(t):this.setRGB(t,e,r)}function It(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+6*(e-t)*(2/3-r):t}function zt(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Bt(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}function Ft(t,e,r,n,i,a){this.a=t,this.b=e,this.c=r,this.normal=n&&n.isVector3?n:new d,this.vertexNormals=Array.isArray(n)?n:[],this.color=i&&i.isColor?i:new Nt,this.vertexColors=Array.isArray(i)?i:[],this.materialIndex=void 0!==a?a:0}Object.assign(Nt.prototype,{isColor:!0,r:1,g:1,b:1,set:function(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this},setScalar:function(t){return this.r=t,this.g=t,this.b=t,this},setHex:function(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this},setRGB:function(t,e,r){return this.r=t,this.g=e,this.b=r,this},setHSL:function(t,e,r){if(t=s.euclideanModulo(t,1),e=s.clamp(e,0,1),r=s.clamp(r,0,1),0===e)this.r=this.g=this.b=r;else{var n=r<=.5?r*(1+e):r+e-r*e,i=2*r-n;this.r=It(i,n,t+1/3),this.g=It(i,n,t),this.b=It(i,n,t-1/3)}return this},setStyle:function(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}var r;if(r=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(t)){var n,i=r[1],a=r[2];switch(i){case"rgb":case"rgba":if(n=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(n[1],10))/255,this.g=Math.min(255,parseInt(n[2],10))/255,this.b=Math.min(255,parseInt(n[3],10))/255,e(n[5]),this;if(n=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(n[1],10))/100,this.g=Math.min(100,parseInt(n[2],10))/100,this.b=Math.min(100,parseInt(n[3],10))/100,e(n[5]),this;break;case"hsl":case"hsla":if(n=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(a)){var o=parseFloat(n[1])/360,s=parseInt(n[2],10)/100,c=parseInt(n[3],10)/100;return e(n[5]),this.setHSL(o,s,c)}}}else if(r=/^\#([A-Fa-f0-9]+)$/.exec(t)){var l,h=(l=r[1]).length;if(3===h)return this.r=parseInt(l.charAt(0)+l.charAt(0),16)/255,this.g=parseInt(l.charAt(1)+l.charAt(1),16)/255,this.b=parseInt(l.charAt(2)+l.charAt(2),16)/255,this;if(6===h)return this.r=parseInt(l.charAt(0)+l.charAt(1),16)/255,this.g=parseInt(l.charAt(2)+l.charAt(3),16)/255,this.b=parseInt(l.charAt(4)+l.charAt(5),16)/255,this}return t&&t.length>0&&(void 0!==(l=Ct[t])?this.setHex(l):console.warn("THREE.Color: Unknown color "+t)),this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(t){return this.r=t.r,this.g=t.g,this.b=t.b,this},copyGammaToLinear:function(t,e){return void 0===e&&(e=2),this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this},copyLinearToGamma:function(t,e){void 0===e&&(e=2);var r=e>0?1/e:1;return this.r=Math.pow(t.r,r),this.g=Math.pow(t.g,r),this.b=Math.pow(t.b,r),this},convertGammaToLinear:function(t){return this.copyGammaToLinear(this,t),this},convertLinearToGamma:function(t){return this.copyLinearToGamma(this,t),this},copySRGBToLinear:function(t){return this.r=zt(t.r),this.g=zt(t.g),this.b=zt(t.b),this},copyLinearToSRGB:function(t){return this.r=Bt(t.r),this.g=Bt(t.g),this.b=Bt(t.b),this},convertSRGBToLinear:function(){return this.copySRGBToLinear(this),this},convertLinearToSRGB:function(){return this.copyLinearToSRGB(this),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(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});var e,r,n=this.r,i=this.g,a=this.b,o=Math.max(n,i,a),s=Math.min(n,i,a),c=(s+o)/2;if(s===o)e=0,r=0;else{var l=o-s;switch(r=c<=.5?l/(o+s):l/(2-o-s),o){case n:e=(i-a)/l+(ie&&(e=t[r]);return e}Ut.prototype=Object.assign(Object.create(e.prototype),{constructor:Ut,isMaterial:!0,onBeforeCompile:function(){},setValues:function(t){if(void 0!==t)for(var e in t){var r=t[e];if(void 0!==r)if("shading"!==e){var n=this[e];void 0!==n?n&&n.isColor?n.set(r):n&&n.isVector3&&r&&r.isVector3?n.copy(r):this[e]=r:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}else console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===r;else console.warn("THREE.Material: '"+e+"' parameter is undefined.")}},toJSON:function(t){var e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});var r={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){var e=[];for(var r in t){var n=t[r];delete n.metadata,e.push(n)}return e}if(r.uuid=this.uuid,r.type=this.type,""!==this.name&&(r.name=this.name),this.color&&this.color.isColor&&(r.color=this.color.getHex()),void 0!==this.roughness&&(r.roughness=this.roughness),void 0!==this.metalness&&(r.metalness=this.metalness),this.emissive&&this.emissive.isColor&&(r.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(r.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(r.specular=this.specular.getHex()),void 0!==this.shininess&&(r.shininess=this.shininess),void 0!==this.clearcoat&&(r.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(r.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(r.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,r.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(r.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(r.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(r.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(r.lightMap=this.lightMap.toJSON(t).uuid),this.aoMap&&this.aoMap.isTexture&&(r.aoMap=this.aoMap.toJSON(t).uuid,r.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(r.bumpMap=this.bumpMap.toJSON(t).uuid,r.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(r.normalMap=this.normalMap.toJSON(t).uuid,r.normalMapType=this.normalMapType,r.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(r.displacementMap=this.displacementMap.toJSON(t).uuid,r.displacementScale=this.displacementScale,r.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(r.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(r.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(r.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(r.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(r.envMap=this.envMap.toJSON(t).uuid,r.reflectivity=this.reflectivity,r.refractionRatio=this.refractionRatio,void 0!==this.combine&&(r.combine=this.combine),void 0!==this.envMapIntensity&&(r.envMapIntensity=this.envMapIntensity)),this.gradientMap&&this.gradientMap.isTexture&&(r.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.size&&(r.size=this.size),void 0!==this.sizeAttenuation&&(r.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(r.blending=this.blending),!0===this.flatShading&&(r.flatShading=this.flatShading),0!==this.side&&(r.side=this.side),0!==this.vertexColors&&(r.vertexColors=this.vertexColors),this.opacity<1&&(r.opacity=this.opacity),!0===this.transparent&&(r.transparent=this.transparent),r.depthFunc=this.depthFunc,r.depthTest=this.depthTest,r.depthWrite=this.depthWrite,r.stencilWrite=this.stencilWrite,r.stencilFunc=this.stencilFunc,r.stencilRef=this.stencilRef,r.stencilMask=this.stencilMask,r.stencilFail=this.stencilFail,r.stencilZFail=this.stencilZFail,r.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(r.rotation=this.rotation),!0===this.polygonOffset&&(r.polygonOffset=!0),0!==this.polygonOffsetFactor&&(r.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(r.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(r.linewidth=this.linewidth),void 0!==this.dashSize&&(r.dashSize=this.dashSize),void 0!==this.gapSize&&(r.gapSize=this.gapSize),void 0!==this.scale&&(r.scale=this.scale),!0===this.dithering&&(r.dithering=!0),this.alphaTest>0&&(r.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(r.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(r.wireframe=this.wireframe),this.wireframeLinewidth>1&&(r.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(r.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(r.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(r.morphTargets=!0),!0===this.morphNormals&&(r.morphNormals=!0),!0===this.skinning&&(r.skinning=!0),!1===this.visible&&(r.visible=!1),!1===this.toneMapped&&(r.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(r.userData=this.userData),e){var i=n(t.textures),a=n(t.images);i.length>0&&(r.textures=i),a.length>0&&(r.images=a)}return r},clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.name=t.name,this.fog=t.fog,this.lights=t.lights,this.blending=t.blending,this.side=t.side,this.flatShading=t.flatShading,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWrite=t.stencilWrite,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilMask=t.stencilMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this.clipShadows=t.clipShadows,this.clipIntersection=t.clipIntersection;var e=t.clippingPlanes,r=null;if(null!==e){var n=e.length;r=new Array(n);for(var i=0;i!==n;++i)r[i]=e[i].clone()}return this.clippingPlanes=r,this.shadowSide=t.shadowSide,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Ht.prototype=Object.create(Ut.prototype),Ht.prototype.constructor=Ht,Ht.prototype.isMeshBasicMaterial=!0,Ht.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this},Object.defineProperty(Vt.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(Vt.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setArray:function(t){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");return this.count=void 0!==t?t.length/this.itemSize:0,this.array=t,this},setDynamic:function(t){return this.dynamic=t,this},copy:function(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.dynamic=t.dynamic,this},copyAt:function(t,e,r){t*=this.itemSize,r*=e.itemSize;for(var n=0,i=this.itemSize;n0,o=i[1]&&i[1].length>0,s=t.morphTargets,c=s.length;if(c>0){e=[];for(var h=0;h0){for(u=[],h=0;h0&&0===r.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported."),h=0;h65535?Jt:Xt)(t,1):this.index=t},addAttribute:function(t,e){return e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?"index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):(this.attributes[t]=e,this):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(t,new Vt(arguments[1],arguments[2])))},getAttribute:function(t){return this.attributes[t]},removeAttribute:function(t){return delete this.attributes[t],this},addGroup:function(t,e,r){this.groups.push({start:t,count:e,materialIndex:void 0!==r?r:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(t,e){this.drawRange.start=t,this.drawRange.count=e},applyMatrix:function(t){var e=this.attributes.position;void 0!==e&&(t.applyToBufferAttribute(e),e.needsUpdate=!0);var r=this.attributes.normal;void 0!==r&&((new m).getNormalMatrix(t).applyToBufferAttribute(r),r.needsUpdate=!0);var n=this.attributes.tangent;return void 0!==n&&((new m).getNormalMatrix(t).applyToBufferAttribute(n),n.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(t){return ee.makeRotationX(t),this.applyMatrix(ee),this},rotateY:function(t){return ee.makeRotationY(t),this.applyMatrix(ee),this},rotateZ:function(t){return ee.makeRotationZ(t),this.applyMatrix(ee),this},translate:function(t,e,r){return ee.makeTranslation(t,e,r),this.applyMatrix(ee),this},scale:function(t,e,r){return ee.makeScale(t,e,r),this.applyMatrix(ee),this},lookAt:function(t){return re.lookAt(t),re.updateMatrix(),this.applyMatrix(re.matrix),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(ne).negate(),this.translate(ne.x,ne.y,ne.z),this},setFromObject:function(t){var e=t.geometry;if(t.isPoints||t.isLine){var r=new Zt(3*e.vertices.length,3),n=new Zt(3*e.colors.length,3);if(this.addAttribute("position",r.copyVector3sArray(e.vertices)),this.addAttribute("color",n.copyColorsArray(e.colors)),e.lineDistances&&e.lineDistances.length===e.vertices.length){var i=new Zt(e.lineDistances.length,1);this.addAttribute("lineDistance",i.copyArray(e.lineDistances))}null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone())}else t.isMesh&&e&&e.isGeometry&&this.fromGeometry(e);return this},setFromPoints:function(t){for(var e=[],r=0,n=t.length;r0){var r=new Float32Array(3*t.normals.length);this.addAttribute("normal",new Vt(r,3).copyVector3sArray(t.normals))}if(t.colors.length>0){var n=new Float32Array(3*t.colors.length);this.addAttribute("color",new Vt(n,3).copyColorsArray(t.colors))}if(t.uvs.length>0){var i=new Float32Array(2*t.uvs.length);this.addAttribute("uv",new Vt(i,2).copyVector2sArray(t.uvs))}if(t.uvs2.length>0){var a=new Float32Array(2*t.uvs2.length);this.addAttribute("uv2",new Vt(a,2).copyVector2sArray(t.uvs2))}for(var o in this.groups=t.groups,t.morphTargets){for(var s=[],c=t.morphTargets[o],l=0,h=c.length;l0){var d=new Zt(4*t.skinIndices.length,4);this.addAttribute("skinIndex",d.copyVector4sArray(t.skinIndices))}if(t.skinWeights.length>0){var f=new Zt(4*t.skinWeights.length,4);this.addAttribute("skinWeight",f.copyVector4sArray(t.skinWeights))}return null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new ct);var t=this.attributes.position,e=this.morphAttributes.position;if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(var r=0,n=e.length;r0&&(t.userData=this.userData),void 0!==this.parameters){var e=this.parameters;for(var r in e)void 0!==e[r]&&(t[r]=e[r]);return t}t.data={attributes:{}};var n=this.index;null!==n&&(t.data.index={type:n.array.constructor.name,array:Array.prototype.slice.call(n.array)});var i=this.attributes;for(var r in i){var a=(p=i[r]).toJSON();""!==p.name&&(a.name=p.name),t.data.attributes[r]=a}var o={},s=!1;for(var r in this.morphAttributes){for(var c=this.morphAttributes[r],l=[],h=0,u=c.length;h0&&(o[r]=l,s=!0)}s&&(t.data.morphAttributes=o);var d=this.groups;d.length>0&&(t.data.groups=JSON.parse(JSON.stringify(d)));var f=this.boundingSphere;return null!==f&&(t.data.boundingSphere={center:f.center.toArray(),radius:f.radius}),t},clone:function(){return(new se).copy(this)},copy:function(t){var e,r,n;this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.name=t.name;var i=t.index;null!==i&&this.setIndex(i.clone());var a=t.attributes;for(e in a){var o=a[e];this.addAttribute(e,o.clone())}var s=t.morphAttributes;for(e in s){var c=[],l=s[e];for(r=0,n=l.length;rr.far?null:{distance:c,point:Se.clone(),object:t}}function Ae(t,e,r,n,i,a,o,s,c,h,u){ue.fromBufferAttribute(i,c),pe.fromBufferAttribute(i,h),de.fromBufferAttribute(i,u);var p=t.morphTargetInfluences;if(e.morphTargets&&a&&p){ve.set(0,0,0),ye.set(0,0,0),xe.set(0,0,0);for(var d=0,f=a.length;d0){var o=i[a[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},t=0,e=o.length;t0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},raycast:function(t,e){var r,n=this.geometry,i=this.material,a=this.matrixWorld;if(void 0!==i&&(null===n.boundingSphere&&n.computeBoundingSphere(),he.copy(n.boundingSphere),he.applyMatrix4(a),!1!==t.ray.intersectsSphere(he)&&(ce.getInverse(a),le.copy(t.ray).applyMatrix4(ce),null===n.boundingBox||!1!==le.intersectsBox(n.boundingBox))))if(n.isBufferGeometry){var o,s,c,h,u,p,d,f,m,g=n.index,v=n.attributes.position,y=n.morphAttributes.position,x=n.attributes.uv,b=n.attributes.uv2,w=n.groups,_=n.drawRange;if(null!==g)if(Array.isArray(i))for(h=0,p=w.length;h0&&(E=P);for(var C=0,O=R.length;C0?1:-1,l.push(P.x,P.y,P.z),h.push(x/g),h.push(1-b/v),L+=1}}for(b=0;b0)for(h=0;h0&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var t,e,r;for(this.computeFaceNormals(),t=0,e=this.faces.length;t0&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var t,e,r,n,i;for(r=0,n=this.faces.length;r=0;r--){var f=p[r];for(this.faces.splice(f,1),o=0,s=this.faceVertexUvs.length;o0,g=d.vertexNormals.length>0,v=1!==d.color.r||1!==d.color.g||1!==d.color.b,y=d.vertexColors.length>0,x=0;if(x=M(x,0,0),x=M(x,1,!0),x=M(x,2,!1),x=M(x,3,f),x=M(x,4,m),x=M(x,5,g),x=M(x,6,v),x=M(x,7,y),o.push(x),o.push(d.a,d.b,d.c),o.push(d.materialIndex),f){var b=this.faceVertexUvs[0][i];o.push(E(b[0]),E(b[1]),E(b[2]))}if(m&&o.push(S(d.normal)),g){var w=d.vertexNormals;o.push(S(w[0]),S(w[1]),S(w[2]))}if(v&&o.push(T(d.color)),y){var _=d.vertexColors;o.push(T(_[0]),T(_[1]),T(_[2]))}}function M(t,e,r){return r?t|1<0&&(t.data.colors=l),u.length>0&&(t.data.uvs=[u]),t.data.faces=o,t},clone:function(){return(new Oe).copy(this)},copy:function(t){var e,r,n,i,a,o;this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.name=t.name;var s=t.vertices;for(e=0,r=s.length;e0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;var i={};for(var a in this.extensions)!0===this.extensions[a]&&(i[a]=!0);return Object.keys(i).length>0&&(e.extensions=i),e},Ge.prototype=Object.assign(Object.create(Y.prototype),{constructor:Ge,isCamera:!0,copy:function(t,e){return Y.prototype.copy.call(this,t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this},getWorldDirection:function(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new d),this.updateMatrixWorld(!0);var e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()},updateMatrixWorld:function(t){Y.prototype.updateMatrixWorld.call(this,t),this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}}),Ue.prototype=Object.assign(Object.create(Ge.prototype),{constructor:Ue,isPerspectiveCamera:!0,copy:function(t,e){return Ge.prototype.copy.call(this,t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this},setFocalLength:function(t){var e=.5*this.getFilmHeight()/t;this.fov=2*s.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){var t=Math.tan(.5*s.DEG2RAD*this.fov);return.5*this.getFilmHeight()/t},getEffectiveFOV:function(){return 2*s.RAD2DEG*Math.atan(Math.tan(.5*s.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(t,e,r,n,i,a){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=r,this.view.offsetY=n,this.view.width=i,this.view.height=a,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var t=this.near,e=t*Math.tan(.5*s.DEG2RAD*this.fov)/this.zoom,r=2*e,n=this.aspect*r,i=-.5*n,a=this.view;if(null!==this.view&&this.view.enabled){var o=a.fullWidth,c=a.fullHeight;i+=a.offsetX*n/o,e-=a.offsetY*r/c,n*=a.width/o,r*=a.height/c}var l=this.filmOffset;0!==l&&(i+=t*l/this.getFilmWidth()),this.projectionMatrix.makePerspective(i,i+n,e,e-r,t,this.far),this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(t){var e=Y.prototype.toJSON.call(this,t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}),He.prototype=Object.create(Y.prototype),He.prototype.constructor=He,Ve.prototype=Object.create(b.prototype),Ve.prototype.constructor=Ve,Ve.prototype.isWebGLRenderTargetCube=!0,Ve.prototype.fromEquirectangularTexture=function(t,e){this.texture.type=e.type,this.texture.format=e.format,this.texture.encoding=e.encoding;var r=new J,n={uniforms:{tEquirect:{value:null}},vertexShader:["varying vec3 vWorldDirection;","vec3 transformDirection( in vec3 dir, in mat4 matrix ) {","\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );","}","void main() {","\tvWorldDirection = transformDirection( position, modelMatrix );","\t#include ","\t#include ","}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;","varying vec3 vWorldDirection;","#define RECIPROCAL_PI 0.31830988618","#define RECIPROCAL_PI2 0.15915494","void main() {","\tvec3 direction = normalize( vWorldDirection );","\tvec2 sampleUV;","\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;","\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;","\tgl_FragColor = texture2D( tEquirect, sampleUV );","}"].join("\n")},i=new Fe({type:"CubemapFromEquirect",uniforms:Ie(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});i.uniforms.tEquirect.value=e;var a=new Te(new Ne(5,5,5),i);r.add(a);var o=new He(1,10,1);return o.renderTarget=this,o.renderTarget.texture.name="CubeCameraTexture",o.update(t,r),a.geometry.dispose(),a.material.dispose(),this},je.prototype=Object.create(y.prototype),je.prototype.constructor=je,je.prototype.isDataTexture=!0;var ke=new d,We=new d,qe=new m;function Xe(t,e){this.normal=void 0!==t?t:new d(1,0,0),this.constant=void 0!==e?e:0}Object.assign(Xe.prototype,{isPlane:!0,set:function(t,e){return this.normal.copy(t),this.constant=e,this},setComponents:function(t,e,r,n){return this.normal.set(t,e,r),this.constant=n,this},setFromNormalAndCoplanarPoint:function(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this},setFromCoplanarPoints:function(t,e,r){var n=ke.subVectors(r,e).cross(We.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.normal.copy(t.normal),this.constant=t.constant,this},normalize:function(){var t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(t){return this.normal.dot(t)+this.constant},distanceToSphere:function(t){return this.distanceToPoint(t.center)-t.radius},projectPoint:function(t,e){return void 0===e&&(console.warn("THREE.Plane: .projectPoint() target is now required"),e=new d),e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)},intersectLine:function(t,e){void 0===e&&(console.warn("THREE.Plane: .intersectLine() target is now required"),e=new d);var r=t.delta(ke),n=this.normal.dot(r);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):void 0;var i=-(t.start.dot(this.normal)+this.constant)/n;return i<0||i>1?void 0:e.copy(r).multiplyScalar(i).add(t.start)},intersectsLine:function(t){var e=this.distanceToPoint(t.start),r=this.distanceToPoint(t.end);return e<0&&r>0||r<0&&e>0},intersectsBox:function(t){return t.intersectsPlane(this)},intersectsSphere:function(t){return t.intersectsPlane(this)},coplanarPoint:function(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new d),t.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(t,e){var r=e||qe.getNormalMatrix(t),n=this.coplanarPoint(ke).applyMatrix4(t),i=this.normal.applyMatrix3(r).normalize();return this.constant=-n.dot(i),this},translate:function(t){return this.constant-=t.dot(this.normal),this},equals:function(t){return t.normal.equals(this.normal)&&t.constant===this.constant}});var Ye=new ut,Je=new d;function Ze(t,e,r,n,i,a){this.planes=[void 0!==t?t:new Xe,void 0!==e?e:new Xe,void 0!==r?r:new Xe,void 0!==n?n:new Xe,void 0!==i?i:new Xe,void 0!==a?a:new Xe]}Object.assign(Ze.prototype,{set:function(t,e,r,n,i,a){var o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(r),o[3].copy(n),o[4].copy(i),o[5].copy(a),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){for(var e=this.planes,r=0;r<6;r++)e[r].copy(t.planes[r]);return this},setFromMatrix:function(t){var e=this.planes,r=t.elements,n=r[0],i=r[1],a=r[2],o=r[3],s=r[4],c=r[5],l=r[6],h=r[7],u=r[8],p=r[9],d=r[10],f=r[11],m=r[12],g=r[13],v=r[14],y=r[15];return e[0].setComponents(o-n,h-s,f-u,y-m).normalize(),e[1].setComponents(o+n,h+s,f+u,y+m).normalize(),e[2].setComponents(o+i,h+c,f+p,y+g).normalize(),e[3].setComponents(o-i,h-c,f-p,y-g).normalize(),e[4].setComponents(o-a,h-l,f-d,y-v).normalize(),e[5].setComponents(o+a,h+l,f+d,y+v).normalize(),this},intersectsObject:function(t){var e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),Ye.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(Ye)},intersectsSprite:function(t){return Ye.center.set(0,0,0),Ye.radius=.7071067811865476,Ye.applyMatrix4(t.matrixWorld),this.intersectsSphere(Ye)},intersectsSphere:function(t){for(var e=this.planes,r=t.center,n=-t.radius,i=0;i<6;i++)if(e[i].distanceToPoint(r)0?t.max.x:t.min.x,Je.y=n.normal.y>0?t.max.y:t.min.y,Je.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(Je)<0)return!1}return!0},containsPoint:function(t){for(var e=this.planes,r=0;r<6;r++)if(e[r].distanceToPoint(t)<0)return!1;return!0}});var Qe={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvarying vec3 vViewPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( STANDARD ) && ! defined( PHONG ) && ! defined( MATCAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = normalMatrix * objectTangent;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t vec3 reflectVec = reflect( -viewDir, normal );\n\t\t reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif",lights_pars_begin:"uniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = saturate( clearcoat );\tmaterial.clearcoatRoughness = clamp( clearcoatRoughness, 0.04, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectDiffuse += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\t#ifdef USE_TANGENT\n\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, normalScale, normalMap );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec2 normalScale, in sampler2D normalMap ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy *= normalScale;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvec3 NfromST = cross( S, T );\n\t\t\tif( dot( NfromST, N ) > 0.0 ) {\n\t\t\t\tS *= -1.0;\n\t\t\t\tT *= -1.0;\n\t\t\t}\n\t\t#else\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 vTBN = mat3( tangent, bitangent, clearcoatNormal );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = clearcoatNormalScale * mapN.xy;\n\t\tclearcoatNormal = normalize( vTBN * mapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatNormalScale, clearcoatNormalMap );\n\t#endif\n#endif",clearcoat_normalmap_pars_fragment:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 encodeHalfRGBA ( vec2 v ) {\n\tvec4 encoded = vec4( 0.0 );\n\tconst vec2 offset = vec2( 1.0 / 255.0, 0.0 );\n\tencoded.xy = vec2( v.x, fract( v.x * 255.0 ) );\n\tencoded.xy = encoded.xy - ( encoded.yy * offset );\n\tencoded.zw = vec2( v.y, fract( v.y * 255.0 ) );\n\tencoded.zw = encoded.zw - ( encoded.ww * offset );\n\treturn encoded;\n}\nvec2 decodeHalfRGBA( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn decodeHalfRGBA( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = ( floor( uv * size - 0.5 ) + 0.5 ) * texelSize;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",uv_pars_fragment:"#ifdef USE_UV\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},Ke={common:{diffuse:{value:new Nt(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new m},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new l(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Nt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new Nt(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new m}},sprite:{diffuse:{value:new Nt(15658734)},opacity:{value:1},center:{value:new l(.5,.5)},rotation:{value:0},map:{value:null},uvTransform:{value:new m}}},$e={basic:{uniforms:ze([Ke.common,Ke.specularmap,Ke.envmap,Ke.aomap,Ke.lightmap,Ke.fog]),vertexShader:Qe.meshbasic_vert,fragmentShader:Qe.meshbasic_frag},lambert:{uniforms:ze([Ke.common,Ke.specularmap,Ke.envmap,Ke.aomap,Ke.lightmap,Ke.emissivemap,Ke.fog,Ke.lights,{emissive:{value:new Nt(0)}}]),vertexShader:Qe.meshlambert_vert,fragmentShader:Qe.meshlambert_frag},phong:{uniforms:ze([Ke.common,Ke.specularmap,Ke.envmap,Ke.aomap,Ke.lightmap,Ke.emissivemap,Ke.bumpmap,Ke.normalmap,Ke.displacementmap,Ke.gradientmap,Ke.fog,Ke.lights,{emissive:{value:new Nt(0)},specular:{value:new Nt(1118481)},shininess:{value:30}}]),vertexShader:Qe.meshphong_vert,fragmentShader:Qe.meshphong_frag},standard:{uniforms:ze([Ke.common,Ke.envmap,Ke.aomap,Ke.lightmap,Ke.emissivemap,Ke.bumpmap,Ke.normalmap,Ke.displacementmap,Ke.roughnessmap,Ke.metalnessmap,Ke.fog,Ke.lights,{emissive:{value:new Nt(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:Qe.meshphysical_vert,fragmentShader:Qe.meshphysical_frag},matcap:{uniforms:ze([Ke.common,Ke.bumpmap,Ke.normalmap,Ke.displacementmap,Ke.fog,{matcap:{value:null}}]),vertexShader:Qe.meshmatcap_vert,fragmentShader:Qe.meshmatcap_frag},points:{uniforms:ze([Ke.points,Ke.fog]),vertexShader:Qe.points_vert,fragmentShader:Qe.points_frag},dashed:{uniforms:ze([Ke.common,Ke.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Qe.linedashed_vert,fragmentShader:Qe.linedashed_frag},depth:{uniforms:ze([Ke.common,Ke.displacementmap]),vertexShader:Qe.depth_vert,fragmentShader:Qe.depth_frag},normal:{uniforms:ze([Ke.common,Ke.bumpmap,Ke.normalmap,Ke.displacementmap,{opacity:{value:1}}]),vertexShader:Qe.normal_vert,fragmentShader:Qe.normal_frag},sprite:{uniforms:ze([Ke.sprite,Ke.fog]),vertexShader:Qe.sprite_vert,fragmentShader:Qe.sprite_frag},background:{uniforms:{uvTransform:{value:new m},t2D:{value:null}},vertexShader:Qe.background_vert,fragmentShader:Qe.background_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Qe.cube_vert,fragmentShader:Qe.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Qe.equirect_vert,fragmentShader:Qe.equirect_frag},distanceRGBA:{uniforms:ze([Ke.common,Ke.displacementmap,{referencePosition:{value:new d},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Qe.distanceRGBA_vert,fragmentShader:Qe.distanceRGBA_frag},shadow:{uniforms:ze([Ke.lights,Ke.fog,{color:{value:new Nt(0)},opacity:{value:1}}]),vertexShader:Qe.shadow_vert,fragmentShader:Qe.shadow_frag}};function tr(){var t=null,e=!1,r=null;function n(i,a){!1!==e&&(r(i,a),t.requestAnimationFrame(n))}return{start:function(){!0!==e&&null!==r&&(t.requestAnimationFrame(n),e=!0)},stop:function(){e=!1},setAnimationLoop:function(t){r=t},setContext:function(e){t=e}}}function er(t){var e=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),e.get(t)},remove:function(r){r.isInterleavedBufferAttribute&&(r=r.data);var n=e.get(r);n&&(t.deleteBuffer(n.buffer),e.delete(r))},update:function(r,n){r.isInterleavedBufferAttribute&&(r=r.data);var i=e.get(r);void 0===i?e.set(r,function(e,r){var n=e.array,i=e.dynamic?35048:35044,a=t.createBuffer();t.bindBuffer(r,a),t.bufferData(r,n,i),e.onUploadCallback();var o=5126;return n instanceof Float32Array?o=5126:n instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):n instanceof Uint16Array?o=5123:n instanceof Int16Array?o=5122:n instanceof Uint32Array?o=5125:n instanceof Int32Array?o=5124:n instanceof Int8Array?o=5120:n instanceof Uint8Array&&(o=5121),{buffer:a,type:o,bytesPerElement:n.BYTES_PER_ELEMENT,version:e.version}}(r,n)):i.version0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}var a="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext,o=void 0!==r.precision?r.precision:"highp",s=i(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);var c=!0===r.logarithmicDepthBuffer,l=t.getParameter(34930),h=t.getParameter(35660),u=t.getParameter(3379),p=t.getParameter(34076),d=t.getParameter(34921),f=t.getParameter(36347),m=t.getParameter(36348),g=t.getParameter(36349),v=h>0,y=a||!!e.get("OES_texture_float");return{isWebGL2:a,getMaxAnisotropy:function(){if(void 0!==n)return n;var r=e.get("EXT_texture_filter_anisotropic");return n=null!==r?t.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:i,precision:o,logarithmicDepthBuffer:c,maxTextures:l,maxVertexTextures:h,maxTextureSize:u,maxCubemapSize:p,maxAttributes:d,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:g,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y,maxSamples:a?t.getParameter(36183):0}}function sr(){var t=this,e=null,r=0,n=!1,i=!1,a=new Xe,o=new m,s={value:null,needsUpdate:!1};function c(){s.value!==e&&(s.value=e,s.needsUpdate=r>0),t.numPlanes=r,t.numIntersection=0}function l(e,r,n,i){var c=null!==e?e.length:0,l=null;if(0!==c){if(l=s.value,!0!==i||null===l){var h=n+4*c,u=r.matrixWorldInverse;o.getNormalMatrix(u),(null===l||l.length65535?Jt:Xt)(r,1);d.version=o,e.update(d,34963);var f=i.get(t);f&&e.remove(f),i.set(t,d)}return{get:function(t,e){var i=n.get(e);return i||(e.addEventListener("dispose",a),e.isBufferGeometry?i=e:e.isGeometry&&(void 0===e._bufferGeometry&&(e._bufferGeometry=(new se).setFromObject(t)),i=e._bufferGeometry),n.set(e,i),r.memory.geometries++,i)},update:function(t){var r=t.index,n=t.attributes;for(var i in null!==r&&e.update(r,34963),n)e.update(n[i],34962);var a=t.morphAttributes;for(var i in a)for(var o=a[i],s=0,c=o.length;s0)return t;var i=e*r,a=_r[i];if(void 0===a&&(a=new Float32Array(i),_r[i]=a),0!==e){n.toArray(a,0);for(var o=1,s=0;o!==e;++o)s+=r,t[o].toArray(a,s)}return a}function Lr(t,e){if(t.length!==e.length)return!1;for(var r=0,n=t.length;r/gm,(function(t,e){var r=Qe[e];if(void 0===r)throw new Error("Can not resolve #include <"+e+">");return _n(r)}))}function Mn(t){return t.replace(/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,(function(t,e,r,n){for(var i="",a=parseInt(e);a0?t.gammaFactor:1,w=o.isWebGL2?"":function(t,e,r){return[(t=t||{}).derivatives||e.envMapCubeUV||e.bumpMap||e.tangentSpaceNormalMap||e.clearcoatNormalMap||e.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(t.fragDepth||e.logarithmicDepthBuffer)&&r.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",t.drawBuffers&&r.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(t.shaderTextureLOD||e.envMap)&&r.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(xn).join("\n")}(n.extensions,a,e),_=function(t){var e=[];for(var r in t){var n=t[r];!1!==n&&e.push("#define "+r+" "+n)}return e.join("\n")}(c),M=s.createProgram();if(n.isRawShaderMaterial?((m=[_].filter(xn).join("\n")).length>0&&(m+="\n"),(g=[w,_].filter(xn).join("\n")).length>0&&(g+="\n")):(m=["precision "+a.precision+" float;","precision "+a.precision+" int;","highp"===a.precision?"#define HIGH_PRECISION":"","#define SHADER_NAME "+i.name,_,a.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+b,"#define MAX_BONES "+a.maxBones,a.useFog&&a.fog?"#define USE_FOG":"",a.useFog&&a.fogExp2?"#define FOG_EXP2":"",a.map?"#define USE_MAP":"",a.envMap?"#define USE_ENVMAP":"",a.envMap?"#define "+d:"",a.lightMap?"#define USE_LIGHTMAP":"",a.aoMap?"#define USE_AOMAP":"",a.emissiveMap?"#define USE_EMISSIVEMAP":"",a.bumpMap?"#define USE_BUMPMAP":"",a.normalMap?"#define USE_NORMALMAP":"",a.normalMap&&a.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",a.normalMap&&a.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",a.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",a.displacementMap&&a.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",a.specularMap?"#define USE_SPECULARMAP":"",a.roughnessMap?"#define USE_ROUGHNESSMAP":"",a.metalnessMap?"#define USE_METALNESSMAP":"",a.alphaMap?"#define USE_ALPHAMAP":"",a.vertexTangents?"#define USE_TANGENT":"",a.vertexColors?"#define USE_COLOR":"",a.vertexUvs?"#define USE_UV":"",a.flatShading?"#define FLAT_SHADED":"",a.skinning?"#define USE_SKINNING":"",a.useVertexTexture?"#define BONE_TEXTURE":"",a.morphTargets?"#define USE_MORPHTARGETS":"",a.morphNormals&&!1===a.flatShading?"#define USE_MORPHNORMALS":"",a.doubleSided?"#define DOUBLE_SIDED":"",a.flipSided?"#define FLIP_SIDED":"",a.shadowMapEnabled?"#define USE_SHADOWMAP":"",a.shadowMapEnabled?"#define "+u:"",a.sizeAttenuation?"#define USE_SIZEATTENUATION":"",a.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",a.logarithmicDepthBuffer&&(o.isWebGL2||e.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(xn).join("\n"),g=[w,"precision "+a.precision+" float;","precision "+a.precision+" int;","highp"===a.precision?"#define HIGH_PRECISION":"","#define SHADER_NAME "+i.name,_,a.alphaTest?"#define ALPHATEST "+a.alphaTest+(a.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+b,a.useFog&&a.fog?"#define USE_FOG":"",a.useFog&&a.fogExp2?"#define FOG_EXP2":"",a.map?"#define USE_MAP":"",a.matcap?"#define USE_MATCAP":"",a.envMap?"#define USE_ENVMAP":"",a.envMap?"#define "+p:"",a.envMap?"#define "+d:"",a.envMap?"#define "+f:"",a.lightMap?"#define USE_LIGHTMAP":"",a.aoMap?"#define USE_AOMAP":"",a.emissiveMap?"#define USE_EMISSIVEMAP":"",a.bumpMap?"#define USE_BUMPMAP":"",a.normalMap?"#define USE_NORMALMAP":"",a.normalMap&&a.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",a.normalMap&&a.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",a.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",a.specularMap?"#define USE_SPECULARMAP":"",a.roughnessMap?"#define USE_ROUGHNESSMAP":"",a.metalnessMap?"#define USE_METALNESSMAP":"",a.alphaMap?"#define USE_ALPHAMAP":"",a.sheen?"#define USE_SHEEN":"",a.vertexTangents?"#define USE_TANGENT":"",a.vertexColors?"#define USE_COLOR":"",a.vertexUvs?"#define USE_UV":"",a.gradientMap?"#define USE_GRADIENTMAP":"",a.flatShading?"#define FLAT_SHADED":"",a.doubleSided?"#define DOUBLE_SIDED":"",a.flipSided?"#define FLIP_SIDED":"",a.shadowMapEnabled?"#define USE_SHADOWMAP":"",a.shadowMapEnabled?"#define "+u:"",a.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",a.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",a.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",a.logarithmicDepthBuffer&&(o.isWebGL2||e.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensions&&n.extensions.shaderTextureLOD||a.envMap)&&(o.isWebGL2||e.get("EXT_shader_texture_lod"))?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==a.toneMapping?"#define TONE_MAPPING":"",0!==a.toneMapping?Qe.tonemapping_pars_fragment:"",0!==a.toneMapping?yn("toneMapping",a.toneMapping):"",a.dithering?"#define DITHERING":"",a.outputEncoding||a.mapEncoding||a.matcapEncoding||a.envMapEncoding||a.emissiveMapEncoding?Qe.encodings_pars_fragment:"",a.mapEncoding?vn("mapTexelToLinear",a.mapEncoding):"",a.matcapEncoding?vn("matcapTexelToLinear",a.matcapEncoding):"",a.envMapEncoding?vn("envMapTexelToLinear",a.envMapEncoding):"",a.emissiveMapEncoding?vn("emissiveMapTexelToLinear",a.emissiveMapEncoding):"",a.outputEncoding?(v="linearToOutputTexel",y=a.outputEncoding,x=mn(y),"vec4 "+v+"( vec4 value ) { return LinearTo"+x[0]+x[1]+"; }"):"",a.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(xn).join("\n")),l=wn(l=bn(l=_n(l),a),a),h=wn(h=bn(h=_n(h),a),a),l=Mn(l),h=Mn(h),o.isWebGL2&&!n.isRawShaderMaterial){var S=!1,T=/^\s*#version\s+300\s+es\s*\n/;n.isShaderMaterial&&null!==l.match(T)&&null!==h.match(T)&&(S=!0,l=l.replace(T,""),h=h.replace(T,"")),m=["#version 300 es\n","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+m,g=["#version 300 es\n","#define varying in",S?"":"out highp vec4 pc_fragColor;",S?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g}var E,A,L=g+h,R=dn(s,35633,m+l),P=dn(s,35632,L);if(s.attachShader(M,R),s.attachShader(M,P),void 0!==n.index0AttributeName?s.bindAttribLocation(M,0,n.index0AttributeName):!0===a.morphTargets&&s.bindAttribLocation(M,0,"position"),s.linkProgram(M),t.debug.checkShaderErrors){var C=s.getProgramInfoLog(M).trim(),O=s.getShaderInfoLog(R).trim(),D=s.getShaderInfoLog(P).trim(),N=!0,I=!0;if(!1===s.getProgramParameter(M,35714)){N=!1;var z=gn(s,R,"vertex"),B=gn(s,P,"fragment");console.error("THREE.WebGLProgram: shader error: ",s.getError(),"35715",s.getProgramParameter(M,35715),"gl.getProgramInfoLog",C,z,B)}else""!==C?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",C):""!==O&&""!==D||(I=!1);I&&(this.diagnostics={runnable:N,material:n,programLog:C,vertexShader:{log:O,prefix:m},fragmentShader:{log:D,prefix:g}})}return s.deleteShader(R),s.deleteShader(P),this.getUniforms=function(){return void 0===E&&(E=new pn(s,M)),E},this.getAttributes=function(){return void 0===A&&(A=function(t,e){for(var r={},n=t.getProgramParameter(e,35721),i=0;i0,maxBones:p,useVertexTexture:r.floatVertexTextures,morphTargets:e.morphTargets,morphNormals:e.morphNormals,maxMorphTargets:t.maxMorphTargets,maxMorphNormals:t.maxMorphNormals,numDirLights:n.directional.length,numPointLights:n.point.length,numSpotLights:n.spot.length,numRectAreaLights:n.rectArea.length,numHemiLights:n.hemi.length,numDirLightShadows:n.directionalShadowMap.length,numPointLightShadows:n.pointShadowMap.length,numSpotLightShadows:n.spotShadowMap.length,numClippingPlanes:c,numClipIntersection:l,dithering:e.dithering,shadowMapEnabled:t.shadowMap.enabled&&h.receiveShadow&&a.length>0,shadowMapType:t.shadowMap.type,toneMapping:e.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:e.premultipliedAlpha,alphaTest:e.alphaTest,doubleSided:2===e.side,flipSided:1===e.side,depthPacking:void 0!==e.depthPacking&&e.depthPacking}},this.getProgramCode=function(e,r){var n=[];if(r.shaderID?n.push(r.shaderID):(n.push(e.fragmentShader),n.push(e.vertexShader)),void 0!==e.defines)for(var i in e.defines)n.push(i),n.push(e.defines[i]);for(var o=0;o1&&r.sort(An),n.length>1&&n.sort(Ln)}}}function Pn(){var t=new WeakMap;function e(r){var n=r.target;n.removeEventListener("dispose",e),t.delete(n)}return{get:function(r,n){var i,a=t.get(r);return void 0===a?(i=new Rn,t.set(r,new WeakMap),t.get(r).set(n,i),r.addEventListener("dispose",e)):void 0===(i=a.get(n))&&(i=new Rn,a.set(n,i)),i},dispose:function(){t=new WeakMap}}}function Cn(){var t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];var r;switch(e.type){case"DirectionalLight":r={direction:new d,color:new Nt,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new l};break;case"SpotLight":r={position:new d,direction:new d,color:new Nt,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new l};break;case"PointLight":r={position:new d,color:new Nt,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new l,shadowCameraNear:1,shadowCameraFar:1e3};break;case"HemisphereLight":r={direction:new d,skyColor:new Nt,groundColor:new Nt};break;case"RectAreaLight":r={color:new Nt,position:new d,halfWidth:new d,halfHeight:new d}}return t[e.id]=r,r}}}var On=0;function Dn(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function Nn(){for(var t=new Cn,e={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},r=0;r<9;r++)e.probe.push(new d);var n=new d,i=new P,a=new P;return{setup:function(r,o,s){for(var c=0,l=0,h=0,u=0;u<9;u++)e.probe[u].set(0,0,0);var p=0,d=0,f=0,m=0,g=0,v=0,y=0,x=0,b=s.matrixWorldInverse;r.sort(Dn),u=0;for(var w=r.length;u\nvoid main() {\n float mean = 0.0;\n float squared_mean = 0.0;\n \n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n #ifdef HORIZONAL_PASS\n vec2 distribution = decodeHalfRGBA ( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n mean += distribution.x;\n squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n #else\n float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n mean += depth;\n squared_mean += depth * depth;\n #endif\n }\n mean = mean * HALF_SAMPLE_RATE;\n squared_mean = squared_mean * HALF_SAMPLE_RATE;\n float std_dev = pow( squared_mean - mean * mean, 0.5 );\n gl_FragColor = encodeHalfRGBA( vec2( mean, std_dev ) );\n}"}),d=p.clone();d.defines.HORIZONAL_PASS=1;var f=new se;f.addAttribute("position",new Vt(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));for(var m=new Te(f,p),g=0;4!==g;++g){var v=0!=(1&g),y=0!=(2&g),w=new Bn({depthPacking:3201,morphTargets:v,skinning:y});s[g]=w;var _=new Fn({morphTargets:v,skinning:y});c[g]=_}var M=this;function S(r,n){var i=e.update(m);p.uniforms.shadow_pass.value=r.map.texture,p.uniforms.resolution.value=r.mapSize,p.uniforms.radius.value=r.radius,t.setRenderTarget(r.mapPass),t.clear(),t.renderBufferDirect(n,null,i,p,m,null),d.uniforms.shadow_pass.value=r.mapPass.texture,d.uniforms.resolution.value=r.mapSize,d.uniforms.radius.value=r.radius,t.setRenderTarget(r.map),t.clear(),t.renderBufferDirect(n,null,i,d,m,null)}function T(e,r,n,i,a,o){var l=e.geometry,p=null,d=s,f=e.customDepthMaterial;if(n.isPointLight&&(d=c,f=e.customDistanceMaterial),f)p=f;else{var m=!1;r.morphTargets&&(l&&l.isBufferGeometry?m=l.morphAttributes&&l.morphAttributes.position&&l.morphAttributes.position.length>0:l&&l.isGeometry&&(m=l.morphTargets&&l.morphTargets.length>0)),e.isSkinnedMesh&&!1===r.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",e);var g=0;m&&(g|=1),e.isSkinnedMesh&&r.skinning&&(g|=2),p=d[g]}if(t.localClippingEnabled&&!0===r.clipShadows&&0!==r.clippingPlanes.length){var v=p.uuid,y=r.uuid,x=h[v];void 0===x&&(x={},h[v]=x);var b=x[y];void 0===b&&(b=p.clone(),x[y]=b),p=b}return p.visible=r.visible,p.wireframe=r.wireframe,p.side=3===o?null!=r.shadowSide?r.shadowSide:r.side:null!=r.shadowSide?r.shadowSide:u[r.side],p.clipShadows=r.clipShadows,p.clippingPlanes=r.clippingPlanes,p.clipIntersection=r.clipIntersection,p.wireframeLinewidth=r.wireframeLinewidth,p.linewidth=r.linewidth,n.isPointLight&&p.isMeshDistanceMaterial&&(p.referencePosition.setFromMatrixPosition(n.matrixWorld),p.nearDistance=i,p.farDistance=a),p}function E(r,i,a,o,s){if(!1!==r.visible){if(r.layers.test(i.layers)&&(r.isMesh||r.isLine||r.isPoints)&&(r.castShadow||r.receiveShadow&&3===s)&&(!r.frustumCulled||n.intersectsObject(r))){r.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,r.matrixWorld);var c=e.update(r),l=r.material;if(Array.isArray(l))for(var h=c.groups,u=0,p=h.length;ur||i.y>r)&&(console.warn("THREE.WebGLShadowMap:",m,"has shadow exceeding max texture size, reducing"),i.x>r&&(a.x=Math.floor(r/v.x),i.x=a.x*v.x,g.mapSize.x=a.x),i.y>r&&(a.y=Math.floor(r/v.y),i.y=a.y*v.y,g.mapSize.y=a.y)),null===g.map&&!g.isPointLightShadow&&3===this.type){var y={minFilter:1006,magFilter:1006,format:1023};g.map=new b(i.x,i.y,y),g.map.texture.name=m.name+".shadowMap",g.mapPass=new b(i.x,i.y,y),g.camera.updateProjectionMatrix()}null===g.map&&(y={minFilter:1003,magFilter:1003,format:1023},g.map=new b(i.x,i.y,y),g.map.texture.name=m.name+".shadowMap",g.camera.updateProjectionMatrix()),t.setRenderTarget(g.map),t.clear();for(var x=g.getViewportCount(),w=0;w=1):-1!==O.indexOf("OpenGL ES")&&(C=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(O)[1]),P=C>=2);var D=null,N={},I=new x,z=new x;function B(e,r,n){var i=new Uint8Array(4),a=t.createTexture();t.bindTexture(e,a),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(var o=0;on||t.height>n)&&(i=n/Math.max(t.width,t.height)),i<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){var a=e?s.floorPowerOfTwo:Math.floor,o=a(i*t.width),c=a(i*t.height);void 0===l&&(l=p(o,c));var h=r?p(o,c):l;return h.width=o,h.height=c,h.getContext("2d").drawImage(t,0,0,o,c),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+o+"x"+c+")."),h}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function f(t){return s.isPowerOfTwo(t.width)&&s.isPowerOfTwo(t.height)}function m(t,e){return t.generateMipmaps&&e&&1003!==t.minFilter&&1006!==t.minFilter}function g(e,r,i,a){t.generateMipmap(e),n.get(r).__maxMipLevel=Math.log(Math.max(i,a))*Math.LOG2E}function v(t,r){if(!a.isWebGL2)return t;var n=t;return 6403===t&&(5126===r&&(n=33326),5131===r&&(n=33325),5121===r&&(n=33321)),6407===t&&(5126===r&&(n=34837),5131===r&&(n=34843),5121===r&&(n=32849)),6408===t&&(5126===r&&(n=34836),5131===r&&(n=34842),5121===r&&(n=32856)),33325===n||33326===n||34842===n||34836===n?e.get("EXT_color_buffer_float"):34843!==n&&34837!==n||console.warn("THREE.WebGLRenderer: Floating point textures with RGB format not supported. Please use RGBA instead."),n}function y(t){return 1003===t||1004===t||1005===t?9728:9729}function x(e){var r=e.target;r.removeEventListener("dispose",x),function(e){var r=n.get(e);void 0!==r.__webglInit&&(t.deleteTexture(r.__webglTexture),n.remove(e))}(r),r.isVideoTexture&&h.delete(r),c.memory.textures--}function b(e){var r=e.target;r.removeEventListener("dispose",b),function(e){var r=n.get(e),i=n.get(e.texture);if(e){if(void 0!==i.__webglTexture&&t.deleteTexture(i.__webglTexture),e.depthTexture&&e.depthTexture.dispose(),e.isWebGLRenderTargetCube)for(var a=0;a<6;a++)t.deleteFramebuffer(r.__webglFramebuffer[a]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[a]);else t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer);n.remove(e.texture),n.remove(e)}}(r),c.memory.textures--}var w=0;function _(t,e){var i=n.get(t);if(t.isVideoTexture&&function(t){var e=c.render.frame;h.get(t)!==e&&(h.set(t,e),t.update())}(t),t.version>0&&i.__version!==t.version){var a=t.image;if(void 0===a)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==a.complete)return void A(i,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}r.activeTexture(33984+e),r.bindTexture(3553,i.__webglTexture)}function M(e,i){if(6===e.image.length){var s=n.get(e);if(e.version>0&&s.__version!==e.version){E(s,e),r.activeTexture(33984+i),r.bindTexture(34067,s.__webglTexture),t.pixelStorei(37440,e.flipY);for(var c=e&&e.isCompressedTexture,l=e.image[0]&&e.image[0].isDataTexture,h=[],u=0;u<6;u++)h[u]=c||l?l?e.image[u].image:e.image[u]:d(e.image[u],!1,!0,a.maxCubemapSize);var p,y=h[0],x=f(y)||a.isWebGL2,b=o.convert(e.format),w=o.convert(e.type),_=v(b,w);if(T(34067,e,x),c){for(u=0;u<6;u++){p=h[u].mipmaps;for(var M=0;M-1?r.compressedTexImage2D(34069+u,M,_,S.width,S.height,0,S.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):r.texImage2D(34069+u,M,_,S.width,S.height,0,b,w,S.data)}}s.__maxMipLevel=p.length-1}else{for(p=e.mipmaps,u=0;u<6;u++)if(l)for(r.texImage2D(34069+u,0,_,h[u].width,h[u].height,0,b,w,h[u].data),M=0;M1||n.get(i).__currentAnisotropy)&&(t.texParameterf(r,c.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),n.get(i).__currentAnisotropy=i.anisotropy)}}function E(e,r){void 0===e.__webglInit&&(e.__webglInit=!0,r.addEventListener("dispose",x),e.__webglTexture=t.createTexture(),c.memory.textures++)}function A(e,n,i){var s=3553;n.isDataTexture2DArray&&(s=35866),n.isDataTexture3D&&(s=32879),E(e,n),r.activeTexture(33984+i),r.bindTexture(s,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment);var c=function(t){return!a.isWebGL2&&(1001!==t.wrapS||1001!==t.wrapT||1003!==t.minFilter&&1006!==t.minFilter)}(n)&&!1===f(n.image),l=d(n.image,c,!1,a.maxTextureSize),h=f(l)||a.isWebGL2,u=o.convert(n.format),p=o.convert(n.type),y=v(u,p);T(s,n,h);var x,b=n.mipmaps;if(n.isDepthTexture){if(y=6402,1015===n.type){if(!a.isWebGL2)throw new Error("Float Depth Texture only supported in WebGL2.0");y=36012}else a.isWebGL2&&(y=33189);1026===n.format&&6402===y&&1012!==n.type&&1014!==n.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),n.type=1012,p=o.convert(n.type)),1027===n.format&&(y=34041,1020!==n.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),n.type=1020,p=o.convert(n.type))),r.texImage2D(3553,0,y,l.width,l.height,0,u,p,null)}else if(n.isDataTexture)if(b.length>0&&h){for(var w=0,_=b.length;w<_;w++)x=b[w],r.texImage2D(3553,w,y,x.width,x.height,0,u,p,x.data);n.generateMipmaps=!1,e.__maxMipLevel=b.length-1}else r.texImage2D(3553,0,y,l.width,l.height,0,u,p,l.data),e.__maxMipLevel=0;else if(n.isCompressedTexture){for(w=0,_=b.length;w<_;w++)x=b[w],1023!==n.format&&1022!==n.format?r.getCompressedTextureFormats().indexOf(u)>-1?r.compressedTexImage2D(3553,w,y,x.width,x.height,0,x.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):r.texImage2D(3553,w,y,x.width,x.height,0,u,p,x.data);e.__maxMipLevel=b.length-1}else if(n.isDataTexture2DArray)r.texImage3D(35866,0,y,l.width,l.height,l.depth,0,u,p,l.data),e.__maxMipLevel=0;else if(n.isDataTexture3D)r.texImage3D(32879,0,y,l.width,l.height,l.depth,0,u,p,l.data),e.__maxMipLevel=0;else if(b.length>0&&h){for(w=0,_=b.length;w<_;w++)x=b[w],r.texImage2D(3553,w,y,u,p,x);n.generateMipmaps=!1,e.__maxMipLevel=b.length-1}else r.texImage2D(3553,0,y,u,p,l),e.__maxMipLevel=0;m(n,h)&&g(3553,n,l.width,l.height),e.__version=n.version,n.onUpdate&&n.onUpdate(n)}function L(e,i,a,s){var c=o.convert(i.texture.format),l=o.convert(i.texture.type),h=v(c,l);r.texImage2D(s,0,h,i.width,i.height,0,c,l,null),t.bindFramebuffer(36160,e),t.framebufferTexture2D(36160,a,s,n.get(i.texture).__webglTexture,0),t.bindFramebuffer(36160,null)}function R(e,r,n){if(t.bindRenderbuffer(36161,e),r.depthBuffer&&!r.stencilBuffer){if(n){var i=C(r);t.renderbufferStorageMultisample(36161,i,33189,r.width,r.height)}else t.renderbufferStorage(36161,33189,r.width,r.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(r.depthBuffer&&r.stencilBuffer)n?(i=C(r),t.renderbufferStorageMultisample(36161,i,35056,r.width,r.height)):t.renderbufferStorage(36161,34041,r.width,r.height),t.framebufferRenderbuffer(36160,33306,36161,e);else{var a=v(o.convert(r.texture.format),o.convert(r.texture.type));n?(i=C(r),t.renderbufferStorageMultisample(36161,i,a,r.width,r.height)):t.renderbufferStorage(36161,a,r.width,r.height)}t.bindRenderbuffer(36161,null)}function P(e){var r=n.get(e),i=!0===e.isWebGLRenderTargetCube;if(e.depthTexture){if(i)throw new Error("target.depthTexture not supported in Cube render targets");!function(e,r){if(r&&r.isWebGLRenderTargetCube)throw new Error("Depth Texture with cube render targets is not supported");if(t.bindFramebuffer(36160,e),!r.depthTexture||!r.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");n.get(r.depthTexture).__webglTexture&&r.depthTexture.image.width===r.width&&r.depthTexture.image.height===r.height||(r.depthTexture.image.width=r.width,r.depthTexture.image.height=r.height,r.depthTexture.needsUpdate=!0),_(r.depthTexture,0);var i=n.get(r.depthTexture).__webglTexture;if(1026===r.depthTexture.format)t.framebufferTexture2D(36160,36096,3553,i,0);else{if(1027!==r.depthTexture.format)throw new Error("Unknown depthTexture format");t.framebufferTexture2D(36160,33306,3553,i,0)}}(r.__webglFramebuffer,e)}else if(i){r.__webglDepthbuffer=[];for(var a=0;a<6;a++)t.bindFramebuffer(36160,r.__webglFramebuffer[a]),r.__webglDepthbuffer[a]=t.createRenderbuffer(),R(r.__webglDepthbuffer[a],e)}else t.bindFramebuffer(36160,r.__webglFramebuffer),r.__webglDepthbuffer=t.createRenderbuffer(),R(r.__webglDepthbuffer,e);t.bindFramebuffer(36160,null)}function C(t){return a.isWebGL2&&t.isWebGLMultisampleRenderTarget?Math.min(a.maxSamples,t.samples):0}var O=!1,D=!1;this.allocateTextureUnit=function(){var t=w;return t>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+a.maxTextures),w+=1,t},this.resetTextureUnits=function(){w=0},this.setTexture2D=_,this.setTexture2DArray=function(t,e){var i=n.get(t);t.version>0&&i.__version!==t.version?A(i,t,e):(r.activeTexture(33984+e),r.bindTexture(35866,i.__webglTexture))},this.setTexture3D=function(t,e){var i=n.get(t);t.version>0&&i.__version!==t.version?A(i,t,e):(r.activeTexture(33984+e),r.bindTexture(32879,i.__webglTexture))},this.setTextureCube=M,this.setTextureCubeDynamic=S,this.setupRenderTarget=function(e){var i=n.get(e),s=n.get(e.texture);e.addEventListener("dispose",b),s.__webglTexture=t.createTexture(),c.memory.textures++;var l=!0===e.isWebGLRenderTargetCube,h=!0===e.isWebGLMultisampleRenderTarget,u=f(e)||a.isWebGL2;if(l){i.__webglFramebuffer=[];for(var p=0;p<6;p++)i.__webglFramebuffer[p]=t.createFramebuffer()}else if(i.__webglFramebuffer=t.createFramebuffer(),h)if(a.isWebGL2){i.__webglMultisampledFramebuffer=t.createFramebuffer(),i.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,i.__webglColorRenderbuffer);var d=v(o.convert(e.texture.format),o.convert(e.texture.type)),y=C(e);t.renderbufferStorageMultisample(36161,y,d,e.width,e.height),t.bindFramebuffer(36160,i.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,i.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),e.depthBuffer&&(i.__webglDepthRenderbuffer=t.createRenderbuffer(),R(i.__webglDepthRenderbuffer,e,!0)),t.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(l){for(r.bindTexture(34067,s.__webglTexture),T(34067,e.texture,u),p=0;p<6;p++)L(i.__webglFramebuffer[p],e,36064,34069+p);m(e.texture,u)&&g(34067,e.texture,e.width,e.height),r.bindTexture(34067,null)}else r.bindTexture(3553,s.__webglTexture),T(3553,e.texture,u),L(i.__webglFramebuffer,e,36064,3553),m(e.texture,u)&&g(3553,e.texture,e.width,e.height),r.bindTexture(3553,null);e.depthBuffer&&P(e)},this.updateRenderTargetMipmap=function(t){var e=t.texture;if(m(e,f(t)||a.isWebGL2)){var i=t.isWebGLRenderTargetCube?34067:3553,o=n.get(e).__webglTexture;r.bindTexture(i,o),g(i,e,t.width,t.height),r.bindTexture(i,null)}},this.updateMultisampleRenderTarget=function(e){if(e.isWebGLMultisampleRenderTarget)if(a.isWebGL2){var r=n.get(e);t.bindFramebuffer(36008,r.__webglMultisampledFramebuffer),t.bindFramebuffer(36009,r.__webglFramebuffer);var i=e.width,o=e.height,s=16384;e.depthBuffer&&(s|=256),e.stencilBuffer&&(s|=1024),t.blitFramebuffer(0,0,i,o,0,0,i,o,s,9728)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===O&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),O=!0),t=t.texture),_(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLRenderTargetCube&&(!1===D&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),D=!0),t=t.texture),t&&t.isCubeTexture||Array.isArray(t.image)&&6===t.image.length?M(t,e):S(t,e)}}function Vn(t,e,r){return{convert:function(t){var n;if(1e3===t)return 10497;if(1001===t)return 33071;if(1002===t)return 33648;if(1003===t)return 9728;if(1004===t)return 9984;if(1005===t)return 9986;if(1006===t)return 9729;if(1007===t)return 9985;if(1008===t)return 9987;if(1009===t)return 5121;if(1017===t)return 32819;if(1018===t)return 32820;if(1019===t)return 33635;if(1010===t)return 5120;if(1011===t)return 5122;if(1012===t)return 5123;if(1013===t)return 5124;if(1014===t)return 5125;if(1015===t)return 5126;if(1016===t){if(r.isWebGL2)return 5131;if(null!==(n=e.get("OES_texture_half_float")))return n.HALF_FLOAT_OES}if(1021===t)return 6406;if(1022===t)return 6407;if(1023===t)return 6408;if(1024===t)return 6409;if(1025===t)return 6410;if(1026===t)return 6402;if(1027===t)return 34041;if(1028===t)return 6403;if(100===t)return 32774;if(101===t)return 32778;if(102===t)return 32779;if(200===t)return 0;if(201===t)return 1;if(202===t)return 768;if(203===t)return 769;if(204===t)return 770;if(205===t)return 771;if(206===t)return 772;if(207===t)return 773;if(208===t)return 774;if(209===t)return 775;if(210===t)return 776;if((33776===t||33777===t||33778===t||33779===t)&&null!==(n=e.get("WEBGL_compressed_texture_s3tc"))){if(33776===t)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===t)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===t)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===t)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if((35840===t||35841===t||35842===t||35843===t)&&null!==(n=e.get("WEBGL_compressed_texture_pvrtc"))){if(35840===t)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===t)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===t)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===t)return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===t&&null!==(n=e.get("WEBGL_compressed_texture_etc1")))return n.COMPRESSED_RGB_ETC1_WEBGL;if((37808===t||37809===t||37810===t||37811===t||37812===t||37813===t||37814===t||37815===t||37816===t||37817===t||37818===t||37819===t||37820===t||37821===t)&&null!==(n=e.get("WEBGL_compressed_texture_astc")))return t;if(103===t||104===t){if(r.isWebGL2){if(103===t)return 32775;if(104===t)return 32776}if(null!==(n=e.get("EXT_blend_minmax"))){if(103===t)return n.MIN_EXT;if(104===t)return n.MAX_EXT}}if(1020===t){if(r.isWebGL2)return 34042;if(null!==(n=e.get("WEBGL_depth_texture")))return n.UNSIGNED_INT_24_8_WEBGL}return 0}}}function jn(){Y.call(this),this.type="Group"}function kn(t){Ue.call(this),this.cameras=t||[]}Bn.prototype=Object.create(Ut.prototype),Bn.prototype.constructor=Bn,Bn.prototype.isMeshDepthMaterial=!0,Bn.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.depthPacking=t.depthPacking,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this},Fn.prototype=Object.create(Ut.prototype),Fn.prototype.constructor=Fn,Fn.prototype.isMeshDistanceMaterial=!0,Fn.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this},jn.prototype=Object.assign(Object.create(Y.prototype),{constructor:jn,isGroup:!0}),kn.prototype=Object.assign(Object.create(Ue.prototype),{constructor:kn,isArrayCamera:!0});var Wn,qn=new d,Xn=new d;function Yn(t,e,r){qn.setFromMatrixPosition(e.matrixWorld),Xn.setFromMatrixPosition(r.matrixWorld);var n=qn.distanceTo(Xn),i=e.projectionMatrix.elements,a=r.projectionMatrix.elements,o=i[14]/(i[10]-1),s=i[14]/(i[10]+1),c=(i[9]+1)/i[5],l=(i[9]-1)/i[5],h=(i[8]-1)/i[0],u=(a[8]+1)/a[0],p=o*h,d=o*u,f=n/(-h+u),m=f*-h;e.matrixWorld.decompose(t.position,t.quaternion,t.scale),t.translateX(m),t.translateZ(f),t.matrixWorld.compose(t.position,t.quaternion,t.scale),t.matrixWorldInverse.getInverse(t.matrixWorld);var g=o+f,v=s+f,y=p-m,x=d+(n-m),b=c*s/v*g,w=l*s/v*g;t.projectionMatrix.makePerspective(y,x,b,w,g,v)}function Jn(t){var e,r,n=this,i=null,o=null,s=null,c=[],u=new P,p=new P,f=1,m="local-floor";void 0!==a&&"VRFrameData"in a&&(o=new a.VRFrameData,a.addEventListener("vrdisplaypresentchange",E,!1));var g=new P,v=new h,y=new d,b=new Ue;b.viewport=new x,b.layers.enable(1);var w=new Ue;w.viewport=new x,w.layers.enable(2);var _=new kn([b,w]);function M(){return null!==i&&!0===i.isPresenting}_.layers.enable(1),_.layers.enable(2);var S,T=new l;function E(){if(M()){var a=i.getEyeParameters("left");e=2*a.renderWidth*f,r=a.renderHeight*f,S=t.getPixelRatio(),t.getSize(T),t.setDrawingBufferSize(e,r,1),b.viewport.set(0,0,e/2,r),w.viewport.set(e/2,0,e/2,r),C.start(),n.dispatchEvent({type:"sessionstart"})}else n.enabled&&t.setDrawingBufferSize(T.width,T.height,S),C.stop(),n.dispatchEvent({type:"sessionend"})}var A=[];function L(t){for(var e=navigator.getGamepads&&navigator.getGamepads(),r=0,n=0,i=e.length;r=0){var c=n[o];if(void 0!==c){var l=c.normalized,h=c.itemSize,u=E.get(c);if(void 0===u)continue;var p=u.buffer,d=u.type,f=u.bytesPerElement;if(c.isInterleavedBufferAttribute){var m=c.data,g=m.stride,v=c.offset;m&&m.isInstancedInterleavedBuffer?(_.enableAttributeAndDivisor(s,m.meshPerAttribute),void 0===r.maxInstancedCount&&(r.maxInstancedCount=m.meshPerAttribute*m.count)):_.enableAttribute(s),y.bindBuffer(34962,p),y.vertexAttribPointer(s,h,d,l,g*f,v*f)}else c.isInstancedBufferAttribute?(_.enableAttributeAndDivisor(s,c.meshPerAttribute),void 0===r.maxInstancedCount&&(r.maxInstancedCount=c.meshPerAttribute*c.count)):_.enableAttribute(s),y.bindBuffer(34962,p),y.vertexAttribPointer(s,h,d,l,0,0)}else if(void 0!==a){var x=a[o];if(void 0!==x)switch(x.length){case 2:y.vertexAttrib2fv(s,x);break;case 3:y.vertexAttrib3fv(s,x);break;case 4:y.vertexAttrib4fv(s,x);break;default:y.vertexAttrib1fv(s,x)}}}}_.disableUnusedAttributes()}}(n,s,r),null!==h&&y.bindBuffer(34963,l.buffer));var f=1/0;null!==h?f=h.count:void 0!==u&&(f=u.count);var m=r.drawRange.start*p,g=r.drawRange.count*p,v=null!==a?a.start*p:0,x=null!==a?a.count*p:1/0,M=Math.max(m,v),S=Math.min(f,m+g,v+x)-1,T=Math.max(0,S-M+1);if(0!==T){if(i.isMesh)if(!0===n.wireframe)_.setLineWidth(n.wireframeLinewidth*ht()),d.setMode(1);else switch(i.drawMode){case 0:d.setMode(4);break;case 1:d.setMode(5);break;case 2:d.setMode(6)}else if(i.isLine){var L=n.linewidth;void 0===L&&(L=1),_.setLineWidth(L*ht()),i.isLineSegments?d.setMode(1):i.isLineLoop?d.setMode(2):d.setMode(3)}else i.isPoints?d.setMode(0):i.isSprite&&d.setMode(4);r&&r.isInstancedBufferGeometry?r.maxInstancedCount>0&&d.renderInstances(r,M,T):d.render(M,T)}},this.compile=function(t,e){(v=O.get(t,e)).init(),t.traverse((function(t){t.isLight&&(v.pushLight(t),t.castShadow&&v.pushShadow(t))})),v.setupLights(e),t.traverse((function(e){if(e.material)if(Array.isArray(e.material))for(var r=0;r=0&&t.numSupportedMorphTargets++}if(t.morphNormals)for(t.numSupportedMorphNormals=0,d=0;d=0&&t.numSupportedMorphNormals++;var f=n.shader.uniforms;(t.isShaderMaterial||t.isRawShaderMaterial)&&!0!==t.clipping||(n.numClippingPlanes=at.numPlanes,n.numIntersection=at.numIntersection,f.clippingPlanes=at.uniform),n.fog=e,n.lightsStateVersion=o,t.lights&&(f.ambientLightColor.value=i.state.ambient,f.lightProbe.value=i.state.probe,f.directionalLights.value=i.state.directional,f.spotLights.value=i.state.spot,f.rectAreaLights.value=i.state.rectArea,f.pointLights.value=i.state.point,f.hemisphereLights.value=i.state.hemi,f.directionalShadowMap.value=i.state.directionalShadowMap,f.directionalShadowMatrix.value=i.state.directionalShadowMatrix,f.spotShadowMap.value=i.state.spotShadowMap,f.spotShadowMatrix.value=i.state.spotShadowMatrix,f.pointShadowMap.value=i.state.pointShadowMap,f.pointShadowMatrix.value=i.state.pointShadowMatrix);var m=n.program.getUniforms(),g=pn.seqWithValue(m.seq,f);n.uniformsList=g}function Tt(t,e,r,n){T.resetTextureUnits();var i=S.get(r),a=v.state.lights;if(ot&&(st||t!==X)){var o=t===X&&r.id===W;at.setState(r.clippingPlanes,r.clipIntersection,r.clipShadows,t,i,o)}!1===r.needsUpdate&&(void 0===i.program||r.fog&&i.fog!==e||r.lights&&i.lightsStateVersion!==a.state.version?r.needsUpdate=!0:void 0===i.numClippingPlanes||i.numClippingPlanes===at.numPlanes&&i.numIntersection===at.numIntersection||(r.needsUpdate=!0)),r.needsUpdate&&(St(r,e,n),r.needsUpdate=!1);var c,l,h=!1,u=!1,p=!1,d=i.program,f=d.getUniforms(),m=i.shader.uniforms;if(_.useProgram(d.program)&&(h=!0,u=!0,p=!0),r.id!==W&&(W=r.id,u=!0),h||X!==t){if(f.setValue(y,"projectionMatrix",t.projectionMatrix),w.logarithmicDepthBuffer&&f.setValue(y,"logDepthBufFC",2/(Math.log(t.far+1)/Math.LN2)),X!==t&&(X=t,u=!0,p=!0),r.isShaderMaterial||r.isMeshPhongMaterial||r.isMeshStandardMaterial||r.envMap){var g=f.map.cameraPosition;void 0!==g&&g.setValue(y,lt.setFromMatrixPosition(t.matrixWorld))}(r.isMeshPhongMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial||r.skinning)&&f.setValue(y,"viewMatrix",t.matrixWorldInverse)}if(r.skinning){f.setOptional(y,n,"bindMatrix"),f.setOptional(y,n,"bindMatrixInverse");var x=n.skeleton;if(x){var b=x.bones;if(w.floatVertexTextures){if(void 0===x.boneTexture){var M=Math.sqrt(4*b.length);M=s.ceilPowerOfTwo(M),M=Math.max(M,4);var E=new Float32Array(M*M*4);E.set(x.boneMatrices);var A=new je(E,M,M,1023,1015);A.needsUpdate=!0,x.boneMatrices=E,x.boneTexture=A,x.boneTextureSize=M}f.setValue(y,"boneTexture",x.boneTexture,T),f.setValue(y,"boneTextureSize",x.boneTextureSize)}else f.setOptional(y,x,"boneMatrices")}}return u&&(f.setValue(y,"toneMappingExposure",F.toneMappingExposure),f.setValue(y,"toneMappingWhitePoint",F.toneMappingWhitePoint),r.lights&&(l=p,(c=m).ambientLightColor.needsUpdate=l,c.lightProbe.needsUpdate=l,c.directionalLights.needsUpdate=l,c.pointLights.needsUpdate=l,c.spotLights.needsUpdate=l,c.rectAreaLights.needsUpdate=l,c.hemisphereLights.needsUpdate=l),e&&r.fog&&function(t,e){t.fogColor.value.copy(e.color),e.isFog?(t.fogNear.value=e.near,t.fogFar.value=e.far):e.isFogExp2&&(t.fogDensity.value=e.density)}(m,e),r.isMeshBasicMaterial?Et(m,r):r.isMeshLambertMaterial?(Et(m,r),function(t,e){e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap)}(m,r)):r.isMeshPhongMaterial?(Et(m,r),r.isMeshToonMaterial?function(t,e){At(t,e),e.gradientMap&&(t.gradientMap.value=e.gradientMap)}(m,r):At(m,r)):r.isMeshStandardMaterial?(Et(m,r),r.isMeshPhysicalMaterial?function(t,e){Lt(t,e),t.reflectivity.value=e.reflectivity,t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&t.sheen.value.copy(e.sheen),e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate()),t.transparency.value=e.transparency}(m,r):Lt(m,r)):r.isMeshMatcapMaterial?(Et(m,r),function(t,e){e.matcap&&(t.matcap.value=e.matcap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(m,r)):r.isMeshDepthMaterial?(Et(m,r),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(m,r)):r.isMeshDistanceMaterial?(Et(m,r),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias),t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(m,r)):r.isMeshNormalMaterial?(Et(m,r),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(m,r)):r.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(m,r),r.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(m,r)):r.isPointsMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*tt,t.scale.value=.5*$,t.map.value=e.map,null!==e.map&&(!0===e.map.matrixAutoUpdate&&e.map.updateMatrix(),t.uvTransform.value.copy(e.map.matrix))}(m,r):r.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,t.map.value=e.map,null!==e.map&&(!0===e.map.matrixAutoUpdate&&e.map.updateMatrix(),t.uvTransform.value.copy(e.map.matrix))}(m,r):r.isShadowMaterial&&(m.color.value.copy(r.color),m.opacity.value=r.opacity),void 0!==m.ltc_1&&(m.ltc_1.value=Ke.LTC_1),void 0!==m.ltc_2&&(m.ltc_2.value=Ke.LTC_2),pn.upload(y,i.uniformsList,m,T)),r.isShaderMaterial&&!0===r.uniformsNeedUpdate&&(pn.upload(y,i.uniformsList,m,T),r.uniformsNeedUpdate=!1),r.isSpriteMaterial&&f.setValue(y,"center",n.center),f.setValue(y,"modelViewMatrix",n.modelViewMatrix),f.setValue(y,"normalMatrix",n.normalMatrix),f.setValue(y,"modelMatrix",n.matrixWorld),d}function Et(t,e){var r;t.opacity.value=e.opacity,e.color&&t.diffuse.value.copy(e.color),e.emissive&&t.emissive.value.copy(e.emissive).multiplyScalar(e.emissiveIntensity),e.map&&(t.map.value=e.map),e.alphaMap&&(t.alphaMap.value=e.alphaMap),e.specularMap&&(t.specularMap.value=e.specularMap),e.envMap&&(t.envMap.value=e.envMap,t.flipEnvMap.value=e.envMap.isCubeTexture?-1:1,t.reflectivity.value=e.reflectivity,t.refractionRatio.value=e.refractionRatio,t.maxMipLevel.value=S.get(e.envMap).__maxMipLevel),e.lightMap&&(t.lightMap.value=e.lightMap,t.lightMapIntensity.value=e.lightMapIntensity),e.aoMap&&(t.aoMap.value=e.aoMap,t.aoMapIntensity.value=e.aoMapIntensity),e.map?r=e.map:e.specularMap?r=e.specularMap:e.displacementMap?r=e.displacementMap:e.normalMap?r=e.normalMap:e.bumpMap?r=e.bumpMap:e.roughnessMap?r=e.roughnessMap:e.metalnessMap?r=e.metalnessMap:e.alphaMap?r=e.alphaMap:e.emissiveMap&&(r=e.emissiveMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}function At(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}function Lt(t,e){t.roughness.value=e.roughness,t.metalness.value=e.metalness,e.roughnessMap&&(t.roughnessMap.value=e.roughnessMap),e.metalnessMap&&(t.metalnessMap.value=e.metalnessMap),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias),e.envMap&&(t.envMapIntensity.value=e.envMapIntensity)}bt.setAnimationLoop((function(t){dt.isPresenting()||xt&&xt(t)})),void 0!==a&&bt.setContext(a),this.setAnimationLoop=function(t){xt=t,dt.setAnimationLoop(t),bt.start()},this.render=function(t,e){var r,n;if(void 0!==arguments[2]&&(console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."),r=arguments[2]),void 0!==arguments[3]&&(console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."),n=arguments[3]),e&&e.isCamera){if(!G){q.geometry=null,q.program=null,q.wireframe=!1,W=-1,X=null,!0===t.autoUpdate&&t.updateMatrixWorld(),null===e.parent&&e.updateMatrixWorld(),dt.enabled&&(e=dt.getCamera(e)),(v=O.get(t,e)).init(),t.onBeforeRender(F,t,e,r||j),ct.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),it.setFromMatrix(ct),st=this.localClippingEnabled,ot=at.init(this.clippingPlanes,st,e),(g=C.get(t,e)).init(),wt(t,e,0,F.sortObjects),!0===F.sortObjects&&g.sort(),ot&&at.beginShadows();var i=v.state.shadowsArray;ft.render(i,t,e),v.setupLights(e),ot&&at.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==r&&this.setRenderTarget(r),D.render(g,t,e,n);var a=g.opaque,o=g.transparent;if(t.overrideMaterial){var s=t.overrideMaterial;a.length&&_t(a,t,e,s),o.length&&_t(o,t,e,s)}else a.length&&_t(a,t,e),o.length&&_t(o,t,e);t.onAfterRender(F,t,e),null!==j&&(T.updateRenderTargetMipmap(j),T.updateMultisampleRenderTarget(j)),_.buffers.depth.setTest(!0),_.buffers.depth.setMask(!0),_.buffers.color.setMask(!0),_.setPolygonOffset(!1),dt.enabled&&dt.submitFrame(),g=null,v=null}}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.setFramebuffer=function(t){U!==t&&y.bindFramebuffer(36160,t),U=t},this.getActiveCubeFace=function(){return H},this.getActiveMipmapLevel=function(){return V},this.getRenderTarget=function(){return j},this.setRenderTarget=function(t,e,r){j=t,H=e,V=r,t&&void 0===S.get(t).__webglFramebuffer&&T.setupRenderTarget(t);var n=U,i=!1;if(t){var a=S.get(t).__webglFramebuffer;t.isWebGLRenderTargetCube?(n=a[e||0],i=!0):n=t.isWebGLMultisampleRenderTarget?S.get(t).__webglMultisampledFramebuffer:a,J.copy(t.viewport),Z.copy(t.scissor),Q=t.scissorTest}else J.copy(et).multiplyScalar(tt).floor(),Z.copy(rt).multiplyScalar(tt).floor(),Q=nt;if(k!==n&&(y.bindFramebuffer(36160,n),k=n),_.viewport(J),_.scissor(Z),_.setScissorTest(Q),i){var o=S.get(t.texture);y.framebufferTexture2D(36160,36064,34069+(e||0),o.__webglTexture,r||0)}},this.readRenderTargetPixels=function(t,e,r,n,i,a,o){if(t&&t.isWebGLRenderTarget){var s=S.get(t).__webglFramebuffer;if(t.isWebGLRenderTargetCube&&void 0!==o&&(s=s[o]),s){var c=!1;s!==k&&(y.bindFramebuffer(36160,s),c=!0);try{var l=t.texture,h=l.format,u=l.type;if(1023!==h&&B.convert(h)!==y.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!(1009===u||B.convert(u)===y.getParameter(35738)||1015===u&&(w.isWebGL2||b.get("OES_texture_float")||b.get("WEBGL_color_buffer_float"))||1016===u&&(w.isWebGL2?b.get("EXT_color_buffer_float"):b.get("EXT_color_buffer_half_float"))))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===y.checkFramebufferStatus(36160)?e>=0&&e<=t.width-n&&r>=0&&r<=t.height-i&&y.readPixels(e,r,n,i,B.convert(h),B.convert(u),a):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{c&&y.bindFramebuffer(36160,k)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")},this.copyFramebufferToTexture=function(t,e,r){var n=e.image.width,i=e.image.height,a=B.convert(e.format);T.setTexture2D(e,0),y.copyTexImage2D(3553,r||0,a,t.x,t.y,n,i,0)},this.copyTextureToTexture=function(t,e,r,n){var i=e.image.width,a=e.image.height,o=B.convert(r.format),s=B.convert(r.type);T.setTexture2D(r,0),e.isDataTexture?y.texSubImage2D(3553,n||0,t.x,t.y,i,a,o,s,e.image.data):y.texSubImage2D(3553,n||0,t.x,t.y,o,s,e.image)},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Kn(t,e){this.name="",this.color=new Nt(t),this.density=void 0!==e?e:25e-5}function $n(t,e,r){this.name="",this.color=new Nt(t),this.near=void 0!==e?e:1,this.far=void 0!==r?r:1e3}function ti(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.version=0}function ei(t,e,r,n){this.data=t,this.itemSize=e,this.offset=r,this.normalized=!0===n}function ri(t){Ut.call(this),this.type="SpriteMaterial",this.color=new Nt(16777215),this.map=null,this.rotation=0,this.sizeAttenuation=!0,this.lights=!1,this.transparent=!0,this.setValues(t)}Object.assign(Jn.prototype,e.prototype),Object.assign(Zn.prototype,e.prototype),Object.assign(Kn.prototype,{isFogExp2:!0,clone:function(){return new Kn(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}),Object.assign($n.prototype,{isFog:!0,clone:function(){return new $n(this.color,this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}),Object.defineProperty(ti.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(ti.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setArray:function(t){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");return this.count=void 0!==t?t.length/this.stride:0,this.array=t,this},setDynamic:function(t){return this.dynamic=t,this},copy:function(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.dynamic=t.dynamic,this},copyAt:function(t,e,r){t*=this.stride,r*=e.stride;for(var n=0,i=this.stride;nt.far||e.push({distance:s,point:ni.clone(),uv:Pt.getUV(ni,li,hi,ui,pi,di,fi,new l),face:null,object:this})}},clone:function(){return new this.constructor(this.material).copy(this)},copy:function(t){return Y.prototype.copy.call(this,t),void 0!==t.center&&this.center.copy(t.center),this}});var vi=new d,yi=new d;function xi(){Y.call(this),this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}function bi(t,e){t&&t.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."),Te.call(this,t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new P,this.bindMatrixInverse=new P}xi.prototype=Object.assign(Object.create(Y.prototype),{constructor:xi,isLOD:!0,copy:function(t){Y.prototype.copy.call(this,t,!1);for(var e=t.levels,r=0,n=e.length;r1){vi.setFromMatrixPosition(t.matrixWorld),yi.setFromMatrixPosition(this.matrixWorld);var r=vi.distanceTo(yi);e[0].object.visible=!0;for(var n=1,i=e.length;n=e[n].distance;n++)e[n-1].object.visible=!1,e[n].object.visible=!0;for(;no||(h.applyMatrix4(this.matrixWorld),(_=t.ray.origin.distanceTo(h))t.far||e.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,v=f.length/3-1;go||(h.applyMatrix4(this.matrixWorld),(_=t.ray.origin.distanceTo(h))t.far||e.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(n.isGeometry){var b=n.vertices,w=b.length;for(g=0;go||(h.applyMatrix4(this.matrixWorld),(_=t.ray.origin.distanceTo(h))t.far||e.push({distance:_,point:l.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Oi=new d,Di=new d;function Ni(t,e){Ci.call(this,t,e),this.type="LineSegments"}function Ii(t,e){Ci.call(this,t,e),this.type="LineLoop"}function zi(t){Ut.call(this),this.type="PointsMaterial",this.color=new Nt(16777215),this.map=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.lights=!1,this.setValues(t)}Ni.prototype=Object.assign(Object.create(Ci.prototype),{constructor:Ni,isLineSegments:!0,computeLineDistances:function(){var t=this.geometry;if(t.isBufferGeometry)if(null===t.index){for(var e=t.attributes.position,r=[],n=0,i=e.count;ni.far)return;a.push({distance:l,distanceToRay:Math.sqrt(s),point:c,index:e,face:null,object:o})}}function ji(t,e,r,n,i,a,o,s,c){y.call(this,t,e,r,n,i,a,o,s,c),this.format=void 0!==o?o:1022,this.minFilter=void 0!==a?a:1006,this.magFilter=void 0!==i?i:1006,this.generateMipmaps=!1}function ki(t,e,r,n,i,a,o,s,c,l,h,u){y.call(this,null,a,o,s,c,l,n,i,h,u),this.image={width:e,height:r},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}function Wi(t,e,r,n,i,a,o,s,c){y.call(this,t,e,r,n,i,a,o,s,c),this.needsUpdate=!0}function qi(t,e,r,n,i,a,o,s,c,l){if(1026!==(l=void 0!==l?l:1026)&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===r&&1026===l&&(r=1012),void 0===r&&1027===l&&(r=1020),y.call(this,null,n,i,a,o,s,l,r,c),this.image={width:t,height:e},this.magFilter=void 0!==o?o:1003,this.minFilter=void 0!==s?s:1003,this.flipY=!1,this.generateMipmaps=!1}function Xi(t){se.call(this),this.type="WireframeGeometry";var e,r,n,i,a,o,s,c,l,h,u=[],p=[0,0],f={},m=["a","b","c"];if(t&&t.isGeometry){var g=t.faces;for(e=0,n=g.length;e=0?(t(y-l,v,p),f.subVectors(u,p)):(t(y+l,v,p),f.subVectors(p,u)),v-l>=0?(t(y,v-l,p),m.subVectors(u,p)):(t(y,v+l,p),m.subVectors(p,u)),h.crossVectors(f,m).normalize(),s.push(h.x,h.y,h.z),c.push(y,v)}}for(n=0;n.9&&o<.1&&(e<.2&&(a[t+0]+=1),r<.2&&(a[t+2]+=1),n<.2&&(a[t+4]+=1))}}()}(),this.addAttribute("position",new Zt(i,3)),this.addAttribute("normal",new Zt(i.slice(),3)),this.addAttribute("uv",new Zt(a,2)),0===n?this.computeVertexNormals():this.normalizeNormals()}function Ki(t,e){Oe.call(this),this.type="TetrahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new $i(t,e)),this.mergeVertices()}function $i(t,e){Qi.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],t,e),this.type="TetrahedronBufferGeometry",this.parameters={radius:t,detail:e}}function ta(t,e){Oe.call(this),this.type="OctahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new ea(t,e)),this.mergeVertices()}function ea(t,e){Qi.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],t,e),this.type="OctahedronBufferGeometry",this.parameters={radius:t,detail:e}}function ra(t,e){Oe.call(this),this.type="IcosahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new na(t,e)),this.mergeVertices()}function na(t,e){var r=(1+Math.sqrt(5))/2,n=[-1,r,0,1,r,0,-1,-r,0,1,-r,0,0,-1,r,0,1,r,0,-1,-r,0,1,-r,r,0,-1,r,0,1,-r,0,-1,-r,0,1];Qi.call(this,n,[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],t,e),this.type="IcosahedronBufferGeometry",this.parameters={radius:t,detail:e}}function ia(t,e){Oe.call(this),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new aa(t,e)),this.mergeVertices()}function aa(t,e){var r=(1+Math.sqrt(5))/2,n=1/r,i=[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-n,-r,0,-n,r,0,n,-r,0,n,r,-n,-r,0,-n,r,0,n,-r,0,n,r,0,-r,0,-n,r,0,-n,-r,0,n,r,0,n];Qi.call(this,i,[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronBufferGeometry",this.parameters={radius:t,detail:e}}function oa(t,e,r,n,i,a){Oe.call(this),this.type="TubeGeometry",this.parameters={path:t,tubularSegments:e,radius:r,radialSegments:n,closed:i},void 0!==a&&console.warn("THREE.TubeGeometry: taper has been removed.");var o=new sa(t,e,r,n,i);this.tangents=o.tangents,this.normals=o.normals,this.binormals=o.binormals,this.fromBufferGeometry(o),this.mergeVertices()}function sa(t,e,r,n,i){se.call(this),this.type="TubeBufferGeometry",this.parameters={path:t,tubularSegments:e,radius:r,radialSegments:n,closed:i},e=e||64,r=r||1,n=n||8,i=i||!1;var a=t.computeFrenetFrames(e,i);this.tangents=a.tangents,this.normals=a.normals,this.binormals=a.binormals;var o,s,c=new d,h=new d,u=new l,p=new d,f=[],m=[],g=[],v=[];function y(i){p=t.getPointAt(i/e,p);var o=a.normals[i],l=a.binormals[i];for(s=0;s<=n;s++){var u=s/n*Math.PI*2,d=Math.sin(u),g=-Math.cos(u);h.x=g*o.x+d*l.x,h.y=g*o.y+d*l.y,h.z=g*o.z+d*l.z,h.normalize(),m.push(h.x,h.y,h.z),c.x=p.x+r*h.x,c.y=p.y+r*h.y,c.z=p.z+r*h.z,f.push(c.x,c.y,c.z)}}!function(){for(o=0;o0){var o=i[a[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},t=0,e=o.length;t0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),ji.prototype=Object.assign(Object.create(y.prototype),{constructor:ji,isVideoTexture:!0,update:function(){var t=this.image;t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}),ki.prototype=Object.create(y.prototype),ki.prototype.constructor=ki,ki.prototype.isCompressedTexture=!0,Wi.prototype=Object.create(y.prototype),Wi.prototype.constructor=Wi,Wi.prototype.isCanvasTexture=!0,qi.prototype=Object.create(y.prototype),qi.prototype.constructor=qi,qi.prototype.isDepthTexture=!0,Xi.prototype=Object.create(se.prototype),Xi.prototype.constructor=Xi,Yi.prototype=Object.create(Oe.prototype),Yi.prototype.constructor=Yi,Ji.prototype=Object.create(se.prototype),Ji.prototype.constructor=Ji,Zi.prototype=Object.create(Oe.prototype),Zi.prototype.constructor=Zi,Qi.prototype=Object.create(se.prototype),Qi.prototype.constructor=Qi,Ki.prototype=Object.create(Oe.prototype),Ki.prototype.constructor=Ki,$i.prototype=Object.create(Qi.prototype),$i.prototype.constructor=$i,ta.prototype=Object.create(Oe.prototype),ta.prototype.constructor=ta,ea.prototype=Object.create(Qi.prototype),ea.prototype.constructor=ea,ra.prototype=Object.create(Oe.prototype),ra.prototype.constructor=ra,na.prototype=Object.create(Qi.prototype),na.prototype.constructor=na,ia.prototype=Object.create(Oe.prototype),ia.prototype.constructor=ia,aa.prototype=Object.create(Qi.prototype),aa.prototype.constructor=aa,oa.prototype=Object.create(Oe.prototype),oa.prototype.constructor=oa,sa.prototype=Object.create(se.prototype),sa.prototype.constructor=sa,sa.prototype.toJSON=function(){var t=se.prototype.toJSON.call(this);return t.path=this.parameters.path.toJSON(),t},ca.prototype=Object.create(Oe.prototype),ca.prototype.constructor=ca,la.prototype=Object.create(se.prototype),la.prototype.constructor=la,ha.prototype=Object.create(Oe.prototype),ha.prototype.constructor=ha,ua.prototype=Object.create(se.prototype),ua.prototype.constructor=ua;var pa=function(t,e,r){r=r||2;var n,i,a,o,s,c,l,h=e&&e.length,u=h?e[0]*r:t.length,p=da(t,0,u,r,!0),d=[];if(!p||p.next===p.prev)return d;if(h&&(p=function(t,e,r,n){var i,a,o,s,c,l=[];for(i=0,a=e.length;i80*r){n=a=t[0],i=o=t[1];for(var f=r;fa&&(a=s),c>o&&(o=c);l=0!==(l=Math.max(a-n,o-i))?1/l:0}return ma(p,d,r,n,i,l),d};function da(t,e,r,n,i){var a,o;if(i===function(t,e,r,n){for(var i=0,a=e,o=r-n;a0)for(a=e;a=e;a-=n)o=Ca(a,t[a],t[a+1],o);return o&&Aa(o,o.next)&&(Oa(o),o=o.next),o}function fa(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!Aa(n,n.next)&&0!==Ea(n.prev,n,n.next))n=n.next;else{if(Oa(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function ma(t,e,r,n,i,a,o){if(t){!o&&a&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=_a(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,c,l=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||c>0&&n;)0!==s&&(0===c||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,c--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,l*=2}while(o>1)}(i)}(t,n,i,a);for(var s,c,l=t;t.prev!==t.next;)if(s=t.prev,c=t.next,a?va(t,n,i,a):ga(t))e.push(s.i/r),e.push(t.i/r),e.push(c.i/r),Oa(t),t=c.next,l=c.next;else if((t=c)===l){o?1===o?ma(t=ya(t,e,r),e,r,n,i,a,2):2===o&&xa(t,e,r,n,i,a):ma(fa(t),e,r,n,i,a,1);break}}}function ga(t){var e=t.prev,r=t,n=t.next;if(Ea(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(Sa(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&Ea(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function va(t,e,r,n){var i=t.prev,a=t,o=t.next;if(Ea(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,h=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,u=_a(s,c,e,r,n),p=_a(l,h,e,r,n),d=t.prevZ,f=t.nextZ;d&&d.z>=u&&f&&f.z<=p;){if(d!==t.prev&&d!==t.next&&Sa(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Ea(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,f!==t.prev&&f!==t.next&&Sa(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&Ea(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;d&&d.z>=u;){if(d!==t.prev&&d!==t.next&&Sa(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Ea(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;f&&f.z<=p;){if(f!==t.prev&&f!==t.next&&Sa(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&Ea(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function ya(t,e,r){var n=t;do{var i=n.prev,a=n.next.next;!Aa(i,a)&&La(i,n,n.next,a)&&Ra(i,a)&&Ra(a,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(a.i/r),Oa(n),Oa(n.next),n=t=a),n=n.next}while(n!==t);return n}function xa(t,e,r,n,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&Ta(o,s)){var c=Pa(o,s);return o=fa(o,o.next),c=fa(c,c.next),ma(o,e,r,n,i,a),void ma(c,e,r,n,i,a)}s=s.next}o=o.next}while(o!==t)}function ba(t,e){return t.x-e.x}function wa(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x=n.x&&n.x>=h&&i!==n.x&&Sa(ar.x)&&Ra(n,t)&&(r=n,p=c),n=n.next;return r}(t,e)){var r=Pa(e,t);fa(r,r.next)}}function _a(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Ma(t){var e=t,r=t;do{(e.x=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function Ta(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&La(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&Ra(t,e)&&Ra(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)}function Ea(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function Aa(t,e){return t.x===e.x&&t.y===e.y}function La(t,e,r,n){return!!(Aa(t,r)&&Aa(e,n)||Aa(t,n)&&Aa(r,e))||Ea(t,e,r)>0!=Ea(t,e,n)>0&&Ea(r,n,t)>0!=Ea(r,n,e)>0}function Ra(t,e){return Ea(t.prev,t,t.next)<0?Ea(t,e,t.next)>=0&&Ea(t,t.prev,e)>=0:Ea(t,e,t.prev)<0||Ea(t,t.next,e)<0}function Pa(t,e){var r=new Da(t.i,t.x,t.y),n=new Da(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function Ca(t,e,r,n){var i=new Da(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function Oa(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Da(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}var Na={area:function(t){for(var e=t.length,r=0,n=e-1,i=0;i2&&t[e-1].equals(t[0])&&t.pop()}function za(t,e){for(var r=0;rNumber.EPSILON){var d=Math.sqrt(u),f=Math.sqrt(c*c+h*h),m=e.x-s/d,g=e.y+o/d,v=((r.x-h/f-m)*h-(r.y+c/f-g)*c)/(o*h-s*c),y=(n=m+o*v-t.x)*n+(i=g+s*v-t.y)*i;if(y<=2)return new l(n,i);a=Math.sqrt(y/2)}else{var x=!1;o>Number.EPSILON?c>Number.EPSILON&&(x=!0):o<-Number.EPSILON?c<-Number.EPSILON&&(x=!0):Math.sign(s)===Math.sign(h)&&(x=!0),x?(n=-s,i=o,a=Math.sqrt(u)):(n=o,i=s,a=Math.sqrt(u/2))}return new l(n/a,i/a)}for(var V=[],j=0,k=C.length,W=k-1,q=j+1;j=0;D--){for(I=D/m,z=u*Math.cos(I*Math.PI/2),N=p*Math.sin(I*Math.PI/2)+f,j=0,k=C.length;j=0;){r=j,(n=j-1)<0&&(n=t.length-1);var i=0,a=s+2*m;for(i=0;i0)&&m.push(M,S,E),(c!==r-1||l0&&x(!0),e>0&&x(!1)),this.setIndex(h),this.addAttribute("position",new Zt(u,3)),this.addAttribute("normal",new Zt(p,3)),this.addAttribute("uv",new Zt(f,2))}function eo(t,e,r,n,i,a,o){$a.call(this,0,t,e,r,n,i,a,o),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:r,heightSegments:n,openEnded:i,thetaStart:a,thetaLength:o}}function ro(t,e,r,n,i,a,o){to.call(this,0,t,e,r,n,i,a,o),this.type="ConeBufferGeometry",this.parameters={radius:t,height:e,radialSegments:r,heightSegments:n,openEnded:i,thetaStart:a,thetaLength:o}}function no(t,e,r,n){Oe.call(this),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:r,thetaLength:n},this.fromBufferGeometry(new io(t,e,r,n)),this.mergeVertices()}function io(t,e,r,n){se.call(this),this.type="CircleBufferGeometry",this.parameters={radius:t,segments:e,thetaStart:r,thetaLength:n},t=t||1,e=void 0!==e?Math.max(3,e):8,r=void 0!==r?r:0,n=void 0!==n?n:2*Math.PI;var i,a,o=[],s=[],c=[],h=[],u=new d,p=new l;for(s.push(0,0,0),c.push(0,0,1),h.push(.5,.5),a=0,i=3;a<=e;a++,i+=3){var f=r+a/e*n;u.x=t*Math.cos(f),u.y=t*Math.sin(f),s.push(u.x,u.y,u.z),c.push(0,0,1),p.x=(s[i]/t+1)/2,p.y=(s[i+1]/t+1)/2,h.push(p.x,p.y)}for(i=1;i<=e;i++)o.push(i,i+1,0);this.setIndex(o),this.addAttribute("position",new Zt(s,3)),this.addAttribute("normal",new Zt(c,3)),this.addAttribute("uv",new Zt(h,2))}Ha.prototype=Object.create(Oe.prototype),Ha.prototype.constructor=Ha,Va.prototype=Object.create(Fa.prototype),Va.prototype.constructor=Va,ja.prototype=Object.create(Oe.prototype),ja.prototype.constructor=ja,ka.prototype=Object.create(se.prototype),ka.prototype.constructor=ka,Wa.prototype=Object.create(Oe.prototype),Wa.prototype.constructor=Wa,qa.prototype=Object.create(se.prototype),qa.prototype.constructor=qa,Xa.prototype=Object.create(Oe.prototype),Xa.prototype.constructor=Xa,Ya.prototype=Object.create(se.prototype),Ya.prototype.constructor=Ya,Ja.prototype=Object.create(Oe.prototype),Ja.prototype.constructor=Ja,Ja.prototype.toJSON=function(){var t=Oe.prototype.toJSON.call(this);return Qa(this.parameters.shapes,t)},Za.prototype=Object.create(se.prototype),Za.prototype.constructor=Za,Za.prototype.toJSON=function(){var t=se.prototype.toJSON.call(this);return Qa(this.parameters.shapes,t)},Ka.prototype=Object.create(se.prototype),Ka.prototype.constructor=Ka,$a.prototype=Object.create(Oe.prototype),$a.prototype.constructor=$a,to.prototype=Object.create(se.prototype),to.prototype.constructor=to,eo.prototype=Object.create($a.prototype),eo.prototype.constructor=eo,ro.prototype=Object.create(to.prototype),ro.prototype.constructor=ro,no.prototype=Object.create(Oe.prototype),no.prototype.constructor=no,io.prototype=Object.create(se.prototype),io.prototype.constructor=io;var ao=Object.freeze({WireframeGeometry:Xi,ParametricGeometry:Yi,ParametricBufferGeometry:Ji,TetrahedronGeometry:Ki,TetrahedronBufferGeometry:$i,OctahedronGeometry:ta,OctahedronBufferGeometry:ea,IcosahedronGeometry:ra,IcosahedronBufferGeometry:na,DodecahedronGeometry:ia,DodecahedronBufferGeometry:aa,PolyhedronGeometry:Zi,PolyhedronBufferGeometry:Qi,TubeGeometry:oa,TubeBufferGeometry:sa,TorusKnotGeometry:ca,TorusKnotBufferGeometry:la,TorusGeometry:ha,TorusBufferGeometry:ua,TextGeometry:Ha,TextBufferGeometry:Va,SphereGeometry:ja,SphereBufferGeometry:ka,RingGeometry:Wa,RingBufferGeometry:qa,PlaneGeometry:rr,PlaneBufferGeometry:nr,LatheGeometry:Xa,LatheBufferGeometry:Ya,ShapeGeometry:Ja,ShapeBufferGeometry:Za,ExtrudeGeometry:Ba,ExtrudeBufferGeometry:Fa,EdgesGeometry:Ka,ConeGeometry:eo,ConeBufferGeometry:ro,CylinderGeometry:$a,CylinderBufferGeometry:to,CircleGeometry:no,CircleBufferGeometry:io,BoxGeometry:De,BoxBufferGeometry:Ne});function oo(t){Ut.call(this),this.type="ShadowMaterial",this.color=new Nt(0),this.transparent=!0,this.setValues(t)}function so(t){Fe.call(this,t),this.type="RawShaderMaterial"}function co(t){Ut.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new Nt(16777215),this.roughness=.5,this.metalness=.5,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Nt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new l(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function lo(t){co.call(this),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.reflectivity=.5,this.clearcoat=0,this.clearcoatRoughness=0,this.sheen=null,this.clearcoatNormalScale=new l(1,1),this.clearcoatNormalMap=null,this.transparency=0,this.setValues(t)}function ho(t){Ut.call(this),this.type="MeshPhongMaterial",this.color=new Nt(16777215),this.specular=new Nt(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Nt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new l(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function uo(t){ho.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.gradientMap=null,this.setValues(t)}function po(t){Ut.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new l(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function fo(t){Ut.call(this),this.type="MeshLambertMaterial",this.color=new Nt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Nt(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function mo(t){Ut.call(this),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Nt(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new l(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.lights=!1,this.setValues(t)}function go(t){Ti.call(this),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}oo.prototype=Object.create(Ut.prototype),oo.prototype.constructor=oo,oo.prototype.isShadowMaterial=!0,oo.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.color.copy(t.color),this},so.prototype=Object.create(Fe.prototype),so.prototype.constructor=so,so.prototype.isRawShaderMaterial=!0,co.prototype=Object.create(Ut.prototype),co.prototype.constructor=co,co.prototype.isMeshStandardMaterial=!0,co.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.defines={STANDARD:""},this.color.copy(t.color),this.roughness=t.roughness,this.metalness=t.metalness,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.roughnessMap=t.roughnessMap,this.metalnessMap=t.metalnessMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},lo.prototype=Object.create(co.prototype),lo.prototype.constructor=lo,lo.prototype.isMeshPhysicalMaterial=!0,lo.prototype.copy=function(t){return co.prototype.copy.call(this,t),this.defines={STANDARD:"",PHYSICAL:""},this.reflectivity=t.reflectivity,this.clearcoat=t.clearcoat,this.clearcoatRoughness=t.clearcoatRoughness,t.sheen?this.sheen=(this.sheen||new Nt).copy(t.sheen):this.sheen=null,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.transparency=t.transparency,this},ho.prototype=Object.create(Ut.prototype),ho.prototype.constructor=ho,ho.prototype.isMeshPhongMaterial=!0,ho.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},uo.prototype=Object.create(ho.prototype),uo.prototype.constructor=uo,uo.prototype.isMeshToonMaterial=!0,uo.prototype.copy=function(t){return ho.prototype.copy.call(this,t),this.gradientMap=t.gradientMap,this},po.prototype=Object.create(Ut.prototype),po.prototype.constructor=po,po.prototype.isMeshNormalMaterial=!0,po.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},fo.prototype=Object.create(Ut.prototype),fo.prototype.constructor=fo,fo.prototype.isMeshLambertMaterial=!0,fo.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},mo.prototype=Object.create(Ut.prototype),mo.prototype.constructor=mo,mo.prototype.isMeshMatcapMaterial=!0,mo.prototype.copy=function(t){return Ut.prototype.copy.call(this,t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},go.prototype=Object.create(Ti.prototype),go.prototype.constructor=go,go.prototype.isLineDashedMaterial=!0,go.prototype.copy=function(t){return Ti.prototype.copy.call(this,t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this};var vo=Object.freeze({ShadowMaterial:oo,SpriteMaterial:ri,RawShaderMaterial:so,ShaderMaterial:Fe,PointsMaterial:zi,MeshPhysicalMaterial:lo,MeshStandardMaterial:co,MeshPhongMaterial:ho,MeshToonMaterial:uo,MeshNormalMaterial:po,MeshLambertMaterial:fo,MeshDepthMaterial:Bn,MeshDistanceMaterial:Fn,MeshBasicMaterial:Ht,MeshMatcapMaterial:mo,LineDashedMaterial:go,LineBasicMaterial:Ti,Material:Ut}),yo={arraySlice:function(t,e,r){return yo.isTypedArray(t)?new t.constructor(t.subarray(e,void 0!==r?r:t.length)):t.slice(e,r)},convertArray:function(t,e,r){return!t||!r&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){for(var e=t.length,r=new Array(e),n=0;n!==e;++n)r[n]=n;return r.sort((function(e,r){return t[e]-t[r]})),r},sortedArray:function(t,e,r){for(var n=t.length,i=new t.constructor(n),a=0,o=0;o!==n;++a)for(var s=r[a]*e,c=0;c!==e;++c)i[o++]=t[s+c];return i},flattenJSON:function(t,e,r,n){for(var i=1,a=t[0];void 0!==a&&void 0===a[n];)a=t[i++];if(void 0!==a){var o=a[n];if(void 0!==o)if(Array.isArray(o))do{void 0!==(o=a[n])&&(e.push(a.time),r.push.apply(r,o)),a=t[i++]}while(void 0!==a);else if(void 0!==o.toArray)do{void 0!==(o=a[n])&&(e.push(a.time),o.toArray(r,r.length)),a=t[i++]}while(void 0!==a);else do{void 0!==(o=a[n])&&(e.push(a.time),r.push(o)),a=t[i++]}while(void 0!==a)}}};function xo(t,e,r,n){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=void 0!==n?n:new e.constructor(r),this.sampleValues=e,this.valueSize=r}function bo(t,e,r,n){xo.call(this,t,e,r,n),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0}function wo(t,e,r,n){xo.call(this,t,e,r,n)}function _o(t,e,r,n){xo.call(this,t,e,r,n)}function Mo(t,e,r,n){if(void 0===t)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===e||0===e.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+t);this.name=t,this.times=yo.convertArray(e,this.TimeBufferType),this.values=yo.convertArray(r,this.ValueBufferType),this.setInterpolation(n||this.DefaultInterpolation)}function So(t,e,r){Mo.call(this,t,e,r)}function To(t,e,r,n){Mo.call(this,t,e,r,n)}function Eo(t,e,r,n){Mo.call(this,t,e,r,n)}function Ao(t,e,r,n){xo.call(this,t,e,r,n)}function Lo(t,e,r,n){Mo.call(this,t,e,r,n)}function Ro(t,e,r,n){Mo.call(this,t,e,r,n)}function Po(t,e,r,n){Mo.call(this,t,e,r,n)}function Co(t,e,r){this.name=t,this.tracks=r,this.duration=void 0!==e?e:-1,this.uuid=s.generateUUID(),this.duration<0&&this.resetDuration()}function Oo(t){if(void 0===t.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");var e=function(t){switch(t.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return Eo;case"vector":case"vector2":case"vector3":case"vector4":return Po;case"color":return To;case"quaternion":return Lo;case"bool":case"boolean":return So;case"string":return Ro}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+t)}(t.type);if(void 0===t.times){var r=[],n=[];yo.flattenJSON(t.keys,r,n,"value"),t.times=r,t.values=n}return void 0!==e.parse?e.parse(t):new e(t.name,t.times,t.values,t.interpolation)}Object.assign(xo.prototype,{evaluate:function(t){var e=this.parameterPositions,r=this._cachedIndex,n=e[r],i=e[r-1];t:{e:{var a;r:{n:if(!(t=i)break t;var s=e[1];for(t=(i=e[--r-1]))break e}a=r,r=0}for(;r>>1;te;)--a;if(++a,0!==i||a!==n){i>=a&&(i=(a=Math.max(a,1))-1);var o=this.getValueSize();this.times=yo.arraySlice(r,i,a),this.values=yo.arraySlice(this.values,i*o,a*o)}return this},validate:function(){var t=!0,e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);var r=this.times,n=this.values,i=r.length;0===i&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);for(var a=null,o=0;o!==i;o++){var s=r[o];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,s),t=!1;break}if(null!==a&&a>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,s,a),t=!1;break}a=s}if(void 0!==n&&yo.isTypedArray(n)){o=0;for(var c=n.length;o!==c;++o){var l=n[o];if(isNaN(l)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,o,l),t=!1;break}}}return t},optimize:function(){for(var t=this.times,e=this.values,r=this.getValueSize(),n=2302===this.getInterpolation(),i=1,a=t.length-1,o=1;o0){for(t[i]=t[a],f=a*r,m=i*r,p=0;p!==r;++p)e[m+p]=e[f+p];++i}return i!==t.length&&(this.times=yo.arraySlice(t,0,i),this.values=yo.arraySlice(e,0,i*r)),this},clone:function(){var t=yo.arraySlice(this.times,0),e=yo.arraySlice(this.values,0),r=new(0,this.constructor)(this.name,t,e);return r.createInterpolant=this.createInterpolant,r}}),So.prototype=Object.assign(Object.create(Mo.prototype),{constructor:So,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),To.prototype=Object.assign(Object.create(Mo.prototype),{constructor:To,ValueTypeName:"color"}),Eo.prototype=Object.assign(Object.create(Mo.prototype),{constructor:Eo,ValueTypeName:"number"}),Ao.prototype=Object.assign(Object.create(xo.prototype),{constructor:Ao,interpolate_:function(t,e,r,n){for(var i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=t*o,c=(r-e)/(n-e),l=s+o;s!==l;s+=4)h.slerpFlat(i,0,a,s-o,a,s,c);return i}}),Lo.prototype=Object.assign(Object.create(Mo.prototype),{constructor:Lo,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(t){return new Ao(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:void 0}),Ro.prototype=Object.assign(Object.create(Mo.prototype),{constructor:Ro,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Po.prototype=Object.assign(Object.create(Mo.prototype),{constructor:Po,ValueTypeName:"vector"}),Object.assign(Co,{parse:function(t){for(var e=[],r=t.tracks,n=1/(t.fps||1),i=0,a=r.length;i!==a;++i)e.push(Oo(r[i]).scale(n));return new Co(t.name,t.duration,e)},toJSON:function(t){for(var e=[],r=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid},i=0,a=r.length;i!==a;++i)e.push(Mo.toJSON(r[i]));return n},CreateFromMorphTargetSequence:function(t,e,r,n){for(var i=e.length,a=[],o=0;o1){var l=n[u=c[1]];l||(n[u]=l=[]),l.push(s)}}var h=[];for(var u in n)h.push(Co.CreateFromMorphTargetSequence(u,n[u],e,r));return h},parseAnimation:function(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var r=function(t,e,r,n,i){if(0!==r.length){var a=[],o=[];yo.flattenJSON(r,a,o,n),0!==a.length&&i.push(new t(e,a,o))}},n=[],i=t.name||"default",a=t.length||-1,o=t.fps||30,s=t.hierarchy||[],c=0;c0||0===t.search(/^data\:image\/jpeg/);i.format=n?1022:1023,i.needsUpdate=!0,void 0!==e&&e(i)}),r,n),i}}),Object.assign(Wo.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(t,e){var r=this.getUtoTmapping(t);return this.getPoint(r,e)},getPoints:function(t){void 0===t&&(t=5);for(var e=[],r=0;r<=t;r++)e.push(this.getPoint(r/t));return e},getSpacedPoints:function(t){void 0===t&&(t=5);for(var e=[],r=0;r<=t;r++)e.push(this.getPointAt(r/t));return e},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,r,n=[],i=this.getPoint(0),a=0;for(n.push(0),r=1;r<=t;r++)a+=(e=this.getPoint(r/t)).distanceTo(i),n.push(a),i=e;return this.cacheArcLengths=n,n},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(t,e){var r,n=this.getLengths(),i=0,a=n.length;r=e||t*n[a-1];for(var o,s=0,c=a-1;s<=c;)if((o=n[i=Math.floor(s+(c-s)/2)]-r)<0)s=i+1;else{if(!(o>0)){c=i;break}c=i-1}if(n[i=c]===r)return i/(a-1);var l=n[i];return(i+(r-l)/(n[i+1]-l))/(a-1)},getTangent:function(t){var e=t-1e-4,r=t+1e-4;e<0&&(e=0),r>1&&(r=1);var n=this.getPoint(e);return this.getPoint(r).clone().sub(n).normalize()},getTangentAt:function(t){var e=this.getUtoTmapping(t);return this.getTangent(e)},computeFrenetFrames:function(t,e){var r,n,i,a=new d,o=[],c=[],l=[],h=new d,u=new P;for(r=0;r<=t;r++)n=r/t,o[r]=this.getTangentAt(n),o[r].normalize();c[0]=new d,l[0]=new d;var p=Number.MAX_VALUE,f=Math.abs(o[0].x),m=Math.abs(o[0].y),g=Math.abs(o[0].z);for(f<=p&&(p=f,a.set(1,0,0)),m<=p&&(p=m,a.set(0,1,0)),g<=p&&a.set(0,0,1),h.crossVectors(o[0],a).normalize(),c[0].crossVectors(o[0],h),l[0].crossVectors(o[0],c[0]),r=1;r<=t;r++)c[r]=c[r-1].clone(),l[r]=l[r-1].clone(),h.crossVectors(o[r-1],o[r]),h.length()>Number.EPSILON&&(h.normalize(),i=Math.acos(s.clamp(o[r-1].dot(o[r]),-1,1)),c[r].applyMatrix4(u.makeRotationAxis(h,i))),l[r].crossVectors(o[r],c[r]);if(!0===e)for(i=Math.acos(s.clamp(c[0].dot(c[t]),-1,1)),i/=t,o[0].dot(h.crossVectors(c[0],c[t]))>0&&(i=-i),r=1;r<=t;r++)c[r].applyMatrix4(u.makeRotationAxis(o[r],i*r)),l[r].crossVectors(o[r],c[r]);return{tangents:o,normals:c,binormals:l}},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this},toJSON:function(){var t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t},fromJSON:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}),qo.prototype=Object.create(Wo.prototype),qo.prototype.constructor=qo,qo.prototype.isEllipseCurve=!0,qo.prototype.getPoint=function(t,e){for(var r=e||new l,n=2*Math.PI,i=this.aEndAngle-this.aStartAngle,a=Math.abs(i)n;)i-=n;i0?0:(Math.floor(Math.abs(h)/c)+1)*c:0===u&&h===c-1&&(h=c-2,u=1),this.closed||h>0?r=s[(h-1)%c]:(Jo.subVectors(s[0],s[1]).add(s[0]),r=Jo),n=s[h%c],i=s[(h+1)%c],this.closed||h+2n.length-2?n.length-1:a+1],u=n[a>n.length-3?n.length-1:a+2];return r.set(ts(o,s.x,c.x,h.x,u.x),ts(o,s.y,c.y,h.y,u.y)),r},ls.prototype.copy=function(t){Wo.prototype.copy.call(this,t),this.points=[];for(var e=0,r=t.points.length;e=e){var i=r[n]-e,a=this.curves[n],o=a.getLength(),s=0===o?0:1-i/o;return a.getPointAt(s)}n++}return null},getLength:function(){var t=this.getCurveLengths();return t[t.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var t=[],e=0,r=0,n=this.curves.length;r1&&!r[r.length-1].equals(r[0])&&r.push(r[0]),r},copy:function(t){Wo.prototype.copy.call(this,t),this.curves=[];for(var e=0,r=t.curves.length;e0){var l=c.getPoint(0);l.equals(this.currentPoint)||this.lineTo(l.x,l.y)}this.curves.push(c);var h=c.getPoint(1);this.currentPoint.copy(h)},copy:function(t){return us.prototype.copy.call(this,t),this.currentPoint.copy(t.currentPoint),this},toJSON:function(){var t=us.prototype.toJSON.call(this);return t.currentPoint=this.currentPoint.toArray(),t},fromJSON:function(t){return us.prototype.fromJSON.call(this,t),this.currentPoint.fromArray(t.currentPoint),this}}),ds.prototype=Object.assign(Object.create(ps.prototype),{constructor:ds,getPointsHoles:function(t){for(var e=[],r=0,n=this.holes.length;r0){var a=new Vo(new No(e));a.setCrossOrigin(this.crossOrigin);for(var o=0,s=t.length;o0?new bi(o,s):new Te(o,s),void 0!==t.drawMode&&n.setDrawMode(t.drawMode);break;case"LOD":n=new xi;break;case"Line":n=new Ci(i(t.geometry),a(t.material),t.mode);break;case"LineLoop":n=new Ii(i(t.geometry),a(t.material));break;case"LineSegments":n=new Ni(i(t.geometry),a(t.material));break;case"PointCloud":case"Points":n=new Hi(i(t.geometry),a(t.material));break;case"Sprite":n=new mi(a(t.material));break;case"Group":n=new jn;break;default:n=new Y}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children)for(var c=t.children,l=0;lNumber.EPSILON){if(l<0&&(o=e[a],c=-c,s=e[i],l=-l),t.ys.y)continue;if(t.y===o.y){if(t.x===o.x)return!0}else{var h=l*(t.x-o.x)-c*(t.y-o.y);if(0===h)return!0;if(h<0)continue;n=!n}}else{if(t.y!==o.y)continue;if(s.x<=t.x&&t.x<=o.x||o.x<=t.x&&t.x<=s.x)return!0}}return n}var i=Na.isClockWise,a=this.subPaths;if(0===a.length)return[];if(!0===e)return r(a);var o,s,c,l=[];if(1===a.length)return s=a[0],(c=new ds).curves=s.curves,l.push(c),l;var h=!i(a[0].getPoints());h=t?!h:h;var u,p,d=[],f=[],m=[],g=0;f[g]=void 0,m[g]=[];for(var v=0,y=a.length;v1){for(var x=!1,b=[],w=0,_=f.length;w<_;w++)d[w]=[];for(w=0,_=f.length;w<_;w++)for(var M=m[w],S=0;S0&&(x||(m=d))}v=0;for(var L=f.length;v0){this.source.connect(this.filters[0]);for(var t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(var t=1,e=this.filters.length;t=.5)for(var a=0;a!==i;++a)t[e+a]=t[r+a]},_slerp:function(t,e,r,n){h.slerpFlat(t,e,t,e,t,r,n)},_lerp:function(t,e,r,n,i){for(var a=1-n,o=0;o!==i;++o){var s=e+o;t[s]=t[s]*a+t[r+o]*n}}});var uc=new RegExp("[\\[\\]\\.:\\/]","g"),pc="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",dc=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),fc=/(WCOD+)?/.source.replace("WCOD",pc),mc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),gc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),vc=new RegExp("^"+dc+fc+mc+gc+"$"),yc=["material","materials","bones"];function xc(t,e,r){var n=r||bc.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,n)}function bc(t,e,r){this.path=e,this.parsedPath=r||bc.parseTrackName(e),this.node=bc.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t}function wc(){this.uuid=s.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var t={};this._indicesByUUID=t;for(var e=0,r=arguments.length;e!==r;++e)t[arguments[e].uuid]=e;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var n=this;this.stats={objects:{get total(){return n._objects.length},get inUse(){return this.total-n.nCachedObjects_}},get bindingsPerObject(){return n._bindings.length}}}function _c(t,e,r){this._mixer=t,this._clip=e,this._localRoot=r||null;for(var n=e.tracks,i=n.length,a=new Array(i),o={endingStart:2400,endingEnd:2400},s=0;s!==i;++s){var c=n[s].createInterpolant(null);a[s]=c,c.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(i),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}function Mc(t){this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}function Sc(t){"string"==typeof t&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),t=arguments[1]),this.value=t}function Tc(t,e,r){ti.call(this,t,e),this.meshPerAttribute=r||1}function Ec(t,e,r,n){this.ray=new xt(t,e),this.near=r||0,this.far=n||1/0,this.camera=null,this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}function Ac(t,e){return t.distance-e.distance}function Lc(t,e,r,n){if(!1!==t.visible&&(t.raycast(e,r),!0===n))for(var i=t.children,a=0,o=i.length;a=e){var h=e++,u=t[h];r[u.uuid]=l,t[l]=u,r[c]=h,t[h]=s;for(var p=0,d=i;p!==d;++p){var f=n[p],m=f[h],g=f[l];f[l]=m,f[h]=g}}}this.nCachedObjects_=e},uncache:function(){for(var t=this._objects,e=t.length,r=this.nCachedObjects_,n=this._indicesByUUID,i=this._bindings,a=i.length,o=0,s=arguments.length;o!==s;++o){var c=arguments[o],l=c.uuid,h=n[l];if(void 0!==h)if(delete n[l],h0)for(var c=this._interpolants,l=this._propertyBindings,h=0,u=c.length;h!==u;++h)c[h].evaluate(o),l[h].accumulate(n,s)}else this._updateWeight(t)},_updateWeight:function(t){var e=0;if(this.enabled){e=this.weight;var r=this._weightInterpolant;if(null!==r){var n=r.evaluate(t)[0];e*=n,t>r.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e},_updateTimeScale:function(t){var e=0;if(!this.paused){e=this.timeScale;var r=this._timeScaleInterpolant;null!==r&&(e*=r.evaluate(t)[0],t>r.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e))}return this._effectiveTimeScale=e,e},_updateTime:function(t){var e=this.time+t,r=this._clip.duration,n=this.loop,i=this._loopCount,a=2202===n;if(0===t)return-1===i?e:a&&1==(1&i)?r-e:e;if(2200===n){-1===i&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(e>=r)e=r;else{if(!(e<0)){this.time=e;break t}e=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=e,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===i&&(t>=0?(i=0,this._setEndings(!0,0===this.repetitions,a)):this._setEndings(0===this.repetitions,!0,a)),e>=r||e<0){var o=Math.floor(e/r);e-=r*o,i+=Math.abs(o);var s=this.repetitions-i;if(s<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,e=t>0?r:0,this.time=e,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===s){var c=t<0;this._setEndings(c,!c,a)}else this._setEndings(!1,!1,a);this._loopCount=i,this.time=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=e;if(a&&1==(1&i))return r-e}return e},_setEndings:function(t,e,r){var n=this._interpolantSettings;r?(n.endingStart=2401,n.endingEnd=2401):(n.endingStart=t?this.zeroSlopeAtStart?2401:2400:2402,n.endingEnd=e?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(t,e,r){var n=this._mixer,i=n.time,a=this._weightInterpolant;null===a&&(a=n._lendControlInterpolant(),this._weightInterpolant=a);var o=a.parameterPositions,s=a.sampleValues;return o[0]=i,s[0]=e,o[1]=i+t,s[1]=r,this}}),Mc.prototype=Object.assign(Object.create(e.prototype),{constructor:Mc,_bindAction:function(t,e){var r=t._localRoot||this._root,n=t._clip.tracks,i=n.length,a=t._propertyBindings,o=t._interpolants,s=r.uuid,c=this._bindingsByRootAndName,l=c[s];void 0===l&&(l={},c[s]=l);for(var h=0;h!==i;++h){var u=n[h],p=u.name,d=l[p];if(void 0!==d)a[h]=d;else{if(void 0!==(d=a[h])){null===d._cacheIndex&&(++d.referenceCount,this._addInactiveBinding(d,s,p));continue}var f=e&&e._propertyBindings[h].binding.parsedPath;++(d=new hc(bc.create(r,p,f),u.ValueTypeName,u.getValueSize())).referenceCount,this._addInactiveBinding(d,s,p),a[h]=d}o[h].resultBuffer=d.buffer}},_activateAction:function(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){var e=(t._localRoot||this._root).uuid,r=t._clip.uuid,n=this._actionsByClip[r];this._bindAction(t,n&&n.knownActions[0]),this._addInactiveAction(t,r,e)}for(var i=t._propertyBindings,a=0,o=i.length;a!==o;++a){var s=i[a];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(t)}},_deactivateAction:function(t){if(this._isActiveAction(t)){for(var e=t._propertyBindings,r=0,n=e.length;r!==n;++r){var i=e[r];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}},_isActiveAction:function(t){var e=t._cacheIndex;return null!==e&&ethis.max.x||t.ythis.max.y)},containsBox:function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y},getParameter:function(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new l),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)},clampPoint:function(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new l),e.copy(t).clamp(this.min,this.max)},distanceToPoint:function(t){return Cc.copy(t).clamp(this.min,this.max).sub(t).length()},intersect:function(t){return this.min.max(t.min),this.max.min(t.max),this},union:function(t){return this.min.min(t.min),this.max.max(t.max),this},translate:function(t){return this.min.add(t),this.max.add(t),this},equals:function(t){return t.min.equals(this.min)&&t.max.equals(this.max)}});var Dc=new d,Nc=new d;function Ic(t,e){this.start=void 0!==t?t:new d,this.end=void 0!==e?e:new d}function zc(t){Y.call(this),this.material=t,this.render=function(){}}Object.assign(Ic.prototype,{set:function(t,e){return this.start.copy(t),this.end.copy(e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.start.copy(t.start),this.end.copy(t.end),this},getCenter:function(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new d),t.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new d),t.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new d),this.delta(e).multiplyScalar(t).add(this.start)},closestPointToPointParameter:function(t,e){Dc.subVectors(t,this.start),Nc.subVectors(this.end,this.start);var r=Nc.dot(Nc),n=Nc.dot(Dc)/r;return e&&(n=s.clamp(n,0,1)),n},closestPointToPoint:function(t,e,r){var n=this.closestPointToPointParameter(t,e);return void 0===r&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),r=new d),this.delta(r).multiplyScalar(n).add(this.start)},applyMatrix4:function(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this},equals:function(t){return t.start.equals(this.start)&&t.end.equals(this.end)}}),zc.prototype=Object.create(Y.prototype),zc.prototype.constructor=zc,zc.prototype.isImmediateRenderObject=!0;var Bc=new d,Fc=new d,Gc=new m,Uc=["a","b","c"];function Hc(t,e,r,n){this.object=t,this.size=void 0!==e?e:1;var i=void 0!==r?r:16711680,a=void 0!==n?n:1,o=0,s=this.object.geometry;s&&s.isGeometry?o=3*s.faces.length:s&&s.isBufferGeometry&&(o=s.attributes.normal.count);var c=new se,l=new Zt(2*o*3,3);c.addAttribute("position",l),Ni.call(this,c,new Ti({color:i,linewidth:a})),this.matrixAutoUpdate=!1,this.update()}Hc.prototype=Object.create(Ni.prototype),Hc.prototype.constructor=Hc,Hc.prototype.update=function(){this.object.updateMatrixWorld(!0),Gc.getNormalMatrix(this.object.matrixWorld);var t=this.object.matrixWorld,e=this.geometry.attributes.position,r=this.object.geometry;if(r&&r.isGeometry)for(var n=r.vertices,i=r.faces,a=0,o=0,s=i.length;o1&&t.multiplyScalar(1/e),this.children[0].material.color.copy(this.material.color)}},Jc.prototype.dispose=function(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()};var Zc=new d,Qc=new Nt,Kc=new Nt;function $c(t,e,r){Y.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=r;var n=new ea(e);n.rotateY(.5*Math.PI),this.material=new Ht({wireframe:!0,fog:!1}),void 0===this.color&&(this.material.vertexColors=2);var i=n.getAttribute("position"),a=new Float32Array(3*i.count);n.addAttribute("color",new Vt(a,3)),this.add(new Te(n,this.material)),this.update()}function tl(t,e){this.lightProbe=t,this.size=e;var r={GAMMA_OUTPUT:""},n=new Fe({defines:r,uniforms:{sh:{value:this.lightProbe.sh.coefficients},intensity:{value:this.lightProbe.intensity}},vertexShader:["varying vec3 vNormal;","void main() {","\tvNormal = normalize( normalMatrix * normal );","\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );","}"].join("\n"),fragmentShader:["#define RECIPROCAL_PI 0.318309886","vec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {","\t// matrix is assumed to be orthogonal","\treturn normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );","}","vec3 linearToOutput( in vec3 a ) {","\t#ifdef GAMMA_OUTPUT","\t\treturn pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );","\t#else","\t\treturn a;","\t#endif","}","// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf","vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {","\t// normal is assumed to have unit length","\tfloat x = normal.x, y = normal.y, z = normal.z;","\t// band 0","\tvec3 result = shCoefficients[ 0 ] * 0.886227;","\t// band 1","\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;","\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;","\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;","\t// band 2","\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;","\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;","\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );","\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;","\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );","\treturn result;","}","uniform vec3 sh[ 9 ]; // sh coefficients","uniform float intensity; // light probe intensity","varying vec3 vNormal;","void main() {","\tvec3 normal = normalize( vNormal );","\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );","\tvec3 irradiance = shGetIrradianceAt( worldNormal, sh );","\tvec3 outgoingLight = RECIPROCAL_PI * irradiance * intensity;","\toutgoingLight = linearToOutput( outgoingLight );","\tgl_FragColor = vec4( outgoingLight, 1.0 );","}"].join("\n")}),i=new ka(1,32,16);Te.call(this,i,n),this.onBeforeRender()}function el(t,e,r,n){t=t||10,e=e||10,r=new Nt(void 0!==r?r:4473924),n=new Nt(void 0!==n?n:8947848);for(var i=e/2,a=t/e,o=t/2,s=[],c=[],l=0,h=0,u=-o;l<=e;l++,u+=a){s.push(-o,0,u,o,0,u),s.push(u,0,-o,u,0,o);var p=l===i?r:n;p.toArray(c,h),h+=3,p.toArray(c,h),h+=3,p.toArray(c,h),h+=3,p.toArray(c,h),h+=3}var d=new se;d.addAttribute("position",new Zt(s,3)),d.addAttribute("color",new Zt(c,3));var f=new Ti({vertexColors:2});Ni.call(this,d,f)}function rl(t,e,r,n,i,a){t=t||10,e=e||16,r=r||8,n=n||64,i=new Nt(void 0!==i?i:4473924),a=new Nt(void 0!==a?a:8947848);var o,s,c,l,h,u,p,d=[],f=[];for(l=0;l<=e;l++)c=l/e*(2*Math.PI),o=Math.sin(c)*t,s=Math.cos(c)*t,d.push(0,0,0),d.push(o,0,s),p=1&l?i:a,f.push(p.r,p.g,p.b),f.push(p.r,p.g,p.b);for(l=0;l<=r;l++)for(p=1&l?i:a,u=t-t/r*l,h=0;h.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{_l.set(t.z,0,-t.x).normalize();var e=Math.acos(t.y);this.quaternion.setFromAxisAngle(_l,e)}},Ml.prototype.setLength=function(t,e,r){void 0===e&&(e=.2*t),void 0===r&&(r=.2*e),this.line.scale.set(1,Math.max(0,t-e),1),this.line.updateMatrix(),this.cone.scale.set(r,e,r),this.cone.position.y=t,this.cone.updateMatrix()},Ml.prototype.setColor=function(t){this.line.material.color.set(t),this.cone.material.color.set(t)},Ml.prototype.copy=function(t){return Y.prototype.copy.call(this,t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this},Ml.prototype.clone=function(){return(new this.constructor).copy(this)},Sl.prototype=Object.create(Ni.prototype),Sl.prototype.constructor=Sl,Wo.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(Wo.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},Object.assign(us.prototype,{createPointsGeometry:function(t){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getPoints(t);return this.createGeometry(e)},createSpacedPointsGeometry:function(t){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getSpacedPoints(t);return this.createGeometry(e)},createGeometry:function(t){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var e=new Oe,r=0,n=t.length;rlR&DH_~pcS}Xe*`bYkO zpQAHLDwXO{QJI0so1M&LH!mUCVT|#5FLW3yF~$TaVy*zqCxZQ`6Oyx@DL}5rxM{}f zEQnPw5lfEW$pEh1G>cfmLe^&E>xWxn3v}gGi~jtv$e`c7vMc=@T*Xm0tyW)nZYn=L zGb=<<6z7X4-i7LWsh{?`b-#0jPkVlP5m*J5VS zq%&@d4{qPgZH2=1+hKgE!x?uCQcDaF10NZ{+7G0J_y6wK^}i0Hh8Q3Q{wD)G-|!lB zn47&@CuWIvtpsg>qF`KR@I3_#eHBA2Ud2nGTEH*S0CX*82EhYDKLVNtYKVa!W#A2@ CWL$p$ literal 0 HcmV?d00001 diff --git a/pages/agreement/index.js b/pages/agreement/index.js new file mode 100644 index 0000000..bba8a1b --- /dev/null +++ b/pages/agreement/index.js @@ -0,0 +1,84 @@ +import { post } from "../../app"; +// pages/agreement/index.js +Page({ + /** + * 页面的初始数据 + */ + data: { + stage: "first", + q: "", + e: "", + s: "", + }, + toStage2() { + this.setData({ stage: "second" }); + }, + async agree() { + wx.showLoading(); + const app = getApp(); + const openid = app.globalData.openid; + try { + await post("/api/Privacy/Agreement", { openid }); + app.globalData.agreed = true; + const { q, e, s } = this.data; + wx.redirectTo({ + url: `/pages/h5map/index?q=${q}&e=${e}&s=${s}&fe=true`, + }); + } catch (error) { + console.warn(error); + } finally { + wx.hideLoading(); + } + }, + exit() { + wx.exitMiniProgram(); + }, + toPrivacy() { + wx.navigateTo({ + url: "/pages/privacy/index", + }); + }, + /** + * 生命周期函数--监听页面加载 + */ + onLoad({ q, e, s }) { + q && this.setData({ q }); + e && this.setData({ e }); + s && this.setData({ s }); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () {}, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () {}, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () {}, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () {}, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () {}, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () {}, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () {}, +}); diff --git a/pages/agreement/index.json b/pages/agreement/index.json new file mode 100644 index 0000000..fb852be --- /dev/null +++ b/pages/agreement/index.json @@ -0,0 +1,6 @@ +{ + "usingComponents": {}, + "navigationStyle": "default", + "navigationBarTitleText": "无锡荟聚实景导航", + "navigationBarBackgroundColor": "#FFFFFF" +} diff --git a/pages/agreement/index.wxml b/pages/agreement/index.wxml new file mode 100644 index 0000000..8d080e5 --- /dev/null +++ b/pages/agreement/index.wxml @@ -0,0 +1,21 @@ + + + 无锡荟聚 + + 荟聚隐私政策提示 + 欢迎您使用无锡荟聚实景导航小程序,为更好地保护您的个人信息安全,请您仔细阅读并理解《隐私政策》 + 我们将严格按照您同意的《隐私政策》中的各项条款使用和保护您的个人信息。 + 为继续使用我们的产品或服务,请您阅读并同意《隐私政策》内容。 + + + 不同意 + 同意 + + + 不同意并退出 + 同意并继续 + + \ No newline at end of file diff --git a/pages/agreement/index.wxss b/pages/agreement/index.wxss new file mode 100644 index 0000000..6d81ffa --- /dev/null +++ b/pages/agreement/index.wxss @@ -0,0 +1,91 @@ +.ag { + display: inline-flex; + flex-direction: column; + width: 100vw; + height: 100vh; + align-items: center; +} +.logo { + width: 86px; + height: 86px; + margin-top: 40px; +} +.name { + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + height: 23px; + display: flex; + align-items: center; + text-align: center; + + /* Font color/深灰 */ + + color: #6a6665; + margin-top: 8px; +} +.desc { + margin-top: 70px; + width: calc(100vw - 102px); + height: 198px; + text-align: left; +} +.title { + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 21px; + color: #474747; +} +.p { + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: normal; + font-size: 14px; + line-height: 21px; + color: #474747; + margin-top: 16px; + text-indent: 2em; +} +.og { + color: #ef9617; +} +.btns { + width: calc(100vw - 70px); + display: flex; + justify-content: space-between; +} +.btn1 { + width: 140px; + height: 50px; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 16px; + line-height: 50px; + text-align: center; + color: #767571; + border: 1px solid #b3aea7; + box-sizing: border-box; + border-radius: 100px; +} + +.btn2 { + width: 140px; + height: 50px; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 16px; + line-height: 50px; + text-align: center; + color: #474747; + border: 1px solid #ffdb00; + box-sizing: border-box; + background: #ffdb00; + box-shadow: 0px 4px 20px rgba(215, 148, 87, 0.33); + border-radius: 30px; +} diff --git a/pages/agreement/logo.png b/pages/agreement/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..98c475b8eb8580239ab38b3683a9db8e2fbce783 GIT binary patch literal 2911 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 + + {{shop.name}} + {{shop.floorName}} + {{shop.shopFormat}} + \ No newline at end of file diff --git a/pages/destination/destination.wxss b/pages/destination/destination.wxss new file mode 100644 index 0000000..1e881bb --- /dev/null +++ b/pages/destination/destination.wxss @@ -0,0 +1,58 @@ +.destination { + position: fixed; + height: 120px; + left: 8px; + right: 8px; + bottom: 82px; + background: linear-gradient(180deg, #ffffff 0%, #ffffff 100.83%); + z-index: 12 !important; + border-radius: 16px 16px 0 0; +} +.destination > image { + position: absolute; + top: 28px; + left: 20px; + width: 56px; + height: 56px; + border: 2px solid #e2e1df; + border-radius: 50%; +} +.destination > .name { + position: absolute; + top: 28px; + left: 92px; + font-style: normal; + font-weight: 900; + font-size: 24px; + line-height: 34px; + height: 34px; + letter-spacing: 1px; + color: #767571; +} +.destination > .name.noicon { + left: 20px; +} +.destination > .meta { + display: inline-flex; + position: absolute; + top: 64px; + left: 92px; + right: 10px; + font-style: normal; + font-weight: normal; + font-size: 14px; + line-height: 20px; + height: 20px; + color: #6a6665; +} +.destination > .meta.noicon { + left: 20px; +} +.destination > .meta > .sep { + display: inline-block; + width: 1px; + height: 8px; + background: #c4c4c4; + opacity: 0.5; + margin: auto 8px; +} diff --git a/pages/gesture/gesture.js b/pages/gesture/gesture.js new file mode 100644 index 0000000..29e6960 --- /dev/null +++ b/pages/gesture/gesture.js @@ -0,0 +1,17 @@ +Component({ + options: { + addGlobalClass: true, + multipleSlots: true, + }, + properties: { + propagation: { + type: Boolean, + value: true, + }, + requireFailure: { + type: Boolean, + value: true, + }, + }, + methods: {} +}) diff --git a/pages/gesture/gesture.json b/pages/gesture/gesture.json new file mode 100644 index 0000000..a2006db --- /dev/null +++ b/pages/gesture/gesture.json @@ -0,0 +1,5 @@ + +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/gesture/gesture.wxml b/pages/gesture/gesture.wxml new file mode 100644 index 0000000..eb35c79 --- /dev/null +++ b/pages/gesture/gesture.wxml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/pages/gesture/gesture.wxs b/pages/gesture/gesture.wxs new file mode 100644 index 0000000..8598899 --- /dev/null +++ b/pages/gesture/gesture.wxs @@ -0,0 +1,263 @@ + +/* eslint-disable */ +// @ts-ignore +function getLen(v) { + return Math.sqrt(v.x * v.x + v.y * v.y) +} +function dot(v1, v2) { + return v1.x * v2.x + v1.y * v2.y +} +function getAngle(v1, v2) { + var mr = getLen(v1) * getLen(v2) + if (mr === 0) return 0 + var r = dot(v1, v2) / mr + if (r > 1) r = 1 + return Math.acos(r) +} +function cross(v1, v2) { + return v1.x * v2.y - v2.x * v1.y +} +function getRotateAngle(v1, v2) { + var angle = getAngle(v1, v2) + if (cross(v1, v2) > 0) { + angle *= -1 + } + return angle * 180 / Math.PI +} +function _swipeDirection(x1, x2, y1, y2) { + if (Math.abs(x1 - x2) >= Math.abs(y1 - y2)) { + return x1 - x2 > 0 ? 'Left' : 'Right' + } else { + return y1 - y2 > 0 ? 'Up' : 'Down' + } +} +// 实现setTimeout功能 +var setTimeout = function(callback, interval, instance) { + var now = Date.now + var stime = now() + var loop = function() { + if (now() - stime >= interval) { + callback() + } else { + instance.requestAnimationFrame(loop) + } + } + instance.requestAnimationFrame(loop) +} +var start = function(event, ownerInstance) { + var instance = event.instance; + var State = instance.getState() + if(!State._init) { + State.preV = {x: null, y: null} + State.pinchStartLen = null + State.zoom = 1 + State.isDoubleTap = false + State.delta = null + State.last = null + State.now = null + State.x1 = State.x2 = State.y1 = State.y2 = null + State.preTapPosition = {x: null, y: null} + // 控制定时器 + State._cancelLongTap = function() { + State.longTapTimeout = false + } + State._cancelSingleTap = function() { + State.singleTapTimeout = false + } + State._tapTimeout = function() { + State.tapTimeout = false + } + State._swipeTimeout = function() { + State.swipeTimeout = false + } + State._init = true // 表示已经初始化完成 + } + State.tapTimeout = true + State.singleTapTimeout = true + State.longTapTimeout = true + State.swipeTimeout = true + State.now = Date.now() + State.x1 = event.touches[0].pageX + State.y1 = event.touches[0].pageY + State.delta = State.now - (State.last || State.now) + // 触发 touchStart 事件 + ownerInstance.triggerEvent('touchStart', event) + if (State.preTapPosition.x !== null) { + State.isDoubleTap = (State.delta > 0 && + State.delta <= 250 && + Math.abs(State.preTapPosition.x - State.x1) < 30 && + Math.abs(State.preTapPosition.y - State.y1) < 30) + if (State.isDoubleTap) { + State._cancelSingleTap() + } + } + State.preTapPosition.x = State.x1 + State.preTapPosition.y = State.y1 + State.last = State.now + var preV = State.preV + var len = event.touches.length + if (len > 1) { + State._cancelLongTap() + State._cancelSingleTap() + var v = {x: event.touches[1].pageX - State.x1, y: event.touches[1].pageY - State.y1} + preV.x = v.x + preV.y = v.y + State.pinchStartLen = getLen(preV) + // 触发 multipointStart 多指点按 事件 + ownerInstance.triggerEvent('multipointStart', event) + } + State._preventTap = false + setTimeout(function () { + // 触发 longTap(长按) 事件 + if(State.longTapTimeout) { + ownerInstance.triggerEvent('longTap', event) + State._preventTap = true + State.longTapTimeout = true + } + }, 750, instance) + + if (!instance.getDataset()['propagation']) return false +} +var move = function(event, ownerInstance) { + var instance = event.instance; + var State = instance.getState() + var preV = State.preV + var len = event.touches.length + var currentX = event.touches[0].pageX + var currentY = event.touches[0].pageY + State.isDoubleTap = false + if (len > 1) { + var sCurrentX = event.touches[1].pageX + var sCurrentY = event.touches[1].pageY + var v = {x: event.touches[1].pageX - currentX, y: event.touches[1].pageY - currentY} + if (preV.x !== null) { + if (State.pinchStartLen > 0) { + event.zoom = getLen(v) / State.pinchStartLen + // 触发 pinch 事件 + ownerInstance.triggerEvent('pinch', event) + } + event.angle = getRotateAngle(v, preV) + // 触发 rotate 事件 + ownerInstance.triggerEvent('rotate', event) + } + preV.x = v.x + preV.y = v.y + if (State.x2 !== null && State.sx2 !== null) { + event.deltaX = (currentX - State.x2 + sCurrentX - State.sx2) / 2 + event.deltaY = (currentY - State.y2 + sCurrentY - State.sy2) / 2 + } else { + event.deltaX = 0 + event.deltaY = 0 + } + // 触发 twoFingerPressMove 事件 + ownerInstance.triggerEvent('twoFingerPressMove', event) + State.sx2 = sCurrentX + State.sy2 = sCurrentY + } else { + if (State.x2 !== null) { + event.deltaX = currentX - State.x2 + event.deltaY = currentY - State.y2 + // move事件中添加对当前触摸点到初始触摸点的判断, + // 如果曾经大于过某个距离(比如10),就认为是移动到某个地方又移回来,应该不再触发tap事件才对。 + var movedX = Math.abs(State.x1 - State.x2) + var movedY = Math.abs(State.y1 - State.y2) + if (movedX > 10 || movedY > 10) { + State._preventTap = true + } + } else { + event.deltaX = 0 + event.deltaY = 0 + } + // 触发 pressMove 单指点按移动 事件 + ownerInstance.triggerEvent('pressMove', event) + } + // 触发 touchMove 移动事件 + ownerInstance.triggerEvent('touchMove', event) + State._cancelLongTap() + State.x2 = currentX + State.y2 = currentY + // if (len > 1) { + // // event.preventDefault() + // } + if (!instance.getDataset()['propagation']) return false +} +var end = function(event, ownerInstance) { + var instance = event.instance; + var State = instance.getState() + State._cancelLongTap() + if (event.touches.length < 2) { + // 触发 multipointEnd 多指点按结束 事件 + ownerInstance.triggerEvent('multipointEnd', event) + State.sx2 = State.sy2 = null + } + // swipe + if ((State.x2 && Math.abs(State.x1 - State.x2) > 30) || + (State.y2 && Math.abs(State.y1 - State.y2) > 30)) { + event.direction = _swipeDirection(State.x1, State.x2, State.y1, State.y2) + setTimeout(function () { + if(State.swipeTimeout) { + // 触发 swipe 滑动 上下左右 事件 + ownerInstance.triggerEvent('swipe', event) + State.swipeTimeout = true + } + }, 0, instance) + } else { + setTimeout(function () { + if(State.tapTimeout) { + if (!State._preventTap) { + // 触发 tap 事件 + ownerInstance.triggerEvent('tap', event) + } + // trigger double tap immediately + if (State.isDoubleTap) { + // 触发 doubleTap 事件 + ownerInstance.triggerEvent('doubleTap', event) + State.isDoubleTap = false + } + State.tapTimeout = true + } + }, 0, instance) + if (!State.isDoubleTap) { + if (instance.getDataset()['requirefailure']) { // requireFailure + setTimeout(function () { + if(State.singleTapTimeout) { + // 触发 singleTap 事件 + ownerInstance.triggerEvent('singleTap', event) + State.singleTapTimeout = true + } + }, 250, instance) + } else { + ownerInstance.triggerEvent('singleTap', event) + State.singleTapTimeout = true + } + } + } + // 触发 touchEnd 事件 + ownerInstance.triggerEvent('touchEnd', event) + State.preV.x = 0 + State.preV.y = 0 + State.zoom = 1 + State.pinchStartLen = null + State.x1 = State.x2 = null + State.y1 = State.y2 = null + + if (!instance.getDataset()['propagation']) return false +} +var cancel = function(event, ownerInstance) { + var instance = event.instance; + var State = instance.getState() + State._cancelLongTap() + State._cancelSingleTap() + State._tapTimeout() + State._swipeTimeout() + // 触发 touchCancel 事件 + ownerInstance.triggerEvent('touchCancel', event) + + if (!instance.getDataset()['propagation']) return false +} +module.exports = { + start: start, + move: move, + end: end, + cancel: cancel +} diff --git a/pages/h5map/index.js b/pages/h5map/index.js new file mode 100644 index 0000000..adbe94b --- /dev/null +++ b/pages/h5map/index.js @@ -0,0 +1,147 @@ +import { post } from "../../app"; +const baseUrl = "https://huiju.mapais.com/livatbeijing/"; +Page({ + /** + * 页面的初始数据 + */ + data: { + url: "", + }, + + /** + * 生命周期函数--监听页面加载 + */ + async onLoad({ q = "", e = "", s = "", fe, plate = "" }) { + let range = "unauth"; + try { + const { latitude, longitude } = await wx.getLocation(); + if ( + latitude < 39.7411 || + latitude > 39.83099 || + longitude < 116.2608 || + longitude > 116.37891 + ) + range = "out"; + else range = "in"; + } catch (error) { + console.log(error); + } + if (q) { + q = decodeURIComponent(q); + const kvs = q + .split("?") + .pop() + .split("&") + .map((kv) => kv.split("=")); + s = kvs.find(([k]) => k === "s")[1]; + e = kvs.find(([k]) => k === "e")[1]; + } + const app = getApp(); + if (!app.globalData.openid) { + const openid = await new Promise((resolve) => app.onOpenid(resolve)); + const agreed = await this.getAgreement(); + if (!agreed) + return wx.redirectTo({ + url: `/pages/agreement/index?q=${q}&e=${e}&s=${s}&plate=${plate}`, + }); + this.setData({ + url: `${baseUrl}?t=${new Date().getTime()}#/?openid=${openid}&range=${range}${ + e ? "&e=" + e : "" + }${e && s ? "&s=" + s : ""}${plate ? "&plate=" + plate : ""}${ + fe ? "&fe=true" : "" + }`, + }); + } else { + const openid = app.globalData.openid; + const agreed = await this.getAgreement(); + if (!agreed) + return wx.redirectTo({ + url: `/pages/agreement/index?q=${q}&e=${e}&s=${s}&plate=${plate}`, + }); + this.setData({ + url: `${baseUrl}?t=${new Date().getTime()}#/?openid=${openid}&range=${range}${ + e ? "&e=" + e : "" + }${e && s ? "&s=" + s : ""}${plate ? "&plate=" + plate : ""}${ + fe ? "&fe=true" : "" + }`, + }); + } + }, + async getAgreement() { + const app = getApp(); + if (app.globalData.agreed) return true; + const openid = app.globalData.openid; + + try { + const { data } = await post("/api/Privacy/Query", { openid }); + app.globalData.agreed = data; + } catch (error) { + console.warn(error); + } + return app.globalData.agreed; + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () {}, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () {}, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () {}, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () {}, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () {}, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () {}, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage({ webViewUrl: q }) { + let e; + let name; + if (q) { + q = decodeURIComponent(q); + const kvs = q + .split("?") + .pop() + .split("&") + .map((kv) => kv.split("=")); + console.log(kvs); + if (kvs.find(([k]) => k === "e")) { + e = kvs.find(([k]) => k === "e")[1]; + } + if (kvs.find(([k]) => k === "name")) { + name = kvs.find(([k]) => k === "name")[1]; + } + } + + return name + ? { + title: name, + path: `/pages/h5map/index?e=${e}`, + imageUrl: "/pages/h5map/share.png", + } + : { + title: "无锡荟聚实景导航", + path: "/pages/h5map/index", + imageUrl: "/pages/h5map/share.png", + }; + }, +}); diff --git a/pages/h5map/index.json b/pages/h5map/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/h5map/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/h5map/index.wxml b/pages/h5map/index.wxml new file mode 100644 index 0000000..fa399ce --- /dev/null +++ b/pages/h5map/index.wxml @@ -0,0 +1,2 @@ + + > \ No newline at end of file diff --git a/pages/h5map/index.wxss b/pages/h5map/index.wxss new file mode 100644 index 0000000..f63f996 --- /dev/null +++ b/pages/h5map/index.wxss @@ -0,0 +1 @@ +/* pages/h5map/index.wxss */ \ No newline at end of file diff --git a/pages/h5map/share.png b/pages/h5map/share.png new file mode 100644 index 0000000000000000000000000000000000000000..653df7929de9bfe6a88fcaf372a0bdac653ba660 GIT binary patch literal 223324 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⁡6sIO( zI_THW*rEN99oYBV-r#$Mvn8W}7Xpz{bER*+(}#J<7BiF+l+yx0eF{A01kiIFlRU4a z0di4x@HT@*xBzIr0C*X|%beqbIxOPjUV-uM3jK*EpPme4p)-)#-bBZYIzrK6!TXDNpKB%olB15nP=a}ybstX*1qVV{@|U{x)M4s zW8oQhx~rJuupFPigHN}Fa-pGee4!!v@^Y70<>?3hvR$}Pe>r&K{?x(#uI)Yb1-t#} z-?jBKZCm-eH(Te-dGW4tJG>}|vZ16lcN&xvvIt8|GH@2EU5ttsm$ml`wTJvJUs>m8 z);6pqxx`5Y)g27Ar(=k*c?bA_#P0>5V51VWY2u{<^RWDmN}dW*xt4JWN8&1f;sZ{z zav45)MV?3TOMZY1zZ8Jhyh3LjA{bZV_^NV_l_%Vg3x6o@SY*;VdF#dRE7Ct@3-Ogb zNW>eo>TF(m8`IwYW-aTgUFdJ@1|6#WJJuLqSDt5V)jn?>`+~LW&nSG=TI1(o(I+Tp zD?|dtxDx4Uk-+bCQRvE>SdH0=9}nUW9|SynGC0-n-ZQ+EykF}e+0nP?GwMfiRlo7J zj<#ivrc2Tdn70O#ueUo`;-jBb^jqZ^=b9s%nlr&yzUb}hBajh&|C@HOfawB4eTF&e zZVDZMoLk*R;%u6gmweB&PWh+qr6i#_-VkcdprF|2Zl2>k>5E?R{^~MrU2hZdHw~rd31n z9Jgj2G0VMls7b*h?S>{Pg_s8XK%D5Znxkk=mD88}lc|n@6-WBmn(BOX5Vy3c78YoO zFRF<*=qjDbjm`#jb{85QPPxmHMj4`vrMM{DEm_ePTcXXRsq!>&vY_DE@(GI+DRxCl zp<|O!wrEJ1Pg-p4YayZ5bm{ti_o{qk$L@g^9ZanL^*Hb(V-ED=PbENo6(K$Z-kafj zXt%FlvHoZNzY&95Tlp*|sH5MD9;L)ImMu-_Kqs&VKiev9-H zyl(oD=zMYmm9r2bM)hL)y5v6;0_xhwh0;grjWlGfz9--F)~el9{ADTYXKh7RcDwZ{ zYxl0I#d}&@+!WC$%jxUtZN(yxf{_c0S(gu36}VS;nn`JCXHYnS0WJ`ImpJ-al^BpH zcZD+3y}+ppcm)=LIzybZktDriFl$CL)6WK@HS5>D$9j_=v7N?u+hP9=!jUfUxqDaM zc$S=Pc)AfY4ZDWkE>+VodO2&fs9Uge%c3!M0~ITzyD4{zbFe`EB(P8 zHRPdB%)H{XDTU6qF9+iIkjWy2-cWht28|gVin7?2;dyO8bmyy#u+Ui)I4^V>#c>bb zx3a|=RpX;8{_ztjcB-H$RAq^p>fjxvDS9Yh9$#z3HhCNvOPNr2Emqt*4+ZYl5Xzm( zhNe;-C)QDcyp(2wLdR)wfLi68fC~*$;?{Q`z*Tu8P3)=Uy)C3P{bVPL7;woVpmu~% zPCS3Vcl(A7FMU#Vt6O*LysYRotwq$>JkP7eOp~idUMLbKXQiP;bmc=ZO!i(!PZxFC zl>UH>bD>6@@YXkW%(|~p`dL?fq10K(NESl|IlC9oz=06}&wiUhAWkGRB2|w{wo~O> z05nn&1BAgJ(7_x+CiS7@5D^N~FOKF(N8YlWj1NEK!F_Tm>6ZXg7UXeqL6h=MQt0$o zY6Eus0@YPG)Of^aKDoCzUf1~G048N6}klM z7N+8uYuN}KLYr;#{=N-vUAD>IGu9gIsId=ipiDJRlS`rVcodWNB8AR#h5quECKE43 z>Z%4uF%E~WvguXM8;^@I6~dM480SV#fx46ueIP!*f>p}Ba#~xQs@3Z%%kPOxaq>nq zK3c+SVzF?2i_+x+#Su03I&zAg_r|+Y_eBLA*f~KD%YxMa(4xh++i{}D_mfBLB*05> z8l9X@ue$hQH1Fi1&*44s<$UXh2K23PL4~39gWPan{k>fq?O#(F1M8@)5qz`25^?gg zrR#@NyzXq3s~pL_&a?I|P1T=zLf`X9X39u8+&b~c3l(TeMi(bPC?)@#7Hr?BHvT4& z`9|^eR=GDS?oDcP)fHY<9tRzLYZ$5V45>FRok;&I?G?j6;7SP~T9AsDc=|^S;%L>r z6b`pjs)p9&K@BPpefp2fYtDIcbp^_JfSnzRNl>a^y;&(NYPZ=1FUhpSAYr z1>wD*Tn9>%gLo+xob%^F(TxS0T2+o-4Km7`T2nS0AxGu~;W-ZhjI!W<4nQdtdWp3# z!z=I=hgmaL{nmYQ^9`gpB~JUbV5q?{9KAzJ!arfRChxM^@byyI>oS7&l_*@L*JXV1 zn6f&K@@Z~?v}p0}jvzx?^fKQOtmak+p-_~rzcebG-d>UY0 zp;L}4bhhzCPtC7F!kXc;tKMSjJiL>+F6HK1;V=Z6%Hi#4928O(DM;nVB1N&*I?}it zIE%#u3lFzMn9Z@w`KlPt#;aZpwx+$lLJ=*Vhg3l-SAJLKDw{a1NYRP(<(BgCSyC)? z|Bg6HR!ZBmvPG|A=$1lo9-?Ebvx?DFTvU&Wcs%8KD6iy)1>SitiE3fNDR&MYdHpqD zc;1}FkGHd;ylusUD+?3|_t4qur#uvS?C*ynS3ZBKkMfM%LZ^Ms*n0hAwl)4?g++>D zsw=t~Ki6^nAsaSdYm?TSWjVh_>gXG+-?}LIzd?MT5#p+3(N TQcKa%ak#xzGKg$ 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 Hu0mjfL2>AY literal 0 HcmV?d00001 diff --git a/pages/index/.DS_Store b/pages/index/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e1c3c60b39c22cad011accd427fc399212417066 GIT binary patch literal 6148 zcmeHKyG{c!5FCdHCD2?+>5>LSYMLWDiiid&5;aN!DCi(XgrK~Jf8ZDRK0W|u?Ip5v zff51Qjn?DG&TTxl&SwB__%Is)1%Mu1u+wL;!DL*#WgYF=Cc5y9Ic{)>TP#O)E804K zqXM#aeN3^yJ+6_g-(otc7ZZ-k)_A4wzXxMYw!@t9GhE^6bG_4e_q-OrvmP(`Ms>z{ z`tE_i)o%Pmy}cB0_Qlvn7;~VIKY5&I#LgNIpa&tR0}rE zOaW8C6!>Eb@XQwL?MAfH6fgx$ft3RCe(-d`Qn85`UL7pL6@b`fcQDrFgHbqMu~cj# za)jn0l^Cf`uNW@U+3z*3RBR$fI-FiUoMv`De$ipaNTNL4LKz}TU(Qpv)0ou>0%PsL|jo=2}dzw~O9|A!JD@=hORp0|w)L?D^ literal 0 HcmV?d00001 diff --git a/pages/index/VPASSDK-1.2.2.js b/pages/index/VPASSDK-1.2.2.js new file mode 100644 index 0000000..889acdc --- /dev/null +++ b/pages/index/VPASSDK-1.2.2.js @@ -0,0 +1 @@ +var VPASSDK=function(t){var e={};function i(o){if(e[o])return e[o].exports;var s=e[o]={i:o,l:!1,exports:{}};return t[o].call(s.exports,s,s.exports,i),s.l=!0,s.exports}return i.m=t,i.c=e,i.d=function(t,e,o){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)i.d(o,s,function(e){return t[e]}.bind(null,s));return o},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=39)}([function(t,e,i){var o=t.exports,s=i(17);o.LongBits=i(11),o.Long=i(32),o.pool=i(33),o.float=i(34),o.asPromise=i(35),o.EventEmitter=i(36),o.path=i(37),o.base64=i(18),o.utf8=i(8),o.compareFieldsById=function(t,e){return t.id-e.id},o.toArray=function(t){if(t){for(var e=Object.keys(t),i=new Array(e.length),o=0;o-1;--i)if(1===e[t[i]]&&void 0!==this[t[i]]&&null!==this[t[i]])return t[i]}},o.oneOfSetter=function(t){return function(e){for(var i=0;i=65536&&i<=1114111?(o.push(i>>18&7|240),o.push(i>>12&63|128),o.push(i>>6&63|128),o.push(63&i|128)):i>=2048&&i<=65535?(o.push(i>>12&15|224),o.push(i>>6&63|128),o.push(63&i|128)):i>=128&&i<=2047?(o.push(i>>6&31|192),o.push(63&i|128)):o.push(255&i);return o},o.byteToString=function(t){if("string"==typeof t)return t;for(var e="",i=t,o=0;o-1;--i)if(1===e[t[i]]&&void 0!==this[t[i]]&&null!==this[t[i]])return t[i]}}}(this._oneofsArray[i].oneof);o[s]={get:r.getter,set:r.setter}}i&&Object.defineProperties(t.prototype,o)}}}),v.generateConstructor=function(t){return function(e){for(var i,o=0;o=e)return!0;return!1},c.isReservedName=function(t,e){if(t)for(var i=0;i0;){var o=t.shift();if(i.nested&&i.nested[o]){if(!((i=i.nested[o])instanceof c))throw Error("path conflicts with non-namespace objects")}else i.add(i=new c(o))}return e&&i.addJSON(e),i},c.prototype.resolveAll=function(){for(var t=this.nestedArray,e=0;e-1)return o}else if(o instanceof c&&(o=o.lookup(t.slice(1),e,!0)))return o}else for(var s=0;s-1&&this.oneof.splice(e,1),t.partOf=null,this},r.prototype.onAdd=function(t){n.prototype.onAdd.call(this,t);for(var e=0;e191&&o<224?n[r++]=(31&o)<<6|63&t[e++]:o>239&&o<365?(o=((7&o)<<18|(63&t[e++])<<12|(63&t[e++])<<6|63&t[e++])-65536,n[r++]=55296+(o>>10),n[r++]=56320+(1023&o)):n[r++]=(15&o)<<12|(63&t[e++])<<6|63&t[e++],r>8191&&((s||(s=[])).push(String.fromCharCode.apply(String,n)),r=0);return s?(r&&s.push(String.fromCharCode.apply(String,n.slice(0,r))),s.join("")):String.fromCharCode.apply(String,n.slice(0,r))},o.write=function(t,e,i){for(var o,s,n=i,r=0;r>6|192,e[i++]=63&o|128):55296==(64512&o)&&56320==(64512&(s=t.charCodeAt(r+1)))?(o=65536+((1023&o)<<10)+(1023&s),++r,e[i++]=o>>18|240,e[i++]=o>>12&63|128,e[i++]=o>>6&63|128,e[i++]=63&o|128):(e[i++]=o>>12|224,e[i++]=o>>6&63|128,e[i++]=63&o|128);return i-n}},function(t,e,i){t.exports=d;var o=i(6);((d.prototype=Object.create(o.prototype)).constructor=d).className="Root";var s,n,r,a=i(2),l=i(1),h=i(7),c=i(0);function d(t){o.call(this,"",t),this.deferred=[],this.files=[],this.names=[]}function f(){}d.fromJSON=function(t,e){return t="string"==typeof t?JSON.parse(t):t,e||(e=new d),t.options&&e.setOptions(t.options),e.addJSON(t.nested)},d.prototype.resolvePath=c.path.resolve,d.prototype.parseFromPbString=function t(e,i,o){"function"==typeof i&&(o=i,i=void 0);var s=this;if(!o)return c.asPromise(t,s,e,i);var a=null;if("string"==typeof e)a=JSON.parse(e);else{if("object"!=typeof e)return void console.log("pb格式转化失败");a=e}function l(t,e){if(o){var i=o;o=null,i(t,e)}}function h(t,e){try{if(c.isString(e)&&"{"===e.charAt(0)&&(e=JSON.parse(e)),c.isString(e)){n.filename=t;var o,r=n(e,s,i),a=0;if(r.imports)for(;a-1||(s.names.push(t),t in r&&h(t,r[t]))}h(a.name,a.pbJsonStr)},d.prototype.load=function t(e,i,o){"function"==typeof i&&(o=i,i=void 0);var s=this;if(!o)return c.asPromise(t,s,e,i);var a=o===f;function l(t,e){if(o){var i=o;if(o=null,a)throw t;i(t,e)}}function h(t,e){try{if(c.isString(e)&&"{"===e.charAt(0)&&(e=JSON.parse(e)),c.isString(e)){n.filename=t;var o,r=n(e,s,i),h=0;if(r.imports)for(;h-1){var n=t.substring(i);n in r&&(t=n)}if(!(s.files.indexOf(t)>-1))if(s.files.push(t),t in r)a?h(t,r[t]):(++u,setTimeout((function(){--u,h(t,r[t])})));else if(a){var d;try{d=c.fs.readFileSync(t).toString("utf8")}catch(t){return void(e||l(t))}h(t,d)}else++u,c.fetch(t,(function(i,n){--u,o&&(i?e?u||l(null,s):l(i):h(t,n))}))}var u=0;c.isString(e)&&(e=[e]);for(var p,y=0;y-1&&this.deferred.splice(e,1)}}else if(t instanceof l)u.test(t.name)&&delete t.parent[t.name];else if(t instanceof o){for(var i=0;i>>0,this.hi=e>>>0}t.exports=i;var o=i.zero=new i(0,0);o.toNumber=function(){return 0},o.zzEncode=o.zzDecode=function(){return this},o.length=function(){return 1};var s=i.zeroHash="\0\0\0\0\0\0\0\0";i.fromNumber=function(t){if(0===t)return o;var e=t<0;e&&(t=-t);var s=t>>>0,n=(t-s)/4294967296>>>0;return e&&(n=~n>>>0,s=~s>>>0,++s>4294967295&&(s=0,++n>4294967295&&(n=0))),new i(s,n)},i.from=function(t){return"number"==typeof t?i.fromNumber(t):"string"==typeof t||t instanceof String?i.fromNumber(parseInt(t,10)):t.low||t.high?new i(t.low>>>0,t.high>>>0):o},i.prototype.toNumber=function(t){if(!t&&this.hi>>>31){var e=1+~this.lo>>>0,i=~this.hi>>>0;return e||(i=i+1>>>0),-(e+4294967296*i)}return this.lo+4294967296*this.hi},i.prototype.toLong=function(t){return{low:0|this.lo,high:0|this.hi,unsigned:Boolean(t)}};var n=String.prototype.charCodeAt;i.fromHash=function(t){return t===s?o:new i((n.call(t,0)|n.call(t,1)<<8|n.call(t,2)<<16|n.call(t,3)<<24)>>>0,(n.call(t,4)|n.call(t,5)<<8|n.call(t,6)<<16|n.call(t,7)<<24)>>>0)},i.prototype.toHash=function(){return String.fromCharCode(255&this.lo,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,255&this.hi,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},i.prototype.zzEncode=function(){var t=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^t)>>>0,this.lo=(this.lo<<1^t)>>>0,this},i.prototype.zzDecode=function(){var t=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^t)>>>0,this.hi=(this.hi>>>1^t)>>>0,this},i.prototype.length=function(){var t=this.lo,e=(this.lo>>>28|this.hi<<4)>>>0,i=this.hi>>>24;return 0===i?0===e?t<16384?t<128?1:2:t<2097152?3:4:e<16384?e<128?5:6:e<2097152?7:8:i<128?9:10}},function(t,e,i){t.exports=r;var o,s,n=i(2);function r(t,e,i,o,r,a){if(n.call(this,t,e,o,void 0,void 0,r,a),!s.isString(i))throw TypeError("keyType must be a string");this.keyType=i,this.resolvedKeyType=null,this.map=!0}((r.prototype=Object.create(n.prototype)).constructor=r).className="MapField",r.fromJSON=function(t,e){return new r(t,e.id,e.keyType,e.type,e.options,e.comment)},r.prototype.toJSON=function(t){var e=!!t&&Boolean(t.keepComments);return s.toObject(["keyType",this.keyType,"type",this.type,"id",this.id,"extend",this.extend,"options",this.options,"comment",e?this.comment:void 0])},r.prototype.resolve=function(){if(this.resolved)return this;if(void 0===o.mapKey[this.keyType])throw Error("invalid key type: "+this.keyType);return n.prototype.resolve.call(this)},r.d=function(t,e,i){return"function"==typeof i?i=s.decorateType(i).name:i&&"object"==typeof i&&(i=s.decorateEnum(i).name),function(o,n){s.decorateType(o.constructor).add(new r(n,t,e,i))}},r._configure=function(){o=i(5),s=i(0)}},function(t,e,i){"use strict";t.exports=n;var o,s=i(4);function n(t,e,i,n,r,a,l,h){if(o.isObject(r)?(l=r,r=a=void 0):o.isObject(a)&&(l=a,a=void 0),void 0!==e&&!o.isString(e))throw TypeError("type must be a string");if(!o.isString(i))throw TypeError("requestType must be a string");if(!o.isString(n))throw TypeError("responseType must be a string");s.call(this,t,l),this.type=e||"rpc",this.requestType=i,this.requestStream=!!r||void 0,this.responseType=n,this.responseStream=!!a||void 0,this.resolvedRequestType=null,this.resolvedResponseType=null,this.comment=h}((n.prototype=Object.create(s.prototype)).constructor=n).className="Method",n.fromJSON=function(t,e){return new n(t,e.type,e.requestType,e.responseType,e.requestStream,e.responseStream,e.options,e.comment)},n.prototype.toJSON=function(t){var e=!!t&&Boolean(t.keepComments);return o.toObject(["type","rpc"!==this.type&&this.type||void 0,"requestType",this.requestType,"requestStream",this.requestStream,"responseType",this.responseType,"responseStream",this.responseStream,"options",this.options,"comment",e?this.comment:void 0])},n.prototype.resolve=function(){return this.resolved?this:(this.resolvedRequestType=this.parent.lookupType(this.requestType),this.resolvedResponseType=this.parent.lookupType(this.responseType),s.prototype.resolve.call(this))},n._configure=function(){o=i(0)}},function(t,e,i){"use strict";var o;function s(t){if(t)for(var e=Object.keys(t),i=0;i>16)+(e>>16)+(i>>16)<<16|65535&i}function r(t,e,i,o,s,r){return n((a=n(n(e,t),n(o,r)))<<(l=s)|a>>>32-l,i);var a,l}function a(t,e,i,o,s,n,a){return r(e&i|~e&o,t,e,s,n,a)}function l(t,e,i,o,s,n,a){return r(e&o|i&~o,t,e,s,n,a)}function h(t,e,i,o,s,n,a){return r(e^i^o,t,e,s,n,a)}function c(t,e,i,o,s,n,a){return r(i^(e|~o),t,e,s,n,a)}function d(t,e){var i,o,s,r,d;t[e>>5]|=128<>>9<<4)]=e;var f=1732584193,u=-271733879,p=-1732584194,y=271733878;for(i=0;i>5]>>>e%32&255);return i}function u(t){var e,i=[];for(i[(t.length>>2)-1]=void 0,e=0;e>5]|=(255&t.charCodeAt(e/8))<>>4&15)+"0123456789abcdef".charAt(15&e);return o}function y(t){return unescape(encodeURIComponent(t))}function m(t){return function(t){return f(d(u(t),8*t.length))}(y(t))}function g(t,e){return function(t,e){var i,o,s=u(t),n=[],r=[];for(n[15]=r[15]=void 0,s.length>16&&(s=d(s,8*t.length)),i=0;i<16;i+=1)n[i]=909522486^s[i],r[i]=1549556828^s[i];return o=d(n.concat(u(e)),512+8*e.length),f(d(r.concat(o),640))}(y(t),y(e))}function v(t,e,i){return e?i?g(e,t):p(g(e,t)):i?m(t):p(m(t))}void 0===(o=function(){return v}.call(e,i,e,t))||(t.exports=o)}()},function(t,e,i){t.exports=h;var o,s=i(0),n=i(8);function r(t,e,i){this.fn=t,this.len=e,this.next=void 0,this.val=i}function a(){}function l(t){this.head=t.head,this.tail=t.tail,this.len=t.len,this.next=t.states}function h(){this.len=0,this.head=new r(a,0,0),this.tail=this.head,this.states=null}function c(t,e,i){e[i]=255&t}function d(t,e){this.len=t,this.next=void 0,this.val=e}function f(t,e,i){for(;t.hi;)e[i++]=127&t.lo|128,t.lo=(t.lo>>>7|t.hi<<25)>>>0,t.hi>>>=7;for(;t.lo>127;)e[i++]=127&t.lo|128,t.lo=t.lo>>>7;e[i++]=t.lo}function u(t,e,i){e[i]=255&t,e[i+1]=t>>>8&255,e[i+2]=t>>>16&255,e[i+3]=t>>>24}h.create=s.Buffer?function(){return(h.create=function(){return new(void 0)})()}:function(){return new h},h.alloc=function(t){return new s.Array(t)},s.Array!==Array&&(h.alloc=s.pool(h.alloc,s.Array.prototype.subarray)),h.prototype._push=function(t,e,i){return this.tail=this.tail.next=new r(t,e,i),this.len+=e,this},d.prototype=Object.create(r.prototype),d.prototype.fn=function(t,e,i){for(;t>127;)e[i++]=127&t|128,t>>>=7;e[i]=t},h.prototype.uint32=function(t){return this.len+=(this.tail=this.tail.next=new d((t>>>=0)<128?1:t<16384?2:t<2097152?3:t<268435456?4:5,t)).len,this},h.prototype.int32=function(t){return t<0?this._push(f,10,o.fromNumber(t)):this.uint32(t)},h.prototype.sint32=function(t){return this.uint32((t<<1^t>>31)>>>0)},h.prototype.uint64=function(t){var e=o.from(t);return this._push(f,e.length(),e)},h.prototype.int64=h.prototype.uint64,h.prototype.sint64=function(t){var e=o.from(t).zzEncode();return this._push(f,e.length(),e)},h.prototype.bool=function(t){return this._push(c,1,t?1:0)},h.prototype.fixed32=function(t){return this._push(u,4,t>>>0)},h.prototype.sfixed32=h.prototype.fixed32,h.prototype.fixed64=function(t){var e=o.from(t);return this._push(u,4,e.lo)._push(u,4,e.hi)},h.prototype.sfixed64=h.prototype.fixed64,h.prototype.float=function(t){return this._push(s.float.writeFloatLE,4,t)},h.prototype.double=function(t){return this._push(s.float.writeDoubleLE,8,t)};var p=s.Array.prototype.set?function(t,e,i){e.set(t,i)}:function(t,e,i){for(var o=0;o>>0;if(!e)return this._push(c,1,0);if(s.isString(t)){var i=h.alloc(e=n.length(t));n.write(t,i,0),t=i}return this.uint32(e)._push(p,e,t)},h.prototype.string=function(t){var e=n.length(t);return e?this.uint32(e)._push(n.write,e,t):this._push(c,1,0)},h.prototype.fork=function(){return this.states=new l(this),this.head=this.tail=new r(a,0,0),this.len=0,this},h.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new r(a,0,0),this.len=0),this},h.prototype.ldelim=function(){var t=this.head,e=this.tail,i=this.len;return this.reset().uint32(i),i&&(this.tail.next=t.next,this.tail=e,this.len+=i),this},h.prototype.finish=function(){for(var t=this.head.next,e=this.constructor.alloc(this.len),i=0;t;)t.fn(t.val,e,i),i+=t.len,t=t.next;return e},h._configure=function(){o=i(11),i(18),n=i(8)}},function(t,e){t.exports={}},function(t,e,i){"use strict";var o=t.exports;o.length=function(t){var e=t.length;if(!e)return 0;for(var i=0;--e%4>1&&"="===t.charAt(e);)++i;return Math.ceil(3*t.length)/4-i};for(var s=new Array(64),n=new Array(123),r=0;r<64;)n[s[r]=r<26?r+65:r<52?r+71:r<62?r-4:r-59|43]=r++;o.encode=function(t,e,i){for(var o,n=null,r=[],a=0,l=0;e>2],o=(3&h)<<4,l=1;break;case 1:r[a++]=s[o|h>>4],o=(15&h)<<2,l=2;break;case 2:r[a++]=s[o|h>>6],r[a++]=s[63&h],l=0}a>8191&&((n||(n=[])).push(String.fromCharCode.apply(String,r)),a=0)}return l&&(r[a++]=s[o],r[a++]=61,1===l&&(r[a++]=61)),n?(a&&n.push(String.fromCharCode.apply(String,r.slice(0,a))),n.join("")):String.fromCharCode.apply(String,r.slice(0,a))};o.decode=function(t,e,i){for(var o,s=i,r=0,a=0;a1)break;if(void 0===(l=n[l]))throw Error("invalid encoding");switch(r){case 0:o=l,r=1;break;case 1:e[i++]=o<<2|(48&l)>>4,o=l,r=2;break;case 2:e[i++]=(15&o)<<4|(60&l)>>2,o=l,r=3;break;case 3:e[i++]=(3&o)<<6|l,r=0}}if(1===r)throw Error("invalid encoding");return i-s},o.test=function(t){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(t)}},function(t,e,i){"use strict";var o,s,n,r,a,l,h,c,d,f,u;t.exports=T,T.filename=null,T.defaults={keepCase:!1};var p=/^[1-9][0-9]*$/,y=/^-?[1-9][0-9]*$/,m=/^0[x][0-9a-fA-F]+$/,g=/^-?0[x][0-9a-fA-F]+$/,v=/^0[0-7]+$/,w=/^-?0[0-7]+$/,b=/^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/,_=/^[a-zA-Z_][a-zA-Z_0-9]*$/,x=/^(?:\.?[a-zA-Z_][a-zA-Z_0-9]*)+$/,P=/^(?:\.[a-zA-Z][a-zA-Z_0-9]*)+$/;function T(t,e,i){e instanceof s||(i=e,e=new s),i||(i=T.defaults);var A,M,C,S,E,I=o(t,i.alternateCommentMode||!1),O=I.next,k=I.push,R=I.peek,D=I.skip,L=I.cmnt,N=!0,V=!1,B=e,F=i.keepCase?function(t){return t}:u.camelCase;function j(t,e,i){var o=T.filename;return i||(T.filename=null),Error("illegal "+(e||"token")+" '"+t+"' ("+(o?o+", ":"")+"line "+I.line+")")}function W(){var t,e=[];do{if('"'!==(t=O())&&"'"!==t)throw j(t);e.push(O()),D(t),t=R()}while('"'===t||"'"===t);return e.join("")}function z(t){var e=O();switch(e){case"'":case'"':return k(e),W();case"true":case"TRUE":return!0;case"false":case"FALSE":return!1}try{return function(t,e){var i=1;"-"===t.charAt(0)&&(i=-1,t=t.substring(1));switch(t){case"inf":case"INF":case"Inf":return i*(1/0);case"nan":case"NAN":case"Nan":case"NaN":return NaN;case"0":return 0}if(p.test(t))return i*parseInt(t,10);if(m.test(t))return i*parseInt(t,16);if(v.test(t))return i*parseInt(t,8);if(b.test(t))return i*parseFloat(t);throw j(t,"number",e)}(e,!0)}catch(i){if(t&&x.test(e))return e;throw j(e,"value")}}function U(t,e){var i,o;do{!e||'"'!==(i=R())&&"'"!==i?t.push([o=H(O()),D("to",!0)?H(O()):o]):t.push(W())}while(D(",",!0));D(";")}function H(t,e){switch(t){case"max":case"MAX":case"Max":return 536870911;case"0":return 0}if(!e&&"-"===t.charAt(0))throw j(t,"id");if(y.test(t))return parseInt(t,10);if(g.test(t))return parseInt(t,16);if(w.test(t))return parseInt(t,8);throw j(t,"id")}function q(){if(void 0!==A)throw j("package");if(A=O(),!x.test(A))throw j(A,"name");B=B.define(A),D(";")}function J(){var t,e=R();switch(e){case"weak":t=C||(C=[]),O();break;case"public":O();default:t=M||(M=[])}e=W(),D(";"),t.push(e)}function X(){if(D("="),S=W(),!(V="proto3"===S)&&"proto2"!==S)throw j(S,"syntax");D(";")}function $(t,e){switch(e){case"option":return G(t,e),D(";"),!0;case"message":return function(t,e){if(!_.test(e=O()))throw j(e,"type name");var i=new n(e);Z(i,(function(t){if(!$(i,t))switch(t){case"map":!function(t){D("<");var e=O();if(void 0===f.mapKey[e])throw j(e,"type");D(",");var i=O();if(!x.test(i))throw j(i,"type");D(">");var o=O();if(!_.test(o))throw j(o,"name");D("=");var s=new a(F(o),H(O()),e,i);Z(s,(function(t){if("option"!==t)throw j(t);G(s,t),D(";")}),(function(){tt(s)})),t.add(s)}(i);break;case"required":case"optional":case"repeated":Y(i,t);break;case"oneof":!function(t,e){if(!_.test(e=O()))throw j(e,"name");var i=new l(F(e));Z(i,(function(t){"option"===t?(G(i,t),D(";")):(k(t),Y(i,"optional"))})),t.add(i)}(i,t);break;case"extensions":U(i.extensions||(i.extensions=[]));break;case"reserved":U(i.reserved||(i.reserved=[]),!0);break;default:if(!V||!x.test(t))throw j(t);k(t),Y(i,"optional")}})),t.add(i)}(t,e),!0;case"enum":return function(t,e){if(!_.test(e=O()))throw j(e,"name");var i=new h(e);Z(i,(function(t){switch(t){case"option":G(i,t),D(";");break;case"reserved":U(i.reserved||(i.reserved=[]),!0);break;default:!function(t,e){if(!_.test(e))throw j(e,"name");D("=");var i=H(O(),!0),o={};Z(o,(function(t){if("option"!==t)throw j(t);G(o,t),D(";")}),(function(){tt(o)})),t.add(e,i,o.comment)}(i,t)}})),t.add(i)}(t,e),!0;case"service":return function(t,e){if(!_.test(e=O()))throw j(e,"service name");var i=new c(e);Z(i,(function(t){if(!$(i,t)){if("rpc"!==t)throw j(t);!function(t,e){var i=e;if(!_.test(e=O()))throw j(e,"name");var o,s,n,r,a=e;D("("),D("stream",!0)&&(s=!0);if(!x.test(e=O()))throw j(e);o=e,D(")"),D("returns"),D("("),D("stream",!0)&&(r=!0);if(!x.test(e=O()))throw j(e);n=e,D(")");var l=new d(a,i,o,n,s,r);Z(l,(function(t){if("option"!==t)throw j(t);G(l,t),D(";")})),t.add(l)}(i,t)}})),t.add(i)}(t,e),!0;case"extend":return function(t,e){if(!x.test(e=O()))throw j(e,"reference");var i=e;Z(null,(function(e){switch(e){case"required":case"repeated":case"optional":Y(t,e,i);break;default:if(!V||!x.test(e))throw j(e);k(e),Y(t,"optional",i)}}))}(t,e),!0}return!1}function Z(t,e,i){var o=I.line;if(t&&(t.comment=L(),t.filename=T.filename),D("{",!0)){for(var s;"}"!==(s=O());)e(s);D(";",!0)}else i&&i(),D(";"),t&&"string"!=typeof t.comment&&(t.comment=L(o))}function Y(t,e,i){var o=O();if("group"!==o){if(!x.test(o))throw j(o,"type");var s=O();if(!_.test(s))throw j(s,"name");s=F(s),D("=");var a=new r(s,H(O()),o,e,i);Z(a,(function(t){if("option"!==t)throw j(t);G(a,t),D(";")}),(function(){tt(a)})),t.add(a),V||!a.repeated||void 0===f.packed[o]&&void 0!==f.basic[o]||a.setOption("packed",!1,!0)}else!function(t,e){var i=O();if(!_.test(i))throw j(i,"name");var o=u.lcFirst(i);i===o&&(i=u.ucFirst(i));D("=");var s=H(O()),a=new n(i);a.group=!0;var l=new r(o,s,i,e);l.filename=T.filename,Z(a,(function(t){switch(t){case"option":G(a,t),D(";");break;case"required":case"optional":case"repeated":Y(a,t);break;default:throw j(t)}})),t.add(a).add(l)}(t,e)}function G(t,e){var i=D("(",!0);if(!x.test(e=O()))throw j(e,"name");var o=e;i&&(D(")"),o="("+o+")",e=R(),P.test(e)&&(o+=e,O())),D("="),K(t,o)}function K(t,e){if(D("{",!0))do{if(!_.test(E=O()))throw j(E,"name");"{"===R()?K(t,e+"."+E):(D(":"),"{"===R()?K(t,e+"."+E):Q(t,e+"."+E,z(!0)))}while(!D("}",!0));else Q(t,e,z(!0))}function Q(t,e,i){t.setOption&&t.setOption(e,i)}function tt(t){if(D("[",!0)){do{G(t,"option")}while(D(",",!0));D("]")}return t}for(;null!==(E=O());)switch(E){case"package":if(!N)throw j(E);q();break;case"import":if(!N)throw j(E);J();break;case"syntax":if(!N)throw j(E);X();break;case"option":if(!N)throw j(E);G(B,E),D(";");break;default:if($(B,E)){N=!1;continue}throw j(E)}return T.filename=null,{package:A,imports:M,weakImports:C,syntax:S,root:e}}T._configure=function(){o=i(20),s=i(9),n=i(3),r=i(2),a=i(12),l=i(7),h=i(1),c=i(10),d=i(13),f=i(5),u=i(0)}},function(t,e){t.exports=f;var i=/[\s{}=;:[\],'"()<>]/g,o=/(?:"([^"\\]*(?:\\.[^"\\]*)*)")/g,s=/(?:'([^'\\]*(?:\\.[^'\\]*)*)')/g,n=/^ *[*/]+ */,r=/^\s*\*?\/*/,a=/\n/g,l=/\s/,h=/\\(.?)/g,c={0:"\0",r:"\r",n:"\n",t:"\t"};function d(t){return t.replace(h,(function(t,e){switch(e){case"\\":case"":return e;default:return c[e]||""}}))}function f(t,e){t=t.toString();var h=0,c=t.length,f=1,u=null,p=null,y=0,m=!1,g=[],v=null;function w(t){return Error("illegal "+t+" (line "+f+")")}function b(e){return t.charAt(e)}function _(i,o){u=t.charAt(i++),y=f,m=!1;var s,l=i-(e?2:3);do{if(--l<0||"\n"===(s=t.charAt(l))){m=!0;break}}while(" "===s||"\t"===s);for(var h=t.substring(i,o).split(a),c=0;c0)return g.shift();if(v)return function(){var e="'"===v?s:o;e.lastIndex=h-1;var i=e.exec(t);if(!i)throw w("string");return h=e.lastIndex,A(v),v=null,d(i[1])}();var n,r,a,u,p;do{if(h===c)return null;for(n=!1;l.test(a=b(h));)if("\n"===a&&++f,++h===c)return null;if("/"===b(h)){if(++h===c)throw w("comment");if("/"===b(h))if(e){if(u=h,p=!1,x(h)){p=!0;do{if((h=P(h))===c)break;h++}while(x(h))}else h=Math.min(c,P(h)+1);p&&_(u,h),f++,n=!0}else{for(p="/"===b(u=h+1);"\n"!==b(++h);)if(h===c)return null;++h,p&&_(u,h-1),++f,n=!0}else{if("*"!==(a=b(h)))return"/";u=h+1,p=e||"*"===b(u);do{if("\n"===a&&++f,++h===c)throw w("comment");r=a,a=b(h)}while("*"!==r||"/"!==a);++h,p&&_(u,h-2),n=!0}}}while(n);var y=h;if(i.lastIndex=0,!i.test(b(y++)))for(;y "+t.len)}function a(t){this.buf=t,this.pos=0,this.len=t.length}var l,h="undefined"!=typeof Uint8Array?function(t){if(t instanceof Uint8Array||Array.isArray(t))return new a(t);if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer)return new a(new Uint8Array(t));throw Error("illegal buffer")}:function(t){if(Array.isArray(t))return new a(t);throw Error("illegal buffer")};function c(){var t=new o(0,0),e=0;if(!(this.len-this.pos>4)){for(;e<3;++e){if(this.pos>=this.len)throw r(this);if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*e)>>>0,this.buf[this.pos++]<128)return t}return t.lo=(t.lo|(127&this.buf[this.pos++])<<7*e)>>>0,t}for(;e<4;++e)if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*e)>>>0,this.buf[this.pos++]<128)return t;if(t.lo=(t.lo|(127&this.buf[this.pos])<<28)>>>0,t.hi=(t.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return t;if(e=0,this.len-this.pos>4){for(;e<5;++e)if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*e+3)>>>0,this.buf[this.pos++]<128)return t}else for(;e<5;++e){if(this.pos>=this.len)throw r(this);if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*e+3)>>>0,this.buf[this.pos++]<128)return t}throw Error("invalid varint encoding")}function d(t,e){return(t[e-4]|t[e-3]<<8|t[e-2]<<16|t[e-1]<<24)>>>0}function f(){if(this.pos+8>this.len)throw r(this,8);return new o(d(this.buf,this.pos+=4),d(this.buf,this.pos+=4))}a.create=n.Buffer?function(t){return(a.create=function(t){return n.Buffer.isBuffer(t)?new(void 0)(t):h(t)})(t)}:h,a.prototype._slice=n.Array.prototype.subarray||n.Array.prototype.slice,a.prototype.uint32=(l=4294967295,function(){if(l=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return l;if(l=(l|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return l;if(l=(l|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return l;if(l=(l|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return l;if(l=(l|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return l;if((this.pos+=5)>this.len)throw this.pos=this.len,r(this,10);return l}),a.prototype.int32=function(){return 0|this.uint32()},a.prototype.sint32=function(){var t=this.uint32();return t>>>1^-(1&t)|0},a.prototype.bool=function(){return 0!==this.uint32()},a.prototype.fixed32=function(){if(this.pos+4>this.len)throw r(this,4);return d(this.buf,this.pos+=4)},a.prototype.sfixed32=function(){if(this.pos+4>this.len)throw r(this,4);return 0|d(this.buf,this.pos+=4)},a.prototype.float=function(){if(this.pos+4>this.len)throw r(this,4);var t=n.float.readFloatLE(this.buf,this.pos);return this.pos+=4,t},a.prototype.double=function(){if(this.pos+8>this.len)throw r(this,4);var t=n.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,t},a.prototype.bytes=function(){var t=this.uint32(),e=this.pos,i=this.pos+t;if(i>this.len)throw r(this,t);return this.pos+=t,Array.isArray(this.buf)?this.buf.slice(e,i):e===i?new this.buf.constructor(0):this._slice.call(this.buf,e,i)},a.prototype.string=function(){var t=this.bytes();return s.read(t,0,t.length)},a.prototype.skip=function(t){if("number"==typeof t){if(this.pos+t>this.len)throw r(this,t);this.pos+=t}else do{if(this.pos>=this.len)throw r(this)}while(128&this.buf[this.pos++]);return this},a.prototype.skipType=function(t){switch(t){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;;){if(4==(t=7&this.uint32()))break;this.skipType(t)}break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+t+" at offset "+this.pos)}return this},a._configure=function(){o=i(11),s=i(8);var t=n.Long?"toLong":"toNumber";n.merge(a.prototype,{int64:function(){return c.call(this)[t](!1)},uint64:function(){return c.call(this)[t](!0)},sint64:function(){return c.call(this).zzDecode()[t](!1)},fixed64:function(){return f.call(this)[t](!0)},sfixed64:function(){return f.call(this)[t](!1)}})}},function(t,e,i){var o,s;function n(t,e){return t.name+": "+e+(t.repeated&&"array"!==e?"[]":t.map&&"object"!==e?"{k:"+t.keyType+"}":"")+" expected"}function r(t,e,i,r){var a=r.types;if(t.resolvedType)if(t.resolvedType instanceof o){if(Object.keys(t.resolvedType.values).indexOf(i)<0)return n(t,"enum value")}else{var l=a[e].verify(i);if(l)return t.name+"."+l}else switch(t.type){case"int32":case"uint32":case"sint32":case"fixed32":case"sfixed32":if(!s.isInteger(i))return n(t,"integer");break;case"int64":case"uint64":case"sint64":case"fixed64":case"sfixed64":if(!(s.isInteger(i)||i&&s.isInteger(i.low)&&s.isInteger(i.high)))return n(t,"integer|Long");break;case"float":case"double":if("number"!=typeof i)return n(t,"number");break;case"bool":if("boolean"!=typeof i)return n(t,"boolean");break;case"string":if(!s.isString(i))return n(t,"string");break;case"bytes":if(!(i&&"number"==typeof i.length||s.isString(i)))return n(t,"buffer")}}function a(t,e){switch(t.keyType){case"int32":case"uint32":case"sint32":case"fixed32":case"sfixed32":if(!s.key32Re.test(e))return n(t,"integer key");break;case"int64":case"uint64":case"sint64":case"fixed64":case"sfixed64":if(!s.key64Re.test(e))return n(t,"integer|Long key");break;case"bool":if(!s.key2Re.test(e))return n(t,"boolean key")}}function l(t){return function(e){return function(i){var o;if("object"!=typeof i||null===i)return"object expected";var l,h={};t.oneofsArray.length&&(l={});for(var c=0;c>>0).fork().uint32(8|s.mapKey[c.keyType])[c.keyType](y[m]),void 0===u?n[d].encode(p[y[m]],a.uint32(18).fork()).ldelim().ldelim():a.uint32(16|u)[f](p[y[m]]).ldelim()}else if(c.repeated){if(p&&p.length)if(c.packed&&void 0!==s.packed[f]){a.uint32((c.id<<3|2)>>>0).fork();for(var g=0;g>>0)).uint32((c.id<<3|4)>>>0):n[d].encode(p[v],a.uint32((c.id<<3|2)>>>0).fork()).ldelim():a.uint32((c.id<<3|u)>>>0)[f](p[v])}else(!c.optional||null!=p&&e.hasOwnProperty(c.name))&&(c.optional||null!=p&&e.hasOwnProperty(c.name)||console.warn("注意啦!!!很大概率会报错 类型:",e.$type?e.$type.name:"不晓得","没有设置对应的属性:",c.name,"检查是不是proto文件属性设置为了required"),void 0===u?c.resolvedType.group?n[d].encode(p,a.uint32((c.id<<3|3)>>>0)).uint32((c.id<<3|4)>>>0):n[d].encode(p,a.uint32((c.id<<3|2)>>>0).fork()).ldelim():a.uint32((c.id<<3|u)>>>0)[f](p))}return a}}}t.exports=n,n._configure=function(){o=i(1),s=i(5)}},function(t,e,i){var o,s,n;function r(t){return"missing required '"+t.name+"'"}function a(t){return function(e){var i=e.Reader,a=e.types,l=e.util;return function(e,h){e instanceof i||(e=i.create(e));for(var c,d=void 0===h?e.len:e.pos+h,f=new this.ctor;e.pos>>3,y=0,m=!1;y>>0:r[i]=a[i]>>>0;break;case"int32":case"sint32":case"sfixed32":c?r[i][h]=0|a[i][h]:r[i]=0|a[i];break;case"uint64":y=!0;case"int64":case"sint64":case"fixed64":case"sfixed64":s.Long?c?r[i][h]=s.Long.fromValue(a[i][h]).unsigned=y:r[i]=s.Long.fromValue(a[i]).unsigned=y:"string"==typeof(c?a[i][h]:a[i])?c?r[i][h]=parseInt(a[i][h],10):r[i]=parseInt(a[i],10):"number"==typeof(c?a[i][h]:a[i])?c?r[i][h]=a[i][h]:r[i]=a[i]:"object"==typeof(c?a[i][h]:a[i])&&(c?r[i][h]=new s.LongBits(a[i][h].low>>>0,a[i][h].high>>>0).toNumber(y):r[i]=new s.LongBits(a[i].low>>>0,a[i].high>>>0).toNumber(y));break;case"bytes":"string"==typeof(c?a[i][h]:a[i])?c?s.base64.decode(a[i][h],r[i][h]=s.newBuffer(s.base64.length(a[i][h])),0):s.base64.decode(a[i],r[i]=s.newBuffer(s.base64.length(a[i])),0):(c?a[i][h]:a[i]).length&&(c?r[i][h]=a[i][h]:r[i]=a[i]);break;case"string":c?r[i][h]=String(a[i][h]):r[i]=String(a[i]);break;case"bool":c?r[i][h]=Boolean(a[i][h]):r[i]=Boolean(a[i])}}}function a(t,e,i,n){var r=n.m,a=n.d,l=n.types,h=n.ksi,c=n.o,d=void 0!==h;if(t.resolvedType)t.resolvedType instanceof o?d?a[i][h]=c.enums===String?l[e].values[r[i][h]]:r[i][h]:a[i]=c.enums===String?l[e].values[r[i]]:r[i]:d?a[i][h]=l[e].toObject(r[i][h],c):a[i]=l[e].toObject(r[i],c);else{var f=!1;switch(t.type){case"double":case"float":d?a[i][h]=c.json&&!isFinite(r[i][h])?String(r[i][h]):r[i][h]:a[i]=c.json&&!isFinite(r[i])?String(r[i]):r[i];break;case"uint64":f=!0;case"int64":case"sint64":case"fixed64":case"sfixed64":"number"==typeof r[i][h]?d?a[i][h]=c.longs===String?String(r[i][h]):r[i][h]:a[i]=c.longs===String?String(r[i]):r[i]:d?a[i][h]=c.longs===String?s.Long.prototype.toString.call(r[i][h]):c.longs===Number?new s.LongBits(r[i][h].low>>>0,r[i][h].high>>>0).toNumber(f):r[i][h]:a[i]=c.longs===String?s.Long.prototype.toString.call(r[i]):c.longs===Number?new s.LongBits(r[i].low>>>0,r[i].high>>>0).toNumber(f):r[i];break;case"bytes":d?a[i][h]=c.bytes===String?s.base64.encode(r[i][h],0,r[i][h].length):c.bytes===Array?Array.prototype.slice.call(r[i][h]):r[i][h]:a[i]=c.bytes===String?s.base64.encode(r[i],0,r[i].length):c.bytes===Array?Array.prototype.slice.call(r[i]):r[i];break;default:d?a[i][h]=r[i][h]:a[i]=r[i]}}}n._configure=function(){o=i(1),s=i(0)},n.fromObject=function(t){var e=t.fieldsArray;return function(t){return function(i){if(i instanceof this.ctor)return i;if(!e.length)return new this.ctor;for(var n=new this.ctor,a=0;a255)return!1;return!0}return{toBytes:function(i){var o=[],s=0;for(i=encodeURI(i);s>>7==0?(e+=String.fromCharCode(t[i]),i+=1):252==(252&o)?(s=(3&t[i])<<30,s|=(63&t[i+1])<<24,s|=(63&t[i+2])<<18,s|=(63&t[i+3])<<12,s|=(63&t[i+4])<<6,s|=63&t[i+5],e+=String.fromCodePoint(s),i+=6):248==(248&o)?(s=(7&t[i])<<24,s|=(63&t[i+1])<<18,s|=(63&t[i+2])<<12,s|=(63&t[i+3])<<6,s|=63&t[i+4],e+=String.fromCodePoint(s),i+=5):240==(240&o)?(s=(15&t[i])<<18,s|=(63&t[i+1])<<12,s|=(63&t[i+2])<<6,s|=63&t[i+3],e+=String.fromCodePoint(s),i+=4):224==(224&o)?(s=(31&t[i])<<12,s|=(63&t[i+1])<<6,s|=63&t[i+2],e+=String.fromCharCode(s),i+=3):192==(192&o)?(s=(63&t[i])<<6,s|=63&t[i+1],e+=String.fromCharCode(s),i+=2):(e+=String.fromCharCode(t[i]),i+=1)}return e}}}();t.exports=i},function(t,e){var i=function(){const t={width:720,height:1280,intrinstics:[1110.828383,0,360,0,1111.21832,640,0,0,1],undistorts:[1e-5,0,0,0,0]},e={width:720,height:960,intrinstics:[720,0,360,0,720,480,0,0,1],undistorts:[0,0,0,0,0]},i={width:288,height:352,intrinstics:[594.25994,0,237.531106,0,594.825983,313.414084,0,0,1],undistorts:[.184825,-.433983,-.003168,-.010542,0]};function o(t,e){const i=[],o=[];for(var s=0;sn?(e=1200*s/1280,i=e):(e=1200*n/1280,i=e),o=s/2,r=n/2,c.intrinstics=[e,0,o,0,i,r,0,0,1],c.undistorts=t.undistorts,c}return{intrinstics:[],undistorts:[]}}}}();t.exports=i},function(t,e,i){t.exports=function(){var t={};function e(e,i,o){return"function"==typeof i?(o=i,i=new t.Root):i||(i=new t.Root),i.load(e,o)}function o(e,i){return i||(i=new t.Root),i.loadSync(e)}function s(e,i,o){return"function"==typeof i?(o=i,i=new t.Root):i||(i=new t.Root),i.parseFromPbString(e,o)}function n(){t.converter._configure(),t.decoder._configure(),t.encoder._configure(),t.Field._configure(),t.MapField._configure(),t.Message._configure(),t.Namespace._configure(),t.Method._configure(),t.ReflectionObject._configure(),t.OneOf._configure(),t.parse._configure(),t.Reader._configure(),t.Root._configure(),t.Service._configure(),t.verifier._configure(),t.Type._configure(),t.types._configure(),t.wrappers._configure(),t.Writer._configure()}if(t.build="minimal",t.Writer=i(16),t.encoder=i(25),t.Reader=i(23),t.util=i(0),t.rpc=i(21),t.roots=i(17),t.verifier=i(24),t.tokenize=i(20),t.parse=i(19),t.common=i(22),t.ReflectionObject=i(4),t.Namespace=i(6),t.Root=i(9),t.Enum=i(1),t.Type=i(3),t.Field=i(2),t.OneOf=i(7),t.MapField=i(12),t.Service=i(10),t.Method=i(13),t.converter=i(28),t.decoder=i(26),t.Message=i(14),t.wrappers=i(27),t.types=i(5),t.util=i(0),t.configure=n,t.load=e,t.loadSync=o,t.parseFromPbString=s,n(),arguments&&arguments.length)for(var r=0;r>>=0)&&t<256)&&(o=r[t])?o:(i=h(t,(0|t)<0?-1:0,!0),s&&(r[t]=i),i):(s=-128<=(t|=0)&&t<128)&&(o=n[t])?o:(i=h(t,t<0?-1:0,!1),s&&(n[t]=i),i)}function l(t,e){if(isNaN(t))return e?v:g;if(e){if(t<0)return v;if(t>=p)return P}else{if(t<=-y)return T;if(t+1>=y)return x}return t<0?l(-t,e).neg():h(t%u|0,t/u|0,e)}function h(t,e,i){return new o(t,e,i)}o.fromInt=a,o.fromNumber=l,o.fromBits=h;var c=Math.pow;function d(t,e,i){if(0===t.length)throw Error("empty string");if("NaN"===t||"Infinity"===t||"+Infinity"===t||"-Infinity"===t)return g;if("number"==typeof e?(i=e,e=!1):e=!!e,(i=i||10)<2||360)throw Error("interior hyphen");if(0===o)return d(t.substring(1),e,i).neg();for(var s=l(c(i,8)),n=g,r=0;r>>0:this.low},A.toNumber=function(){return this.unsigned?(this.high>>>0)*u+(this.low>>>0):this.high*u+(this.low>>>0)},A.toString=function(t){if((t=t||10)<2||36>>0).toString(t);if((n=a).isZero())return h+r;for(;h.length<6;)h="0"+h;r=""+h+r}},A.getHighBits=function(){return this.high},A.getHighBitsUnsigned=function(){return this.high>>>0},A.getLowBits=function(){return this.low},A.getLowBitsUnsigned=function(){return this.low>>>0},A.getNumBitsAbs=function(){if(this.isNegative())return this.eq(T)?64:this.neg().getNumBitsAbs();for(var t=0!=this.high?this.high:this.low,e=31;e>0&&0==(t&1<=0},A.isOdd=function(){return 1==(1&this.low)},A.isEven=function(){return 0==(1&this.low)},A.equals=function(t){return s(t)||(t=f(t)),(this.unsigned===t.unsigned||this.high>>>31!=1||t.high>>>31!=1)&&(this.high===t.high&&this.low===t.low)},A.eq=A.equals,A.notEquals=function(t){return!this.eq(t)},A.neq=A.notEquals,A.ne=A.notEquals,A.lessThan=function(t){return this.comp(t)<0},A.lt=A.lessThan,A.lessThanOrEqual=function(t){return this.comp(t)<=0},A.lte=A.lessThanOrEqual,A.le=A.lessThanOrEqual,A.greaterThan=function(t){return this.comp(t)>0},A.gt=A.greaterThan,A.greaterThanOrEqual=function(t){return this.comp(t)>=0},A.gte=A.greaterThanOrEqual,A.ge=A.greaterThanOrEqual,A.compare=function(t){if(s(t)||(t=f(t)),this.eq(t))return 0;var e=this.isNegative(),i=t.isNegative();return e&&!i?-1:!e&&i?1:this.unsigned?t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1:this.sub(t).isNegative()?-1:1},A.comp=A.compare,A.negate=function(){return!this.unsigned&&this.eq(T)?T:this.not().add(w)},A.neg=A.negate,A.add=function(t){s(t)||(t=f(t));var e=this.high>>>16,i=65535&this.high,o=this.low>>>16,n=65535&this.low,r=t.high>>>16,a=65535&t.high,l=t.low>>>16,c=0,d=0,u=0,p=0;return u+=(p+=n+(65535&t.low))>>>16,d+=(u+=o+l)>>>16,c+=(d+=i+a)>>>16,c+=e+r,h((u&=65535)<<16|(p&=65535),(c&=65535)<<16|(d&=65535),this.unsigned)},A.subtract=function(t){return s(t)||(t=f(t)),this.add(t.neg())},A.sub=A.subtract,A.multiply=function(t){if(this.isZero())return g;if(s(t)||(t=f(t)),i)return h(i.mul(this.low,this.high,t.low,t.high),i.get_high(),this.unsigned);if(t.isZero())return g;if(this.eq(T))return t.isOdd()?T:g;if(t.eq(T))return this.isOdd()?T:g;if(this.isNegative())return t.isNegative()?this.neg().mul(t.neg()):this.neg().mul(t).neg();if(t.isNegative())return this.mul(t.neg()).neg();if(this.lt(m)&&t.lt(m))return l(this.toNumber()*t.toNumber(),this.unsigned);var e=this.high>>>16,o=65535&this.high,n=this.low>>>16,r=65535&this.low,a=t.high>>>16,c=65535&t.high,d=t.low>>>16,u=65535&t.low,p=0,y=0,v=0,w=0;return v+=(w+=r*u)>>>16,y+=(v+=n*u)>>>16,v&=65535,y+=(v+=r*d)>>>16,p+=(y+=o*u)>>>16,y&=65535,p+=(y+=n*d)>>>16,y&=65535,p+=(y+=r*c)>>>16,p+=e*u+o*d+n*c+r*a,h((v&=65535)<<16|(w&=65535),(p&=65535)<<16|(y&=65535),this.unsigned)},A.mul=A.multiply,A.divide=function(t){if(s(t)||(t=f(t)),t.isZero())throw Error("division by zero");var e,o,n;if(i)return this.unsigned||-2147483648!==this.high||-1!==t.low||-1!==t.high?h((this.unsigned?i.div_u:i.div_s)(this.low,this.high,t.low,t.high),i.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?v:g;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return v;if(t.gt(this.shru(1)))return b;n=v}else{if(this.eq(T))return t.eq(w)||t.eq(_)?T:t.eq(T)?w:(e=this.shr(1).div(t).shl(1)).eq(g)?t.isNegative()?w:_:(o=this.sub(t.mul(e)),n=e.add(o.div(t)));if(t.eq(T))return this.unsigned?v:g;if(this.isNegative())return t.isNegative()?this.neg().div(t.neg()):this.neg().div(t).neg();if(t.isNegative())return this.div(t.neg()).neg();n=g}for(o=this;o.gte(t);){e=Math.max(1,Math.floor(o.toNumber()/t.toNumber()));for(var r=Math.ceil(Math.log(e)/Math.LN2),a=r<=48?1:c(2,r-48),d=l(e),u=d.mul(t);u.isNegative()||u.gt(o);)u=(d=l(e-=a,this.unsigned)).mul(t);d.isZero()&&(d=w),n=n.add(d),o=o.sub(u)}return n},A.div=A.divide,A.modulo=function(t){return s(t)||(t=f(t)),i?h((this.unsigned?i.rem_u:i.rem_s)(this.low,this.high,t.low,t.high),i.get_high(),this.unsigned):this.sub(this.div(t).mul(t))},A.mod=A.modulo,A.rem=A.modulo,A.not=function(){return h(~this.low,~this.high,this.unsigned)},A.and=function(t){return s(t)||(t=f(t)),h(this.low&t.low,this.high&t.high,this.unsigned)},A.or=function(t){return s(t)||(t=f(t)),h(this.low|t.low,this.high|t.high,this.unsigned)},A.xor=function(t){return s(t)||(t=f(t)),h(this.low^t.low,this.high^t.high,this.unsigned)},A.shiftLeft=function(t){return s(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?h(this.low<>>32-t,this.unsigned):h(0,this.low<>>t|this.high<<32-t,this.high>>t,this.unsigned):h(this.high>>t-32,this.high>=0?0:-1,this.unsigned)},A.shr=A.shiftRight,A.shiftRightUnsigned=function(t){if(s(t)&&(t=t.toInt()),0===(t&=63))return this;var e=this.high;return t<32?h(this.low>>>t|e<<32-t,e>>>t,this.unsigned):h(32===t?e:e>>>t-32,0,this.unsigned)},A.shru=A.shiftRightUnsigned,A.shr_u=A.shiftRightUnsigned,A.toSigned=function(){return this.unsigned?h(this.low,this.high,!1):this},A.toUnsigned=function(){return this.unsigned?this:h(this.low,this.high,!0)},A.toBytes=function(t){return t?this.toBytesLE():this.toBytesBE()},A.toBytesLE=function(){var t=this.high,e=this.low;return[255&e,e>>>8&255,e>>>16&255,e>>>24,255&t,t>>>8&255,t>>>16&255,t>>>24]},A.toBytesBE=function(){var t=this.high,e=this.low;return[t>>>24,t>>>16&255,t>>>8&255,255&t,e>>>24,e>>>16&255,e>>>8&255,255&e]},o.fromBytes=function(t,e,i){return i?o.fromBytesLE(t,e):o.fromBytesBE(t,e)},o.fromBytesLE=function(t,e){return new o(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24,e)},o.fromBytesBE=function(t,e){return new o(t[4]<<24|t[5]<<16|t[6]<<8|t[7],t[0]<<24|t[1]<<16|t[2]<<8|t[3],e)}},function(t,e){t.exports=function(t,e,i){var o=i||8192,s=o>>>1,n=null,r=o;return function(i){if(i<1||i>s)return t(i);r+i>o&&(n=t(o),r=0);var a=e.call(n,r,r+=i);return 7&r&&(r=1+(7|r)),a}}},function(t,e){function i(t){return"undefined"!=typeof Float32Array?function(){var e=new Float32Array([-0]),i=new Uint8Array(e.buffer),o=128===i[3];function s(t,o,s){e[0]=t,o[s]=i[0],o[s+1]=i[1],o[s+2]=i[2],o[s+3]=i[3]}function n(t,o,s){e[0]=t,o[s]=i[3],o[s+1]=i[2],o[s+2]=i[1],o[s+3]=i[0]}function r(t,o){return i[0]=t[o],i[1]=t[o+1],i[2]=t[o+2],i[3]=t[o+3],e[0]}function a(t,o){return i[3]=t[o],i[2]=t[o+1],i[1]=t[o+2],i[0]=t[o+3],e[0]}t.writeFloatLE=o?s:n,t.writeFloatBE=o?n:s,t.readFloatLE=o?r:a,t.readFloatBE=o?a:r}():function(){function e(t,e,i,o){var s=e<0?1:0;if(s&&(e=-e),0===e)t(1/e>0?0:2147483648,i,o);else if(isNaN(e))t(2143289344,i,o);else if(e>34028234663852886e22)t((s<<31|2139095040)>>>0,i,o);else if(e<11754943508222875e-54)t((s<<31|Math.round(e/1401298464324817e-60))>>>0,i,o);else{var n=Math.floor(Math.log(e)/Math.LN2);t((s<<31|n+127<<23|8388607&Math.round(e*Math.pow(2,-n)*8388608))>>>0,i,o)}}function i(t,e,i){var o=t(e,i),s=2*(o>>31)+1,n=o>>>23&255,r=8388607&o;return 255===n?r?NaN:s*(1/0):0===n?1401298464324817e-60*s*r:s*Math.pow(2,n-150)*(r+8388608)}t.writeFloatLE=e.bind(null,o),t.writeFloatBE=e.bind(null,s),t.readFloatLE=i.bind(null,n),t.readFloatBE=i.bind(null,r)}(),"undefined"!=typeof Float64Array?function(){var e=new Float64Array([-0]),i=new Uint8Array(e.buffer),o=128===i[7];function s(t,o,s){e[0]=t,o[s]=i[0],o[s+1]=i[1],o[s+2]=i[2],o[s+3]=i[3],o[s+4]=i[4],o[s+5]=i[5],o[s+6]=i[6],o[s+7]=i[7]}function n(t,o,s){e[0]=t,o[s]=i[7],o[s+1]=i[6],o[s+2]=i[5],o[s+3]=i[4],o[s+4]=i[3],o[s+5]=i[2],o[s+6]=i[1],o[s+7]=i[0]}function r(t,o){return i[0]=t[o],i[1]=t[o+1],i[2]=t[o+2],i[3]=t[o+3],i[4]=t[o+4],i[5]=t[o+5],i[6]=t[o+6],i[7]=t[o+7],e[0]}function a(t,o){return i[7]=t[o],i[6]=t[o+1],i[5]=t[o+2],i[4]=t[o+3],i[3]=t[o+4],i[2]=t[o+5],i[1]=t[o+6],i[0]=t[o+7],e[0]}t.writeDoubleLE=o?s:n,t.writeDoubleBE=o?n:s,t.readDoubleLE=o?r:a,t.readDoubleBE=o?a:r}():function(){function e(t,e,i,o,s,n){var r=o<0?1:0;if(r&&(o=-o),0===o)t(0,s,n+e),t(1/o>0?0:2147483648,s,n+i);else if(isNaN(o))t(0,s,n+e),t(2146959360,s,n+i);else if(o>17976931348623157e292)t(0,s,n+e),t((r<<31|2146435072)>>>0,s,n+i);else{var a;if(o<22250738585072014e-324)t((a=o/5e-324)>>>0,s,n+e),t((r<<31|a/4294967296)>>>0,s,n+i);else{var l=Math.floor(Math.log(o)/Math.LN2);1024===l&&(l=1023),t(4503599627370496*(a=o*Math.pow(2,-l))>>>0,s,n+e),t((r<<31|l+1023<<20|1048576*a&1048575)>>>0,s,n+i)}}}function i(t,e,i,o,s){var n=t(o,s+e),r=t(o,s+i),a=2*(r>>31)+1,l=r>>>20&2047,h=4294967296*(1048575&r)+n;return 2047===l?h?NaN:a*(1/0):0===l?5e-324*a*h:a*Math.pow(2,l-1075)*(h+4503599627370496)}t.writeDoubleLE=e.bind(null,o,0,4),t.writeDoubleBE=e.bind(null,s,4,0),t.readDoubleLE=i.bind(null,n,0,4),t.readDoubleBE=i.bind(null,r,4,0)}(),t}function o(t,e,i){e[i]=255&t,e[i+1]=t>>>8&255,e[i+2]=t>>>16&255,e[i+3]=t>>>24}function s(t,e,i){e[i]=t>>>24,e[i+1]=t>>>16&255,e[i+2]=t>>>8&255,e[i+3]=255&t}function n(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0}function r(t,e){return(t[e]<<24|t[e+1]<<16|t[e+2]<<8|t[e+3])>>>0}t.exports=i(i)},function(t,e,i){"use strict";t.exports=function(t,e){var i=new Array(arguments.length-1),o=0,s=2,n=!0;for(;s0&&".."!==e[n-1]?e.splice(--n,2):i?e.splice(n,1):++n:"."===e[n]?e.splice(n,1):++n;return s+e.join("/")};i.resolve=function(t,e,i){return i||(e=s(e)),o(e)?e:(i||(t=s(t)),(t=t.replace(/(?:\/|^)[^/]+$/,"")).length?s(t+"/"+e):e)}},function(t,e){t.exports={nested:{bdarvps:{nested:{BdarVector12f:{fields:{f1:{type:"float",id:1},f2:{type:"float",id:2},f3:{type:"float",id:3},f4:{type:"float",id:4},f5:{type:"float",id:5},f6:{type:"float",id:6},f7:{type:"float",id:7},f8:{type:"float",id:8},f9:{type:"float",id:9},f10:{type:"float",id:10},f11:{type:"float",id:11},f12:{type:"float",id:12}}},BdarVector9f:{fields:{f1:{type:"float",id:1},f2:{type:"float",id:2},f3:{type:"float",id:3},f4:{type:"float",id:4},f5:{type:"float",id:5},f6:{type:"float",id:6},f7:{type:"float",id:7},f8:{type:"float",id:8},f9:{type:"float",id:9}}},BdarVector5f:{fields:{f1:{type:"float",id:1},f2:{type:"float",id:2},f3:{type:"float",id:3},f4:{type:"float",id:4},f5:{type:"float",id:5}}},BdarVector4f:{fields:{f1:{type:"float",id:1},f2:{type:"float",id:2},f3:{type:"float",id:3},f4:{type:"float",id:4}}},BdarVector3f:{fields:{x:{type:"float",id:1},y:{type:"float",id:2},z:{type:"float",id:3}}},BdarVector2f:{fields:{x:{type:"float",id:1},y:{type:"float",id:2}}},BdarVector2d:{fields:{x:{type:"double",id:1},y:{type:"double",id:2}}},BdarVector3d:{fields:{x:{type:"double",id:1},y:{type:"double",id:2},z:{type:"double",id:3}}},BdarTrackerData:{fields:{pose:{type:"BdarVector12f",id:1},poseOrig:{type:"BdarVector12f",id:2},timestamp:{type:"bytes",id:3},frameId:{type:"int32",id:4},status:{type:"int32",id:5},magnet:{rule:"repeated",type:"double",id:6}}},BdarLocalizerData:{fields:{pose:{type:"BdarVector12f",id:1},timestamp:{type:"bytes",id:2},frameId:{type:"int32",id:3},consistent:{type:"int32",id:4}}},BdarTrackerOptimizeData:{fields:{sampleRate:{type:"int32",id:1},trackerData:{rule:"repeated",type:"BdarTrackerData",id:2},localizerData:{rule:"repeated",type:"BdarLocalizerData",id:3}}},BdarPosePrior:{fields:{type:{type:"int32",id:1},prior:{type:"BdarVector12f",id:2},priorAccuracy:{type:"float",id:3},priorConfidence:{type:"float",id:4}}},BdarOCRPrior:{fields:{status:{type:"bytes",id:1},roiCoordinate:{type:"BdarVector4f",id:2}}},BdarVPSRequestData:{fields:{methodType:{type:"int32",id:1},trackerType:{type:"int32",id:2},phoneType:{type:"bytes",id:3},userId:{type:"bytes",id:4},frameId:{type:"int32",id:5},timestamp:{type:"bytes",id:6},trackerStatus:{type:"bool",id:7},trackerPose:{type:"BdarVector12f",id:8},pointIndices:{rule:"repeated",type:"int32",id:9},points_2d:{rule:"repeated",type:"BdarVector2f",id:10},points_3d:{rule:"repeated",type:"BdarVector3f",id:11},cameraIntrinsics:{type:"BdarVector9f",id:12},cameraDistort:{type:"BdarVector5f",id:13},gps:{type:"BdarVector3d",id:14},gravityDirection:{type:"BdarVector3f",id:15},imu:{type:"BdarVector12f",id:16},frame:{type:"bytes",id:17},frameWidth:{type:"int32",id:18},frameHeight:{type:"int32",id:19},frameChannels:{type:"int32",id:20},frameCompressType:{type:"int32",id:21},requestCorrespondence:{type:"bool",id:22},sessionId:{type:"bytes",id:23},version:{type:"bytes",id:24},sceneType:{type:"int32",id:25},trackerOptimizeData:{type:"BdarTrackerOptimizeData",id:26},posePriors:{rule:"repeated",type:"BdarPosePrior",id:27},floorId:{type:"bytes",id:28},bdarOCRPrior:{type:"BdarOCRPrior",id:29}}},BdarMapInfo:{fields:{mapTag:{type:"bytes",id:1},mapQueryConfidence:{type:"float",id:2}}},BdarClientResult:{fields:{buildingId:{type:"bytes",id:1},floorId:{type:"bytes",id:2},locationPoint:{type:"BdarVector2d",id:3},locationTransform:{type:"BdarVector12f",id:4}}},BdarCoupledPose:{fields:{pose:{type:"BdarVector12f",id:1},trackerPose:{type:"BdarVector12f",id:2},timestamp:{type:"bytes",id:3},frameId:{type:"int32",id:4}}},BdarCoupleResult:{fields:{status:{type:"int32",id:1},coupledPose:{rule:"repeated",type:"BdarCoupledPose",id:2},scale:{type:"float",id:3},transform:{type:"BdarVector12f",id:4}}},BdarVPSResponseData:{fields:{userId:{type:"bytes",id:1},frameId:{type:"int32",id:2},timestamp:{type:"bytes",id:3},trackerPose:{type:"BdarVector12f",id:4},imu:{type:"BdarVector12f",id:5},vpsStatus:{type:"bool",id:6},vpsPose:{type:"BdarVector12f",id:7},scale:{type:"float",id:8},points_2d:{rule:"repeated",type:"BdarVector2f",id:9},points_3d:{rule:"repeated",type:"BdarVector3f",id:10},vpsPosition:{type:"BdarVector3d",id:11},version:{type:"bytes",id:12},vpsPoseAccuracy:{type:"float",id:13},vpsPoseConfidence:{type:"float",id:14},sceneType:{type:"int32",id:15},trackerType:{type:"int32",id:16},mapInfo:{type:"BdarMapInfo",id:17},clientResult:{type:"BdarClientResult",id:18},session:{type:"bytes",id:19},trackerOptimizeData:{type:"BdarTrackerOptimizeData",id:20},coupleResult:{type:"BdarCoupleResult",id:21},vpsStatusMsg:{type:"int32",id:22}}},BdarVPSResponseDataList:{fields:{data:{rule:"repeated",type:"BdarVPSResponseData",id:1}}},LocationResponse:{fields:{errCode:{type:"int32",id:1},errMsg:{type:"string",id:2},data:{type:"bytes",id:3}}},SubBdarVPSRequestData:{fields:{sessionId:{type:"bytes",id:23}}},TrackFrameResp:{fields:{errCode:{type:"int32",id:1},errMsg:{type:"string",id:2},data:{type:"bytes",id:3}}},TrackFrameResp2:{fields:{errCode:{type:"int32",id:1},errMsg:{type:"string",id:2},data:{type:"string",id:3}}}}}}}},function(t,e,i){"use strict";function o(t){return{data:function(t){const e=new t.constructor(t.byteLength);return new Uint8Array(e).set(new Uint8Array(t)),e}(t.data),width:t.width,height:t.height}}i.r(e),i.d(e,"SDKWrapper",(function(){return bt}));const s=i(29),n=i(15);function r(t){return s.toBytes(t)}function a(t){for(var e={},i=0,o=t.length;i{e.floor_id===t.floor_id&&(o=e)}),this.baseURL=this._configData.interface.baseURL,console.log("createSession-this.baseURL",this.baseURL),{task:new Promise((t,s)=>{i=wx.request({url:this.baseURL+this._configData.interface.sessionInterface,method:"POST",data:{app_id:o.app_id,poi_id:o.poi_id,map_id:o.map_id,timestamp:e,sign:h({app_id:o.app_id,poi_id:o.poi_id,map_id:o.map_id,timestamp:e})},headers:{"Content-Type":"application/json; charset=UTF-8",Connection:"keep-alive"},success:e=>{0===e.data.err_code&&(console.log("createSssion",e),k=!1,O=e.data.data.session_id,t(e))},fail(t){s({msg:"创建session请求失败",data:t})}})}),taskController:i}}sendTrackframe(t){let e;return this.baseURL=this._configData.interface.baseURL,{trackframe:new Promise((i,o)=>{e=wx.request({url:this.baseURL+this._configData.interface.trackFrameInterface,method:"POST",data:t,headers:{"Content-Type":"multipart/protobuf",Connection:"keep-alive"},dataType:"protobuf",responseType:"arraybuffer",success:t=>{let e=function(t,e,i){let o=T.decode(t.data);return 0===o.errCode&&o.data?P.decode(o.data):void(i||(e.onError({type:10004,msg:o.errMsg+" err_code:"+o.errCode}),console.log(o.errMsg+" err_code:"+o.errCode+" sessionId = "+C)))}(t,I,k);if(void 0===e)return{undefined:void 0,undefined:void 0};let o={};e.data.map(t=>{t.clientResult&&(o.floor=t.clientResult.floorId?l(t.clientResult.floorId):"",o.buildingId=t.clientResult.buildingId?l(t.clientResult.buildingId):"",o.locPoint=t.clientResult.locationPoint),t.session&&(o.session=l(t.session)),t.mapInfo&&t.mapInfo.mapTag&&(o.mapTag=l(t.mapInfo.mapTag)),o.vpsStatusMsg=t.vpsStatusMsg,!0===t.vpsStatus?(o.vpsStatus=t.vpsStatus,o.vpsPose=t.vpsPose,o.trackerPose=t.trackerPose,i(o)):(o.vpsStatus=!1,i(o))})},fail:t=>{o(t),console.log(t)}})}),trackframeController:e}}destroylocatesession(){this.baseURL=this._configData.interface.baseURL,console.log("destroylocatesession-this.baseURL",this.baseURL);let t,e=(new Date).getTime();if(void 0!==O){return{destroy:new Promise((i,o)=>{t=wx.request({url:this.baseURL+this._configData.interface.destroySessionInterface,method:"POST",data:{session_id:O,timestamp:e,app_id:0,sign:h({session_id:O,timestamp:e,app_id:0})},headers:{"Content-Type":"application/json; charset=UTF-8",Connection:"keep-alive"},success:t=>{console.log("destroylocatesession",t.data),0!==t.data.err_code?(I.onError({type:10006,msg:t.data.err_msg}),console.log(t.data.err_msg)):i(t.data),O=void 0},fail:t=>{o({msg:"销毁session请求失败",data:t}),O=void 0}})}),destroyController:t}}}getMapPoi(t){let e,i=((new Date).getTime()/1e3).toFixed();return{getPoi:new Promise((o,s)=>{e=wx.request({url:this._configData.interface.getMapPoiBaseUrl+this._configData.interface.getMapPoiInterface,method:"POST",data:{case_id:t,timestamp:Number(i),sign:c({case_id:t,timestamp:Number(i)})},headers:{"Content-Type":"application/json; charset=UTF-8",Connection:"keep-alive"},success:t=>{console.log("getMapPoi",t),o(t)},fail(t){s({msg:"获取poi数据失败",data:t})}})}),getPoiController:e}}}function D(t,e){let i=e.x-t.x,o=e.y-t.y;return 0===i&&0===o?0:Math.atan2(o,i)-Math.PI/2}function L(t,e){return Math.sqrt((t.x-e.x)*(t.x-e.x)+(t.y-e.y)*(t.y-e.y))}var N,V,B=null,F=0,j=!1,W=!1,z=!1,U=!1,H=!1,q=!1,J=null,X=0,$="",Z={f1:0,f2:0,f3:0,f4:0},Y=[],G=0,K=0;const Q=i(15);class tt{constructor(t,e,i){this.renderer=e,this._configData=t,this.option=i,void 0===E&&this.initWXwasm(),this.cContex=wx.createCameraContext(),this.initSystemInfo(),this.initAccelerometer(),this.initDevice(),this.initCamera(),this.algorithm=new d,this.severInterface=new R(this._configData),this.isPark=!1,this.hasIndoorLoc=!1,this.ak="",this.minTimeQueryServer=1e3,this.haveReceiveSessionMsg=!0,this.haveTrackFrame=!1,this.minDistanceToFinalThreshold=this._configData.minTriggerDistance.final,this.minDistanceToTransferThreshold=this._configData.minTriggerDistance.transfer,this.btDataPath=null,this.startTime=0,this.geo_map_transform_matrix=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.with_bt_but_not_work=!1,this.userId="default_user"}forEachMap(){let t=this;t._configData.map.forEach(e=>{e.floor_id===t.locationOption.floor_id&&(console.log("item.ak =",e.ak),""===e.ak||void 0===e.ak?t.locationOption.onBluetoothAndScanStatus({type:100,msg:"只开启ocr扫描"}):(t.ak=e.ak,console.log("需要打开蓝牙 ak = ",t.ak),wx.getSetting({success(e){e.authSetting["scope.bluetooth"]?(wx.openBluetoothAdapter({success:e=>{t.locationOption.onBluetoothAndScanStatus({type:1,msg:"蓝牙已打开"}),t.getWxBtLocation()},fail:e=>{console.log("打开蓝牙错误:",e),t.locationOption.onBluetoothAndScanStatus({type:99,msg:"提示打开蓝牙"})}}),wx.onBluetoothAdapterStateChange((function(e){t.locationOption.onBluetoothAndScanStatus({type:e.available,msg:"打开蓝牙"})}))):wx.authorize({scope:"scope.bluetooth",success(){wx.openBluetoothAdapter({success:e=>{t.locationOption.onBluetoothAndScanStatus({type:1,msg:"蓝牙已打开"}),t.getWxBtLocation()},fail:e=>{console.log("打开蓝牙错误:",e),t.locationOption.onBluetoothAndScanStatus({type:99,msg:"提示打开蓝牙"})}}),wx.onBluetoothAdapterStateChange((function(e){t.locationOption.onBluetoothAndScanStatus({type:e.available,msg:"打开蓝牙"})}))}})}})))})}initSystemInfo(){let t;wx.getSystemInfo({success:e=>{this.phonetype=e.system,console.log("phonetype = ",this.phonetype),t=e.platform}}),"ios"===t&&(F=1),function(t){let e=t.getAccountInfoSync().miniProgram.appId;e=Q(e+"*-#-$--%%%=216").toUpperCase();for(let t=0;t{(E=e.instance.exports).set_device_platform(F),t.setAlgoParam(),E.set_date_time(X),console.log("WXWebAssembly-初始化成功",E);let i=E.add_test();console.log("verifyResult = ",i)},t=>{console.log("WXWebAssembly-初始化失败",t)})}initAccelerometer(){wx.startAccelerometer({interval:"ui"}),wx.onAccelerometerChange(t=>{let e=this.algorithm.stepFunc(t.x,t.y,t.z,E);e.acc=[(9.8*t.x).toFixed(2),(9.8*t.y).toFixed(2),(9.8*t.z).toFixed(2)],void 0!==this.orientation?e.orientation=[this.orientation[0].toFixed(2),this.orientation[1].toFixed(2),this.orientation[2].toFixed(2)]:e.orientation=[0,0,0],this.acc=[9.8*t.x,9.8*t.y,9.8*t.z],this.locationOption.onStep(e),void 0!==this.locationOption.onSaveAcc&&this.locationOption.onSaveAcc(this.acc)})}stopAccelerometer(){wx.stopAccelerometer({success:t=>{console.log("success = ",t)},fail:t=>{console.log("fail = ",t)}})}initDevice(){wx.startDeviceMotionListening({interval:"ui"}),wx.onDeviceMotionChange(t=>{B=this.algorithm.odometryFunc(t.alpha,t.beta,t.gamma,E),this.orientation=[t.alpha,t.beta,t.gamma],Math.abs(t.beta)<45&&j&&void 0!==this.locationOption&&this.locationOption.onError({type:10010,msg:"手机姿态异常"})})}stopDevice(){wx.stopDeviceMotionListening({success:t=>{console.log("success = ",t)},fail:t=>{console.log("fail = ",t)}})}setLoactionData(t,e){this.locationOption=t,e.map.forEach(e=>{if(e.floor_id===t.floor_id){if(this.ak=e.ak,this.algorithm.set_map_transform(e.transform_matrix,e.scale),void 0!==e.geo_map_transform_matrix&&(this.geo_map_transform_matrix=e.geo_map_transform_matrix,this.algorithm.set_geo_map_transform(e.geo_map_transform_matrix)),void 0!==E)for(let t=0;t<12;t++)E.set_geo_to_vpas_transform_matrix(1,this.geo_map_transform_matrix[t],t);0===e.is_park||void 0===e.is_park?(this.isPark=!1,$=""):(this.isPark=!0,$="")}}),this.startLocation=!0}setCanvasData(t){this._canvas=t}setGlCanvas(t){this.gl_canvas=t}initCamera(){let t,e;V=(new Date).getTime(),N=V;let i=!1,s=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],n=[-1,-1,0],r=3;t=this.cContex.onCameraFrame(t=>{if(i||void 0!==this._canvas&&(this._canvas.width=t.width,this._canvas.height=t.height,i=!0),i){let i=o(t);if(0===Z.f1&&0===Z.f2&&0===Z.f3&&0===Z.f4&&this.isPark){console.log("canvas size = ",this.gl_canvas.width/3,this.gl_canvas.height/3,i.width,i.height);let t=this.gl_canvas.width/3*4/5,e=this.gl_canvas.height/3*1/10,o=(this.gl_canvas.height/3-e)/2,s=(this.gl_canvas.width/3-t)/2;Z=function(t,e,i,o,s,n,r,a){let l=t-(s-r)/2,h=e-(n-a)/2;return[l,h,i+l,o+h]}(s,o,t,e,this.gl_canvas.width/3,this.gl_canvas.height/3,i.width,i.height)}if(null!==B&&!0===this.startLocation&&void 0!==this._canvas){null===J&&this.haveReceiveSessionMsg&&(this.severInterface.createSession(this.locationOption).task.then(t=>{0===t.data.err_code?J=t.data.data.session_id:(this.locationOption.onError({type:10003,msg:t.data.msg}),console.log(t.data.msg)),this.haveReceiveSessionMsg=!0}),this.haveReceiveSessionMsg=!1);let t=(new Date).getTime(),o=t-V,h=t-N;if(null!==J&&this.haveReceiveSessionMsg){var l={};if(o>this.minTimeQueryServer&&!q&&!this.haveTrackFrame&&void 0!==this.acc){if(this.haveTrackFrame=!0,""!==this.ak&&void 0!==this.ak){if(E.get_vpas_translation_from_geo)for(let t=0;t<3;t++)n[t]=E.get_vpas_translation_from_geo(t);if(-1!==n[0]&&-1!==n[1]&&n[0]!==Number.NaN&&n[1]!==Number.NaN&&""!==n[0]&&""!==n[1]){s[0]=n[0],s[1]=n[1],r=1;let t={type:r,prior:null,priorAccuracy:10,priorConfidence:0},e=a(s),i=1;t.prior=e,t.priorConfidence=i,Y[0]=t,this.with_bt_but_not_work=!1}else this.with_bt_but_not_work=!0,this.haveTrackFrame=!1}if(void 0!==this.renderer.priorCrossFloor&&!j){E.transform_map_coodinate_to_translation(this.renderer.priorCrossFloor[0],this.renderer.priorCrossFloor[1]);let t=[];for(let e=0;e<2;e++)t[e]=E.get_transform_vpas_translation(e);s[0]=t[0],s[1]=t[1],r=1;let e={type:r,prior:null,priorAccuracy:10,priorConfidence:0},i=a(s),o=1;e.prior=i,e.priorConfidence=o,Y[0]=e}e={pixels:i.data,pixelWidth:i.width,pixelHeight:i.height,phonetype:this.phonetype,lng:void 0,lat:void 0,posePriors:Y,odometry:B,ocrStatus:$,ocrCoordinate:Z,acc:this.acc,deviceOrientation:this.orientation,floorId:this.locationOption.floor_id};let t=S(J,this._canvas,e,0,this.locationOption,this.userId);if(t!=={}&&!this.with_bt_but_not_work){let e=this.severInterface.sendTrackframe(t).trackframe;if(void 0===e)return void(this.haveTrackFrame=!1);V=(new Date).getTime(),1,e.then(t=>{if(this.haveTrackFrame=!1,!0===t.vpsStatus&&this.startLocation){$="",t.wasmFunction=E,l.vpsStatus=t.vpsStatus,l.vpsPose=t.vpsPose,l.trackerPose=t.trackerPose;let e=this.algorithm.locationSuccessEvery(E,l);if(null===e)W=!1;else{N=(new Date).getTime(),W=!0,t.locX=e.locX,t.locY=e.locY,t.vpasX=e.vpasX,t.vpasY=e.vpasY,G=e.vpasX,K=e.vpasY,j||(this.locationOption.onFirstSuccess(t),j=!0,this.minTimeQueryServer=1500),1;let i={locStatus:!0,locX:e.locX,locY:e.locY};this.locationOption.onLocateEvent(i)}}else{let t={locStatus:!1};this.locationOption.onLocateEvent(t)}-1===t.vpsStatusMsg&&(console.log("无效的车位号"),this.locationOption.onError({type:10009,msg:"无效的车位号"})),(!1===t.vpsStatus&&!1===j||!1===W)&&(h>5e3&&!1===z&&(this.locationOption.onError({type:10005,msg:"首帧定位超时5s"}),z=!0),h>8e3&&!1===U&&(this.locationOption.onError({type:10007,msg:"首帧定位超时8s"}),U=!0))}),this.haveTrackFrame=!1}}}}if(H&&j&&!q){let t=this.algorithm.locationOnceSuccessFun(E,this.renderer);if(null===t)return;let e={type:t.priorType,prior:null,priorAccuracy:10,priorConfidence:0};e.prior=t.posePriors,e.priorConfidence=t.priorConfidence,Y[0]=e,t.vpasX=G,t.vpasY=K,this.locationOption.distanceOfNextPoint(t.distanceToNextPoint),this.locationOption.onEverySuccess(t),(t.distance=s){let r=n.add(this.segments[i].direction().multiplyScalar(s));e.push(r),n=r.clone(),o+=s,s=t}else s-=a,n=this.segments[i].ep.clone(),i+=1,o=0;i>=this.segments.length&&(r=!0)}return e}}class ot{constructor(t,e,i,o,s){this.THREE=t,this.scene=e,this.camera=i,this.onResLoaded=o,this.onScreenModelInfo=s.onScreenArrow,this.onScreenModel=void 0,this.loadArrowModel(),this.position=new t.Vector3(0,-.05,-.25)}loadArrowModel(){let t=this.THREE,e=this.onScreenModelInfo.arrowURL.split("/");console.log("onScreenModelInfo url = ",e);let i=e[e.length-1],o=this.onScreenModelInfo.arrowURL.replace(i,""),s=this.onScreenModelInfo.arrowPosition,n=this.onScreenModelInfo.arrowRotation,r=this.onScreenModelInfo.arrowScale;const a=(new t.GLTFLoader).setPath(o);let l=this;a.load(i,(function(t){l.onScreenModel=t.scene,l.onScreenModel.position.set(s[0],s[1],s[2]),l.onScreenModel.scale.set(r[0],r[1],r[2]),l.onScreenModel.visible=!1,l.onScreenModel.rotateX(n[0]),l.onResLoaded(),console.log("ARNaviRenderer Res Loaded"),l.camera.add(l.onScreenModel)}))}setScreenArrowPosition(t){this.position=t}reset(t){void 0!==this.onScreenModel&&(this.onScreenModel.visible=!1,t&&(this.camera.remove(this.onScreenModel),this.onScreenModel=void 0))}release(){void 0!==this.onScreenModel&&(this.onScreenModel.visible=!1,this.camera.remove(this.onScreenModel),this.onScreenModel=void 0)}hide(){void 0!==this.onScreenModel&&(this.onScreenModel.visible=!1)}update(t){void 0!==this.onScreenModel?(this.onScreenModel.visible=!0,this.onScreenModel.position.set(this.position.x,this.position.y,this.position.z),this.onScreenModel.quaternion.x=t.x,this.onScreenModel.quaternion.y=t.y,this.onScreenModel.quaternion.z=t.z,this.onScreenModel.quaternion.w=t.w,this.onScreenModel.rotateZ(Math.PI)):console.log("this.onScreenModel === undefined")}}class st{constructor(t,e,i,o,s){this.THREE=t,this.scene=e,this.camera=i,this.onResLoaded=o,this.arrowRenderMode=2,this.arrowInfo=s.arrow,this.finalInfo=s.final,this.onScreenArrowCtrl=new ot(t,e,i,o,s),this.arrows=[],this.allFinalWayPointsModel=[],this.loadArrowModel(),this.loadFinalModel(0,0,0),this.inited=!1,this.oneMaterial=new t.MeshStandardMaterial({color:350973}),this.twoMaterial=new t.MeshStandardMaterial({color:41120}),this.allModels=[],this.allModelsStatus=[1,1,1,1,1,1],this.frameCount=0,this.intervalCount=15,this.showArrowCount=6,this.lastWayPointPosition=void 0,this.speed=s.arrow.arrowMoveSpeed,this.time=[],this.localWayPoints=[],this.destination=[],this.positionKF=null,this.mixer=null,this.clipAction=null,this.clip=null,this.clock=new t.Clock,this.moveArrow=null,this.localNextPoint=[30,0,0],this.localNextNextPoint=[0,20,0],this.localNextNextNextPoint=[0,0,0],this.newLocalNextPoint=[0,0,0],this.newLocalNextNextPoint=[0,0,0],this.cameraPosition=[0,0,0],this.moveStart=!0,this.totalTime=0,this.totalCountTime=0,this.moveArrowRenderMode=!0,this.moveArrowShowDistance=s.arrow.showDistance,this.finalShowDistance=s.final.showDistance,this.startTime=0,this.intervalTime=0,this.lastRadians=0,this.lostUpdateTime=0,this.segmentNum=2,this.locationOption=null,this.timeOut=this.arrowInfo.downloadTimeout}setScreenArrowPosition(t){void 0!==this.onScreenArrowCtrl&&this.onScreenArrowCtrl.setScreenArrowPosition(t)}loadFinalModel(t,e,i){let o=this.THREE,s=this.finalInfo.URL.split("/"),n=s[s.length-1],r=this.finalInfo.URL.replace(n,""),a=this.finalInfo.rotation,l=this.finalInfo.scale;const h=(new o.GLTFLoader).setPath(r);let c=this;h.load(n,(function(o){let s=o.scene;s.position.set(t,e,i),s.scale.set(l[0],l[1],l[2]),s.rotateX(a[0]),s.visible=!1,c.allFinalWayPointsModel.push(s),c.scene.add(s)}))}loadArrowModel(){let t=this.THREE,e=this.arrowInfo.arrowURL.split("/"),i=e[e.length-1],o=this.arrowInfo.arrowURL.replace(i,""),s=this.arrowInfo.arrowPosition,n=this.arrowInfo.arrowRotation,r=(new t.GLTFLoader).setPath(o),a=this;r.load(i,(function(t){a.arrow_prototype=t.scene,a.arrow_prototype.position.set(s[0],s[1],s[2]),a.arrow_prototype.visible=!1,a.arrow_prototype.rotateX(n[0]),a.onResLoaded(),console.log("ARNaviRenderer Res Loaded")}))}setMoveArrow(){if(void 0===this.arrow_prototype)return;let t=this.arrow_prototype.clone();t.scale.set(100,100,100),t.rotateZ(Math.PI/2),t.rotateX(-Math.PI/2),t.visible=!1,this.moveArrow=t.clone(),this.moveArrow.position.set(0,0,0),1!==this.arrowRenderMode&&this.scene.add(this.moveArrow)}setArrow(t){let e=this.arrow_prototype.clone();e.position.set(t.x,t.y,t.z),e.scale.set(this.arrowInfo.arrowScale[0],this.arrowInfo.arrowScale[1],this.arrowInfo.arrowScale[2]),e.rotateZ(this.arrowInfo.arrowRotation[2]),e.rotateX(this.arrowInfo.arrowRotation[0]),e.rotateY(this.arrowInfo.arrowRotation[1]),e.visible=!1,this.arrows.push(e),this.moveArrow=e.clone(),this.moveArrow.position.set(this.arrowInfo.arrowPosition),1!==this.arrowRenderMode&&(this.scene.add(e),this.scene.add(this.moveArrow))}setArrowRenderMode(t){this.arrowRenderMode=t,console.log("this.arrowRenderMode = ",this.arrowRenderMode),0===this.arrowRenderMode&&void 0!==this.onScreenArrowCtrl&&this.onScreenArrowCtrl.reset()}updateRoute(t,e,i){this.lastWayPointPosition=t[t.length-1].clone(),t.push(e),this.locationOption=i;let o=(new Date).getTime(),s=0;for(;void 0===this.arrow_prototype;){if(this.locationOption.onResourceLoaded({status:-1}),(new Date).getTime()-o>=this.timeOut&&(this.loadArrowModel(),o=(new Date).getTime(),s+=1),2===s)return this.locationOption.onResourceLoaded({status:-2}),void console.log("load arrow model time is out")}this.locationOption.onResourceLoaded({status:0}),void 0!==this.allFinalWayPointsModel[0]&&(this.allFinalWayPointsModel[0].position.set(e.x,e.y,e.z-0),this.scene.add(this.allFinalWayPointsModel[0]));let n=new it(t).sampling(1);this.arrows.length=0;for(let t=0;t=t*this.intervalCount&&this.frameCount<(t+1)*this.intervalCount)for(let e=0;e1&&(r=1),Math.acos(r)}getFootOfPerpendicular(t,e,i){let o=this.THREE;const s=e[0]-i[0],n=e[1]-i[1],r=e[2]-i[2];if(Math.abs(s)<1e-8&&Math.abs(n)<1e-8&&Math.abs(r)<1e-8)return e;let a=(t.x-e[0])*(e[0]-i[0])+(t.y-e[1])*(e[1]-i[1])+(t.z-e[2])*(e[2]-i[2]);return a/=Math.pow(s,2)+Math.pow(n,2)+Math.pow(r,2),new o.Vector3(e[0]+a*s,e[1]+a*n,e[2]+a*r)}decidePointBetweenTwo(t,e,i){if(void 0===t||void 0===e||void 0===i)return!1;let o=this.getFootOfPerpendicular(t,e,i),s=new this.THREE.Vector3(e[0],e[1],e[2]),n=new this.THREE.Vector3(i[0],i[1],i[2]);this.distanceCameraToFootPoint=L(o,t),this.segmentLength=L(s,n),this.footPointToFirstPointDistance=L(s,o);let r=new this.THREE.Vector3;r.subVectors(s,o);let a=new this.THREE.Vector3;a.subVectors(n,o);let l=r.dot(a)/(r.length()*a.length());l>1&&(l=1),l<-1&&(l=-1);let h=180*Math.acos(l)/Math.PI;return!(h>=0&&h<90)}update(t,e,i,o,s,n,r,a){if(0===s.length)return console.error("Error:::remainingWayPoints length is 0!"),[void 0,void 0,void 0,void 0];n||r||(this.isAlmostArrive=3===o||4===o||5===o||6===o||7===o||8===o||9===o),0===this.startTime||(this.intervalTime=(new Date).getTime()-this.startTime),this.startTime=(new Date).getTime();let l=this.THREE;if(!this.inited)return[0,void 0,void 0,void 0];if(this.moveArrowRenderMode){if(null!==this.moveArrow&&this.moveStart&&void 0!==this.clock){this.totalCountTime=0,this.moveArrow.visible=!0,this.time=[0],this.localWayPoints=[];let e=Math.sqrt(Math.pow(t.x-s[0][0],2)+Math.pow(t.y-s[0][1],2)),i=0,o=0,n=0,r=0;if(this.localWayPoints.push([t.x,t.y,0]),e>this.moveArrowShowDistance){let e=s[0][0]-t.x,i=s[0][1]-t.y,o=Math.sqrt(e*e+i*i);this.localWayPoints.push([t.x+this.moveArrowShowDistance*e/o,t.y+this.moveArrowShowDistance*i/o,0]),this.time.push(this.moveArrowShowDistance/this.speed),this.totalTime=this.time[1]}else{for(r=1,o=e,this.localWayPoints.push(s[0]),this.time.push(e/this.speed),this.totalTime=this.time[1];os.length-1);)i=Math.sqrt(Math.pow(s[r][0]-s[r-1][0],2)+Math.pow(s[r][1]-s[r-1][1],2)),o+=i,this.localWayPoints.push(s[r]),this.time.push(this.time[r]+i/this.speed),r++;if(o>=this.moveArrowShowDistance){n=this.moveArrowShowDistance-o+i;let t=s[r-1][0]-s[r-2][0],e=s[r-1][1]-s[r-2][1],a=Math.sqrt(t*t+e*e);this.localWayPoints[r][0]=this.localWayPoints[r-1][0]+n*t/a,this.localWayPoints[r][1]=this.localWayPoints[r-1][1]+n*e/a,this.time[r]=this.time[r-1]+n/this.speed,this.totalTime=this.time[r]}else r>1&&(this.localWayPoints.push(s[r-1]),i=Math.sqrt(Math.pow(s[r-1][0]-s[r-2][0],2)+Math.pow(s[r-1][1]-s[r-2][1],2)),this.time.push(this.time[r-1]+i/this.speed),this.totalTime=this.time[r])}let a=[];for(let t=0;t=this.totalTime&&(this.clipAction.stop(),this.mixer.uncacheAction(this.clipAction,this.moveArrow),this.positionKF,this.clip=null,this.moveArrow.position.set(this.camera.position),this.moveStart=!0,this.localWayPoints[1][0]+=1e-7,this.localWayPoints[1][2]=0,t.fromArray(this.localWayPoints),this.moveArrow.lookAt(t),this.moveArrow.rotateX(this.arrowInfo.arrowRotation[0]),this.moveArrow.rotateY(this.arrowInfo.arrowRotation[1]),this.moveArrow.rotateZ(this.arrowInfo.arrowRotation[2])),this.totalCountTime>=this.time[this.time.length-2]&&this.totalCountTime3)for(let e=1;e=this.time[e]&&this.totalCountTime1&&(p.x=this.localWayPoints[this.localWayPoints.length-1][0],p.y=this.localWayPoints[this.localWayPoints.length-1][1]);let y=this.calculateNaviArrowOrientation(t,p,c);f=y[1],u=y[0];let m=new l.Euler(Math.PI/2,u,0,"XYZ"),g=new l.Matrix4,v=new l.Matrix4;v.makeRotationFromEuler(m),g=(new l.Matrix4).getInverse(e),g.multiply(v);let w=new l.Euler;if(w.setFromRotationMatrix(g),0!==this.arrowRenderMode){let t=new l.Quaternion;t.setFromRotationMatrix(g),this.onScreenArrowCtrl.update(t)}if(!this.moveArrowRenderMode&&(fthis.finalShowDistance||7!==o)){for(let t=0;t{t.isMesh&&(t.material=s)}),i.panel=o}))}loadTextFont(){let t=this.THREE,e=this;(new t.FontLoader).load("https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/font/PingFang_SC_Regular_Regular.json",(function(t){e.font=t}))}reset(t){void 0!==this.textMesh&&(this.scene.remove(this.textMesh),t&&(this.textMesh=void 0)),void 0!==this.panel&&(this.scene.remove(this.panel),t&&(this.panel=void 0)),void 0!==this.font&&t&&(this.font=void 0)}createText(t,e,i){let o=this.THREE;if(void 0!==this.panel&&(this.panel.visible=!0),t!==this.last_message){void 0!==this.textMesh&&(this.scene.remove(this.textMesh),this.textMesh.geometry.dispose(),this.textMesh.material.dispose(),this.textMesh=void 0);let e=new o.MeshBasicMaterial({color:this.textColor,transparent:!0,opacity:1,side:o.DoubleSide}),i=this.font.generateShapes(t+"米",.15),s=new o.ShapeBufferGeometry(i);s.computeBoundingBox(),this.textMesh=new o.Mesh(s,e),this.textMesh.rotation.x=-Math.PI/2,this.textMesh.rotation.y=0,this.textMesh.add(this.panel),this.scene.add(this.textMesh),this.last_message=t,s.center()}this.textMesh.position.set(e.x,e.y,e.z-1.7),void 0!==this.textMesh&&void 0!==this.panel&&(this.textMesh.rotation.y=-D(this.textMesh.position,i),this.panel.rotation.x=-1*Math.PI/180,this.panel.position.set(0,0,-.1))}loadTextModel(t,e,i){void 0!==this.font&&this.createText(t,e,i)}hideTextModel(){void 0!==this.textMesh&&(this.textMesh.visible=!1),void 0!==this.panel&&(this.panel.visible=!1)}setVisible(t){void 0!==this.textMesh&&(this.textMesh.visible=t)}}class rt{constructor(t,e,i,o,s,n,r,a){this.THREE=t,this.scene=e,this.configInfo=r,this.isShow=a,this.turnLeftAngleThreshold=this.configInfo.turnLeft.angleThreshold,this.turnRightAngleThreshold=this.configInfo.turnRight.angleThreshold,this.showDistance=15,n?(this.location=new t.Vector3(s.x,s.y,s.z),this.postLocation=new t.Vector3(i.x,i.y,i.z),this.preLocation=new t.Vector3(o.x,o.y,o.z)):(this.location=new t.Vector3(i.x,i.y,i.z),this.postLocation=new t.Vector3(s.x,s.y,s.z),this.preLocation=new t.Vector3(o.x,o.y,o.z)),this.isAppended=n,this.isLeftArrow=!1,this.model=void 0,this.angle=0,this.angleThreshold=15,this.isAppended&&(this.angleThreshold=10),this.isNormalArrow=!1,this.isLeft()?this.angle>this.turnLeftAngleThreshold?(this.loadModelLeft(),this.isLeftArrow=!0):this.isNormalArrow=!0:this.angle>this.turnRightAngleThreshold?(this.loadModelRight(),this.isLeftArrow=!1):this.isNormalArrow=!0,this.arTextCtrl=new nt(t,e,r),this.distance=Number.MAX_VALUE}reset(t){void 0!==this.model&&(this.scene.remove(this.model),t&&(this.model=void 0)),void 0!==this.arTextCtrl&&(this.arTextCtrl.reset(),t&&(this.arTextCtrl=void 0))}loadModelLeft(){let t=this.THREE;this.showDistance=this.configInfo.turnLeft.showDistance;let e=this.configInfo.turnLeft.URL,i=e.split("/"),o=i[i.length-1],s=e.replace(o,""),n=this.configInfo.turnLeft.scale,r=this.configInfo.turnLeft.rotation;const a=(new t.GLTFLoader).setPath(s);let l=this;a.load(o,(function(e){console.log("zuo.gltf loaded");let i=e.scene;i.scale.set(n[0],n[1],n[2]),i.visible=!0,i.rotateX(r[0]),i.rotateY(r[1]),i.rotateZ(r[2]),l.m_model=i;let o=new t.Object3D;o.add(i),l.model=o,l.model.position.set(l.location.x,l.location.y,-1.5),l.scene.add(l.model),l.model.visible=!1}))}loadModelRight(){let t=this.THREE;this.showDistance=this.configInfo.turnRight.showDistance;let e=this.configInfo.turnRight.URL,i=e.split("/"),o=i[i.length-1],s=e.replace(o,""),n=this.configInfo.turnRight.scale,r=this.configInfo.turnRight.rotation;const a=(new t.GLTFLoader).setPath(s);let l=this;a.load(o,(function(e){console.log("you.gltf loaded");let i=e.scene;i.scale.set(n[0],n[1],n[2]),i.visible=!0,i.rotateZ(r[2]),i.rotateX(r[0]),i.rotateY(r[1]),l.m_model=i;let o=new t.Object3D;o.add(i),l.model=o,l.model.position.set(l.location.x,l.location.y,-1.5),l.scene.add(l.model),l.model.visible=!1}))}isLeft(){let t=this.THREE,e=new t.Vector3,i=new t.Vector3;this.isAppended?(e.subVectors(this.location,this.preLocation),i.subVectors(this.postLocation,this.preLocation)):(e.subVectors(this.location,this.preLocation),i.subVectors(this.postLocation,this.location)),e.normalize(),i.normalize();let o=new t.Vector3;o.crossVectors(e,i);let s=e.dot(i)/(e.length()*i.length());s>1?s=1:s<-1&&(s=-1),this.angle=180*Math.acos(s)/Math.PI;let n=!1;return n=this.isAppended?o.z>0:o.z<0,n}setVisible(t){void 0!==this.model&&(t&&this.distancethis.showDistance)this.model.visible=!1,this.arTextCtrl.hideTextModel();else{this.model.visible=!0;let e=Math.round(this.distance);this.arTextCtrl.loadTextModel(e,this.location,t)}return this.model.position.set(this.location.x,this.location.y,-1.5),this.model.rotation.z=D(this.model.position,t),e=null,[this.distance,this.isLeftArrow,this.location]}}class at{constructor(t,e,i,o,s){this.THREE=t,this.scene=e,this.isUp=o,this.configInfo=s,this.showDistance=15,this.location=new t.Vector3(i.x,i.y,i.z),this.model=null,this.isUp?this.loadModelUp():this.loadModelDown(),console.log("Load EscalatorCtrl"),this.arTextCtrl=new nt(t,e,s),this.distance=Number.MAX_VALUE}reset(t){null!==this.model&&(this.scene.remove(this.model),t&&(this.model=null)),void 0!==this.arTextCtrl&&(this.arTextCtrl.reset(),t&&(this.arTextCtrl=void 0))}setVisible(t){null!==this.model&&(t&&this.distancethis.showDistance)this.model.visible=!1,this.arTextCtrl.hideTextModel();else{this.model.visible=!0;let e=Math.round(this.distance);this.arTextCtrl.loadTextModel(e,this.location,t)}return this.model.position.set(this.location.x,this.location.y,-1.5),this.model.rotation.z=D(this.model.position,t),e=null,[this.distance,this.isUp,this.location]}}class lt{constructor(t,e,i,o,s){this.THREE=t,this.scene=e,this.isUp=o,this.configInfo=s,this.showDistance=15,this.location=new t.Vector3(i.x,i.y,i.z),this.model=null,this.isUp?this.loadModelUp():this.loadModelDown(),console.log("Load ElevatorCtrl"),this.arTextCtrl=new nt(t,e,s),this.distance=Number.MAX_VALUE}reset(t){null!==this.model&&(this.scene.remove(this.model),t&&(this.model=null)),void 0!==this.arTextCtrl&&(this.arTextCtrl.reset(),t&&(this.arTextCtrl=void 0))}setVisible(t){null!==this.model&&(t&&this.distancethis.showDistance)this.model.visible=!1,this.arTextCtrl.hideTextModel();else{this.model.visible=!0;let e=Math.round(this.distance);this.arTextCtrl.loadTextModel(e,this.location,t)}return this.model.position.set(this.location.x,this.location.y,-1.5),this.model.rotation.z=D(this.model.position,t),e=null,[this.distance,this.isUp,this.location]}}var ht=1,ct=1;class dt{constructor(t,e,i,o,s){this.THREE=t,this.scene=e,this.camera=i,this.name=null,this.res_type=0,this.res_url=null,this.position=[0,0,0],this.orientation=[0,0,0],this.scale=1,this.event_type=0,this.event_url=null,this.showing=1,this.rotate_type=1,this.poiModel=null,this.box=null,this.eventCallBack=o,this.configInfo=s,this.rayCaster=new t.Raycaster,this.touchPoint=[0,0]}updateData(t,e,i,o,s,n,r,a,l,h){this.THREE;this.name=t,this.res_type="img"===e?0:1,this.res_url=i,console.log("this.res_type = ",this.res_type),this.position=JSON.parse(o),this.orientation=""===s?[0,0,0]:JSON.parse(s),this.event_type=r,this.event_url=a,this.showing=l,this.rotate_type=h,this.scale=n;var c=this;let d=this.res_url.split("://");"http"===d[0]&&(this.res_url=d[0]+"s://"+d[1]),0===this.res_type?wx.getImageInfo({src:this.res_url,success(t){ht=t.width,ct=t.height,c.createPoiContent(c.poiModel)}}):c.createPoiContent(c.poiModel)}createPoiContent(t){let e=this.THREE;switch(this.res_type){case 0:let t=(new e.TextureLoader).load(this.res_url),i=(new e.TextureLoader).load(this.res_url);i.center=new e.Vector2(.5,.5),i.rotation=Math.PI,i.flipY=!1;let o=[new e.MeshBasicMaterial({map:t,side:e.FrontSide}),new e.MeshBasicMaterial({map:i,side:e.BackSide})],s=new e.PlaneGeometry(1,ct/ht);for(let t=0,e=s.faces.length;t0){if(this.intersected=e[0].object,this.intersected.name==="poi"+this.name){console.log("processTouch object = ",this.name);let t={};t.poiName=this.name,t.eventType=this.event_type,t.eventUrl=this.event_url,this.eventCallBack.onPoiEvent(t)}}else this.intersected=null}}update(){if(null===this.poiModel)return;if(!this.showing&&null!==this.poiModel)return this.poiModel.visible=!1,void(null!==this.box&&(this.box.visible=!1));if(L(this.poiModel.position,this.camera.position)>this.configInfo.mapPoi.showDistance)return this.poiModel.visible=!1,void(null!==this.box&&(this.box.visible=!1));switch(this.poiModel.visible=!0,null!==this.box&&(this.box.visible=!0),this.rotate_type){case 1:this.poiModel.rotateY(.1);break;case 2:this.poiModel.rotation.y=-D(this.poiModel.position,this.camera.position),null!==this.box&&(this.box.rotation.y=-D(this.box.position,this.camera.position))}}}class ft{constructor(t,e,i,o,s){this.THREE=t,this.scene=e,this.isParkToMall=o,this.configInfo=s,this.showDistance=15,this.location=new t.Vector3(i.x,i.y,i.z),this.model=null,this.isParkToMall?this.loadPark():this.loadMall(),this.arTextCtrl=new nt(t,e,s),this.distance=Number.MAX_VALUE}reset(t){null!==this.model&&(this.scene.remove(this.model),t&&(this.model=null)),void 0!==this.arTextCtrl&&(this.arTextCtrl.reset(),t&&(this.arTextCtrl=void 0))}setVisible(t){null!==this.model&&(t&&this.distancethis.showDistance)this.model.visible=!1,this.arTextCtrl.hideTextModel();else{this.model.visible=!0;let e=Math.round(this.distance);this.arTextCtrl.loadTextModel(e,this.location,t)}return this.model.position.set(this.location.x,this.location.y,-1.5),this.model.rotation.z=D(this.model.position,t),[this.distance,this.isParkToMall,this.location]}}class ut{constructor(t,e,i,o,s){this.THREE=t,this.scene=e,this.isStepLadderUp=o,this.configInfo=s,this.showDistance=15,this.location=new t.Vector3(i.x,i.y,i.z),this.model=null,this.isStepLadderUp?this.loadStepLadderUp():this.loadStepLadderDown(),this.arTextCtrl=new nt(t,e,s),this.distance=Number.MAX_VALUE}reset(t){null!==this.model&&(this.scene.remove(this.model),t&&(this.model=null)),void 0!==this.arTextCtrl&&(this.arTextCtrl.reset(),t&&(this.arTextCtrl=void 0))}setVisible(t){null!==this.model&&(t&&this.distancethis.showDistance)this.model.visible=!1,this.arTextCtrl.hideTextModel();else{this.model.visible=!0;let e=Math.round(this.distance);this.arTextCtrl.loadTextModel(e,this.location,t)}return this.model.position.set(this.location.x,this.location.y,-1.5),this.model.rotation.z=D(this.model.position,t),[this.distance,this.isStepLadderUp,this.location]}}class pt{constructor(t,e,i){this.THREE=t,this.scene=e,this.location=new t.Vector3(i.x,i.y,i.z),this.distance=Number.MAX_VALUE}reset(){}setVisible(){}update(t){let e=new this.THREE.Vector3;return e.subVectors(this.location,t),e.z=0,this.distance=e.length(),[this.distance,0,this.location]}}var yt,mt;class gt{constructor(t,e,i,o){console.log("ARNaviRenderer constructor..."),this.THREE=t,this.canvas=e,this.onResLoaded=i,this.configInfo=o,this.minCoverPointDistance=this.configInfo.interaction.minCoverPointDistance,this.renderer=null,this.camera=null,this.scene=null,this.initScene(this.THREE,this.canvas),this.arrowCtrl=new st(t,this.scene,this.camera,i,this.configInfo),this.textCtrl=new nt(t,this.scene,this.configInfo,this.camera,i),this.wayPointCtrls=[],this.wayPointCtrlsClone=[],this.wayPointCtrlsStatus=[],this.driftAwayDistanceThreshold=5,this.driftAwayAngleThreshold=60,this.driftAwayAngle=0,this.nextLocation=void 0,this.nextNextLocation=void 0,this.final=void 0,this.finalClone=void 0,this.type=-1,this.way_point_index=0,this.min_distance=Number.MAX_VALUE,this.next_point_distance=Number.MAX_VALUE,this.allMapPois=[],this.touchPoint=[0,0],this.isTouch=!1,this.rayCaster=new t.Raycaster,this.naviData=void 0,this.haveFoundNextPoint=!1,this.cameraToLstFootPointDistance=Number.MAX_VALUE,this.distanceCameraToFootPoint=0,this.segmentLength=0,this.footPointToFirstPointDistance=0,this.nextPointIsFinal=!1,this.threshold_to_next_point=5,this.wayPointIndex=[],this.wayPointindexClone=[],this.nextIsFinal=!1,this.nextIsTransfer=!1,this.lastNextPoint=[0,0,0],this.lostUpdateTime=0,this.testLastNextPoint=void 0,this.newLocalWayPoints=[],this.localWayPoints=[],this.isInited=!1}screenCoordinate(t){this.touchPoint[0]=t.x/(this.canvas.width/2)*2-1,this.touchPoint[1]=-t.y/(this.canvas.height/2)*2+1}touchCancel(){}touchStart(){this.isTouch=!0}setPoiList(t,e){void 0!==t&&this.arrangePoiDatasWithJson(t,e)}renderWebGL(){let t=this.THREE;if(this.isTouch){let e=new t.Vector3(this.touchPoint[0],this.touchPoint[1],.5).unproject(this.camera);this.rayCaster.set(this.camera.position,e.sub(this.camera.position).normalize());let i=this.rayCaster.intersectObjects(this.scene.children,!0);console.log("intersects length = ",i.length,i);for(let t=0;ti){o=640*i/640}else{o=480/(480/i)}this.camera=new t.PerspectiveCamera(62,o,.01,1e3),this.scene=new t.Scene,this.renderer=new t.WebGLRenderer({canvas:e,antialias:!0,alpha:!0}),this.renderer.gammaOutput=!0,this.renderer.gammaFactor=2.2,this.renderer.setSize(2*e.width,2*e.height,!1),this.scene.add(this.camera);let s=new t.Color("#FFFFFF"),n=new t.DirectionalLight(s);n.position.set(1.1,3.1,-12.94),n.intensity=.7,this.scene.add(n);let r=new t.Color("#FFFFFF"),a=new t.AmbientLight(r);a.position.set(0,0,0),a.intensity=.9,this.scene.add(a)}getJson(t,e){wx.request({url:t,header:{"content-type":"application/json"},success:t=>{console.log(t.data),e(t.data)},fail:t=>{console.log("error message = ",t.data)}})}generateOtherRoute(t,e,i,o,s,n){this.THREE;for(let r=s;r3))break;this.generateOtherRoute(t,e,i,o,s,n)}}}updateOnScreenArrowPosition(t){this.arrowCtrl.setScreenArrowPosition(t)}drawRoute(t,e,i,o,s){let n=this.THREE;this.naviData=t,this.arrowCtrl.setArrowRenderMode(o.ArrowRenderMode.mode);let r=o.ThreeDofArrowPosition.position;this.arrowCtrl.setScreenArrowPosition(new n.Vector3(r[0],r[1],r[2])),this.final=new n.Vector3(0,0,0),1===o.InputCoordinateMode.mode?(this.final=e,this.finalClone=new n.Vector3(this.final.x,this.final.y,this.final.z)):(i.transform_map_coodinate_to_translation(e.x,e.y),this.final.x=i.get_transform_vpas_translation(0),this.final.y=i.get_transform_vpas_translation(1),this.finalClone=new n.Vector3(this.final.x,this.final.y,this.final.z));let a=[],l=[];for(let e=0;e0){let s=null,a=null,h=t[e-1],c=void 0;if(c=e===t.length-1?this.final:t[e+1],1===o.InputCoordinateMode.mode)s=new n.Vector3(h.x,h.y,0),a=new n.Vector3(c.x,c.y,0);else{i.transform_map_coodinate_to_translation(h.x,h.y);for(let t=0;t<2;t++)l[t]=i.get_transform_vpas_translation(t);if(s=new n.Vector3(l[0],l[1],0),e===t.length-1)a=new n.Vector3(c.x,c.y,0);else{i.transform_map_coodinate_to_translation(c.x,c.y);for(let t=0;t<2;t++)l[t]=i.get_transform_vpas_translation(t);a=new n.Vector3(l[0],l[1],0)}}let d=new rt(this.THREE,this.scene,r,s,a,!1,this.configInfo),f=new rt(this.THREE,this.scene,r,s,a,!1,this.configInfo);if(d.isNormalArrow){let t=new pt(this.THREE,this.scene,r),e=new pt(this.THREE,this.scene,r);this.wayPointCtrls.push(t),this.wayPointCtrlsClone.push(e)}else this.wayPointCtrls.push(d),this.wayPointCtrlsClone.push(f),this.wayPointIndex.push(this.wayPointCtrls.length-1),this.wayPointindexClone.push(e)}let a=!0,h=!0,c=void 0,d=void 0;switch(s.pointType){case 4:a=!0,c=new at(this.THREE,this.scene,r,a,this.configInfo),d=new at(this.THREE,this.scene,r,a,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1);break;case 5:a=!1,c=new at(this.THREE,this.scene,r,a,this.configInfo),d=new at(this.THREE,this.scene,r,a,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1);break;case 2:a=!0,c=new lt(this.THREE,this.scene,r,a,this.configInfo),d=new lt(this.THREE,this.scene,r,a,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1);break;case 3:a=!1,c=new lt(this.THREE,this.scene,r,a,this.configInfo),d=new lt(this.THREE,this.scene,r,a,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1);break;case 7:h=!1,c=new ft(this.THREE,this.scene,r,h,this.configInfo),d=new ft(this.THREE,this.scene,r,h,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1);break;case 8:h=!0,c=new ft(this.THREE,this.scene,r,h,this.configInfo),d=new ft(this.THREE,this.scene,r,h,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1);break;case 9:a=!0,c=new ut(this.THREE,this.scene,r,a,this.configInfo),d=new ut(this.THREE,this.scene,r,a,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1);break;case 10:a=!1,c=new ut(this.THREE,this.scene,r,a,this.configInfo),d=new ut(this.THREE,this.scene,r,a,this.configInfo),this.wayPointCtrls.push(c),this.wayPointCtrlsClone.push(d),this.wayPointIndex.push(this.wayPointCtrls.length-1)}}console.log("after regenerate route, this.wayPointCtrls.length = ",this.wayPointCtrls.length),console.log("this.wayPointIndex = ",this.wayPointIndex);for(let t=0;tthis.driftAwayAngleThreshold&&n>this.driftAwayDistanceThreshold){let t=new o.Vector3;if(t.crossVectors(r,a),t.z<0){return 0}return 1}return 2}getFootOfPerpendicular(t,e,i){let o=this.THREE;const s=e.x-i.x,n=e.y-i.y,r=e.z-i.z;if(Math.abs(s)<1e-8&&Math.abs(n)<1e-8&&Math.abs(r)<1e-8)return e;let a=(t.x-e.x)*(e.x-i.x)+(t.y-e.y)*(e.y-i.y)+(t.z-e.z)*(e.z-i.z);return a/=Math.pow(s,2)+Math.pow(n,2)+Math.pow(r,2),new o.Vector3(e.x+a*s,e.y+a*n,e.z+a*r)}decidePointBetweenTwo(t,e,i){if(void 0===t||void 0===e||void 0===i)return[!1,[0,0,0]];let o=this.getFootOfPerpendicular(t,e,i);this.distanceCameraToFootPoint=L(o,t),this.segmentLength=L(e,i),this.footPointToFirstPointDistance=L(e,o);let s=new this.THREE.Vector3;s.subVectors(e,o);let n=new this.THREE.Vector3;n.subVectors(i,o);let r=s.dot(n)/(s.length()*n.length());r>1&&(r=1),r<-1&&(r=-1);let a=180*Math.acos(r)/Math.PI;return a>=0&&a<90?[!1,o]:[!0,o]}updateNewLocalWayPoints(t,e,i){let o,s=this.THREE,n=[0,0,0];if(o=0===this.way_point_index?this.decidePointBetweenTwo(this.camera.position,new s.Vector3(t[0][0],t[0][1],t[0][2]),new s.Vector3(t[1][0],t[1][1],t[1][2])):this.decidePointBetweenTwo(this.camera.position,this.wayPointCtrls[this.way_point_index-1].location,this.wayPointCtrls[this.way_point_index].location),n=o[1],!i){for(let i=0;i0&&this.wayPointIndex.length>1){for(let t=0;tthis.min_distance&&(this.min_distance=p,this.next_point_distance=p),this.min_distance===Number.MAX_VALUE||this.next_point_distance===Number.MAX_VALUE)return this.type=-1,[u,c,this.next_point_distance,this.type,2,this.newLocalWayPoints]}let y=[0,0,0],m=[0,0,0],g=0;if(this.localWayPoints=[],this.wayPointCtrls.length>0){for(let t=this.way_point_index;t1){y=this.updateNewLocalWayPoints(this.localWayPoints,this.newLocalWayPoints,this.isInited),this.isInited=!0;let t=this.localWayPoints[0][0]-y.x,e=this.localWayPoints[0][1]-y.y,i=Math.sqrt(t*t+e*e),o=Math.sqrt(Math.pow(y.x-this.localWayPoints[0][0],2)+Math.pow(y.y-this.localWayPoints[0][1],2));if(m[0]=this.camera.position.x+o*t/i,m[1]=this.camera.position.y+o*e/i,g=Math.sqrt(Math.pow(this.camera.position.x-m[0],2)+Math.pow(this.camera.position.y-m[1],2)),this.min_distance=g,this.min_distancethis.wayPointIndex[this.wayPointIndex.length-1]||this.nextIsFinal)&&(Math.abs(this.final.x-this.wayPointCtrls[this.wayPointCtrls.length-1].location.x)<1e-7&&Math.abs(this.final.y-this.wayPointCtrls[this.wayPointCtrls.length-1].location.y)<1e-7?(this.arrowCtrl.hideFinalModel(),this.arrowCtrl.hideMoveArrowModel()):(this.next_point_distance=u,this.type=7,this.way_point_index===this.wayPointCtrls.length-1&&(this.min_distance=u,this.nextLocation=this.finalClone),void 0!==this.wayPointCtrls[this.way_point_index]&&this.wayPointCtrls[this.way_point_index].setVisible(!1),void 0!==this.wayPointCtrlsClone[this.way_point_index]&&this.wayPointCtrlsClone[this.way_point_index].setVisible(!1)));let v=this.arrowCtrl.update(this.camera.position,a,u,this.type,this.localWayPoints,this.nextIsFinal,this.nextIsTransfer,this.final);v[0];if(void 0!==v[1]){let t=(new s.Matrix4).getInverse(v[1]);h.multiply(t),c.setFromRotationMatrix(h,"XYZ")}let w=0,b=v[2];w=Math.abs(b)>20&&b<0?1:Math.abs(b)>20&&b>0?0:2;for(let t=0;t{this.updateRenderer()}),this.renderer.renderWebGL()}requestVPASLocation(t){!function(t){wx.getNetworkType({success(e){t.onNetWork({type:e.networkType,msg:"获取网络类型"})},fail(e){t.onError({type:10008,msg:"监听网络信号失败"})}}),wx.onNetworkStatusChange((function(e){e.isConnected?t.onNetWork({type:e.networkType,msg:"监听到网络状态发生变化"}):t.onError({type:10008,msg:"监听网络信号失败"})}))}(t),this.platform.setLoactionData(t,this._configData),this.resetARNavigationAgain(),this.requestGetPOi(t)}updateBluetoothLocation(t,e){this.platform.updateBluetoothLocation(t,e)}setUserId(t){this.platform.setUserId(t)}get2DPosition(){}getScreenCoordinate(t){this.renderer.screenCoordinate(t)}touchCancel(t){this.renderer.touchCancel()}touchStart(){this.renderer.touchStart()}requestGetPOi(t){this._configData.map.forEach(e=>{e.floor_id===t.floor_id&&void 0!==e.case_id&&""!==e.case_id&&this.severInterface.getMapPoi(Number(e.case_id)).getPoi.then(e=>{this.renderer.setPoiList(e.data.data.pois,t)})})}setNavigationData(t,e,i,o){console.log("naviData = ",t),this.renderer.drawRoute(t,e,i,this._configData,o)}startARNavigation(){vt=!0,this.platform.startARTrue(vt)}resetARNavigationAgain(){wt=!1,this.platform.resetARTrue(wt)}resetRender(){this.renderer.reset(),void 0!==this.intervalId&&(console.log("resetRender..."),clearInterval(this.intervalId))}releaseRender(){this.renderer&&this.renderer.dispose()}finishARNavigation(t){vt=!1,wt=!0,void 0!==this.platform&&(this.platform.stopARTrue(wt),this.platform.release(t)),void 0!==this.severInterface&&this.severInterface.destroylocatesession(),void 0!==this.renderer&&this.renderer.reset(t)}}function _t(){}function xt(t){wx.createSelectorQuery().select(t).fields({node:!0}).exec(t=>{const e=t[0].node;yt=e,mt.setCanvasData(yt)})}}]);void 0===VPASSDK&&console.error("esm-webpack-plugin: nothing exported!");const _VPASSDK$SDKWrapper=VPASSDK.SDKWrapper;export{_VPASSDK$SDKWrapper as SDKWrapper}; \ No newline at end of file diff --git a/pages/index/config.js b/pages/index/config.js new file mode 100644 index 0000000..3561cd8 --- /dev/null +++ b/pages/index/config.js @@ -0,0 +1,303 @@ +module.exports = { + // 有关接口 + interface: { + // baseURL + baseURL: "https://dusee.baidu.com", + // 创建 session 的接口 + sessionInterface: "/ar-vps-ui/createsession_poi_map", + // trackFrame 定位接口 + trackFrameInterface: "/ar-vps-ui/trackframe", + // 导航结束 销毁 session + destroySessionInterface: "/ar-vps-ui/sessiondestory", + getMapPoiBaseUrl: "https://dusee.baidu.com", + getMapPoiInterface: "/vpastob/inner/get_map_poi", + // 定义定位超时时间 + timeOut: 5 * 1000, + }, + // 有关地图 --- 一层商场使用独立的视觉地图,用map_id和poi_id表示; + map: [ + { + app_id: 0, + map_id: 193, + poi_id: 25, + floor_id: "B3", + transform_matrix: [1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0], // 表示视觉地图和2D地图之间的转换矩阵 + geo_map_transform_matrix: [ + 0.0000117466936564, + 0.000000189887476, + 0, + -0.0000002456396239, + 0.0000090804973974, + 0, + 0, + 0, + 1, + 116.32584837, + 39.78784125, + 0, + ], + scale: 5.6, // 表示视觉地图与2D地图之间的尺度变换 + // 0:表示非车库,1表示为车库 + is_park: 1, + // 不为空表示支持蓝牙定位,否则不支持蓝牙定位;具体数值由百度方提供 + ak: "4HLHLEsOD3OpdwlO", + case_id: "23", + }, + { + app_id: 0, + map_id: 193, + poi_id: 25, + floor_id: "B2", + transform_matrix: [1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0], // 表示视觉地图和2D地图之间的转换矩阵 + geo_map_transform_matrix: [ + 0.0000117257737436, + 0.000000195171089, + 0, + -0.0000002146964509, + 0.0000090049708756, + 0, + 0, + 0, + 1, + 116.32584014, + 39.7879071, + 0, + ], + scale: 5.6, // 表示视觉地图与2D地图之间的尺度变换 + // 0:表示非车库,1表示为车库 + is_park: 1, + // 不为空表示支持蓝牙定位,否则不支持蓝牙定位;具体数值由百度方提供 + ak: "4HLHLEsOD3OpdwlO", + // case_id: "22", + case_id: "58", + }, + { + app_id: 0, + map_id: 193, + poi_id: 25, + floor_id: "B1", + transform_matrix: [1, 0, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0], // 表示视觉地图和2D地图之间的转换矩阵 + geo_map_transform_matrix: [ + 0.0000115390412537, + 0.0000001639865905, + 0, + -0.0000002121341793, + 0.0000089200542687, + 0, + 0, + 0, + 1, + 116.32581195, + 39.78789641, + 0, + ], + scale: 5.6, // 表示视觉地图与2D地图之间的尺度变换 + // 0:表示非车库,1表示为车库 + is_park: 1, + // 不为空表示支持蓝牙定位,否则不支持蓝牙定位;具体数值由百度方提供 + ak: "4HLHLEsOD3OpdwlO", + case_id: "21", + }, + { + app_id: 0, + map_id: 193, + poi_id: 25, + floor_id: "F1", + transform_matrix: [ + -0.9650306770413328, + -0.2621369574920047, + 0, + -0.2621369574920047, + 0.9650306770413328, + 0, + 0, + 0, + 1, + 421.28192787, + 31.53136436, + 0, + ], // 表示视觉地图和2D地图之间的转换矩阵 + scale: 5.788425061257576, // 表示视觉地图与2D地图之间的尺度变换 + // 0:表示非车库,1表示为车库 + is_park: 0, + // 不为空表示支持蓝牙定位,否则不支持蓝牙定位;具体数值由百度方提供 + ak: "", + case_id: "66", + }, + { + app_id: 0, + map_id: 193, + poi_id: 25, + floor_id: "F2", + transform_matrix: [ + 0.8891579162272474, + 0.4576004900572795, + 0, + 0.4576004900572795, + -0.8891579162272474, + 0, + 0, + 0, + 1, + 571.10078532, + -245.82877513, + 0, + ], // 表示视觉地图和2D地图之间的转换矩阵 + scale: 5.862545391362199, // 表示视觉地图与2D地图之间的尺度变换 + // 与内容编辑平台绑定,从平台获取 + // 0:表示非车库,1表示为车库 + is_park: 0, + // 不为空表示支持蓝牙定位,否则不支持蓝牙定位;具体数值由百度方提供 + ak: "", + }, + { + app_id: 0, + map_id: 193, + poi_id: 25, + floor_id: "F3", + transform_matrix: [ + 0.8148392200653999, + 0.5796870180613556, + 0, + 0.5796870180613556, + -0.8148392200653999, + 0, + 0, + 0, + 1, + 583.57528358, + -239.44318034, + 0, + ], // 表示视觉地图和2D地图之间的转换矩阵 + scale: 5.858752899058012, // 表示视觉地图与2D地图之间的尺度变换 + // 0:表示非车库,1表示为车库 + is_park: 0, + // 不为空表示支持蓝牙定位,否则不支持蓝牙定位;具体数值由百度方提供 + ak: "", + }, + ], + // 有关渲染随屏箭头的配置 + ArrowRenderMode: { + mode: 2, // 0:只显示贴地箭头 1:只显示3Dof箭头 2:显示贴地箭头和3Dof剪头 + }, + // todo 暂时未开发 + ThreeDofArrowPosition: { + position: [0, -0.05, -0.25], + }, + InputCoordinateMode: { + mode: 0, // 0:表示使用的是2D地图坐标 1:表示使用的是3DVPAS地图坐标 + }, + // 是否需要将translation结果写入到本地文件中 + // 注意:只在Debug时候开启 + WriteCameraPositionForDebug: { + mode: 0, // 0:关闭 1:开启 + }, + arrow: { + // 动画导航箭头 + arrowURL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/qianjina/qianjina.gltf", + arrowPosition: [0, 0, 0], + arrowRotation: [0, Math.PI, Math.PI / 2], + arrowScale: [50, 50, 50], + arrowMoveSpeed: 8, + showDistance: 15, + }, + onScreenArrow: { + // 随屏3Dof箭头 + arrowURL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/qianjinb/qianjinb.gltf", + arrowPosition: [0, -0.05, -0.25], + arrowRotation: [Math.PI / 2, 0, 0], + arrowScale: [2.5, 2.5, 2.5], + }, + turnLeft: { + // 左转 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/zuo/zuo.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + angleThreshold: 30, + }, + turnRight: { + // 右转 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/you/you.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + angleThreshold: 30, + }, + escalatorUp: { + // 上扶梯 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/shang/shang.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + }, + escalatorDown: { + // 下扶梯 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/xia/xia.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + }, + elevatorUp: { + // 上电梯 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/zhiti/zhiti.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + }, + elevatorDown: { + // 下电梯 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/zhiti/zhiti.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + }, + mallToPark: { + // 商场到车库入口 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/park/park.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + }, + parkToMall: { + // 车库到商场入口 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/park/park.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + }, + final: { + // 终点 + URL: + "https://ar-fm.cdn.bcebos.com/home_3d_model/vpas_applet/ikea/gltf_20211111/zhongdian/zhongdian.gltf", + scale: [100, 100, 100], + rotation: [-Math.PI / 2, 0, 0], + showDistance: 15, + }, + mapPoi: { + // 地图打点数据 + showDistance: 40, + }, + panel: { + panelColor: 0xf9dc4f, + textColor: 0xffffff, + opacity: 0.8, // 透明度设置,1.0为不透明,0.0为完全透明 + }, + interaction: { + minCoverPointDistance: 4, // 通过路径节点的最短距离阈值 + }, + minTriggerDistance: { + transfer: 5, // 电梯扶梯点最短触发距离 + final: 5, // 终点最短触发距离 + }, +}; diff --git a/pages/index/corner.png b/pages/index/corner.png new file mode 100644 index 0000000000000000000000000000000000000000..13dbed3b0c8041d522539d6953bce5e69965f78d GIT binary patch literal 3880 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 Ds=p~M literal 0 HcmV?d00001 diff --git a/pages/index/elevator-up.png b/pages/index/elevator-up.png new file mode 100644 index 0000000000000000000000000000000000000000..69f2c94e94fc4d4e10ec445b4f085b76af93afdc GIT binary patch literal 3752 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 literal 0 HcmV?d00001 diff --git a/pages/index/end.png b/pages/index/end.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6f7932bb20951416cdfeba5b9c883dd9d22f9a GIT binary patch literal 11674 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 XMOaOaq+|K(00000NkvXXu0mjf4n=c& literal 0 HcmV?d00001 diff --git a/pages/index/floor-bg.png b/pages/index/floor-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..78881596f8146fc42d5472744f190c4f795e13ca GIT binary patch literal 72343 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

!>tExv_d5jy``)5Iqxn5s@yhOj*#o)YMyM(QE9l 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 literal 0 HcmV?d00001 diff --git a/pages/index/index-helper.js b/pages/index/index-helper.js new file mode 100644 index 0000000..a58aba3 --- /dev/null +++ b/pages/index/index-helper.js @@ -0,0 +1,110 @@ +export const STATES = { + selectFloor: "selectFloor", + startScan: "startScan", + fail5s: "fail5s", + fail8s: "fail8s", + successPrompt: "successPrompt", + wrongLocation: "wrongLocation", + badConnection: "badConnection", + arriveEscalator: "arriveEscalator", + arriveElevator: "arriveElevator", + arriveMall: "arriveMall", + arrivePark: "arrivePark", + requestEnd: "requestEnd", + inNav: "inNav", + noCamera: "noCamera", + tomap: "tomap", + arriveEnd: "arriveEnd", + bluetoothRequired: "bluetoothRequired", +}; +export const promptIcons = { + info: "info", + escalator: "escalator", + elevator: "elevator", + question: "question", + tomap: "tomap", + mall: "mall", + park: "park", + end: "end", + bluetooth: "bluetooth", +}; +export const promptStateMap = { + bluetoothRequired: { + icon: promptIcons.bluetooth, + title: "开启蓝牙 精准导航", + meta: "请在系统设置打开蓝牙", + btn3: "退出导航", + }, + noCamera: { + icon: promptIcons.info, + title: "相机未授权", + meta: "AR导航需要相机权限", + btn1: "打开设置", + btn2: "退出导航", + }, + fail8s: { + icon: promptIcons.info, + title: "定位失败", + meta: "请确认您是否在正确楼层", + btn1: "重新定位", + btn2: "选择楼层", + btn3: "退出导航", + }, + wrongLocation: { + icon: promptIcons.info, + title: "当前位置无法导航", + meta: "导航有效区域:无锡荟聚", + btn1: "退出导航", + }, + badConnection: { + icon: promptIcons.info, + title: "网络信号差", + meta: "请检查网络连接是否正常", + btn1: "重新定位", + }, + arriveEscalator: { + icon: promptIcons.escalator, + title: "", + meta: "请注意乘梯安全", + btn1: "已到达目标楼层", + }, + arriveElevator: { + icon: promptIcons.elevator, + title: "", + meta: "请注意乘梯安全", + btn1: "已到达目标楼层", + }, + arriveMall: { + icon: promptIcons.mall, + title: "请步行至商场区域", + meta: "请注意安全", + btn1: "已到达目标商场", + }, + arrivePark: { + icon: promptIcons.park, + title: "请步行至停车场", + meta: "请注意安全", + btn1: "已到达目标停车场", + }, + requestEnd: { + icon: promptIcons.question, + title: "是否退出导航?", + meta: "退出导航后 将返回首页", + btn1: "确定", + btn2: "取消", + }, + tomap: { + icon: promptIcons.tomap, + title: `即将离开AR导航 + 进入模拟导航`, + meta: "是否要继续?", + btn1: "确定", + btn2: "取消", + }, + arriveEnd: { + icon: promptIcons.end, + title: `已到达终点,是否退出导航`, + meta: "退出导航后将返回首页", + btn1: "确定", + }, +}; diff --git a/pages/index/index.js b/pages/index/index.js new file mode 100644 index 0000000..0c6b4db --- /dev/null +++ b/pages/index/index.js @@ -0,0 +1,758 @@ +import * as VPASSDK from "./VPASSDK-1.2.2.js"; +import { stopBeaconScan, getLocation } from "ais-h5-location"; +import { createScopedThreejs } from "threejs-miniprogram"; +import { registerGLTFLoader } from "../../loader/gltfLoader"; +var THREE; +import configData from "./config"; +import { STATES, promptStateMap } from "./index-helper"; +var _canvas; +let map; +let locationOption; +const icons = { + left: "/pages/index/left.png", + straight: "/pages/index/straight.png", + right: "/pages/index/right.png", + end: "/pages/index/end.png", + escalatorUp: "/pages/index/escalator-up.png", + escalatorDown: "/pages/index/escalator-down.png", + elevatorUp: "/pages/index/elevator-up.png", + elevatorDown: "/pages/index/elevator-down.png", +}; +Page({ + /** + * 页面的初始数据 + */ + data: { + inited: false, + isMap: true, + isMeet: true, + locX: 0, + locY: 0, + floors: [], + floorOrder: null, + floorId: null, + floorName: null, + windowHeight: 812, + states: STATES, + state: STATES.selectFloor, + promptStateMap, + map: null, + e: null, + lastLoc: null, + tab: 0, + showTabs: false, + shop: null, + nextFloor: null, + nextNextFloor: null, + navIcon: icons.straight, + distanceToNextPoint: null, + msgTop: "", + nextPointType: null, + msgBottomLeft: "", + msgBottomRight: "", + totalDistance: 0, + distance: 0, + arriveEnd: false, + theta: null, + flash: "off", + parkTop: 0, + parkLeft: 0, + flash_isFilter: "true", + parkWidth: 0, + parkHeight: 0, + session: null, + filteredMallFloors: [], + filteredParkFloors: [], + selectMall: true, + safeTop: 54, + frameSize: "medium", + leftYaw: true, + rightYaw: true, + searchType: 0, + point: null, + resolution: null, + }, + clickScreen(e) { + let detail = e.detail; + if (this.SDK) this.SDK.getScreenCoordinate({ x: detail.x, y: detail.y }); + console.log("点击屏幕x, y:", detail.x, detail.y); + }, + + touchMove(event) { + if (this.SDK) this.SDK.getScreenCoordinate(event.touches[0]); + }, + + touchCancel(event) { + if (this.SDK) this.SDK.touchCancel(); + }, + + touchStart() { + console.log("touch Start"); + if (this.SDK) this.SDK.touchStart(); + }, + + touchEnd() { + console.log("touch End"); + if (this.SDK) this.SDK.touchCancel(); + }, + setSelectMall() { + this.setData({ selectMall: true }); + }, + setSelectPark() { + this.setData({ selectMall: false }); + }, + /** + * 生命周期函数--监听页面加载 + */ + async onLoad({ e, searchType = 0 }) { + this.frameIndex = 0; + this.getSystemInfo(); + wx.setKeepScreenOn({ + keepScreenOn: true, + }); + const { + globalData: { floors }, + } = getApp(); + const { windowHeight } = wx.getSystemInfoSync(); + this.setData({ + floors, + filteredMallFloors: floors.filter( + ({ url, isPark }) => url !== null && !isPark + ), + filteredParkFloors: floors.filter( + ({ url, isPark }) => url !== null && isPark + ), + windowHeight, + e: decodeURIComponent(e), + searchType: Number(searchType), + }); + this.initSDK(); + }, + initSDK() { + this.SDK = new VPASSDK.SDKWrapper(configData); + wx.createSelectorQuery() + .select("#webgl") + .node() + .exec((res) => { + _canvas = res[0].node; + // todo 初始化引擎放到我们系统初始化中 + // 创建一个与 canvas 绑定的 three.js + THREE = createScopedThreejs(_canvas); + // SXC + registerGLTFLoader(THREE); + }); + }, + requestLocation() { + if (!(this.data.inited && this.data.floorOrder !== null)) return; + if (!this.sdkInited) { + try { + this.SDK.initAR( + { + rgba2JpegCanvas: "#capture", // 压缩jpeg的Canvas,必填 + webGLCanvas: "#webgl", // 绘制AR内容canvas,必填 + }, + THREE, + _canvas + ); + } catch (error) { + console.log(error); + } + } + this.sdkInited = true; + locationOption = { + floor_id: this.data.floorId, + onLocateEvent: () => {}, + distanceOfNextPoint: () => {}, + onFirstSuccess: (res) => { + this.firstSuccess(res); + this.setData({ + totalDistance: 0, + lastLoc: [res.locX, res.locY], + state: STATES.successPrompt, + flash: "off", + }); + }, + onBluetoothAndScanStatus: (res) => { + console.log("关于蓝牙和扫描框状态:", res.type); + }, + onError: (e) => { + const { type } = e; + if (type !== 10010) console.log("error:", e); + if (type === 10005) return this.setState(STATES.fail5s); + if (type === 10007) { + this.finishARNavigation(); + return this.setState(STATES.fail8s); + } + if (type === 10008) { + return wx.showModal({ + title: "提示", + content: "断网了,重新链接?", + showCancel: false, + success: (res) => { + if (res.confirm) { + console.log("用户点击确定"); + // 获取网络信号 + wx.getNetworkType({ + success: (res) => { + locationOption.onNetWork({ + type: res.networkType, + msg: "获取网络类型", + }); + if (res.networkType !== "none") { + this.SDK.requestVPASLocation(locationOption); + } else { + locationOption.onError({ + type: 10008, + msg: "监听网络信号失败", + }); + } + }, + fail: (err) => { + locationOption.onError({ + type: 10008, + msg: "监听网络信号失败", + }); + }, + }); + } + }, + }); + } + if (type === 10009) { + return wx.showToast({ + icon: "none", + title: "车位号无效\n换个试试吧", + }); + } + if (type === 10010) { + return wx.showToast({ + icon: "none", + title: "请将手机保持竖屏镜头向前", + }); + } + wx.showToast({ + icon: "none", + title: "定位失败\n错误码:" + type, + }); + }, + onEverySuccess: (res) => { + // 跟踪回调 + const lastLoc = [res.locX, res.locY]; + const { + distance, + distanceToNextPoint, + type: nextPointType, + orientation: theta, + } = res; + if (!this.data.totalDistance) this.setData({ totalDistance: distance }); + this.setData({ + theta, + distance, + distanceToNextPoint, + nextPointType, + msgBottomLeft: "剩余" + Math.floor(distance) + "米", + msgBottomRight: Math.floor(distance / 1.4 / 60) + "分钟", + }); + this.setMsgTopAndIcon(); + if ( + this.data.lastLoc && + this.data.lastLoc[0] === lastLoc[0] && + this.data.lastLoc[1] === lastLoc[1] + ) + return; + this.setData({ + lastLoc, + }); + }, + onNetWork: (status) => { + console.log("network", status); + }, + onArrive: (res) => { + console.log("onArrive", res); + if (res.type === 3 || res.type === 4) { + this.finishARNavigation(); + this.setState(STATES.arriveElevator); + } else if (res.type === 5 || res.type === 6) { + this.finishARNavigation(); + this.setState(STATES.arriveEscalator); + } else if (res.type === 8 || res.type === 9) { + this.finishARNavigation(); + this.setState(res.type === 8 ? STATES.arrivePark : STATES.arriveMall); + } else if (res.type === 7) { + this.setData({ arriveEnd: true }); + this.setMsgTopAndIcon(); + this.setState(STATES.arriveEnd); + } + }, + onResourceLoaded: (res) => { + console.log("AR资源导航加载完成"); + }, + onStep: (res) => { + // console.log(res) + }, + onYaw: ({ type }) => { + this.setData({ + leftYaw: type === 1 || type === 2, + rightYaw: type === 0 || type === 2, + }); + }, + onPoiEvent: ({ eventUrl }) => { + console.log(eventUrl); + if (!eventUrl.includes("***")) return; + let [appId, path] = eventUrl.split("***"); + wx.navigateToMiniProgram({ + appId, + path, + }); + }, + }; + console.log("locationOption:", locationOption); + const floor = this.data.floors.find( + ({ floorId }) => locationOption.floor_id == floorId + ); + + if (floor.isPark) { + this.startBlueTooth(locationOption.floor_id); + } else { + this.stopBlueTooth(); + } + console.log(floor); + this.SDK.requestVPASLocation(locationOption); + this.setData({ + state: STATES.startScan, + arriveEnd: false, + showTabs: false, + }); + }, + stopBlueTooth() { + stopBeaconScan(); + wx.closeBluetoothAdapter(); + }, + startBlueTooth(currentFloor) { + const ak = configData.map.find(({ floor_id }) => floor_id == currentFloor) + .ak; + console.log("ak:", ak); + if (!ak) return console.warn("no ak"); + wx.openBluetoothAdapter({ + success: () => { + getLocation({ + ak, + intervalTime: 1000, // 定时器(请求频率时长) + successCb: (result) => { + const { location, floor, indoor } = result.body && result.body[0]; + const sameFloor = (floor && floor.toUpperCase()) == currentFloor; // 判断是否为同一楼层(避免获取同临楼层定位信息) + // pointX、pointY格式处理 + const splitArray = location && location.split(","); + const pointX = parseFloat(splitArray[0]); + const pointY = parseFloat(splitArray[1]); + + // 过滤蓝牙location 无效值 + let isValidLocation; + if (splitArray && splitArray.length) { + isValidLocation = pointX > 1 && pointY > 1; + } + /** + * vpas updateBluetoothLocation 触发条件: + * 选择楼层 等于 蓝牙返回楼层时 + * indoor = 1(室内) + */ + if (sameFloor && indoor === "1") { + isValidLocation && + this.SDK.updateBluetoothLocation(pointX, pointY); + } + }, + failCb: (err) => { + console.warn("fail-蓝牙位置定位失败", err); + }, + }); + }, + fail: (res) => { + console.warn("蓝牙未开启>>", res); + }, + }); + }, + setMsgTopAndIcon() { + const { + distanceToNextPoint, + nextPointType, + arriveEnd, + nextFloor, + floors, + } = this.data; + if ( + distanceToNextPoint !== null && + nextPointType !== null && + nextPointType !== -1 + ) { + const flooredDistance = Math.floor(distanceToNextPoint); + const nextFloorName = nextFloor ? nextFloor.name : ""; + this.setData({ + msgTop: arriveEnd + ? "已到达" + : distanceToNextPoint > 20 + ? `直行${flooredDistance}米` + : nextPointType === 7 + ? `${flooredDistance}米后 到达终点` + : nextPointType === 8 + ? `${ + distanceToNextPoint < 5 ? "" : `${flooredDistance}米后 ` + }到达停车位入口` + : nextPointType === 9 + ? `${ + distanceToNextPoint < 5 ? "" : `${flooredDistance}米后 ` + }到达商场入口` + : [3, 4, 5, 6].includes(nextPointType) + ? `${ + distanceToNextPoint < 5 ? "" : `${flooredDistance}米后 ` + }乘梯至${nextFloorName}` + : [1, 2].includes(nextPointType) + ? `${ + distanceToNextPoint < 5 + ? nextPointType === 1 + ? "左转" + : "右转" + : `${flooredDistance}米后 ${ + nextPointType === 1 ? "左前方" : "右前方" + }` + }` + : distanceToNextPoint < 5 + ? `${nextPointType === 1 ? "左转" : "右转"}` + : "", + navIcon: arriveEnd + ? icons.end + : distanceToNextPoint > 20 + ? icons.straight + : { + 1: icons.left, + 2: icons.right, + 3: icons.elevatorUp, + 4: icons.elevatorDown, + 5: icons.escalatorUp, + 6: icons.escalatorDown, + 7: icons.end, + }[nextPointType], + }); + } + }, + setFloor({ currentTarget: { id } }) { + const floor = this.data[ + this.data.selectMall ? "filteredMallFloors" : "filteredParkFloors" + ][id]; + this.setData({ + floorOrder: floor.floorOrder, + point: null, + floorId: floor.floorId, + floorName: floor.name, + }); + }, + firstSuccess(res) { + console.log("firstSuccess---", this.data.e); + if (!map) return; + let shop = map.shopMap[this.data.e] + ? map.shopMap[this.data.e] + : map.facilityMap[this.data.e] + ? map.facilityMap[this.data.e] + : map.pMap[this.data.e]; + + if (!shop) { + const endParamList = this.data.e.split("_"); + if (endParamList.length === 3) { + let [efloororder, epoint, ename] = endParamList; + efloororder = Number(efloororder); + epoint = Number(epoint); + shop = { + isDevice: true, + name: ename, + navPoint: epoint, + yaxis: epoint, + floorOrder: efloororder, + floorName: map.mall.floors[efloororder][1], + }; + } + } + console.log("end", shop); + if (!shop) + return wx.showToast({ + icon: "none", + title: `未匹配到该终点:${this.data.e}`, + }); + + this.setData({ + shop: { + ...shop, + logoPath: shop.logoPath ? shop.logoPath.replaceAll("\\", "/") : null, + }, + }); + + const { naviData, nextFloorId, nextNextFloorId } = map.requestRoute( + [res.locX, res.locY, this.data.floorId], + { floorOrder: shop.floorOrder, navPoint: shop.yaxis } + ); + if (!naviData) return; + let nextFloor = this.data.floors.find( + ({ floorId }) => nextFloorId == floorId + ); + let nextNextFloor = this.data.floors.find( + ({ floorId }) => nextNextFloorId == floorId + ); + this.setData({ nextFloor, nextNextFloor }); + + let final = new THREE.Vector3( + naviData[naviData.length - 1].x, + naviData[naviData.length - 1].y, + 0 + ); + if (!nextFloor) { + naviData.pop(); + if (naviData.length === 1) { + naviData.push({ + ...naviData[0], + pointType: 1, + x: (naviData[0].x + final.x) / 2, + y: (naviData[0].y + final.y) / 2, + }); + } + } + console.log("naviData", naviData, "final", final); + const openid = getApp().globalData.openid; + if ( + [ + "oBbmR5c_SWeSyHBQ2YrAnu9W2Zts", + "oBbmR5VLexJ41jtbMsvIKVaiz7vE", + "oBbmR5ecGc_0RmQhR8qbQR1rdpYg", + ].includes(openid) + ) + this.setData({ + session: { + session: res.session, + timestamp: new Date().getTime(), + naviData, + openid, + path: [ + { locX: res.locX, locY: res.locY, timestamp: new Date().getTime() }, + ], + }, + }); + this.SDK.setNavigationData( + naviData, + final, + res.wasmFunction, + locationOption + ); + this.SDK.startARNavigation(); + setTimeout(() => { + this.setState(STATES.inNav); + this.setData({ + showTabs: true, + tab: 0, + }); + }, 1000); + }, + exit() { + wx.redirectTo({ + url: "/pages/h5map/index", + }); + }, + handleToMap() { + this.setState(STATES.tomap); + }, + handlePromptBtn({ detail: { btn } }) { + const { state } = this.data; + if (state === STATES.bluetoothRequired) { + if (btn === "3") return this.exit(); + } + if (state === STATES.fail8s) { + if (btn === "1") return this.requestLocation(); + if (btn === "2") return this.setState(STATES.selectFloor); + if (btn === "3") return this.exit(); + } + if (state === STATES.wrongLocation) return this.exit(); + if (state === STATES.badConnection) return this.requestLocation(); + if ( + state === STATES.arriveEscalator || + state === STATES.arriveElevator || + state === STATES.arriveMall || + state === STATES.arrivePark + ) { + const nextFloor = this.data.nextNextFloor + ? this.data.nextNextFloor + : this.data.nextFloor; + if (nextFloor) + this.setData({ + floorOrder: nextFloor.floorOrder, + point: null, + floorId: nextFloor.floorId, + floorName: nextFloor.name, + }); + return this.requestLocation(); + } + if (state === STATES.requestEnd || state === STATES.arriveEnd) { + if (btn === "1") return this.exit(); + if (btn === "2") return this.setState(STATES.inNav); + } + if (state === STATES.noCamera) { + if (btn === "1") + return wx.openSetting({ + withSubscriptions: true, + success: ({ authSetting }) => { + if (authSetting["scope.camera"]) { + wx.redirectTo({ + url: `/pages/index/index?e=${this.data.e}`, + }); + } + }, + }); + if (btn === "2") return this.exit(); + } + if (state === STATES.tomap) { + if (btn === "1") + return wx.redirectTo({ + url: `/pages/h5map/index?e=${this.data.e}`, + }); + if (btn === "2") return this.setState(STATES.inNav); + } + }, + setState(state) { + if ( + (this.data.state === STATES.arriveEscalator || + this.data.state === STATES.arriveElevator || + this.data.state === STATES.arriveMall || + this.data.state === STATES.arrivePark) && + state === STATES.inNav + ) + return console.log("到达弹窗出现忽略导航中状态变更触发"); + if ( + this.data.state === STATES.bluetoothRequired && + state !== STATES.startScan + ) + return console.log("蓝牙弹窗状态只能进入开始定位状态"); + this.setData({ + state, + }); + }, + handleMap({ detail }) { + map = detail; + this.setData({ + inited: true, + }); + }, + handleTabChange({ detail }) { + this.setData({ + tab: detail, + }); + if (this.SDK) { + this.SDK.updateOnScreenArrowPosition( + detail == 0 + ? new THREE.Vector3(0, -0.015, -0.25) + : new THREE.Vector3(0, -0.06, -0.25) + ); + } + }, + handleRelocate() { + this.SDK.finishARNavigation(); + this.requestLocation(); + }, + handleNavExit() { + this.setState(STATES.requestEnd); + }, + handleNoCamera() { + this.setState(STATES.noCamera); + }, + flashlightBtn() { + if (this.data.flash === "off") { + this.setData({ + flash: "on", + flash_isFilter: "true", + }); + } else { + this.setData({ + flash: "off", + }); + } + }, + getSystemInfo() { + wx.getSystemInfo({ + success: (res) => { + console.log("设备信息:", res); + let parkWidth = 248; + let parkHeight = 70; + let parkTop = res.windowHeight - parkHeight; + let parkLeft = res.windowWidth - parkWidth; + this.setData({ + parkWidth: parkWidth, + parkHeight: parkHeight, + parkTop: parkTop / 2, + parkLeft: parkLeft / 2, + safeTop: res.safeArea.top, + frameSize: res.system.includes("iOS") ? "medium" : "small", + resolution: res.system.includes("iOS") ? "high" : "small", + }); + console.log( + "宽高左上:", + this.data.parkWidth, + this.data.parkHeight, + this.data.parkTop, + this.data.parkLeft + ); + }, + }); + }, + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + this.getSystemInfo(); + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () {}, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + this.finishARNavigation(true); + if (this.SDK) this.SDK.releaseRender(); + }, + finishARNavigation(isUnload = false) { + if (this.SDK) this.SDK.finishARNavigation(isUnload); + this.stopBlueTooth(); + this.setData({ totalDistance: 0 }); + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () {}, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () {}, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage({ from }) { + const e = + from === "button" && this.data.point !== null + ? `${this.data.floorOrder}_${this.data.point}_来自分享的位置` + : null; + return e === null + ? { + title: "无锡荟聚实景导航", + path: "/pages/h5map/index", + imageUrl: "/pages/h5map/share.png", + } + : { + title: "来自分享的位置", + path: `/pages/h5map/index?e=${e}`, + imageUrl: "/pages/h5map/share.png", + }; + }, + handlePoint({ detail }) { + this.setData({ point: detail }); + }, +}); diff --git a/pages/index/index.json b/pages/index/index.json new file mode 100644 index 0000000..38b5100 --- /dev/null +++ b/pages/index/index.json @@ -0,0 +1,9 @@ +{ + "usingComponents": { + "prompt": "../prompt/prompt", + "map2d": "../map2d/map2d", + "tabs": "../tabs/tabs", + "destination": "../destination/destination", + "nav": "../nav/nav" + } +} \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml new file mode 100644 index 0000000..10ca951 --- /dev/null +++ b/pages/index/index.wxml @@ -0,0 +1,85 @@ + + + + + + + + + + + +无锡荟聚 + + + + + + + + 为了更精确定位 + 请选择您当前所在楼层 + + + 商场 + 停车场 + + + + {{item.name}} + + + + + + + + + + + + + {{state===states.startScan?'开始定位':'努力定位中'}} + {{state===states.startScan?'请摆正手机扫描临近车位号':'再试试扫描其他车位号'}} + + + 示例 + + + + 您身边的车位号置于此区域,并对齐扫描边缘 + + + + + + + + + + + + + + + {{state===states.startScan?'开始定位':'努力定位中'}} + + + {{state===states.startScan?'请抬起手机,缓慢扫描周围环境。':'请扫描其他区域试试'}} + + 返回 + + + + + 定位成功 + 请跟随路线指示行走 + +

+ + + + + \ No newline at end of file diff --git a/pages/index/index.wxss b/pages/index/index.wxss new file mode 100644 index 0000000..7756991 --- /dev/null +++ b/pages/index/index.wxss @@ -0,0 +1,621 @@ +/**index.wxss**/ +.btn { + margin-top: 30rpx; +} + +.step { + position: fixed; + top: 0px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose1 { + position: fixed; + top: 20px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose2 { + position: fixed; + top: 40px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose3 { + position: fixed; + top: 60px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose4 { + position: fixed; + top: 80px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose5 { + position: fixed; + top: 100px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose6 { + position: fixed; + top: 120px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose7 { + position: fixed; + top: 140px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose8 { + position: fixed; + top: 160px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose9 { + position: fixed; + top: 180px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.pose10 { + position: fixed; + top: 200px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +.intrinstics { + position: fixed; + top: 200px; + color: red; + font-size: 20px; + z-index: 10 !important; +} + +#map { + /* z-index: 10000 !important; */ + position: relative; +} + +#loc { + width: 50rpx; + height: 50rpx; + position: absolute; + /* bottom: 90px; + right: 80px; */ + z-index: 1000000000 !important; +} + +.floor-modal { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 80%); + z-index: 10 !important; +} + +.floor-modal > .content { + position: absolute; + width: 100%; + top: 152px; + bottom: 0; + padding-top: 34px; + background: #ffffff; + font-style: normal; + font-weight: bold; + font-size: 20px; + line-height: 28px; + text-align: center; + letter-spacing: 1px; + color: #554936; + border-radius: 24px 24px 0 0; +} +.floor-modal > .content > .bg { + position: absolute; + top: 0; + left: 0; + width: 100vw; + z-index: 1; +} +.floor-modal > .content > text { + position: absolute; + display: block; + z-index: 2; + left: 0; + right: 0; + top: 34px; +} + +.floor-modal > .content > .floors { + position: absolute; + top: 120px; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient( + 180.1deg, + rgba(250, 245, 240, 0.74) 0.09%, + #ffffff 99.91% + ); + border-radius: 24px 24px 0 0; + z-index: 3; +} +.content > .floors > .tabs { + position: absolute; + display: flex; + width: 236px; + padding: 4px; + left: 0; + right: 0; + top: 20px; + margin: auto; + background: #eee9de; + border-radius: 10px; +} +.content > .floors > .tabs > .tab { + flex: 1; + height: 44px; + line-height: 44px; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: normal; + font-size: 16px; + color: #767571; +} +.content > .floors > .tabs > .tab.active { + background: #ffdb00; + border-radius: 8px; + font-weight: bold; + color: #474747; +} +.content > .floors > .list { + position: absolute; + top: 96px; + left: 16px; + right: 16px; + width: calc(100vw - 32px); + text-align: center; + box-sizing: border-box; +} + +.grid { + display: grid; + width: 232px; + grid-template-columns: 1fr 1fr; + gap: 14px 8px; + margin: auto; +} +.floors > .list .grid .item { + width: 112px; +} +.floors > .list .grid .item + .item { + margin-top: 0; +} +.floors > .list .item { + width: 140px; + height: 40px; + margin: auto; + line-height: 40px; + border: 1px solid #d1c8b9; + box-sizing: border-box; + border-radius: 100px; + font-style: normal; + font-weight: bold; + font-size: 16px; + letter-spacing: 1px; + color: #6a6665; +} + +.floors > .list .item.active { + color: #fff; + background: #ed912b; + box-shadow: 0px 4px 20px rgba(215, 148, 87, 0.33); + border: none; +} + +.floors > .list .item + .item { + margin-top: 16px; +} + +.content > .floors > .btn { + position: absolute; + left: 37px; + right: 37px; + width: auto; + bottom: 77px; + background: #ffdb00; + box-shadow: 0px 6px 12px rgba(255, 219, 0, 0.3); + border-radius: 100px; + font-style: normal; + font-weight: 900; + font-size: 16px; + line-height: 50px; + height: 50px; + text-align: center; + color: #474747; + padding: 0; +} + +.content > .floors > .btn.disabled { + color: #fff; + box-shadow: none; + background: #b3aea7; +} + +.scan-modal { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + width: calc(100vw - 36px - 36px); + height: calc(100vw - 36px - 36px); + border-radius: 16px; + box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.75); + z-index: 10 !important; +} + +.scan-modal > .corner { + position: absolute; + z-index: 1; + width: 32px; + height: 32px; + bottom: -16px; + right: -16px; +} + +.corner.lb { + bottom: -16px; + left: -16px; + transform: rotate(90deg); +} + +.corner.tl { + top: -16px; + left: -16px; + transform: rotate(180deg); +} + +.corner.tr { + top: -16px; + right: -16px; + transform: rotate(270deg); +} + +@keyframes scan { + 0% { + height: 100%; + } + + 100% { + height: 0; + } +} + +.scan-modal > .scaner { + position: absolute; + top: -16px; + bottom: -16px; + left: -16px; + right: -16px; + border-radius: 16px; + overflow: hidden; +} + +.scan-modal > .scaner > .bg { + position: absolute; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.48) 0.2%, + rgba(255, 255, 255, 0) 100% + ); + animation: 1s scan infinite ease-in-out; +} + +.scan-modal > .title { + position: absolute; + bottom: -68px; + left: 0; + right: 0; + height: 34px; + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 34px; + text-align: center; + letter-spacing: 1px; + color: #eee9de; +} + +.scan-modal > .meta { + position: absolute; + bottom: -97px; + left: 0; + right: 0; + font-style: normal; + font-weight: normal; + font-size: 14px; + line-height: 20px; + text-align: center; + color: #b3aea7; +} + +.scan-modal > .btn { + position: absolute; + bottom: -170px; + left: 0; + right: 0; + margin: auto; + width: 180px; + font-family: PingFang SC; + font-style: normal; + font-weight: 900; + font-size: 16px; + line-height: 50px; + height: 50px; + text-align: center; + color: #333333; + background: #ffdb00; + border-radius: 63px; +} + +.success-prompt { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 80%); + z-index: 10 !important; +} + +.success-prompt > image { + position: absolute; + width: 112px; + height: 112px; + top: 267px; + left: 0; + right: 0; + margin: auto; +} + +.success-prompt > .title { + position: absolute; + bottom: 158px; + left: 0; + right: 0; + height: 34px; + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 34px; + text-align: center; + letter-spacing: 1px; + color: #eee9de; +} + +.success-prompt > .meta { + position: absolute; + bottom: 130px; + left: 0; + right: 0; + font-style: normal; + font-weight: normal; + font-size: 14px; + line-height: 20px; + text-align: center; + color: #b3aea7; +} +.zzcImg { + width: 100%; + height: 100%; + /* border: 1px solid red; */ + z-index: 10; + position: absolute; + left: 0; + top: 0; +} +.zzcimg_ys { + width: 100%; + height: 100%; +} +.scan_lo_tow { + width: 90%; + z-index: 1000000000000 !important; + position: absolute; + left: 5%; + top: 510rpx; + height: 72.4; +} +.trans-y { + animation: site-transy 2s infinite ease-in-out; +} +@keyframes site-transy { + 0% { + transform: translateY(-410px); + } + + 100% { + transform: translateY(300px); + } +} +.scanning_textnl { + z-index: 1000000000000 !important; + position: absolute; + left: 0; + right: 0; + width: 100%; + text-align: center; + font-family: PingFang SC; + font-style: normal; + font-weight: bold; + font-size: 20px; + line-height: 28px; + color: #eee9de; +} +.scanning_tip { + position: absolute; + left: 0; + right: 0; + width: 100%; + text-align: center; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: normal; + font-size: 14px; + line-height: 21px; + text-align: center; + color: #fdd02f; +} +.scanning_tip > image { + display: flex; + width: 180px; + height: 50px; + margin: auto; + margin-top: 8px; +} +.scanning_text { + position: absolute; + left: 0; + right: 0; + width: 100%; + font-family: PingFang SC; + font-style: normal; + font-weight: bold; + font-size: 12px; + line-height: 17px; + text-align: center; + letter-spacing: 1px; + color: rgba(238, 233, 222, 0.5); +} +.flashlightBtn { + position: fixed; + top: 1086rpx; + left: 50%; + transform: translate(-50rpx); + color: red; + z-index: 1000000000000 !important; +} +.on_img { + width: 112rpx; + height: 96rpx; +} +.logo { + position: fixed; + z-index: 11; + left: 16px; + width: 24px; + height: 24px; +} +.title { + position: fixed; + z-index: 11; + height: 27px; + left: 48px; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 18px; + line-height: 27px; + color: #fff; +} +.tomap { + position: fixed; + z-index: 16; + width: 120px; + height: 40px; + left: 8px; +} +@keyframes pointleft { + from { + left: 8px; + } + 50% { + left: 0; + } + to { + left: 8px; + } +} +@keyframes pointright { + from { + right: 8px; + } + 50% { + right: 0; + } + to { + right: 8px; + } +} +.leftyaw { + position: fixed; + width: 100px; + height: 36px; + top: 0; + bottom: 0; + z-index: 11; + left: 8px; + margin: auto; + animation: pointleft 0.5s infinite ease; +} +.rightyaw { + position: fixed; + width: 100px; + height: 36px; + top: 0; + bottom: 0; + z-index: 11; + right: 8px; + margin: auto; + animation: pointright 0.5s infinite ease; +} +.share { + position: fixed; + z-index: 11; + right: 8px; + width: 40px !important; + height: 54px; + background: none; +} +.share-img { + position: fixed; + z-index: 12; + right: 8px; + width: 40px; + height: 54px; + pointer-events: none; +} diff --git a/pages/index/left.png b/pages/index/left.png new file mode 100644 index 0000000000000000000000000000000000000000..eefead22c5b9300dfb775eb5445b84335eea1340 GIT binary patch literal 1981 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 literal 0 HcmV?d00001 diff --git a/pages/index/logo.png b/pages/index/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..10a34345f9e64894ab1a1c161b46e4d48e17a60f GIT binary patch literal 975 zcmV;=12FuFP)<+?%CoeW! z{(BrkeCi~G5Wg82SqQXyyL-2{iy#Ng9V&Rl2MG50Zxsf01iWT=L^t7{@89$61_NB< zIc}t8|6d6~My$|JIN|95k0!EUs7!!U?BF`9GN~1a1Q&do7~xeBoKul@T18SRU~UoS zF8C~MdBf*;;-vsby~^QChqg%n`QK{ zi^gS0xl)(bay&D<%|hL0d&x5!5MTYx0uA&GmOEKRrC4CJnwKZh?MjW}GA{ zc)@JIVJ)ylqdy|D!q5Vb8MDdF5m{lVfQ(JDMKtw~Y@z#%dBCfH!CPFCmNzf)KH$86 zfNf=fy2ilvT0l?@O1<(XVblV$#R>>2i952AQ`z;r@sb;gBNPaeHqAUewv;kViW1n& zmePZOQ&F-4n+fz}1z7D1sKQO+jSO_tEzSxyJMfv_MHMifl`yV)C<@=?lBG#i;JfF| z$0!QHN3Z+nJ>qJef8oa=XQK|*NUG%W3AKQ`d=26b{8<04?a8y8L-&zAje#K@_|Y^! zZApDCxMG@LZl+~T$|?uLeDI_FD>@(|7wURm1YbCuu_nGOLzv{@DXA~$`7STDMe zhJ04TM|dUuPYs6FXlc_8`JsZJvetPvYFzk|{l^|dMVhX%owd5xu}22MM`TtYPNWR5 xuYD|A1elB$O;dVy|2?2SA literal 0 HcmV?d00001 diff --git a/pages/index/mask.png b/pages/index/mask.png new file mode 100644 index 0000000000000000000000000000000000000000..d94f75d1d263b2884c3291cfcc8303dd07bb3590 GIT binary patch literal 3382 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 literal 0 HcmV?d00001 diff --git a/pages/index/rightyaw.png b/pages/index/rightyaw.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc19acd34986ecbd35c52b65ad6f19a23fe1a17 GIT binary patch literal 3207 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
#UG#p{r1uw!W*aD3L0io}p{AISC;KF*V?4H+! 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 UV%jN3KmY&$07*qoM6N<$f`!rW0ssI2 literal 0 HcmV?d00001 diff --git a/pages/index/share.png b/pages/index/share.png new file mode 100644 index 0000000000000000000000000000000000000000..7906bc774034d59c9542ef0eca02874bd5927fe5 GIT binary patch literal 2578 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 P7bNQG>gTe~DWM4fk8a&) literal 0 HcmV?d00001 diff --git a/pages/index/success.png b/pages/index/success.png new file mode 100644 index 0000000000000000000000000000000000000000..5aefbfa2274399d924f422daa321714fe9e18e37 GIT binary patch literal 4341 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 R`U)HCF*CBdQE|;V`u}VTMqdB` literal 0 HcmV?d00001 diff --git a/pages/map2d/MAPAPP.js b/pages/map2d/MAPAPP.js new file mode 100644 index 0000000..0ba1f50 --- /dev/null +++ b/pages/map2d/MAPAPP.js @@ -0,0 +1,450 @@ +import { getCrossPoint } from "./util"; +import Events from "./events"; + +import dijkstra from "dijkstrajs"; +import { getMapData, mall } from "../../getMapData"; + +const getDistance = (a, b) => + Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.z - b.z) * (a.z - b.z)); +export const minScale = 0.3; +export const maxScale = 1; + +export default class MAPAPP { + events = new Events(); + mall = mall; + groups = []; + x = null; + y = null; + intervals = []; + shown = false; + theta2s = []; + scale = minScale; + constructor(query, component) { + this.searchType = component.data.searchType; + const canvas = query.node; + const ctx = canvas.getContext("2d"); + const dpr = wx.getSystemInfoSync().pixelRatio; + canvas.width = query.width * dpr; + canvas.height = query.height * dpr; + const start = canvas.createImage(); + start.src = "/pages/map2d/start.png"; + const end = canvas.createImage(); + end.src = "/pages/map2d/end.png"; + const arrow = canvas.createImage(); + arrow.src = "/pages/map2d/arrow.png"; + ctx.scale(dpr, dpr); + Object.assign(this, { + canvas, + ctx, + start, + end, + arrow, + width: query.width, + height: query.height, + }); + this.init(); + } + + on(event, cb) { + return this.events.on(event, cb); + } + once(event, cb) { + return this.events.once(event, cb); + } + off(event, cb) { + return this.events.off(event, cb); + } + dispose() { + console.log("map interval disposed"); + this.intervals && this.intervals.forEach(clearInterval); + this.intervals = []; + } + + async init() { + const data = await getMapData(); + Object.assign(this, data); + const { floors } = this.mall; + const { canvas } = this; + const groups = floors.map(([_, name, map2dData]) => { + const floor = canvas.createImage(); + floor.src = map2dData.data; + return floor; + }); + this.groups = groups; + this.events.dispatch("loaded", this); + this.intervals.push( + setInterval(() => { + this.animate(); + }, 1000 / 30) + ); + } + get shops() { + return !this.serverShopInfo + ? [] + : this.serverShopInfo[this.floorOrder].shopList; + } + get currentFloorObject() { + return this.groups[this.floorOrder]; + } + updateTheta2(rag) { + this.theta2 = rag; + } + setXY(x, y) { + this.x = x; + this.y = y; + } + scaleX(number) { + const { x, width, scale } = this; + return (number - x) * scale + width / 2; + } + scaleY(number) { + const { y, height, scale } = this; + return (number - y) * scale + height / 2; + } + scaleLen(number) { + const { scale } = this; + return number * scale; + } + animate() { + const { shown, ctx, x, y, width, height } = this; + if (!shown) return; + ctx.clearRect(0, 0, width, height); + ctx.save(); + // ctx.translate(this.scaleX(-x) + width / 2, this.scaleY(-y) + height / 2); + this.drawFloor(); + this.drawLines(); + ctx.restore(); + this.drawArrow(); + } + drawArrow() { + const { ctx, arrow, width, height } = this; + ctx.save(); + ctx.translate(width / 2, height / 2); + ctx.drawImage(arrow, -36, -(82 - 36), 72, 82); + ctx.restore(); + } + drawPath() { + const { linePath, ctx } = this; + const start = linePath[0]; + const end = linePath[linePath.length - 1]; + ctx.fillStyle = "#fec210"; + ctx.beginPath(); + ctx.arc( + this.scaleX(start[0]), + this.scaleY(start[1]), + // this.scaleLen(10), + 10, + 0, + 2 * Math.PI + ); + ctx.fill(); + ctx.beginPath(); + ctx.arc( + this.scaleX(end[0]), + this.scaleY(end[1]), + // this.scaleLen(10), + 10, + 0, + 2 * Math.PI + ); + ctx.fill(); + + ctx.beginPath(); + linePath.forEach(([x, y], i) => { + if (i === 0) { + ctx.moveTo(this.scaleX(x), this.scaleY(y)); + } else { + ctx.lineTo(this.scaleX(x), this.scaleY(y)); + } + }); + } + drawLines() { + const { linePath, ctx } = this; + if (!linePath || !linePath.length) return; + this.drawPath(); + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + // ctx.lineWidth = this.scaleLen(11); + ctx.lineWidth = 11; + ctx.strokeStyle = "#fec210"; + ctx.stroke(); + for (let i = 9; i >= 1; i -= 1) { + ctx.lineCap = "butt"; + ctx.lineJoin = "butt"; + // ctx.lineWidth = this.scaleLen(i); + ctx.lineWidth = i; + ctx.strokeStyle = "#fff"; + // ctx.setLineDash([this.scaleLen(4), this.scaleLen(13)]); + ctx.setLineDash([4, 13]); + // ctx.lineDashOffset = this.scaleLen(i - 9); + ctx.lineDashOffset = i - 9; + ctx.stroke(); + ctx.strokeStyle = "#ed912b"; + // ctx.setLineDash([0, this.scaleLen(4), this.scaleLen(13), 0]); + ctx.setLineDash([0, 4, 13, 0]); + // ctx.lineDashOffset = this.scaleLen(i - 9); + ctx.lineDashOffset = i - 9; + ctx.stroke(); + } + const start = linePath[0]; + const end = linePath[linePath.length - 1]; + ctx.fillStyle = "#ed912b"; + // ctx.lineWidth = this.scaleLen(1); + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.arc( + this.scaleX(start[0]), + this.scaleY(start[1]), + // this.scaleLen(9), + 9, + 0, + 2 * Math.PI + ); + ctx.fill(); + ctx.beginPath(); + ctx.arc( + this.scaleX(end[0]), + this.scaleY(end[1]), + // this.scaleLen(9), + 9, + 0, + 2 * Math.PI + ); + ctx.fill(); + ctx.fillStyle = "#fff"; + ctx.beginPath(); + ctx.arc( + this.scaleX(start[0]), + this.scaleY(start[1]), + // this.scaleLen(4.5), + 4.5, + 0, + 2 * Math.PI + ); + ctx.fill(); + ctx.beginPath(); + ctx.arc( + this.scaleX(end[0]), + this.scaleY(end[1]), + // this.scaleLen(4.5), + 4.5, + 0, + 2 * Math.PI + ); + ctx.fill(); + } + + drawFloor() { + const { floorOrder, groups, ctx } = this; + const floor = groups[floorOrder]; + ctx.save(); + ctx.drawImage( + floor, + this.scaleX(-floor.width / 2), + this.scaleY(-floor.height / 2), + this.scaleLen(floor.width), + this.scaleLen(floor.height) + ); + ctx.restore(); + } + + async changeFloor(num) { + this.floorOrder = num; + this.x = null; + this.y = null; + this.events.dispatch("floorchange", Number(num)); + return; + } + + cross({ x, y }) { + const point = { x, y }; + const { positions } = this; + if (!(positions && positions.length)) return point; + let minDisance = Infinity; + let crossPoint = null; + let index = 1; + for (let k = 1; k < positions.length; k++) { + let point1 = positions[k - 1]; + let point2 = positions[k]; + let cross = getCrossPoint(point, point1, point2); + let d = Math.sqrt( + (point.x - cross.x) * (point.x - cross.x) + + (point.y - cross.y) * (point.y - cross.y) + ); + + if (d < minDisance) { + minDisance = d; + crossPoint = cross; + index = k; + if (d < 0.5) break; + } + } + return crossPoint; + } + requestRoute(start, end, draw = true) { + if (!(start && end)) return; + const startFloorId = start[2]; + const startFloorOrder = getApp().globalData.floorIdFloorOrderMap[ + startFloorId + ]; + const { name: sname } = this.getNearestPoint({ + x: start[0], + z: start[1], + floorOrder: startFloorOrder, + }); + const startFloor = startFloorOrder; + const startPoint = Number(sname); + + const endFloor = end.floorOrder; + const endPoint = end.navPoint; + + let path = this.shortestPath( + { + floorOrder: startFloor, + NavPoint: startPoint, + }, + { + floorOrder: endFloor, + NavPoint: endPoint, + } + ); + if (!path) { + console.log("寻路失败", "start", start, "end", end); + return { naviData: null, nextFloorId: null }; + } + let floorIdPoints = path.map((str) => str.split("_")); + const byFirstDiffFloor = ([floorId], i) => + i === 0 ? false : floorIdPoints[i - 1][0] !== floorId; + const index = floorIdPoints.findIndex(byFirstDiffFloor); + console.log("index", index); + const isFloorChange = index !== -1; + const currentFloorOrder = Number(floorIdPoints[0][0]); + const nextFloorOrder = !isFloorChange + ? null + : Number(floorIdPoints[index][0]); + const fac = !isFloorChange ? null : this.facilityLiftMap[path[index - 1]]; + let naviData = floorIdPoints.slice(0, index === -1 ? undefined : index); + naviData = naviData.reduce((acc, [floorOrder, point]) => { + const last = acc[acc.length - 1]; + const x = this.points[floorOrder][point].position[0]; + const y = this.points[floorOrder][point].position[2]; + const floorId = startFloorId; + if (last && Math.abs(last.y - y) <= 3 && Math.abs(last.x - x) <= 3) + return acc; + else return [...acc, { x, y, floorId }]; + }, []); + + if (naviData.length === 1) { + naviData.unshift({ + x: start[0], + y: start[1], + flooorId: naviData[0].flooorId, + }); + } + naviData.forEach((data, i) => { + data.pointType = + i === 0 + ? 0 + : i !== naviData.length - 1 + ? 1 + : !isFloorChange + ? 6 + : nextFloorOrder > currentFloorOrder + ? fac.Type == 5 + ? 2 + : 4 + : fac.Type == 5 + ? 3 + : 5; + }); + this.positions = naviData; + console.log("originalNaviData", naviData); + if (draw && naviData.length) { + this.linePath = naviData.map(({ x, y }) => [x, y]); + } + const nextFloorId = !isFloorChange + ? null + : getApp().globalData.floors[path[index].split("_")[0]].floorId; + console.log("nextFloorId", nextFloorId); + return { + naviData, + nextFloorId, + }; + } + shortestPath( + { floorOrder: floorOrder1, NavPoint: NavPoint1 }, + { floorOrder: floorOrder2, NavPoint: NavPoint2 } + ) { + try { + const { graph, graphDt, graphFt, searchType = 0 } = this; + let currentGraph = + searchType === 0 ? graph : searchType === 1 ? graphFt : graphDt; + const s = floorOrder1 + "_" + NavPoint1; + const d = floorOrder2 + "_" + NavPoint2; + if (currentGraph && currentGraph[s] && currentGraph[d]) { + let path = dijkstra.find_path(currentGraph, s, d); + return path; + } else return null; + } catch (e) { + console.log(e); + return null; + } + } + getNearestPoint({ x, z, floorOrder }) { + const { points } = this; + const [nearest] = points[floorOrder].reduce( + ([last, min], nxt) => { + if (last === null) { + return [ + nxt, + getDistance( + { + x, + z, + }, + { + x: nxt.position[0], + z: nxt.position[2], + } + ), + ]; + } + const dis = getDistance( + { + x, + z, + }, + { + x: nxt.position[0], + z: nxt.position[2], + } + ); + if (dis < min) return [nxt, dis]; + else return [last, min]; + }, + [null, Infinity] + ); + return nearest; + } + getFloorHeightByFloorOrder(floorOrder) { + const { config, groups } = this; + const floor = groups[floorOrder]; + const { floorHeights } = config; + return floorOrder in floorHeights + ? floorHeights[floorOrder] + : floor.floorHeight; + } + getBoxHeightByFloorOrder(floorOrder) { + const { groups } = this; + const floor = groups[floorOrder]; + return floor.boxHeight; + } + getNavIconY(floorOrder) { + const { groups } = this; + const floor = groups[floorOrder]; + if (!floor) return this.getNavIconY(this.floorOrder); + const boxHeight = this.getBoxHeightByFloorOrder(floorOrder); + const radius = PathLine.getPathLineRadius(this, floor); + return boxHeight + radius * 5; + } +} diff --git a/pages/map2d/arrow.png b/pages/map2d/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b09ba2e955c242bf1642f39c06678aa49bcf86 GIT binary patch literal 17287 zcmcdy<8viWu#N3(v~hA{+u0a5+?(9k+}QTUwr$(Ct&MGM%njb}y+7hjRrl$cPxE1_ zPIaF%;mV5As7T+DARr)6Wo0Bl|6##@(Src@Uv4>G`u86o+RJD8N`gciWX0<283^ z%eiScm{Mj&1x*(~jMCsUaKJU1p+%;rWnrK>&BWm!PX$23XQ6ViBHD+ML-XRZqX4iQ zRx!k)6r#N2m{RJ6xM3=f$i^E?w5zxAT+~2&nwPTmMm9jz`Yf% zEIa?6y;zKio##a1|9_Hwz5mKlsw(iD0_U_9{lqj1-yCG#9{z6I-EdHY)4zh(?7G zxAE0`JLLKey6%xCJmUT3A$~*cH(8m?H*_LiWg=qY>IU3-02@ybQ#*OMj6eKpn7f_t zedd+Vzo#QA3s0&&e{UhiY!fR;vNAzchjLYVrtatNYu)um^Vx_Ywq>69hJd0=j9bBc z!!8y&$VHhlD!tryYct?oHp4zwV6j+!-A$zayV0Ig?mrz};X<@6% zcj+=%7=T>wv5lfR=dKBhib!xU%zZ;_{!a48(%ojJ{~q5-H{MbBu9K$J)?JHhgWIz#XH)IUZJPWb zzHxDJ@qqMw7oI##Z^d^gQRk%Pz>^+YF43Lq{!n3uF>uanB`yde-~IUPp#R&C5kUap zLv6C#ltGJh+}b);8Gv$9%jDR;*%w1B;Oci}r4KzC6|nV75z-lbuee5Kx1PCaKUg@t zfUNEr?G|cOzGOZ7t9e;YKD|D@<0Qvx z z0xY(6VDe@6FTJ)On|;cY8877NcMHezaf=)>5iH>;4LQQGt9(m*ipXi%+1c*90q`?2 z;OJg$lzVIUa1C{=k~n+m#V3Q8Jh9*PZ7@MQZ~2`eNWNt(0Si(H{GANLO+_xWV+=Ps0tVH>9c-V84!Zn<#IA=9N z%=+lYSJs4?tL1Ty;}w3%{CFc^W|6uG`N!xWi5q7^l|wIIxlH{xadT`u@}&jsN^S{j z6_f3nU$7?8UgvakQD%+vXN3OC0A3Ei^Qp2s)P({#w>C*5!%fGj`P%zLK!5DqT-Nzg zF{gp}R5KuAs~-&G_xJ~P)Z;;N+k)zyykUM#F zBVn(t0gomIY8qI6Iv!2A@I0rxYuHw+nGIgY`#ZRB0q6PSO~7$VZBeAgT>E_e^v&SA z7pTRTz{W>kE$H8bdQXF!v$M0BnTdT!)?KwW<>bk3f1vl*=f{gKKl^bDSH`7|fi6rF zIRx@~+A>u>9v^fKx#JWByP!l80Q^CBC!?$GarpXuAv%?F@35n&`R7}J%ncJA`B5q3 zHKupUp&MT;4kwj2iBDTXRUNZ+;3)06v0+%)9^1e{I*ggt$K;XTJm^Hnv>tu6*#zkB z%reEjrT{y24?4d}N{HKWUR2og;ZZMBnfBFdI&K%1$pBbSv;EYwDGCuQ+(GEfOT=Uk zFNe3R7>Emds|q8lgRZWLmzhGL0S>%Ge2Zby0Q;FMo?GnmpGPA7%j-t?=iDTng+2dC zoLqc+cb-M`awTz|c{x01<%+_j2p@Dot<8qAz(J{}rIf8W{_h91EIzZ6%HoN(P_ET7 zkzO=rEf9I$8r?jvqS?@Lyu9xkg``2vyy*A*zh!#HIF(G_)MZE2T&?c-Z&1s~me{G| z9|x)xd`cCT+RUxcT)h*?NfP_xE{yrA)Ied-2+D#sG;7tuxDSU^Lwk9we-pq<#jMB-FMlUv3k+7^5UW~=>&LU+Jr+g&3lJx3^_vT0e*%e zG#YB^9G}ztP_tdHLXCshgeWwD(Xv#5p4$<^#)P2MKi0}ByapwE2t|&O@u;U~uSC|I zuLiFLE#-YRfjp2UMHvC!uu|OLF=jL0p5!E7hvd?DJ}Urg-}OlEy^2&Cv~wcgeQ|@c zX@3mU%Y8A%CK8`K_03kl_X?OicVC^j9>dDHPu_Cw68R_L-_3(?ZE;my+vkfp%z`YZ z$U3cfG0mzP9p6@6T~Is4>!It-_j9!pi^2jUYe&-MWwo zBoI8Lb<3K9U4gL{8mxOhHH$N}<0V`F99$&|5>81HAMrWZ1kw^rF6#S+)4so4P3gNM zVx1EO3JmU;ui<^twtoB}t*_{!Lt6{B=SoP*xA}E37o)7QcWUZ^8A}G&{b+W9DM2vt2RcO1EdZG57Cs zJ%3$$-^^XF{qRSvemlW)Kq4Zp90X2;uvil4QObBo2bGH{0hM^{ctz`VxO^-C{p_`V z9~Z4Z-fsqXyNYV^a&_+|iENCRsP-dV$-{ihvM4fJ<12p*lDJt%Hr)g!6?-PmLpG(Ac=o2(E0+1JC6}AFSXU`m|-k%phBq&Eq`VQ!$ zxPCh(0taDJI~gFz6ARb!44*+7I!IoDYUXUQRLS?TQeU_1M0SO)Mpq@gEyZEzX6XE} z?lAz}n~YLc!^#ixwkt^dcUeOj)QDUh1^^-0(0K|?j8{ZVM{Dl3s{#D|t8hhK(eIGu zwIj>zJHdRj9A1% zAt_z<+m+Ir6MRT9rRg4*zr-k>T(|PMDaWN@?3m20@`zFSw23LN%!ISjIvftFzC3#d znfX1DGpIt*znXXeSw?P87UcT)_;?i+V}0?ERk?3WQoI3xqF0`C5S4f77q3&LNBi5t z^dNrYB8a{pS;r<=7jcx`{&=Dvu6ohI0Qm^Q ztt7{Y1`TW*HOQeEE50!(Owr3&aA%jWvs_K%r|P1X{qJ$_!r9R+Er z)4AA8WY(@ivI3+$W?hbPto|F`lG4)Ao|j=3qY257H3_Y{e>yN7vvTv|o1)>S3Q^V& z8~_R()%gfnF^c?&C|Wv=WkA($A$Nn-%(wj$ZX`rVd!~iO-YtDkgEX+|cP#xjkd7Sd zG=gG&RYgPgV44YdXVLVkh%?67Zmq#ofS38k$Jv<^tQ=6MX{GJJB~f*oaV{&ac91vp zlwToNpe59--$c-l%x%}DHr|zoh=?BI)C-X1{dcr6?CC1A9_(yFe+OI1_->D1OR6vO z=5LM~j8jxnDd=p_B?%rssBgo@=7zer%*hR53SU)}8wXpgEWJn8FtSRva^5!ZF@PRA1B=+cJnH`WeZ)zfgTV{6@hEA{F^BNk zC+IoKdF+Tr!{GCd{LD_UABs;`Wz6c{{JO21V(~uxuX=1{dR_|K%QV}ILcdK7L$q>b zo;2|g!z@=)grW^P2P!2~EsCXu_|P^r>~_rTTUSi=x5N+# zl-4$WvoveA6AL?~N&{P%>hPeNTH{cV0-phP4HII3x7w`B6hRv-B0{hFrW97=Ypv7gBJcOzfL3I`X{$?ELW&@y@oM! z<2b|ntvj(oH0UQ5rmRv-WE0-3Ci7d?Y8cmoGOW5R6)P@-$*^jeo`h?j9{Q!2lGg~n z%3}Xk1#k^q((@MHOh%3|v*pP!sppbr>gt`SsatCq5fuFdUo;i<4m+vqk=E{*kyK;@ zImYX9LgRfqspm~FFU(wyw=~5KrW+8k%t$%Yl8seuVbI8a5(d#fj=ZJJE`pU##1J^PQ^<`pN0|L&otQ$jdQNN&ms=@XoN^mw~ z0fPYL?5*3LRy^8gZ7R*&nvd5zyQ3#j{ucHvvJ2N8scQ*om7=>s_bvN}quVuN>SP2A zYNvg)DkJVSY1Etd20hlH_Y>XN;sh@IZ<*hl`OBhxK8Pm81{u_3^!~k;G zM3;GbmD?JPzKj$OT)0Ze8fwx_jnHjxpTSg;?@y^;k3Llj5NGV-xkl;PJ353eYv;E| zY@()}8$X))AN49cB}4UH zmL~VRa@7m2_-!dgRr0>)BYFJKR#m7Ni2a0mEC{pZy5pBDJ#B&?YlH_(NX^u@z>r0A zUdFjP6nRpmXX|{jC^PtaahXyo@3RZowp*`py-0HdO&f$I0>ero+Q_y=SS%}t(e8;`OzvtAz z={y?cOo*rMOEaVHYQr+RnZ<_394eo@b{-zzwRcIjN?CD0-=X2mk$vJx#d6Its9LKKBhiaAKVQc*5#&6$jZ68|F-r=;hh z+^-SsH2sEUO_lw-|bi=DTxNvoKYb0ooJ0i-Pb1dTE}kBepoT?R+dCBM&&K z>9+?}ij10mUf6*bW>0+zfKLUr_w(y|oRJoTLr`2Ya;WwvwcSrz8%YtY3Kb{ItKl|Y z(-t`k*>2nERbLz|6PLI_2xaDgBJ$tAS0T}Xg}u{SFhl2m0^K(0`!Y*Z4H*#VOSgZs z)D#v|jNpIJ&Rsc5_S8+L7y(zN4*6CNKQ2H1J)cYwShP_58gm`wwZUW?_vTO6Va6Lq zQ(#HoJyVXpz$aG0Jy^i7BY7Ozy`NZ8_pJt7Ab{p<#2c#c+9>sHH6;U8t7iP}zq?#> zLJ}JkjTZa`J$#&$bo{ycJz)RcSgPLfC6C8u{TnvB1qr9cxa;MRS(t_~X$Cy|4g!%g zn>B*uPp`CJe?$!ky%<<+a7nh}Dq@HS6dsD7PgtDxh`Upo5oF4B<>~nlZJ(Q|rauNK z?S6uOdlG7wv{6KYN+7VXI&PCSk-t-Hmj|F6K|V>^ z5>i8g;#*&gV7CvOUlRU7#%8QT4UqA~;z+Pw%>{i#5h`$FMc>+NNQM7e51-bX05Wi1 zR0XjfgqHaH(u~2~_(l00wY^gQxvlp5sDKu+az}U;Hqy#V4rp?@)KmL0WdqTx%B>B$ zcV*$teYS$eGf5SuFY}6FfKSz5r-dT4_?u8<-CBqTRJ>{vBST5XG&9hsRQZCdwp*gA zG=p!}JPHX-jqqD=Ob8H&nixP7g41@F@ zjvELcSq)p?cv0GARSgNMr+R5rr`=GlGP4z?e^$U+>AHwGL#3E{9lD4B~O(>oOEoww@Ng^u^gItJA8^M*(gW z=CwRzwPWVz{R%cee9$em_=AFu?j(fTDhre(kdxnN$`7;F;#y(2W&54c9DQ1-<{@ZV zKf12~D`q}Cg`j!_R}D6F^5WPi`;{Cfs=SS+OUtn{wxRw}wweaKQfB3qFV&6S|29%k zCM{36v6NqW##aj4qB0kEsZe>GENKJ$!JTG0Psu-AA?#cRhpZ3TvyCDB_h%4_)+~#i zYSVMV**}?Wr^{eBXL(Epdwl-*pZXe74oDB9#FQ8h`Cy)Hhl}sdkB!`$P#W5vLKno?2y*X#NLg*G{jKv3bi0Rqd3GkxtiG!^LTVHpL|76*C0B z$x!}B<*k&^H-3MwLwrNnZSwt!JqSeTL2WdY&|t~iA$xpoGeL$b?B!W(f#pz^7lG=< z=O!`DbGE9r{ZJ_h6dvmdoaa1J(1cP*cJ1gBHmrgRhrhBwYBD+Tak_v8mpAcP%9Ka zw`21Lh79NB;YkICG{qxe8TLArX6)JEm&^Vp6t!OJds9G`+u{6q7L1Ba{LqvwJn|+$ouW#B~mf~$#zb+bSuk|fqZSwqSF|%fxST7v=ziw&3 zUUOXes00|hAC?S+?VMCfs2}I0AnLRU$ESPduSiE(4mO&PR9xp^iO3=dSx_{Ic4QUc zXQMIBDl!4gwn_};J-}>~A*A>%Exc_`DDC2%+7VJ>b-azV97ygn-{v%)LwN!Yz1v^w)vjo}L{rJ8%E~ zspL8gXkuE?VXALpdrnhQzT?p-GFI|U3hLcU_2uxo+zFlgYE+w>fX5shT5z;b_f*aQ z8W5uP?+Yza8f2N)JuZFj}jL>y4XV(ZoLQ2BJ6M z*1ho>tByE^ciha)V+bY_pT{2EE8hvZ%l2f%BgH5 zl%{`US`UGsX}vIfhhh`Aj*>b==H-CLwJ-ADH7f}&hpj&@{>~g^D}mWVt>V3+@8`2s z5DKFPhEu~EH$)q;CBYTl#h2jR=1&R(-FcKW{x&5SD}Jg7!TjFc?fP5`EZopCW9mzl z*rWy3^FNkWfp7lmgIQ{g%Tu>Yk%)MdU(HwR0ft~J8i`Ys$cLC`p_ZnmptX!9f7f+Z zi|T@M9S-tpcveqBshFHS6_rus+hW#^4(xEh6}8?$M?lye4MG?Wzdg2%nR!S`+Ll*Z zvwt)NPWSi^3%=&jY^EPgHWsAoHHPPT8JIuK;o97Y#VALEJbmpoc=y#2id$y0G@0vg zP-PfzwlpS!wb6ot589qIAwJC2HjhiSw107UF;0?5xd^FYja zaBy(;gh*Ry#9b?Lx7FYmDRp&e0R@$5d#rB*0Xxf<7UT`kk9AdImHwU|AG_KaTuKbU zBM|_Nz(R+r&il4x`G2!3eM`CTcbk7Z)9MNkg634}dasy^3o1=;&z$wT47=yV_3>vl zWQT@dUmO2hY~)FQRP&Cr{?O(zMJWwt7kH8oCYoI0{rI=$hDTX)bO7cxjID2>puXcG zG*eOK9R<;^&pWVgVE!o~{A;sp0qI}AW9fM*2Bqrga;{QkYVS62we5v}WnC>hr`hk7 zjvf~Uwh2^$rpF&eAGsQ|g(@fh39>4`3m_GGT3z!DwQbmioNbsNNa-XB;I0gkNOcYy zCGFLQtNUGS{{o{feKF{sOdLNyzsxJfM*}QArAts<<8w9JNXRDmB(cKGE0~<^!6v=& zgwHa5T_SW48CUDy$`4F&3Z7zd!dwq=R+=|XDJm2@)N%9Q>H$QWm1oDNPVsaO!;`q@ ziB%B9QKK$eVrq-Z?GZBJs4R1oAE&32u<`I{hEXlc3Wd7ZXmORkiSzl?wx??T{bq$}V6_LWH)?_+yDH_tvKrD}-TR6@Rlpe0_ixynEXks%Urq_F zK$ctgn_O&2gz4jTd3hp-gqQ{1$mQV33Ak~h;vh_+o=}y;=ZF1nJ>9bFT9|CQ&$hBE z7iWfxJSO>pt}An&sR0cI3waVp*P)62ToXx{ZXZAOfu#&WT+7~8Jas@0$5>H7u{}Bm z#Y0iNpBVnLF22ola&#HLB*L@b!|7Q@odUHx0XcoM5asY*SmpTU#uDcI?NhK)(23)o z+SX>0jhwf=vd8eqO$m4h8zGYsHSm*#c`ZVMziWm1_QBhdGuTXZTTtRvPXFyi&^WbT zO(c2EYKst`9Cw6mP0?-;lR$2hKAngCt`$UIp{6(7zQ(5$zCHm$S9Pas0t6ij1Yxnh z)Y?&(|0anbOP^DeY$Wn_=-j< zo`f(FDgEB5iTOn=C1l8^;prw4%!TM`dAhFPUa!li2 zL`|Ec$5OT!92~V6p=ci;-@buE(s2~=P-@Y>O`Ay;RX~bJ`B3^WbmV`d40N$MYST!c zq~Z9e{TkAWi-(}^qzK$C*4Lv4KND)0zEjG``@O~itgFNPJp!h-Rf{EpT_$OE{0}Q- zn$az!>ea5QsSvY!R(uvFt}-OBLgryCtSWc?Fo2?=5rhz$KR2W#N3Gk}kl~a3#~Gt8 zXg6*eRHjgjO34X^Y~4&iU4nnU8?~GJK=HCz)!M_D#xP38he|aHq-!q1W*k}Qnl9CwJoxUk;r|9Fvr$sq6pmNZfm9g zOZ|Zr(3)%`L58URPnPHTH{xpo9FW7Lj|63)?Dz7~f!z{WLXubll1$iwvYAR;RGqD& z0K3PQDH#z20)mS4dPuN&??W-mG&&mE#AD1jOmIS2Nvm~;P1t{$Wo!=NGSPM>|2f~p z)0MHf_yO;Ar~YeWIdGVzJh6cJ+}VfXv!%JIaXAx3R5K~!&g^yI1}+`#WK~Nt(6a%W zj-ZtNqxR!a3pnBe?V+GaX80K)TZ~AAiOaJZGJ{`>3Y1Z$=k>vZk%w}C%8)K=Ib5>eSG`1R+}9`Ym3suOk&b?WjgLEi4)GXa`PyK0|Fjc3idP5wbpfc#1# zOl_dJvvLQNY0H>=Qgt!;H@>{=tFj^p84<8fL9vl=gpR?Zg5GrE>~T1a?>mZsO9Uz! zy^@ESS&41|;=$rKEh?inZTcOp6 z7!`?#G|YK0?CAv60wYGSzdTaO>zLD@1lA~G5F4Yh`RvTB--Wgt9=SEb`HONyB9zR1 ziprAXB*|n2zv1t|Qd9_-eXlQHYT^_Q3hNK&g!)j@&%Z%k$YAh29DRxUQjCl#e0+Yi zUEPF$iZ><+M2N#(4}F;ZZ&vRBo>esV%$+xN#m``U3m#}ELqnEH{}26>maZehD0JMV z$&y+XqtdW z!{RVSa6DuTh^>$WNzFk!q73(WJ}fjgfn?xn>&w9RX5`22Q_1M6B$Tb&kMt|QD^e4< zZF|xlYc&Wkr&xEEr=^t`1sz9x^e=OXQ`AD>pJh3E`hJRP<8Mq>>@m6c+3({@pLA1n zffAS3q~(TcT9kB_nF}*>ZPe@JMrHr#O45#*6cj`;htk~T(<8$A*D8kt{qD`ppM$qE)H&S9ZN@GC6~#fj}UJUeI$4nhL#_O|vh z?KZuSKdLryur(G;+l4(xPt$%r4aEiJ5!mas#_oN0K4(9Nm15zmvIW7oJa)UfU}&#h zcpEx8KK=Fj^0qb1C(Ip8RtM>6cK42d+9b#jJQXp`x1E1t5*U{o^Db^Q+L0m`7dQ{B z{`s`M^}GIB2RKzXM3{m-4u>sRI)LdASCYs~ue+_a2a#krY#*iLGTVTWKYeB>Nk3Vr zA~(D~#M`T{Kl75i4@p<>$gfN%|0|q6>^{WZ?myv+!}GyRvLYlNLp|wo)Znbb427$_ z(=Hzk9fY9CvpZ%H#UUaI+$7S^SGSSyAof}!|3>+ zaeWR?L;FFzn(lR;?=K%Thm*R=+;SKM3;cD&A;gXpC}Rb0kj)!~q`%eX%SsyQOG*G$ z5smTCf#>pyOblbTzJskCK0NQ`iM{8Q3xsKAcqj(&dUsdvDXl)N8($-KY+mBBkBve>~!BQOHY4OlP7x`7W5$;3_$>=b4i=!7P6S=pPzIaTkvF89Ym z<}DAp9pY~+17Q!yrxEB3!E8d3#NGoWhVuCZErhpl;&^3H|C|HhgQZ(}8=ZLwTbKg( zFzk{*JpQRQ-!=Zu$TBpFmrT?MsOr9-3HP$!HstX;kw_&rrS`))J9b{XdFs6ZX0Yb= zvk}HzzLAwu<#Th0psKrMlXsaIq`bTpn{X~?KxgCp60nV2{RLWm&Ig{W;NL!+4VL;n z&2?9})lS|h*TMG|C$-vc(JxpJ^6O%^`nhTRE8}|;9p``Tf4zfRjXyF?yBi)J z)wHt<*7vjse}3o+LWP0M%y3?va@t|A>%FwhnM8Ls{xdXuh-ltY>S}kUGPEF(?-iXl zlWAaxp-N-l;53&b`n<-@XtgvxeK4v&-T2gQ}iKND+Ru7#dY7Pgj;Y8j;GDx2czWNEd);*iWmGKWZ+Xgcw0E4W@4-Z=^iqn zFH)MyMaxBqwjre!TfomWVr)ql)knxh4#8f*0 zKU>E>hGi?jU8bfb1heu^rOyPD=jjcOy?1hxS4?Dd-nxfYu}sy zPwpn6WsV@xNSP0~Ezp42-Tf^JVttmXPN+?b6h@-9>GuMTE4pGXcK`4*1r}MJwpmAM zkRm}KW?1oHl8evYuYvTH?RQ9li>K$xo;RJ6jTJZ<`>N zvQoby&fzV4qAl0Wy9%6^$@rQpq@YQcIuPpSah+kPWa*1n3yz+M<7ZAVB^^fwq;$_$ z<&)#B=ui(qXWZRcfab#WEe#PVjU6&FS@BG(&J-kqs28#j%eD-3JvK~s)zLj^ep}r* zI>U%8A$q+rhi~wr`I*CKXTi0;Z_m_kQg1K<3@3VesAgs%L%Wx3!W_(t^>0)y}HnTn3V z==qW%Une}{wj_P}XiqOmlOw0*(dFJ%MXmh@JsSmJpg1fdidslNQ;`Zwfw)SPRAIr{ z-A5h6vQovJm@uTZ`k!TQQ8y{5H(!1#DN338&kycVmluFd^$&q2vsXL(8U8!88x4$sFDHz`mgGuUCiLR2v6EyWh%2=3@Km^P25_I`_ z$Uzd^kZ{-i&pA92&ZTq2IDXCQhUN!RNB^M-3!LsFpjtu6v#U6yI=sIsd-6)PU$$bk_f$&0in~%p$YJiMonHxzIV8}|B(Hq zn_!=~#P8z~Z>SBWJT5ViP5>^E2FO2su1j2WabZXPpZRU7N#EvynE8p?bs22TORD-X zH^l%`7WVmBMT?Wu_xkk^9UH|o6{9eciOY(6RP+e#hLRbs>MR3P4hI;LLD&j_0`gO1g+gD~!pA$WKR?11wj6tnjV;HSU!3G?;o7^} zbP?FZ-}G2=vnViEBr0oM%!)_!IP;74)z~~oiSbXjpY@;4sHEfKA|vmnlTBd8+dNdH z1iimV73E`zg{i<=T$ZQCf(WW|d}oZSnV5YAk_4OWZ}pQ~;nXMFcf9 z<#_3RH#qwWf;}*)QHJ99UAY13mX`82)@qz@dKW2Nu><|=;NL$cA-+@`4$0QI?HNoY zq6}@^@#i%$3T&b`YF6%3NZM1HU#B?1Hzx)d!e7iM;@WR}W3=EX(YHb}mIiB!#dnTJb zX7GNw)1TG(n8;)a9l?*nbFt01l(MuG2{ce~g7&Yq>2LThk1!y@3d4d1sxglJ+XC0i2xd!p_mFpGF~?DLT)rDv#!zsDEDF_VT|jLjPdKd#g#h&rOUUAhzBthogn8 ze;{4DC8?W-bqRq0SSJZ-Dq#DYIVd_!`*X597o^SEvN^m!-uCQbs%(qecy8@+Q_erY1 zft9?NAey$<5P*XGOj0g1c<}LhUNe%i_=p4S81t0LO=-1ZTm7Aq zYtNY9<4$jBuiM7V6|)<=rBaB=5N<`!9vC``4mcF?lx5*BLFdx9Aw@m{riLrd<=d_w z9*p-R=7)oAV_H7aUe@`K>oWnQ%Sh*X+JhD6jIzoJSrmV6MNX+M-190Msoce#DpV9| zv9kDm58JOlKEAYc{%T@m7Rjo_v9N-d{Efv>^LBYu#g{1!6OGTR`4Aybeuud{XIsCP z-sHi$780z-Cty-NzT`{4EVFFPlpZ4qwrU5v9-lCHKmWCAWa&7c-thd_Qig%fFe0l? zl`IDhf>T@d5cD4lvJlfDiBFg(i#Ybiwb1^-R_7tZjq8AYCAgtHZ@;IDxn|8UKOK=y zm0yR#RLHMzUO`1_8Bkt+mj31TrJJb4LWG!->NJqzAeOeXQ!DdpJ?J#OPAI_R{M)dM z=V*y;8*X#R^sWw8{1a(njO=*XO&;~o;|rcqlyd4Ci%LLY;qIk^W~b|T?-uN4O>I&m zE^h7-OZQXt>lTaWU@;>#F{GB5ktDjc3U~pdvUgIDs4>lYL^&aO86sJP7QcvH-ammD zF^o;|gIoGCkKRJ3NH$__A$C1IuMlkdQ}c(2c{0&fnEVIEZ40$~*wMW4k8JPvTR*+5 zv^0av6n6Za07(%sz;68ki1J#|1`X*~l61(~Yf^~2psQ^>JJm}Uw{oDlR&dX#+d!fMq ziBodJN*p;^qW?^4_2YOUTbG0YsihCk2*{fT3$CGoEe$>8sg? zln8&V-Mlg(P6IeH81imNnr|Y$;HLjbgSx=l^o2!srh)p%F*tza+;hY}hA5!*qc9Qj zLfJ|paL5q7y(H1pb5Pz!oP_O>?hN*G;PPdv5dGt5YJQ$?rwKN|`(s50>w$AuRsO#l`fhcuwk1VfrX@wIlbDN(3*qvI zBqX-${9q9hpb6(6P6~RjONwJz$Hi=zpe!x6jKk<%nxPcqUx$>Xq`95ERF7D)vDTvw z;|Vs%aKC}gLU*TgZjn$|s{9+2AJK8h#4JgN}+CHvhBnb&JXI3;t|-1R*&o2&1V+<*?&6T&AqtFp1>xlsF-7W$;;hXfpsh zrDA=JX6G-ox4jw`X#Iz{c#NbW(wK_)l*4Zu^UN-6S|L$W^GfEHmlXuv_WZV>(SBh>jtJ>a}HZ zInLj|9y7&ou)pAMDx7tH03=Qx9Lmhh-Qba99S9OS9}Imn3O04>PQc4&M4AtOGy-<7d8=R4C4>ERAxI9~5gT(FeE$6jCGe{PTt9iUITUU;>x# z63WcXEYr*+Lhm1q=8Dm3c@u@L&T2_19KXj>e`xP58v8(Qw2M1_+~v6)JNVvxGj8n0 z24VdjIZxl);}fPR-djZ?rb^dP0t`7B;K3<)E&5Y>QISg@D9ZbNv4-yQ@UjO6iW7B7 zK*)~jv;y!Sez=+iP3H=YJL&qg`B1~3JBOGyWV#o7tG!Pk`!%|~G%$4DeQb23Cnwvs znqII)deHLKmx;hn85=3d@ve{=%NXFw3ce2B1FnF`usZ_US-E^Y?+-(X!`QKc5&hZy zOo3Geh;6j9*iJ*iWotBR{_>BJLDl5u6tVc9L;Hb`AXn-!fu1k}k zkRI_H!fp4oid$V06|`x+GK8H$JwDz^8Z%rEH+@k|tUL}5Y?Q1_^W`o&vSaEV)ti?- z2$?C_p29CAFN5bwr%d>o3ERKhm!7U%iAM{PGlzAWd8$_-gqP>H(a<}A$8ac@ou*1J zM-iFjZ}(2f%aQ~E`e`4U7IzQv6PH!aN*%fZk2Z@ORjuX{^5co8y4!SRdKhyoHhoYD z*QN!n&kiK8C8OeZqSp4L%Tak(g47EOE{|CWH;_6aopVFM)D*_3WA55Oc%`2KSAj2t zm!pNO5YfK$M}s@{We>!lpeEf`v=Hbz2saH=3&+T$^NooeJc5CpAoh9ejFA;>rdXSgJn(J@MUg;2U;~fQHMz}E*meA< zL&6H>F3p&+(Mk@mr6>j~z*!y_a29ZTGvcoTs_hjM6LRSiTbw=N!h}3Cd|zUe2M~kH zPTuT$&Zd+@?@HD~;*<=Vw1)u2Aq{j?vRrI(-2$+ysq(FPQ;fD^$u(r*T&VQmnfL_M zQhCg33ZYHV^>6<9PSJN0AhZX~CaD>nli*`*BojSeD1l(?;K3J;U@JBHTv90@Z8e+)! zprn=qJqv-D3MiyH(&e)9pCNE104h-zaVxR396^FxBSoM*0*-N4+Oe$5_D(Kd@xpH~ zqnWdwdIIi=K3(Z3FE9QUnZ;;QHl9s4^cNnI6aGH|L|YaW-9Aw~(wl~;*x5T;+_DxB zLHtM5?*;#4kTbQsm%R`#Ai9nuoK_>T*o1n2X6lZdU4hOJXIU8Ue?2cAK&-WFP z3P$~_DrDeXDJ^GQ--;?2(1a8OtSb@%*0h2B8bBnbG3anZQvHxLq#!QXjgW8Ukd@iG ze=F<1V@k~FhYJsxs*|Bl9+)0J40hKzXS1r^$4OQQkepbgJ0zth^vyGYMY}}WW5=MV z;1$@ZWpD2ykI06J6j7Mj&L5YK#+A}NjI=v@OEscV2q$VS98aZ@yiOb8$pNi&ngY1^)3 z^U=AmI#{84ny@b7g013WB_g3ILc#-FiI@PB2+a_4H85X-mDV*0xI)L67Zv$TT&T;G!iUVIvSRiMqrz+gLYaPo8g3*B%Xm&}q2n zNeI}8Ld5(G$=N!4?JRw8br zlB*V_9&W-mFg7|732hN_rF9z~FkuF?i47|OlX$)mu^!rI$O@!QBVh}~-0;Lp;`vTQ zLTZu4d4x!u$MX&yBBmpGUy>xPr!wo^&$R73=-`}!uX1?@9dyt^2OV_KK?fal&_M?s dbkKo;{||DO5*~3IAvpj5002ovPDHLkV1m~P4sZYf literal 0 HcmV?d00001 diff --git a/pages/map2d/end.png b/pages/map2d/end.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c609298f155f47b5891452d2afd0ed58850f10 GIT binary patch literal 3404 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 this.defineEvent[event].splice(i, 1), 0); + break; + } + } + } + } + } + + // once 方法,监听一次 + once(event, cb) { + let onceCb = () => { + cb && cb(); + this.off(event, onceCb); + }; + this.register(event, onceCb); + } +} diff --git a/pages/map2d/map2d.js b/pages/map2d/map2d.js new file mode 100644 index 0000000..5850cef --- /dev/null +++ b/pages/map2d/map2d.js @@ -0,0 +1,118 @@ +import MAPAPP, { minScale, maxScale } from "./MAPAPP"; +let map = null; +const compassCbs = []; +let initScale = 1; +Component({ + /** + * 组件的属性列表 + */ + properties: { + floororder: Number, + hidden: Boolean, + loc: Array, + searchType: Number, + }, + data: { + loaded: false, + dpr: wx.getSystemInfoSync().pixelRatio, + shops: [], + floors: [], + pageHidden: false, + sliderValue: 0, + }, + observers: { + hidden(val) { + if (val) { + wx.stopCompass({ fail: console.log }); + if (map) { + map.shown = false; + } + } else { + wx.startCompass({ fail: console.log }); + if (map) { + map.shown = true; + } + } + }, + floororder(num) { + if (map && num !== null && num !== undefined && this.data.loaded) + map.changeFloor(num); + }, + loc([x, y]) { + if (map) { + const crossPoint = map.cross({ x, y }); + map.setXY(crossPoint.x, crossPoint.y); + map.updateTheta2(0); + try { + const { name } = map.getNearestPoint({ + x, + z: y, + floorOrder: this.data.floororder, + }); + this.triggerEvent("point", name); + } catch (error) { + console.log(error); + } + } + }, + }, + lifetimes: { + attached() {}, + detached() { + console.log("map2d detached"); + map.dispose(); + map = null; + compassCbs.forEach((cb) => wx.offCompassChange(cb)); + compassCbs.length = 0; + }, + ready() { + this.createSelectorQuery() + .select(".map2d") + .fields({ + node: true, + size: true, + }) + .exec((res) => { + map = new MAPAPP(res[0], this); + initScale = map.scale; + this.setData({ + floors: map.mall.floors, + sceneIndex: map.mall.groundFloorIndex, + }); + map.on("loaded", (map) => { + this.setData({ loaded: true }); + if (typeof this.data.floororder === "number") + map.changeFloor(this.data.floororder); + this.triggerEvent("map", map); + const compassCb = ({ direction }) => { + map && map.updateTheta2(-(direction / 180) * Math.PI); + }; + compassCbs.push(compassCb); + wx.onCompassChange(compassCb); + }); + }); + }, + moved: function () {}, + }, + pageLifetimes: { + hide() { + this.setData({ pageHidden: true }); + }, + show() { + this.setData({ pageHidden: false }); + }, + }, + methods: { + handlePinch(e) { + if (map) { + let newScale = initScale * e.detail.zoom; + newScale = Math.max(minScale, newScale); + newScale = Math.min(maxScale, newScale); + map.scale = newScale; + } + }, + handleMultitouchstart() { + initScale = map.scale; + }, + }, +}); diff --git a/pages/map2d/map2d.json b/pages/map2d/map2d.json new file mode 100644 index 0000000..85e9d42 --- /dev/null +++ b/pages/map2d/map2d.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "gesture": "/pages/gesture/gesture" + } +} \ No newline at end of file diff --git a/pages/map2d/map2d.wxml b/pages/map2d/map2d.wxml new file mode 100644 index 0000000..61fe47b --- /dev/null +++ b/pages/map2d/map2d.wxml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/pages/map2d/map2d.wxss b/pages/map2d/map2d.wxss new file mode 100644 index 0000000..03e865f --- /dev/null +++ b/pages/map2d/map2d.wxss @@ -0,0 +1,33 @@ +.map2d-wrapper { + position: fixed; + bottom: 82px; + left: 8px; + right: 8px; + height: 248px; + border-radius: 16px 16px 0 0; + overflow: hidden; + background: #fff; + z-index: 12 !important; +} + +.map2d-wrapper.hidden { + bottom: -99999999px; +} + +.map2d { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: calc(100vw - 8px - 8px); + height: 248px; + z-index: 1; +} +.slider { + position: absolute; + top: 0; + right: 0; + width: 248px; + z-index: 2; +} diff --git a/pages/map2d/start.png b/pages/map2d/start.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9bf39eb4e1254902f2eb307408e1e409894ebd GIT binary patch literal 2860 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 + new Promise((resolve) => { + wx.request({ + url, + success({ data }) { + resolve(data); + }, + }); + }); + +export const post = (url, data) => + new Promise((resolve) => { + wx.request({ + url, + method: "POST", + data, + success({ data }) { + resolve(data); + }, + }); + }); + +export const getCrossPoint = (point, point1, point2) => { + const cross = + (point2.x - point1.x) * (point.x - point1.x) + + (point2.y - point1.y) * (point.y - point1.y); + + if (cross <= 0) return point1; + + const d2 = + (point2.x - point1.x) * (point2.x - point1.x) + + (point2.y - point1.y) * (point2.y - point1.y); + + if (cross >= d2) return point2; + + const r = cross / d2; + + const px = point1.x + (point2.x - point1.x) * r; + const py = point1.y + (point2.y - point1.y) * r; + + return { x: px, y: py }; +}; diff --git a/pages/nav/bubble.png b/pages/nav/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..99853e6993e0a87212d9588de6b8d3d88a46c041 GIT binary patch literal 865 zcmV-n1D^beP)00009a7bBm000&x z000&x0ZCFM@Bjb+0drDELIAGL9O(c600d`2O+f$vv5yPB2~GK}_Uh#D%cYK7sfIoj!r`1Z8CxhE%MHvVfFm zq6-r-lAw*!3M3kVFa@SxGv#_up`>adF+oTff5{}hCpS&+zvrBL&KZVXh(toNeZw^f z8?J)GBTODtCz^Psz}OQLd{j~TlRIr>m5k3LVUG!f9Ck;0Q?nPx8yit~tRA(s5~`7O zT1Q4a3ttmhUitw&qYoE=U?pMx5aij&qroH2nt=C=PxiK+h27!6VI%%=8u6JA8s`Xh z_YFMUabt8Otd75U%G3HfKkU#M>8#PmVYOU?Z4V*Oa7#xYT)xr)ca?_5-$G&Z`sD<4 zef@sPQ;LEVa|Xw|Yn@%PRm3PkqD)SVX<0LWiE@gKj3U7VeCOLNCk8=h_O|+DJ4cAt zjJ(6?mJ%JEU9c*Kk;nL06xpS({SP>tc=6qL{oDM>~*etB4l{)snad6Iz^{o zXt#+9^r97W$M4k1^+F1GD5=WTT7m8*qygI!1EFNH}tY_~5WVN4h6p^liEKw*-x z2aw3rVUy66m>1LW1yKs5M8UX6Z4kbI<}<^nTpVuoAW zOEcV(=g~j;_RTA-rdDDcTrH$>?|1w0|AKuNq?~9Z9B{iOl{|%F`}?AGA!~yaX0e?BQM)uC100000NkvXXu0mjfyVQkj literal 0 HcmV?d00001 diff --git a/pages/nav/close.png b/pages/nav/close.png new file mode 100644 index 0000000000000000000000000000000000000000..f0237b77e2948cbcb1904e863d47af8bbd5f26a5 GIT binary patch literal 482 zcmV<80UiE{P)0}gTxAU&CL3nz08vkVuio| zm)7=phz!Fp48!OTC;j7gy&O146HinYRE*z0zZV3gtA0U3g7_$Wy@teZo~rq7v-%?t z7xS~L{$VN|D-LiHum3=WsF|;6yHYw{9Kd@T-aShU(PW-Y`7sF*uYuTvj*5YHO|)zI zp!F-(QU!=lEDwP)&tp1}5&~(S$91Gj2()<~n}8-n4)Z)d5lM(#=2-(kEJWoim&-is zfM^TRJSoOJYXOmjK$>SgFtHG5^CvX55P%m#)59yIFFWFTAasiu7XtDM#rFA7#s1$u zN8Tqg9%R=Ai>zYrH4@OAu(?8HDCXL?${ZoU<@Doy9vuRBp^+a_$Pl0_rT&CPh0yke zpj9OzgtjkqGf`S?^YQgFZ$2lU&=*1#W=$b-_J#K0Q=+TNT8KTJTZ{6(kYN~xVHkaK Y1RJOl014$~Z2$lO07*qoM6N<$f`duEF#rGn literal 0 HcmV?d00001 diff --git a/pages/nav/nav.js b/pages/nav/nav.js new file mode 100644 index 0000000..8c2f072 --- /dev/null +++ b/pages/nav/nav.js @@ -0,0 +1,33 @@ +Component({ + properties: { + icon: String, + t1: String, + t2: String, + progress: Number, + end: Boolean, + }, + + data: { + progressText: "0%", + progressNum: 0, + }, + + observers: { + progress(val) { + let progressNum = this.data.end ? 1 : val; + if (isNaN(progressNum)) return; + if (progressNum < 0) progressNum = 0; + if (progressNum > 1) progressNum = 1; + this.setData({ + progressText: parseInt(progressNum * 100) + "%", + progressNum, + }); + }, + }, + + methods: { + handleTap() { + this.triggerEvent("exit"); + }, + }, +}); diff --git a/pages/nav/nav.json b/pages/nav/nav.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/pages/nav/nav.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/nav/nav.wxml b/pages/nav/nav.wxml new file mode 100644 index 0000000..5a3a7a6 --- /dev/null +++ b/pages/nav/nav.wxml @@ -0,0 +1,13 @@ + + + {{end?'已到达': t1}} + {{end?'': t2}} + + + + + + + {{progressText}} + + \ No newline at end of file diff --git a/pages/nav/nav.wxss b/pages/nav/nav.wxss new file mode 100644 index 0000000..3964f90 --- /dev/null +++ b/pages/nav/nav.wxss @@ -0,0 +1,115 @@ +.nav { + position: fixed; + height: 120px; + left: 8px; + right: 8px; + bottom: 82px; + background: linear-gradient(180deg, #ffffff 0%, #ffffff 100.83%); + z-index: 12 !important; + border-radius: 16px 16px 0 0; +} +.nav > image { + position: absolute; + top: 12px; + left: 12px; + width: 72px; + height: 72px; +} +.nav > .t1 { + position: absolute; + top: 20px; + left: 92px; + right: 40px; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 36px; + height: 36px; + color: #767571; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.nav > .t2 { + position: absolute; + top: 64px; + left: 92px; + right: 70px; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: normal; + font-size: 14px; + opacity: 0.7; + line-height: 20px; + height: 20px; + color: #6a6665; +} +.nav > .exit { + position: absolute; + top: 16px; + left: auto; + right: 16px; + width: 24px; + height: 24px; +} +.progress { + position: absolute; + left: 20px; + right: 20px; + bottom: 10px; + height: 2px; + background: #eee9de; + border-radius: 5px; + z-index: 1; +} +.bar { + position: absolute; + left: 20px; + right: 20px; + bottom: 10px; + height: 2px; + background: #ffdb00; + border-radius: 5px; + z-index: 2; +} +.thumb { + position: absolute; + width: 12px; + height: 12px; + bottom: 5px; + border-radius: 50%; + border: 2px solid rgba(239, 150, 23, 0.5); + background: #fff; + z-index: 3; + transform: translate(-50%, 0); +} +.bubble { + position: absolute; + width: 34px; + height: 14px; + bottom: 18px; + transform: translate(-50%, 0); +} +.bubble image { + position: absolute; + top: 0; + left: 0; + right: 0; + width: 34px; + height: 14px; + z-index: 0; +} +.bubble view { + position: absolute; + top: 1px; + left: 0; + right: 0; + z-index: 1; + text-align: center; + font-style: normal; + font-weight: 900; + font-size: 8px; + line-height: 11px; + color: #6a6665; +} diff --git a/pages/privacy/index.js b/pages/privacy/index.js new file mode 100644 index 0000000..8916456 --- /dev/null +++ b/pages/privacy/index.js @@ -0,0 +1,66 @@ +// pages/privacy/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) \ No newline at end of file diff --git a/pages/privacy/index.json b/pages/privacy/index.json new file mode 100644 index 0000000..fa30d24 --- /dev/null +++ b/pages/privacy/index.json @@ -0,0 +1,6 @@ +{ + "usingComponents": {}, + "navigationStyle": "default", + "navigationBarTitleText": "隐私政策", + "navigationBarBackgroundColor": "#FFFFFF" +} \ No newline at end of file diff --git a/pages/privacy/index.wxml b/pages/privacy/index.wxml new file mode 100644 index 0000000..ddaf89a --- /dev/null +++ b/pages/privacy/index.wxml @@ -0,0 +1,180 @@ + + 隐私政策 + 最近更新日期:2021年8月20日 + 版本生效日期:2021年8月26日 + + 本政策适用于英格卡购物中心中国提供的各项产品及服务,包括线下、线上所提供的购物、聚会体验、公寓式办公及与其相关的顾客服务、荟聚会员服务、租赁服务、产品目录册及宣传资料投递服务等。 + 如果您有任何疑问、意见或建议,请通过“任何疑问”中所列的方式与我们取得联系。 + + 英格卡购物中心中国(以下简称“我们”或“荟聚中心”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,保护您的个人信息;同时,英格卡购物中心中国承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。 请在使用我们的产品(或服务)前,仔细阅读并了解本《隐私政策》,特别是以粗体或下划线标识的条款。如您选择使用或继续使用我们的产品或服务,即意味着您完全理解本隐私政策的全部内容,并同意我们按照本隐私政策收集、使用、储存和分享您的相关信息。 + 注:本《隐私政策》版本更新日期为2021年8月20日,将于2021年8月26日正式生效,在2021年8月20日至2021年8月25日期间,对于新注册用户,或是您认为更新的《隐私政策》对您更为有利,我们同意双方适用新的《隐私政策》内容。 + + + + 目录 + 定义 + 我们如何收集和使用您的个人信息? + 我们如何使用Cookie和同类技术 + 您的个人信息是否会被共享、转让或披露? + 您的个人信息将被如何保护? + 您的权利 + 我们如何处理未成年人的个人信息 + 您的个人信息如何在全球范围转移 + 本政策如何更新 + 任何疑问 + 定义 + 英格卡集团:指INGKA Holding B.V.及其控制实体。 + 英格卡购物中心中国:指英格卡集团直接或间接在中华人民共和国(以下简称“中国”)境内(为本隐私政策之目的,中国的香港、澳门和台湾地区除外)投资的所有从事英格卡购物中心业务的法人实体。 + 线上渠道:指英格卡购物中心中国(或其指定供应商)所提供的网站、手机应用、社交媒体应用等通过互联网访问使用的渠道,如荟聚云商城等。 + 个人信息:以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息,包括但不仅限于个人姓名、住址、电话号码、身份证号码等。 + 营销信息:荟聚中心向顾客通过包括但不仅限于电子邮件、即时通讯、社交平台等渠道发送的用于推广、推销商品或服务的信息,如荟聚中心的活动、服务或产品推广等信息,但不包括为了向顾客提供服务而必须发送的信息,如物流信息、服务提示等。 + 我们如何收集和使用您的个人信息? + 我们仅会出于本政策中说明的以下目的,收集和使用您的个人信息。部分收集和使用个人信息的场景在不同的荟聚中心可能不适用。 + 注册荟聚俱乐部会员 + 如您申请注册成为荟聚俱乐部会员,您需要提供您的手机号码,并绑定您的微信账号,以便我们向您提供对应的服务。同时,在您的注册过程中或注册之后,您可以选择额外提供您的姓名、性别、出生日期、婚姻状况、子女数量、子女生日、所在省市区、车辆拥有情况、教育水平、职业、个人月收入范围、购物喜好等,以便我们为您提供个性化的服务及营销信息,如您不提供这些额外的个人信息,并不会影响您注册成为荟聚俱乐部会员。 + 注册并使用荟商在线系统 + 如您作为我们的商户雇员,选择在荟商在线系统中注册成为用户时您将被要求提交姓名、电子邮箱地址、电话号码、雇主名称和岗位名称(“基本信息”)。如您需在我们的线上渠道中注册导购或店长等信息的,您可能会被要求提供姓名、手机号码、雇主名称等。 + 如您需要我们制作出入您所在的荟聚中心的门禁卡,除了提供基本信息外,您还需要提供头像照片。出于安全考虑,我们希望了解进出荟聚中心的工作人员情况,因此我们将存储您是否以及何时持有门禁卡等相关信息,我们亦将保留有关门禁卡发放数量的相关信息。 + + 我们也会通过您提供的基本信息,向您发送您在荟聚中心工作而益于知晓的沟通信息,如与荟聚中心相关的实用信息、活动邀请、新闻、安全沟通信息及优惠折扣等。沟通信息将被用于跟进服务请求、服务预测、对荟聚中心需求的维护以及其他统计目的。作为荟商在线系统的用户,您在系统中的用户活动信息会被存储并用于统计,以便进行系统的优化。 + 我们将收集并存储与您的各项交流信息,如果您使用荟商在线系统提交服务请求,我们还将存储该类请求及与此相关的交流信息。 + + 我们将根据适用的法律、法规,处理、使用您在荟商在线系统中提供的个人信息,以确保一个高效且运作良好的系统,从而与我们的租户和合作伙伴进行沟通,并跟踪和跟进服务请求。您的基本信息将自您终止您的系统账户之日起保存12个月或法律规定的其他时间;您的服务请求(包括第三方进入需求)和相关沟通信息将自服务请求被提出之日起保存12 个月或法律规定的其他时间;门禁卡信息将自卡片被禁用之日起保存12个月或法律规定的其他时间。 + 会员积分及权益 + 为完成会员积分服务,您可在荟聚中心商户结账时提供您的荟聚俱乐部会员信息、通过微信扫描购物小票上积分二维码、使用荟聚中心微信公众号中的会员中心上传购物小票、在荟聚云商城上使用荟聚俱乐部会员卡等方式将您的会员信息与您的消费记录进行关联。我们会根据您的消费记录、其他可以获取或使用积分的行为,提取您必要的消费、积分、停车信息,以便为您提供积分奖励兑换、停车优惠、活动参与等服务。 + 活动登记 + 为了注册参加荟聚中心提供的各类活动,您在注册登记时需要提供您的联系方式、手机号码。在注册时,您可以选择是否接受后续其他活动的通知。 + 在线下单 + 如您在我们的线上渠道中购物,如荟聚微信公众号、荟聚云商城,在您结算购物车内商品时,我们会根据您购买的商品或项目生成您的订单。对于实物商品订单,您需要在订单中至少填写收货人姓名、手机号码及收货地址;同时该订单中会载明您的订单号、您所购买的商品或服务信息、您应支付的货款金额及支付方式;您可以另外填写收货人的固定电话、邮箱地址等更多信息以确保商品可以准确送达,但不填写这些额外信息不影响您订单的生成。 + 上述所有信息构成您的“订单信息”,我们将使用您的订单信息进行身份核验、确定交易、支付结算、完成配送、为您查询订单以及提供客服咨询与售后服务;我们还会使用您的订单信息来判断您的交易是否存在异常以保护您的交易安全。 + 同时,您可以通过我们为您提供的评论、直播或其他信息发布功能公开发布信息,包括发布对购买商品或服务的打分、评级及直播互动的评论,我们将收集、审核您上传或发布的此类信息。您发布的信息中可能会涉及您或他人的个人信息甚至敏感个人信息,请您谨慎考虑是否要发布此类信息。若您发布的信息中涉及儿童个人信息的,您需在发布前征得该儿童监护人的同意。 + 荟聚宝贝儿童乐园 + 为便于我们在儿童游玩荟聚宝贝乐园期间联系家长,及在家长认领儿童时进行核验,在使用我们的荟聚宝贝儿童乐园服务时,我们将向入园儿童的家长或监护人收集儿童姓名、年龄、生日、特殊要求、监护人的姓名、监护人身份证号码、联系电话等基本信息。同时我们会现场拍摄监护人及儿童的照片进行留存。儿童和监护人的个人信息将在收集之日起保存6个月或法律规定的其他时间;此外,我们只会在监护人明示同意的情况下,使用该信息向监护人推送与儿童有关的个性化营销信息。 + 荟聚中心停车服务 + 在荟聚中心的微信公众号中,您可以将您的车牌号与您的荟聚俱乐部会员信息绑定,以便我们为您提供微信快速支付停车费及停车费减免特权、反向寻车等服务。 + 免费Wi-Fi服务 + 根据相关法律法规的要求,当您使用我们提供的免费Wi-Fi时,我们将采取上网手机短信实名认证、上网行为审计、日志留存等网络安全技术措施,并向公安机关提供符合公共安全行业技术标准的联网接口。同时,为了提升您的购物体验,我们会记录您的Wi-Fi使用地点、时长等信息,以用于内部运营数据的分析。 + 开展内部审计、问卷调查、数据分析和研究,改善我们的产品或服务 + 在某些情况下,我们可能会需要您提供您个人的真实姓名、联系方式、联系地址和电子邮箱地址、您在荟聚中心或我们的线上渠道购物的交易记录、您使用荟聚中心在线会员服务设备、所绑定微信账号的唯一识别符和在访问中所使用的IP地址,以及您决定与我们分享的任何其他信息,使我们能够开展内部审计、问卷调查、数据分析和研究。这将会帮助我们改善荟聚中心的产品和服务,以便为您提供更加符合需求的产品和服务。 + 您充分知晓,以下情形中,我们收集、使用个人信息无需征得您的授权同意: + 1.与国家安全、国防安全有关的; + 2.与公共安全、公共卫生、重大公共利益有关的; + 3.与犯罪侦查、起诉、审判和判决执行等有关的; + 4.出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的; + 5.所收集的个人信息是个人信息主体自行向社会公众公开的; + 6.从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道; + 7.根据您的要求签订和履行合同所必需的; + 8.用于维护所提供的产品与/或服务的安全稳定运行所必需的,例如发现、处置产品与/或服务的故障; + 9.法律法规规定的其他情形。 + 我们从第三方获得您个人信息的情形 + 我们可能从第三方获取您授权共享的账户信息(包括但不仅限于头像、昵称等),并在您同意本隐私政策后将您的第三方账户与您在荟聚中心的会员账户绑定,使您可以通过第三方账户直接登录并使用我们的产品与/或服务。我们会将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。 + 使用您个人信息的规则 + 如果当我们要将信息用于本政策未载明的其它用途时,会事先征求您的同意。 + 当我们要将基于特定目的收集而来的信息用于其他目的时,会事先征求您的同意。 + 我们如何使用Cookie和同类技术 + Cookie的使用 + 我们网站和移动应用拥有多种实用的Cookie功能,我们会在您的计算机或移动设备上存储名为 Cookie 的小数据文件。Cookie 是小型文件,通常包含标识符、站点名称以及一些号码和字符。借助于 Cookie,我们网站能够记录您在浏览期间的活动信息,以便您下次访问网站时更加轻松快捷。例如,我们会使用Cookie记住您的首选语言等个人浏览偏好、统计网页访问者数量。 + Cookie不可用来"窃取"关于您本人及您所有使用的电脑系统的信息,您不必担心由此引发的个人隐私问题。 我们也不会将Cookie用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookie。有关详情,请参见 AboutCookies.org。 + 网站信标和像素标签 + 除Cookie外,我们还会在网站和移动应用上使用网站信标和像素标签等其他同类技术。 + 我们通过在网站和移动应用上使用网站信标和像素标签,来计算用户访问数量,并统计用户的使用偏好。 + 我们向您发送的电子邮件可能含有链接至我们网站的URL。如果您点击该链接,我们会跟踪此次点击,帮助我们了解您的产品或服务偏好并改善我们的服务。如果您不希望自己的活动以这种方式被追踪,您可随时从我们的寄信名单中退订。 + 您的个人信息是否会被共享、转让或披露? + 共享 + 由于各地的荟聚中心所属的英格卡集团是一家跨国公司,基于集团运营和管理的需要,您的个人信息可能会在英格卡集团内被共享,以便我们为您提供更为优质的服务。 + 我们承诺,所有的共享仅限您的必要个人信息,且受本隐私政策的约束;如果我们要改变个人信息的使用及处理目的,我们将再次征求您的授权同意。同时我们会严格遵守相关法律法规对数据跨境传输的各项要求,具体参见本隐私政策“您的个人信息如何在全球范围转移 “章节。 + + 我们不会与英格卡集团以外的任何公司、组织和个人分享您的个人信息,但以下情况除外: + 1. 在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的个人信息。 + 2. 我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的个人信息。 + 3. 与授权合作伙伴共享:仅为实现本政策中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。例如,在您网上购买我们的产品时,我们必须与物流服务提供商共享您的个人信息才能安排送货,或者安排合作伙伴提供服务。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的合作伙伴无权将共享的个人信息用于任何其他用途。 + + 目前,我们的授权合作伙伴包括以下两大类型: + 1) 广告、分析服务类的授权合作伙伴。除非得到您的许可,否则我们不会将您的个人身份信息(指可以识别您身份的信息,例如姓名或电子邮箱,通过这些信息可以联系到您或识别您的身份)与提供广告、分析服务的合作伙伴分享。我们会向这些合作伙伴提供有关其广告覆盖面和有效性的信息,而不会提供您的个人身份信息,或者我们将这些信息进行汇总,以便它不会识别您个人。 + 2) 供应商、服务提供商和其他合作伙伴。我们会将您的个人信息(指可以识别您身份的信息,例如姓名、联系方式、邮箱地址、设备识别码等)发送给在全球范围内支持我们业务的供应商、服务提供商和其他合作伙伴,这些支持包括提供物流、配送或安装服务、技术基础设施服务、推送营销信息、分析我们服务的使用方式、衡量广告和服务的有效性、提供客户服务(包括提供线上渠道的客户服务)、支付便利或进行学术研究和调查等。对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的保密协议,要求他们按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理个人信息。 + 转让 + 我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外: + 1.在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息; + 2.在涉及合并、收购或破产清算时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受此政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。 + 公开披露 + 我们仅会在以下情况下,公开披露您的个人信息: + 1.获得您明确同意后。 + 2.基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息。 + 3.我们认为披露对检测、防止或以其他方式解决欺诈、安全或技术问题是合理必要的。 + 4.我们认为披露对按法律要求或允许的方式保护我们的用户或公众的权利、财产或安全是合理必要的。 + 您的个人信息将被如何保护? + 我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。 + 我们同时要求可能接触到您个人信息的所有人员履行相应的保密义务。如果未能履行这些义务,可能会被追究法律责任或被中止与我们的合作关系。 + + 我们仅在本政策所述目的所必需的期间和法律法规要求的时限内保留您的个人信息。如果当我们要将信息用于本政策未载明的其它用途时,会事先征求您的同意。 + 互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件等与其他用户的交流方式无法确定是否完全加密,我们建议您使用此类工具时请使用复杂密码,并注意保护您的个人信息安全。 + 同时,我们将始终在管理、技术处理等过程中尽力确保信息安全,防止发生个人信息非法泄露,或在未经授权情况下被使用、披露、修改和删减。我们将致力于对您个人信息实施有效、得力的保护措施,使其免受各种可预见事故的危害。 + + 在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。 + 同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。 + 您的权利 + 我们将采取适当的技术手段,保证您访问、更新、更正或删除您个人信息的权利,提供与您个人信息收集、使用、分享、存储等方面相关的多种选择。 + 访问权与更正权 + 作为荟聚中心的会员,您有权对错误或不完整的信息作出更正或更新,您可以访问您注册会员时所属荟聚中心的微信公众号,通过“荟聚会员”-“会员中心”进入“会员中心”,然后点击页面中的“完善资料”,即可访问并更新您的会员信息;同时,您可以通过微信公众号中提供的其他菜单,查看您在荟聚中心留存的其他信息及记录; + + 作为荟商在线系统的用户,您可登录您的系统账户,在任何时间修改或更正您的个人信息。如果您希望获得一份您的个人信息副本,您可在系统平台上提交服务请求来获得您的个人信息副本。 + + 如您在使用我们的产品与/或服务的过程中需访问或更正其他个人信息的,请根据“任何疑问”中所列的方式与我们联络。我们会根据本隐私政策所列明的方式和期限响应您的请求。但请注意,由于技术限制或安全性考虑,您的部分个人信息我们还无法为您提供访问和更正的服务。 + 删除权 + 如果我们违反法律法规或与您的约定收集、使用、与他人分享您的个人信息,您有权要求我们进行删除。 + 如您是荟商在线系统的用户,您可以通过登录系统账户选择删除您的账户。但请注意,如果您选择删除账户,您将无法访问可能对您在荟聚中心工作有关的重要信息。即使您删除了账户,我们可能仍会保留您在系统中的沟通信息和门禁卡信息。 + 您也可根据“任何疑问”部分所列的方式与我们联络要求删除个人信息。 + 撤销权 + 我们的每个业务功能需要一些基本的信息才能得以完成。您可以通过删除信息、关闭设备功能、在各地荟聚中心微信公众号的“会员中心”中更新隐私设置等方式来改变您授权我们继续收集个人信息的范围或撤回您的授权。您也可以通过注销账户的方式,撤回我们继续收集您个人信息的全部授权。对于我们额外收集的个人信息,您可以随时给予或收回您的授权同意。如果在此过程中,您需要任何帮助,可根据“任何疑问”部分所列的方式与我们联络。 + 注销权 + 您可注销您所注册的荟聚会员, 账户注销将会清除您的所有用户数据和账户信息且不可恢复,如果在您的账户下存在任何的虚拟资产(如账户余额、积分、绑定的礼品卡等),建议您在注销账户前使用完毕,账户删除后将无法恢复。您可根据本隐私政策“任何疑问”部分所列的方式与我们联络以申请冻结账户、注销,或获得更多详情。如您在申请账户冻结后需要重新开通账户,则需携带个人证件至您所在地区的荟聚中心的服务台进行人工办理。 + 但如果根据适用法律法规,我们必须收集、使用或分享您的信息,我们可以在适用法律、法规允许的范围内拒绝您的要求。我们有权根据适用法律法规的规定调整您的上述权利。 + 营销信息的退订 + 您可以选择是否接受我们、我们的关联企业或服务提供商通过电子邮件、短信、印刷材料等发送营销信息。您可以在各地荟聚中心微信公众号的“会员中心”中更新您的营销信息订阅偏好设置。此外,您还可通过这些信息中提供的退订机制退订这些信息(例如对于营销短信,可回复0退订; 对于营销电子邮件,可以通过邮件中的退订链接退订)。对于微信公众号中推送的营销信息,您可以通过微信中提供的公众号“接收文章推送”设置开关关闭推送。您也可以根据以下“任何疑问”部分所列的方式与我们联络,来更新营销信息的订阅选项。 + 响应您的上述请求 + 为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份, 然后再处理您的请求。我们将在15天内做出答复。 + 对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情况收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际的请求,我们可能会予以拒绝。 + 在以下情形中,按照法律法规要求,我们将无法响应您的请求: + 1.与国家安全、国防安全直接相关的; + 2.与公共安全、公共卫生、重大公共利益直接相关的; + 3.与犯罪侦查、起诉、审判和判决执行等直接相关的; + 4.有充分证据表明您存在主观恶意或滥用权利的; + 5.响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的。 + 6.涉及商业秘密的。 + 我们如何处理未成年人的个人信息 + 英格卡购物中心中国不会主动向未满18周岁的未成年人收集个人信息。然而,我们在提供如荟聚宝贝儿童乐园等面向未成年人的服务时,我们会根据目的明确、最少够用的原则,在家长或监护人的明确同意下,直接从家长或监护人处收集未满18周岁未成年人的个人信息。 + 请您在使用我们的服务前,确保自己是成年人,或者在家长、监护人指导下使用我们的服务。家长、监护人在向我们提供未成年人信息前,请仔细阅读我们的隐私政策,以更好的呵护您的孩子。 + + 英格卡购物中心中国将不会向未成年人发送任何营销信息。如果我们发现自己在未事先获得可证实的未成年人的家长或监护人同意的情况下收集了未成年人的个人信息,我们会设法尽快删除相关信息。 + 您的个人信息如何在全球范围转移 + 原则上,我们在中华人民共和国境内收集和产生的个人信息,将存储在中华人民共和国境内。由于英格卡集团是一家跨国公司,基于集团运营和管理的需要,我们通过遍布全球的资源和服务器提供产品或服务,这意味着,在获得您的授权同意后,您的个人信息可能会被转移到您使用产品或服务所在国家/地区的境外管辖区,或者受到来自这些管辖区的访问。 + + 此类管辖区可能设有不同的数据保护法,甚至未设立相关法律。在此类情况下,我们会确保您的个人信息得到在中华人民共和国境内足够同等的保护。我们将始终在管理、技术处理等过程确保信息安全,防止您的个人信息受到各种可预见事故的危害。 + 本政策如何更新 + 我们可能会不定时修改本政策,以便及时反映国家法律法规的变化以及我们服务政策的调整。您继续使用我们的服务将视为您对本隐私政策相关调整的同意。 + 未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。对于重大变更,我们还会提供更为显著的通知。 + + 本政策所指的重大变更包括但不限于: + 1.我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等; + 2.我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等; + 3.个人信息共享、转让或公开披露的主要对象发生变化; + 4.您参与个人信息处理方面的权利及其行使方式发生重大变化; + 5.我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时; + 6.个人信息安全影响评估报告表明存在高风险时。 + 我们还会将本政策的旧版本存档,供您查阅。 + 任何疑问 + 如果您对本政策或我们所拥有的与您相关的个人信息有任何疑问或不满,您可以通过以下方式联系您所在地区的荟聚中心或您服务的雇主所在的荟聚中心。一般情况下,我们将在15天内回复。 + 北京荟聚客服电话:+86 010-60285656 + 北京荟聚客服邮箱:family.bj@livat.cn + 武汉荟聚客服电话:+86 027-83395788 + 武汉荟聚客服邮箱: family.wh@livat.cn + 无锡荟聚客服电话:+86 0510-81167977 + 无锡荟聚客服邮箱: family.wx@livat.cn 长沙荟聚客服电话:+86 0731-85645818 + 长沙荟聚客服邮箱:family.cs@livat.cn + 福州荟聚客服电话:+86 0591-28485188 + 福州荟聚客服邮箱:family.fz@livat.cn 南宁荟聚客服电话:+86 0771-2066689 + 南宁荟聚客服邮箱:family.nn@livat.cn + 本隐私政策以中、英文两种文字书就,两种文本具有同等效力。如中英文文本有不一致之处,应以中文文本为准。 + 您同意因本政策引发的任何您和我们之间的纠纷(以下简称“纠纷”)均适用中华人民共和国法律,冲突规则除外。除非另有禁止,您同意由此引发的直接或间接产生的或与之相关的纠纷、索赔和诉讼均应由上海市徐汇区有管辖权的法院依照中华人民共和国法律解决。 + + \ No newline at end of file diff --git a/pages/privacy/index.wxss b/pages/privacy/index.wxss new file mode 100644 index 0000000..d761e65 --- /dev/null +++ b/pages/privacy/index.wxss @@ -0,0 +1,4 @@ +.content { + display: block; + padding: 20px; +} diff --git a/pages/prompt/bluetooth.png b/pages/prompt/bluetooth.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6bfcaea7ab97fb760c97cce51ac6e7fb9d4507 GIT binary patch literal 6299 zcmV;M7-Z*(P)vsyg-6_mkQ^ z)6-Z(QUCtF^Ibg>GRMD0z4VCs$X5?feeKZ#_2{eoP`}=*zUtNAcd2JT_`2c$j7Ed6 z#?}90eCipmcd6$Ix~{$-rKf1r>(@UQGQ=YxHI&f$=pn77ZY3~ZJwH~Dt|@_~PeqvL zh_n#Tso&?%5U00Pzb2%B2rwbEReMM!C9rks+m-4{ugpwnQJEGdL^(_|sVvqq8AO1V z2;9i+>WaRoZr<%vE+iKq$S(Dmq@zlZ=ae8vNr;UIFb4i5W#LFa)&Cp79U!8MKq$t?v|oZb?GXVsL7(X+ zXb%<9y|hI|j6*bohULuI7!hC{+S+-vn;<%|cJ}b-fViknA_AnE2Wr9Uaw|ZwdP2ZH<&wTbIVG0@)Dg}}`dqA@pn)}8$@hI{KX}a$^C-mXF&fl z?UP`OU>PTaGfoLGh;)9SCrb;0eU8vwddsDTUuOgubTLS0vk_St2exM?x*W3u~Wo`kbtW3xRM{dM3dO29>MiVOoY*;v3yJuFGYC%6FuGqd$QnL4QpFi5gXo=zmf)UF;5=y6 z1@$k`c7$(95csm*TS8^Bgf#(5Z=X;I&_j4fod+#-PIQwkCY5;>@zrqu!7RFU_gT6! z_5zLHd6vGt`$PIxJ>PpcOFz5BoM&!R&&&t(^sM_df9_4{Rp0;Jb2n+>yst^9V%in8 zGGWb%1ytw0?dlg3*HZzpT^;)gUA^&wesEyn{I9eS7tQ}#1UZcrSJajOuNB$)jeYYx zja*wyU;Jei-B;F)GjnF&R)YMRHV&TDR z!6oNu&9d`UP==Hhe3xPnOMt;R!E017iY~l*U==qgi&#h@c2j?x1bsXKUe-gE3e(*# z!fVaEAKj##n~oLDH7zSExSk9#7NCETcBwy|$sCQeK{WHY65b!x8Bb^r&WCGPoK+Fk z2UHM@12X0UEJ)x50hZtWVVg=JxRo|=9k``$Z#`5DYp4P;-eT$}1B?V%6zliJm#gTL zlO+<&fi>JP_+P{x!!Z_-1sH5FV!t%=*q=(`a#~{T&(6};m&?SQak{GlG7-}f(TlMs zbe~@zF$L$n_dj_<#AgwB67PTd5Bl0Nrk7?%?|+SC0lC+EhTVcn#%{y1Sn9KTB%z_t?Dy$b4J^1!1N~QYfpcDNI*9SFD*AhVbPFIDK)sdJK>)mSqSh`KCPtq$qKgHVuw-oMsoE9up%s_+;y@rlzMBC;8 zRphh8(e*@aXB_dt+Ut0QF#-6b~?VRY?HyI=e2m^SbqE)oH+9`F{Grm(}wnm zc#n1xGvGqS3A(`Lg!s~SIZvn$jootZ1sqpk%kA+C)nCmgfxmMFEGCED5oK5B15^Tw$Q z%Z*)6B$0QN{y;8(^B07OzmF^6+L)$Z!Z|w3Xj`7vT7X^rs$S4gYXV#?RB*TiK1dD? zZ`O5|u2{og#c0U===06QkW#B3HWi>=s>v+)Vru>1Zn|7P1?z!yiVH!Sp72`DjDD@~ zZ^O_EwhYEJw}6xUHXE7dt+uIzaUODft^{dttxnQ7ad;M2vuoW^!W= zE**&#Tu2*Nf;6abF*y&iJPUfw1DOp4$T9bK!tm_3F{j1lreEdN3Ja*X7o05 zLmOK_hPl71V`kPb&*f!V2WfEaP#YT+n?>Kw(8LXG=7N@p5vb-j3BKgj`qh(VkY?@A z&P29?*qu=nH}nYsa&$jOMx(nldAELz$RbFCs3@*wREpw;HnM25p^*Sf#E5$jqPsJd(Gk420HqnE!B(ZH-UQrchC`f6^)J*2P}hEv zO29J$gLR{VF%q^haf6d4%^=NkgKNsr3O-RAT5AC(d5I6)FcDyXbeE|WaQA+9e4BIa zL?LMeX^h;^zcF+}pQ%0K)w`hV&VRQIKG`uq$rfl>g}Vn31aW!Nc9KDw`3CJuu5A&v z!sA*aS1UlDqXmo>fSLE4z3F9`H&fqth~76?L{~{FNYi65hLPz$j+$*^Qv%c@=b4@V zz`cm$5_)FdCmXaH_M`(Kj!%kCB1jX}vlvToK51rn)K`5DoVI|I{CfXD)OjT~+|N!X zt>N7D{-WvfE{e+9z>6k-AX!T$y+ka?)P32j6s-v!)o*5?W9Bq z3%H|noc?)>-EFm%QT6W3qsbY){#9ClFDe#rlK-mdG}yT2q!kgG6c4lml4fj^NxiJ#lB0fuW)mlI~|5*kiL?kkf2ocn=CBmtcM-1^{IF*Rc z5|66|C>Agg^fuV7@q!-^Vch&1#0Se4XNd|ddQq3qB!U;Xpt=N2EMQ`UE1Bbn5c#)} z(Zyr}ENC3@p)djB8)Vv`oFTm^NrMIKBOy`3soHTwXd)np4;D0z_;emo#Fq?DQD2v& zAkx8x2&168E{4s!E<*9m=eRu66=uFGbYe%e&wJBTbLgT{)^~42Dn{a`NYlELed@18WfFu?$3$zHg9&%>ygpFve5S=bb zL1YVBhF)25hO$J&ml4VZ?Iy8+nX~QZ!_+hLVaJWUHo?C8of|)KcK0D`l=17<7SJOh zV^G8m(i9=wUsqOc7nI&E5}YA!J5v-yd~VP!QBb!?!xBnIgClri0i7gnPhrddw}{Ur zdb>$*lCb{r*vV3?#CkO%KKBp{=rD163agP`J~t5o7KD2b-5mg2WW)t^7_<}FazW8k z2*e7yg$U45!d^a`hzQ*SX^3$tM{^7G@+Gy#Oho7wXh#|+!5OgFCFvc4uJ0)<3_guY z5XK=o*{Wm<*Y^|_g)Z%a3Yn9p_(Jlqr;s`0uz(`KjDaP}q7wq-VNW4jJP6REQ4%r( z;>&u;Nm6?Xg|>{#889PYarF3kM>Y&4wVg?5fwq9YSirOi#pl|hOA%qp=qRX9*GWi? za6!u0tz@$Cb+hzP?%!eTNS1uBodkk zuI%M=Wly0{!#VsXT+n%r1gp5Vm(SLoLJ^@gwAU#DOaNE+^4Zw^AR@Ge)?B3_S8{>Y zh}+ATVN4!W zjGmUA_fs16FH2{99LE0kyp!UC)jO`l^2fidBAcvTaYjAj1&0dExVNI(0s>#ZP$I#I z`On?dK@*cXE=h?G?l3IXeTx&(@H=9py=%J-bH-H6rMvFM5(&m2Xo9?1lrtdCdcWFq z%&Pdlz4Jrs#ojoZ{vxn?vPmf>ej@>TG^~EGhnRsIJ4#`3+#=+)Dra}^!P6bNqhV^m z_6=>j%K|IRcC0%d`$HmX@Q3ZbLXXPfm(v2Aptw-79`^F#ciXi3Wb8tK zkQ?9pIMVysTH3qH*ab`p5G85;MH=O{EouJTn~|*ASj3y88LdQ^ht*&RvTRflPMac# zI-R>`=6zy^az9am7JgfseDLUq`Y$UtwD+0sBE27CMdZ-NjRz6ldpJ`?AXiVl=DPTj z3bMfcjM`a&4^M{F6us06(5F9h+m<`m;2eQ|JzF;*)=%Gm__Q89;qrE(q=PJD25n6& z&wv#pH$|-gpHe@Zpbv-<^9(9VMy@TgY5`zTR`gw_<$YJkMQjCGS}`)Zh@yhj4m&24 zk*lI+D3fkYqUi_?2TV%3My@X=+qft`SUR*iy}jk*#I4Qw(dgHdoePTd-%o2hj~W%A zm5EV4ut(iwux3$0^Ee0M{hX7{Nd#G%fik$LC2+9H45Ogs`WG4raG01e???X|IX7n8 z4RwVqDp^in9H6MM48YW#|G*P-LA@nPrOZ0y2MpXl+%%k~MZ=mP2(;(*4^tH%ya|)p zrvv?No|ldBX;f+J3FFq)c#Vx(Ljj5#TA?zKXcOfT z1X=#|AAf7DjLZZR>jyS+>oIKNeuAzRf9L=)0&b{@TZ8REXzR%fy0vNRA=>)$;Y_25 zr!Fivvwq55W|)94H~T@WMjIX>cO=! zT|C3m`hiES3tL(WP}hd~{H)-H7@xEVEbRaNo0++zt^`@Cv9W9vlL6SF0-5!-pY?RI zA$LD916J@AWkF2IVx@D>tcT77S*pP`z_o}o1_RcdY3tE}_HXF`{}O#p%my~0L3ICr z#1m1^%m=hZox#>DW9T|{fQ_kZ5FS2M*cDzQ__CDx+r6!`9q~RLBxayX0@KLifavI< z;m!K&Q>2Zu;kq@X8sg5-Nn$9K6SN7wgmh*BuTd{e(lw5Qd*hChuLeN`xQSe+dEu=0 zpI@%lHL_NQS2;W(AQl~3KhW_23gw3GRZm02kYj&ZS2MRIE)e3HWg~0~iqX$^esmF? zLWhW@A-_2HA&|rpk9K*BJM$Vl7a(IR2y73s1#@QKrh&f8y0r%VZFzCEVCnv<0!73c$X)(Ius)m!` zaHhR_<0pxpXOkL6><~lV5_-4OH%Aj7b1RsJ2#XAR@kO+LptC4wK#-WJaEnBmGe?~uLf-GmKNi18I%EF&!4B4y`z6lRN(6V9f;$5m!`T ziKVD#JytCs(5|TRk+}`@6$(w|o=yPk0tDJeE|D8f*>d}M1tTpLrDf* z>Pf`~twxHr1!t*5JX7`5QWqfbFVkW5m)%Z+;101yOPG?H3tGbrU9_Ewk1Yso@zuR} zH=9O+Oe`Rf9HHO@5a0K--ejhy4KfoT&_kVOC=p8GwvYvud;3htRDeK4C}e^I;se>7 z0jtm#pi*%lXF?$z;C4D7K9IQu43RUTkO~=}`Rd8s0*2_i(Qe&GXtm>55UM!hlK6l# z7O)yg)(h6jAj#ed&RD=|R6-ONYKR2E4nr=A4>)N7LzE?i6?~5b!IVm2b!xSpQE^&; zK({hIqQjD=5F%0OL47T)t_D+_7a)*ap%95mn&CAU(hTiz@(frHE@UtoKxWJctx>@i z9qG)0_&_c!U^V(&=+Rzvp?gUXrWx1M%N#!MH6nKc1mcnkH8@gMWQvg zkb4VQjmjCms&a<=#2PY%iPftn_ZF}kub++vXTu>9xG}`V>Q%$a0#>6VrQN!WO@=?^ zn=(z%TX_w#w1cexL;Q=hOFiusw=`!kbT=EpUVtGY#N3d}gt{q(5g-V3EN2QDkEW8jAU>*J?S{JycyGXDFgjQCMecYp(Q4s+)LEKX-l=Y+FZe}Y)fE}RR zQ_L#etsW&2V_U{`U9P9M4T-gDg9tDpQ!c8Au^JJbAtJyS1Y+E-u40LbH_^KsK16ip zhyX1SH^wX$uixLilH?mu71VS*j9bUgp?9T<5gdJRL+C z7QrQh2rxx-Fvp_>MEZGUFjy)}VM0_WdOoKgkJZ;R=$yBZu9J`oB0vYw*766+g@rh~ z)bnHYeI>xt8;G=bY6@KIzz>2Ul63$8 literal 0 HcmV?d00001 diff --git a/pages/prompt/elevator.png b/pages/prompt/elevator.png new file mode 100644 index 0000000000000000000000000000000000000000..6831ba2231261c95d7a1678bb75e8326f2e2ba09 GIT binary patch literal 4409 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 BDYXCq literal 0 HcmV?d00001 diff --git a/pages/prompt/end.png b/pages/prompt/end.png new file mode 100644 index 0000000000000000000000000000000000000000..bc70f4261499edfad27ba7e4d7478bcec2e28c9b GIT binary patch literal 9798 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 DT)EZJ literal 0 HcmV?d00001 diff --git a/pages/prompt/info.png b/pages/prompt/info.png new file mode 100644 index 0000000000000000000000000000000000000000..2c808195c3b3e52b9bf4d81ce9ce5bc4e1125e52 GIT binary patch literal 4251 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 literal 0 HcmV?d00001 diff --git a/pages/prompt/mall.png b/pages/prompt/mall.png new file mode 100644 index 0000000000000000000000000000000000000000..ec85112845576a894f4da255e4a83280798de95c GIT binary patch literal 3695 zcmV-#4v_JQP)5>DUq^BP%aG^Rpo?)b7_wxrygUDJ;fZ$g;4cW zgfP$x1SuPpHa#@h5rwt};zXrEq5=$rLSnCn_r9Hp*Y?iN%DVL+RlY;i&HBq>V(Ksm$v0P7kcS`hj45tL`FJMZJ=m}8B z$!JCGX_xGX6M{BEu1Q4pOPXdYI}QokYC%)T8RLMktrRppa?Z3iZVr39#cNxJRf0A< zc}*ObANC|j{;SFugHwa{)dLfBkp4Li;uc$Qe2}TVfp}-Z!!>9LXtnF!h}0-4buy>le1 zveUjjbl{ukSkp}UBojZ~e}rzbK%ZoS@zdy&z62d?o{WN!EYR)ocl-0xJzI|8#MVU+ zk~O|qj~*v`^&X*{+&m$<(Q~~=PlBe^Ai1K}qsOdAYRkc_1}TW1vL5LpbdxP@Ng?Q2 zPN@srQblMM9+3f%s(>k7g!b}3!EOTs7}E9hX{u(OLn74yssk6S6^c5b}>3ZDGMA6yspRNPR|c*{}CuK2oae0}8x z{O*-sS}$hhtE<7WT(SRHBJm}-#?V#JVl^gRwi>UU-H%T%-vU?AV>$WeemG1$uBm$W z2<`A$C~v$qfxrA?0KGygZE7|gou#e5`Q%x5BiZZv$@7IfpFA6=%epSI zwOn+BZo286UGmLQIPa%DJQDR#H_K6ngSh6Kqj20$ABk#xFx2Uru5P3x_00$NzKKIW zJ&iK+@?Q_ivFz*m96jEx!=K^6-E(k^5eysK(b)Jv=LlVk4(Ya%)HiD$_rZJqhO(pY zF-gwZVL#o`5^oZ;Sq%D;u5*Z_zWG}>T*0q@{=B&^J2!^!_4@Ab)nPwf?_@hRN9bku zymM0D{Ih*$tlDX7eVUw!eV(&^`likG9h(L1ScCF3zWF{2y{7u(`{cdH;beZ=+w3IP z3EDJVbSS&wns1Jx!hU*_?N}e7o9>9&Mc*7nrTz5H>k}9oEr&DN4Oe}06czT<_4YgK z%12$Qd;ZNcg-_+Rir@aqnTa7w-fnCS?_7(};-ANPRtm9@5&t~4hj-R2$1-OL5=&WG z%XX{@+QHpHQW0uv!MJ@<$OujBWOZ#}XasHY&-Bm4Ry>S``RG=JUSV`5mNSfldKFrZ zgCN9a0*BEOw8scdEGJkPwggT8Ol&7u7>1UE5t`VI7g!FnLr91N=#F7cG92v2Pu!r1 z@f!UzaRv_~HTkj~gt&kN=UQl{39%m0vi9YmhweaJy>Q<3)`Nb1EAiEGa6}t%hY`&~ zQ_#c>jE81~CJs@P|0rnU1|B^$af^}kv%U!_F%&d$3JRJy1qB^JT)V71yDi-q*V4=7 z(QSP~K}YaaOi#S6!}$sN_V0ew^>K#>0`-m7ax8&t;?gI#b$$Gf+dn{F?AiW)*T+Ap zz>Jt4S*l@`g6_om|9-#g;|K1J@5$UNI=j0YAAa2ZkFB!!DrnM?xCpH+Z1afH_l&(A z>(9?$`Th~{E%v~^+gMyCWjkos2K1XMqJg~3-aTfZAkz~fp>kf}}?i&-KeOitv zG+Kh+g|9v3AjF-Rv`>sk%!R;B*@{oMFxW11+X-6aCy<_jh z&S23Qo_XQ%LPiYhYdrI(_`#thAlM)r3hvBvVVE4X0GB@g zp2;0&T}G-4NF5rQWIj1rhl$WFL2K%cq(T>I=fx5{Afmqa&UcUn8kIGh!KmC54gJy* z^cK0Z0+JF0ZevhmlqQzo z;l##obrSS*AjAfiH?R3N37WQpSi)?llT)HPCp`s1%8b|98g~}-kR+(& zY>hh#+Sm>sGa#g#G@>4eZr13twu6+EX0#=a6tp*H_Qx9_q+B$*bt;H!r)%xvFw3r> zq*QdZ!d(UJ?KTm*0SnPHMo4G&jJ^je(Z%5I?p8Ry;kj?;MoZScn_WRq2RpRi(i*fH zrsJNHs7<54fJGb6H`E4)FQ2L7oeMirbyUdPZv7~6bI8)6(RmCz;+~dN&{OivXFPKf4G{vg!FDXLRRo7vmPV^min<8A$<#)Sr3v4et%XYr2hyFv*Ds=5%8p1(i^^{=*I9g zG9a_D_5LD8#C~Y42mLfjjt+hO5)&JH)b&ax5n3^=59p^!8dS{Uo3j$Ll9`~Dz)wF4 zLXx0G`x(!g&s5M#aANII5Yi1FN75D^B_VS`E5Rah8iaIaI;%zCMlxFzcEVr433-Jl zKuAa{qmkPuc&>t0C~9&It#2O7w+1M8K`Y!ICnDx~5%UCcCKnIAi6OJ4$w{?UMZ_$* z=DxSJlTb*6R=Dv}Q35e%nQQJwVS)~!r>+nMc;<~1V>#N81DpcuKHO&jVpa+lv?6(G zP1{U^xXSb(#H>$y z0~fU7|5L=gMKT~1wVh}tqlrheE;QEuK+H-hB6K^( zS9>@nKd2FqGP7h(n;M{B?nLPXt%5`0sOb2yk^Sz1aj=n(PN$K>4}p|>uaQhMbmtP!*lMC)T|n_!cknZ*i@mepQ# z!YVzOP0())TRje|9GitB5tSBg5HSO5^b?CZmh|wT$feg ztu&ivDCSkj-W|9IVxXYA5Jd1FqZPf!MM$G4y01vPcvt22Wt^^Z1dfA(?g10YJ$zdP zHY#Ep4I=qSP&n1P_JZ4;(So0rC_NErt4aKl5$~!I@RIoac}Cv!d;{>`)CL1^oALkv N002ovPDHLkV1fv{A_)Kh literal 0 HcmV?d00001 diff --git a/pages/prompt/park.png b/pages/prompt/park.png new file mode 100644 index 0000000000000000000000000000000000000000..d928eb2c5a96d2a1283f6929b28a1d0b6db34a7d GIT binary patch literal 3634 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 Eg06@W4*&oF literal 0 HcmV?d00001 diff --git a/pages/prompt/prompt.js b/pages/prompt/prompt.js new file mode 100644 index 0000000..7a077f6 --- /dev/null +++ b/pages/prompt/prompt.js @@ -0,0 +1,34 @@ +import { promptIcons } from "../index/index-helper"; + +Component({ + /** + * 组件的属性列表 + */ + properties: { + icon: String, + title: String, + subTitle: String, + meta: String, + btn1: String, + btn2: String, + btn3: String, + }, + + /** + * 组件的初始数据 + */ + data: { + promptIcons, + }, + + /** + * 组件的方法列表 + */ + methods: { + handleTap({ currentTarget: { id } }) { + this.triggerEvent("btn", { + btn: id, + }); + }, + }, +}); diff --git a/pages/prompt/prompt.json b/pages/prompt/prompt.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/pages/prompt/prompt.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/pages/prompt/prompt.wxml b/pages/prompt/prompt.wxml new file mode 100644 index 0000000..b8fa03b --- /dev/null +++ b/pages/prompt/prompt.wxml @@ -0,0 +1,10 @@ + + + {{title}} + {{subTitle}} + {{title}} + {{meta}} + {{btn1}} + {{btn2}} + {{btn3}} + \ No newline at end of file diff --git a/pages/prompt/prompt.wxss b/pages/prompt/prompt.wxss new file mode 100644 index 0000000..c1369fa --- /dev/null +++ b/pages/prompt/prompt.wxss @@ -0,0 +1,142 @@ +.prompt { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 80%); + z-index: 20 !important; + text-align: center; +} + +.prompt > .icon { + position: absolute; + width: 112px; + height: 112px; + left: 0; + right: 0; + top: calc(50vh - 112px - 40px - 17px); + margin: auto; +} + +.prompt > .title { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 36px; + height: 36px; + text-align: center; + color: #eee9de; +} +.prompt > .title.top { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 24px; + line-height: 36px; + height: 36px; + text-align: center; + color: #eee9de; + transform: translateY(-36px); +} + +.prompt > .meta { + position: absolute; + left: 0; + right: 0; + top: calc(50vh + 17px + 8px); + margin: auto; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: normal; + font-size: 14px; + line-height: 21px; + /* identical to box height */ + + text-align: center; + + /* Font color/中灰 */ + + color: #b3aea7; +} + +.prompt > .btn1 { + position: absolute; + height: 50px; + width: 180px; + left: 0; + right: 0; + top: calc(75vh - 10px - 50px); + margin: auto; + border-radius: 63px; + font-family: PingFang SC; + font-style: normal; + font-weight: 900; + font-size: 16px; + line-height: 50px; + text-align: center; + color: #333333; + background: #ffdb00; +} + +.prompt > .btn2 { + position: absolute; + height: 50px; + width: 180px; + left: 0; + right: 0; + top: calc(75vh + 10px); + margin: auto; + border: 1px solid #767571; + box-sizing: border-box; + border-radius: 63px; + font-style: normal; + font-weight: 900; + font-size: 16px; + line-height: 50px; + text-align: center; + color: #d1c8b9; +} + +.prompt > .btn3 { + position: absolute; + width: 56px; + height: 20px; + left: 0; + right: 0; + bottom: 66px; + margin: auto; + font-family: Noto IKEA Simplified Chinese; + font-style: normal; + font-weight: bold; + font-size: 14px; + line-height: 20px; + color: #eee9de; +} + +.prompt > .btn3::after { + display: block; + content: ""; + position: absolute; + bottom: -6px; + left: 0; + right: 0; + height: 2px; + width: 16px; + margin: auto; + background: #eee9de; + border-radius: 20px; +} diff --git a/pages/prompt/question.png b/pages/prompt/question.png new file mode 100644 index 0000000000000000000000000000000000000000..22e27970d1576041028adafb76569745e3441c8b GIT binary patch literal 4969 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 literal 0 HcmV?d00001 diff --git a/pages/prompt/tomap.png b/pages/prompt/tomap.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1b23cc3dbb2d92af176550bc076dcf1cf6a9ec GIT binary patch literal 5286 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 literal 0 HcmV?d00001 diff --git a/pages/tabs/relocate.png b/pages/tabs/relocate.png new file mode 100644 index 0000000000000000000000000000000000000000..749cce19e8cfac391d72bd4758c9320c3e627cde GIT binary patch literal 6945 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 literal 0 HcmV?d00001 diff --git a/pages/tabs/tabs.js b/pages/tabs/tabs.js new file mode 100644 index 0000000..64686ce --- /dev/null +++ b/pages/tabs/tabs.js @@ -0,0 +1,32 @@ +// pages/tabs/tabs.js +Component({ + /** + * 组件的属性列表 + */ + properties: { + tab: Number, + floor: String, + }, + + /** + * 组件的初始数据 + */ + data: { + tabs: ["平面地图", "导航", "目的地"], + }, + + /** + * 组件的方法列表 + */ + methods: { + handleTap({ currentTarget: { id } }) { + this.triggerEvent("change", Number(id)); + }, + handleRelocate() { + this.triggerEvent("relocate"); + }, + handleToMap() { + this.triggerEvent("tomap"); + }, + }, +}); diff --git a/pages/tabs/tabs.json b/pages/tabs/tabs.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/pages/tabs/tabs.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/pages/tabs/tabs.wxml b/pages/tabs/tabs.wxml new file mode 100644 index 0000000..c730484 --- /dev/null +++ b/pages/tabs/tabs.wxml @@ -0,0 +1,14 @@ + + + {{item}} + + + + + + + + 当前楼层 + {{floor}} + +请按照导航路线行走 \ No newline at end of file diff --git a/pages/tabs/tabs.wxss b/pages/tabs/tabs.wxss new file mode 100644 index 0000000..f4db58f --- /dev/null +++ b/pages/tabs/tabs.wxss @@ -0,0 +1,105 @@ +.tabs { + position: fixed; + display: flex; + bottom: 0; + left: 0; + right: 0; + height: 83px; + z-index: 15 !important; + background: #ffffff; + padding-top: 9px; + box-shadow: 0px -2px 10px rgba(220, 183, 123, 0.3); +} + +.tabs > .tab { + flex: 1; + height: 50px; + text-align: center; +} + +.tabs > .tab > .btn { + width: 76px; + height: 32px; + margin: auto; + border-radius: 64px; + font-style: normal; + font-weight: 900; + font-size: 14px; + line-height: 32px; + text-align: center; + color: #6a6665; +} + +.tabs > .tab > .btn.active { + background: #ffdb00; +} + +.relocate { + position: fixed; + z-index: 15 !important; + right: 4px; + width: 46px; + height: 46px; + bottom: 235px; +} + +.relocate.high { + bottom: 362px; +} + +.floor { + display: inline-flex; + z-index: 15 !important; + position: fixed; + left: 8px; + bottom: 211px; + height: 24px; + padding: 0 12px; + font-style: normal; + font-weight: normal; + font-size: 12px; + line-height: 24px; + color: #6a6665; + background: #fff; + border-radius: 24px; + align-content: center; + justify-content: center; + align-items: center; +} +.floor.high { + bottom: 338px; +} + +.floor > .sep { + height: 12px; + width: 1px; + margin: 0 8px; + background: #e2e1df; +} + +.floor > .value { + font-size: 14px; + color: #ef9617; +} +.tip { + display: inline-flex; + z-index: 15 !important; + position: fixed; + right: 8px; + bottom: 211px; + padding: 0 10px; + height: 25px; + line-height: 25px; + background: #f37b6f; + backdrop-filter: blur(2px); + border-radius: 50px; + font-family: PingFang SC; + font-style: normal; + font-weight: bold; + font-size: 12px; + color: #ffffff; +} + +.tip.high { + bottom: 338px; +} diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..94cb990 --- /dev/null +++ b/project.config.json @@ -0,0 +1,54 @@ +{ + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "cloudfunctionRoot": "cloudfunctions/", + "setting": { + "urlCheck": true, + "es6": false, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "useIsolateContext": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "disableUseStrict": false, + "minifyWXML": true, + "showES6CompileOption": false, + "useCompilerPlugins": false, + "ignoreUploadUnusedFiles": true, + "useStaticServer": true + }, + "compileType": "miniprogram", + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 4 + }, + "libVersion": "2.24.3", + "packOptions": { + "ignore": [], + "include": [] + }, + "appid": "wx5a07c26e8c297c6c", + "projectname": "无锡荟聚" +} \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json new file mode 100644 index 0000000..c1547a6 --- /dev/null +++ b/project.private.config.json @@ -0,0 +1,8 @@ +{ + "setting": { + "compileHotReLoad": true + }, + "condition": {}, + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "%E6%97%A0%E9%94%A1%E8%8D%9F%E8%81%9A" +} \ No newline at end of file diff --git a/sitemap.json b/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/utils/util.js b/utils/util.js new file mode 100644 index 0000000..061f235 --- /dev/null +++ b/utils/util.js @@ -0,0 +1,25 @@ +const formatTime = (date) => { + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const hour = date.getHours(); + const minute = date.getMinutes(); + const second = date.getSeconds(); + + return `${[year, month, day].map(formatNumber).join("/")} ${[ + hour, + minute, + second, + ] + .map(formatNumber) + .join(":")}`; +}; + +const formatNumber = (n) => { + n = n.toString(); + return n[1] ? n : `0${n}`; +}; + +module.exports = { + formatTime, +}; diff --git a/wasm/module_basic.wasm b/wasm/module_basic.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d5f9375fe84ea284b579fb01be184597c1af8143 GIT binary patch literal 34328 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 literal 0 HcmV?d00001