-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
501 lines (453 loc) · 66.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
<!DOCTYPE html>
<html lang="en">
<head>
<title>Unnamed</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="generator" content="CAD 2021.1015.24301 +3962 (Git)" />
<style>
* { margin:0; padding:0; }
body{
background: #ffffff; /* Old browsers */
background: -moz-linear-gradient(top, #e3e9fc 0%, #ffffff 70%, #e2dab3 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(top, #e3e9fc 0%,#ffffff 70%,#e2dab3 100%); /* Chrome10-25, Safari5.1-6 */
background: linear-gradient(to bottom, #e3e9fc 0%,#ffffff 70%,#e2dab3 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
}
canvas { display: block; }
#arrowCanvas {
position: absolute;
left: 0px;
bottom: 0px;
z-index: 100;
}
select { width: 170px; }
</style>
</head>
<body>
<script type="module">
// Direct from mrdoob - r122(10/28/20): https://www.jsdelivr.com/package/npm/three
import * as THREE from 'https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js';
import { OrbitControls } from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/controls/OrbitControls.js';
import Stats from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/libs/stats.module.js';
import { GUI } from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/libs/dat.gui.module.js';
import { Line2 } from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/lines/Line2.js';
import { LineMaterial } from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/lines/LineMaterial.js';
import { LineGeometry } from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/lines/LineGeometry.js';
import { EdgeSplitModifier } from 'https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/modifiers/EdgeSplitModifier.js';
var disableCompression = false;
var base = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!#$%&()*+-:;/=>?@[]^_,.{|}~`';
var baseFloat = ',.-0123456789';
THREE.Object3D.DefaultUp = new THREE.Vector3(0,0,1); // Z is up for the CAD
var raycasterObj = []; // list of obj that can mouseover highlight
var scene = new THREE.Scene();
var renderer = new THREE.WebGLRenderer( { alpha: true, antialias: true } ); // Clear bg so we can set it with css
renderer.setClearColor( 0x000000, 0 );
var mainCanvas = document.body.appendChild( renderer.domElement );
mainCanvas.setAttribute('id', 'mainCanvas');
// HemisphereLight gives different colors of light from the top and bottom simulating reflected light from the 'ground' and 'sky'
scene.add(new THREE.HemisphereLight(0xC7E8FF, 0xFFE3B3, 0.4));
var dLight1 = new THREE.DirectionalLight( 0xffffff, 0.4 );
dLight1.position.set( 5, -2, 3 );
scene.add( dLight1 );
var dLight2 = new THREE.DirectionalLight( 0xffffff, 0.4 );
dLight2.position.set( -5, 2, 3 );
scene.add( dLight2 );
var data = {"camera":{"type":"Orthographic","focalDistance":94.51393127441406,"position_x":54.567665100097656,"position_y":-57.742645263671875,"position_z":113.04324340820312},"file":{},"objects":[{"name":"Carbon fibre gasket","color":"#ffffff","opacity":1.0,"verts":"2 / b =9j b0j / d =9j d0j!j b#j!j d#j$j d%j$j b%j&j d(j&j b(j)j b*j)j d*j+j b-j+j d-j a b c a d cdc @ [:j @;jdc ] [:j ];j/j @=j/j ]>j?j @@j?j ]@j[j @]j[j ]]j^j @_j^j ],j.j ]{j.j @{j|j ]{j|j @{j}j ],j}j @_j~j ]]j~j @]j`j ]@j`j @@jak ]>jak @=jbk ];jbk @;j ? @ [ ? ] [ud bgcck bdkud dgcck ddkek bfkek dfkgk bhkgk dhkik bjkik djkkk blkkk dlkmk dnkmk bnkok dnkok bnkpk dlkpk blkqk djkqk bjkrk dhkrk bhksk dfksk bfktk ddktk bdkfc bgcfc dgcce bgcuk bdkce dgcuk ddkvk bfkvk dfkwk bhkwk dhkxk bjkxk djkyk blkyk dlkzk dnkzk bnkAk dnkAk bnkBk dlkBk blkCk djkCk bjkDk dhkDk bhkEk dfkEk bfkFk ddkFk bdkzd bgczd dgcuddeeeckdeGkudfeeeckfeGkekdeHkekfeHkgkdeIkgkfeIkikdeJkikfeJkkkdeKkkkfeLkmkfeMkmkdeMkokfeMkokdeMkpkfeLkpkdeKkqkfeJkqkdeJkrkfeIkrkdeIkskfeHkskdeHktkfeGktkdeGkfcdeeefcfeeecedeeeukdeGkcefeeeukfeGkvkdeHkvkfeHkwkdeIkwkfeIkxkdeJkxkfeJkykdeKkykfeLkzkfeMkzkdeMkAkfeMkAkdeMkBkfeLkBkdeKkCkfeJkCkdeJkDkfeIkDkdeIkEkfeHkEkdeHkFkfeGkFkdeGkzddeeezdfeeeNk dOkPk dQkqg drgRk dSkTk dUkWe dgcuk dVkvk dWkwk dXkxk dYkpg ]7fZk ]1k2k ]3k4k d5k6k d7k8k d9k0k d!k#k ]3k$k ]1k%k d&k(k d)k6f ]7fBi dCi:j ]*k/j ]+kFk dVk(k d-k?j ]:kEk dWk0k d;k[j ]/kDk dXk6k d=k^j ]>kCk dYk4k d?kWefeeeyk d@kzk d[k]kfe^kAk d[kBk d@k_kfe,kukfe.k{kfe|kvkfe}kwkfe~k`kfealxkfebl8k dcldj dWe%k ddlBi d celfeflykfeglhlfeilzkfejlejfeVe cfe1hAkfejlBkfeglCkfeblDkfe~kcj dWedjfeeeEkfe}kFkfe.kcjfeee a dCi}j ]>k~j ]/k`j ]:kak ]+kbk ]*k+j dklfjfeVeTe dWeUefeVeXe dWe!j dll$j dml&j dnl9j dol)j dplAi drgck dVkek dWkTefeeegk dXkql dQkik dYkrl dOksl dSkYefeVekk d@ktl dUk.h dgcqk dYkrk dXksk dWktk dVkmk d[kXefeeeok d[kckfe.kpk d@kekfe}kgkfe~k?cfe1hikfeblkkfeglmkfejlokfejl.hfeeeulfeilpkfegltkfe.kvlfe^kwlfeflqkfeblxlfe,kskfe}kylfealrkfe~kzlfe|k.j ]Al|j ]AlNk bOkPk bQkqg bBlRk bSkTk bUkWe bgcuk bClvk bWkwk bXkxk bYkpg @7fZk @1k2k @3k4k b5k6k b7k8k bDl0k b!k#k @3k$k @1k%k b&k(k b)k6f @7fBi bCi:j @*k/j @+k(k b-kFk bCl?j @:k0k b;kEk bWk[j @/k6k b=kDk bXk^j @>k4k b?kCk bYkWedeeeyk b@kzk b[k]kde^kAk b[kBk [email protected]_kde,kvkdeEl{kde|kwkdeFl`kdealxkdebldj bWe8k bcl%k bdlBi b celdeflykdeglhldeilzkdejlej bVe cde1hAkdejlBkdeglCkdeblDkdeFlcj bWedjdeeeEkdeElFkde.kcjdeee a bCi}j @>k~j @/k`j @:kak @+kbk @*k+j bklTe bWefj bVeUe bVeXe bWe!j bll$j bml&j bnl9j bol)j bplAi bBlck bClek bWkTedeeegk bXkql bQkik bYkrl bOksl bSkYe bVekk b@ktl bUk.h bgcqk bYkrk bXksk bWktk bClmk b[kXedeeeok b[kckde.kpk b@kekdeElgkdeFl?cde1hikdeblkkdeglmkdejlokdejl.hdeeeuldeilpkdeglvlde^ktkde.kwldeflqkdeblxlde,kskdeElyldealrkdeFlzlde|k.j @Al|j @Al","facets":"2 a b c c b d d e f b e d g h i f h g e h f h j i i k l j k i l m n k m l n o p m o n q r s s r t t u v r u t v w x u w v x y z w y x z A B y A z C D E B D C A D B D F E G H I E H G F H E H J I K L M I L K J L I M N O L N M N P O O Q R P Q O S T U U T V V W X T W V X Y Z W Y X Z 1 2 Y 1 Z 2 3 4 1 3 2 5 6 7 4 6 5 3 6 4 6 8 7 9 0 ! 7 0 9 8 0 7 0 # ! $ % & ! % $ # % ! & ( ) % ( & ( * ) ) + - * + ) : ; / / ; = = > ? ; > = ? @ [ > @ ? [ ] ^ @ ] [ ^ _ , ] _ ^ . { | , { . _ { , { } | ~ `ab | ` ~ } ` | `bbabcbdbebabdbcbbbdbabebfbgbdbfbebfbhbgbgbibjbhbibgbkblbmbmblbnbnbobpblbobnbpbqbrbobqbpbrbsbtbqbsbrbtbubvbsbubtbwbxbybvbxbwbubxbvbxbzbybAbBbCbybBbAbzbBbybBbDbCbEbFbGbCbFbEbDbFbCbGbHbIbFbHbGbHbJbIbIbKbLbJbKbIbMbNbObObNbPbPbQbRbNbQbPbRbSbTbQbSbRbTbUbVbSbUbTbVbWbXbUbWbVbYbZb1bXbZbYbWbZbXbZb2b1b3b4b5b1b4b3b2b4b1b4b6b5b7b8b9b5b8b7b6b8b5b9b0b!b8b0b9b0b#b!b!b$b%b#b$b!b&b [(b [ ^(b(b ^)b&b ? [*b ?&b ^ ,)b*b = ?+b =*b , .)b-b /+b+b / = . |)b-b:b / | ~)b-b;b:b-b/b;b-b=b/b x z>b>b v x>b B?b z B>b>b t v?b C@b B C?bab[b ~eb]bcbcb]babab]b[b ~^b)b[b^b ~>b s tgb_bebeb_b]b,b E.b@b E,b C E@b)b{b>b^b{b)bjb|bgbgb|b_b.b G}b E G.b{b~b>b>b~b s s~b`b~bac`bbcccjbjbcc|b G I}b~bdcacecfcbcbcfccc I K}b~bgcdc K M}bhcicececicfc~bjcgc M O}bkclchchclcic O R}b-bmc=bTbVbmcmcVb=bmcRbTbVbXb=b=bXbncncXbocmcPbRbXbYbocpcObmcmcObPbYb1bococ1bqcqc1brcsctcpcpctcOb1b3brcucvcscscvctcucwcvcwcxcycucxcwczcAcBcBcAcCcxcDcycycDcEcDcFcEcEcFcGcrcHckckcHclc%bHc!b!bHc9b9bHc7b7bHc5b5bHc3b3bHcrclcHczczcHcAcFcIcGcGcIcJcJcIcKcKcIcLcLcIcMcAcNcCc%bOcHcIcOcMcMcOcPcPcOcQcQcOc%bIcRcOc RSc}bTcScUcUcScVcVcScWcWcScXcXcSc RScYc}bZc1cNcZc2c1c1c3c p p3c n n3c l4c Z5c Z 25c5c 26c4c X Z7c X4c6c 48c 2 46c c V7c7c V X c U V d U cYc9c}b8c9cYc 79c 5 59c 4 49c8c d0c U f0c d 7 99c f!c0c g!c fRc#cZcZc#c2c 9 !9c g$c!c i$c g !%c9c ! $%c i&c$c &(c $ $(c%c &)c(c ))c & i*c&c&c*c+c3c*c l l*c i )-c)c --c ) -:c-c;c:c/c/c:c=c=c:c>c>c:c -rbtb*c*cpbrb*cvb+ctbvb*c+cvb?c*cnbpbvbwb?c@cmb*c*cmbnbwbyb?c?cyb[c@c]cmbybAb[c[cAb^c@c_c]c;cCb:cAbCb^c^cCb;c@c,c_c,c.c{c{c.c|c|c.c}c}c.c~c#c.c@[email protected],cLb`cIbIb`cGbGb`cEbEb`cCbCb`c:c~cadbd.cad~ccdddLbLbdd`cadedbdbdedfdcdgdddhdgdcdfdidjdedidfdhdkdgdidkdjdjdkdhdIc.c#cIc#cRc~bScld~bldjcldScmdmdScTc pCcNc pNc1c @ndod ] @od ]odpd >nd @ >qdnd _ ]pd ;qd > ;rdqd { _pd :rd ; :sdrd } {pdtdsd : ` }pdudsdtdvdsdudwdsdvd y wxd uxd w Axdyd A yxd rxd u Dydzd D AydAdbb `BdfbdbBddbbbBdbbAdCd `pdCdAd ` qxd rDdhbfbDdfbBd FEdFd FzdEd F DzdGdpdxdGdCdpdHdibhbHdhbDd HFdId H FFdJdGdxdJdxd qJd qKdLdJdKdMdNdibMdibHd J HIdOdJdLdPdNdMdPdQdNd L JIdRdJdOd N LIdSdQdPdSdTdQdUdJdRd P NIdVdWdTdVdTdSd Q PIdXdsdwdUbXdwdUbSbXdQbXdSbWbwdYdWbYdZdWbUbwdNbXdQbZbWbZdMb1dXdMbXdNb2bZd2d2b2d3d2bZbZd4d5d1d4d1dMb4b2b3d6d7d5d6d5d4d8d7d6d9d8d0d9d7d8d!d#d$d!d$d%d&d0d(d&d9d0d)d&d(d)d(d*d+dWdVd+d3dWd+d$b#b+d#b0b+d0b8b+dVd#d+d#d!d+d8b6b+d6b4b+d4b3d-d*d:d-d:d;d-d;d/d-d/d=d-d)d*d>d!d%d?d-d=d?d=d@d?d@d[d?d[d$b?d$b+d]d-d?d^d QId^d_d,d^d,d.d^d.d{d^d{d|d^d|d Q}d^dId~d`d>dae`d~dbe~d obe o mbe m k Ycede 1deee 1 Yde Wce Y Wfece 3eege 3 1ee Tfe W T afe S a T S b ahe 8 6he 6 3he}dIdhege}dhe 3geie e bie b S 0 8heje h eje eieke]d`dke`dae # 0hele j hle hjeme #he % #mene jleoe %meoe ( %pe (oepe * (qe jneqenereqebe kqe k jse *pese + *te +seteuevetevewetewexetexe +sbqbqeobqeqbubqereubsbqeubreyelbqeobxbubyekbqelbkbzeqezbxbyezbyeAeBezekbBbAeCeBbzbAeDezeBeDbueteDbCeueDbBbCeEezeDeFezeEeFeEeGeFeGeHeFeHeIeFeIeJeFekezeKeDbteKeKbJbKeJbHbKeHbFbKeFbDbLeFeJeLeJeMeNeKbKeNeOeKbPeLeMePeMeQeReOeNeReSeOeTePeQeTeQeUeVeSeReVeTeUeVeUeSeFe-dkeke-d]d%d o>d>d o~d^dJdWeWeJdUd^dWeXe^dXe_dydxd>byd>b?bzd?b@bzdyd?bEd,b.bEd@b,[email protected]}bFdEd.bIdFd}b)bxdpd)b>bxdrdsd-brd-b+bqd+b*bqdrd+bnd*b&bndqd*bod&b(bodnd&bpd(b)bpdod(bsdXd-bXdmc-b-dIcFc)d-dFc&dFcDc&d)dFc9dDcxc9d&dDc7dxcuc7d9dxc5ducsc5d7duc1dpcmc1dscpc1d5dscXd1dmcIc-d.c.c-dFeNeKe`cNe`cddReddgdReNeddVegdkdVeRegdTekdidTeVekdPeidedPeTeidLeedadLePeedFead.cFeLead:c`cte`cKetemehe9cme9c%coe%c(coeme%cpe(c)cpeoe(cse)c-csepe)cte-c:ctese-c}b9cIdId9che$b[d%b%b[dQcQc@dPc[d@dQcPc=dMc@d=dPcLc/dKcMc/dLc=d/dMc/d;dKcKc:dJc;d:dKcGc*dEcJc*dGc:d*dJcEc(dyc*d(dEc(d0dycyc8dwc0d8dycwc6dvc8d6dwcvc4dtc6d4dvctcMbOb4dMbtcKbOeLbLbOecdcdSehdOeSecdhdUejdSeUehdfdQebdjdQefdUeQejdQeMebdbdJe~cMeJebd}cIe|c~cIe}cJeIe~c|cHe{cIeHe|cHeGe{c{cEe,cGeEe{c,cDe_cEeDe,c_cBe]cDeBe_c]ckbmbBekb]cibNdjbjbNdbcbcQdecNdQdbcecTdhcQdTdeckcWdrchcWdkcTdWdhcWd3drcrc2dqc3d2drcocZdncqcZdoc2dZdqcncYd=bZdYdncYdwd=b=bvd/bwdvd=b/bud;bvdud/b;btd:budtd;b:b : /td ::b +xe - -xe>c>cwe=cxewe>c=cve/cweve=c;cue^c/cue;cveue/cueCe^c^cAe[cCeAe^c?cye+c[cye?cAeye[c+cre&cyere+crene&c&cle$cnele&c$cje!cleje$c!cie0cjeie!c0c S Uie S0c Q|d R R|dXcXc{dWc|d{dXcWc.dVc{d.dWcUc,dTcVc,dUc.d,dVc,d_dTcTcXemd_dXeTcldWejcmdWeldXeWemdjcUdgcWeUdjcUdRdgcgcOddcRdOdgcdcLdacOdLddcacKd`bLdKdac`b q sKd q`b^d}dScSc}dYcYcge8c}dgeYc6cee5c8cee6cgeee8ceede5c5cce4cdece5c4cfe7ccefe4c7c a cfe a7cScJd^dSc~bJd%d$dCcCc$dBcBc#dzc$d#dBczcVdlc#dVdzclcSdicVdSdlcicPdfcSdPdicfcMdccPdMdfcccHd|bMdHdcc|bDd_bHdDd|b_bBd]bDdBd_b]bAd[bBdAd]b[bCd^bAdCd[b^bGd{bCdGd^b{bJd~bGdJd{bCc o%dCc p o3c~dbe3c1c~d1cae~d1c2cae2ckeae2c#ckeke@cze#c@cke@cqeze@c*cqeqe3cbe*c3cqeAc+d!dAcHc+dHc?d+dHcOc?d?dOcRc?dRc]dRc`d]dRcZc`dZc>d`dZcNc>dAc!d>dAc>dNc","wires":["1abcadcedfgdhidjkdlmdnodpqdrsdtudvwdxydzAdBCdDEdFGdHIdJKdLMdNOdPQdRSdTUdVWdXYdZ1d23d45d67d89d0!d#$d%&d()d*+d-:d;/d=/b=:b;+b-)b*&b($b%!b#9b07b85b63b41b2YbZWbXUbVSbTQbRObPMbNKbLIbJGbHEbFCbDAb>ybzwbxubvsbtqbrobpmbnabc","2 ? @ [ ? ] [ ^ ] _ , ] . { ] | } ] ~ ` ]abbb ]cbdb ]ebfb ]gbhb ]ibjb ]kblb ]mbnb ]obpb ]qbrb ]sbtb ]ubvb ]wbxb ]ybzb ]AbBb ]CbDb ]EbFb ]GbHb ]IbJb ]KbLb ]MbNb ]ObPb ]QbRb ]SbTb ]UbVb ]WbXb ]YbZb ]1b2b ]3b4b ]5b6b ]7b8b ]9b @ ]0b!b ]9b#b ]7b$b ]5b%b ]3b&b ]1b(b ]Yb)b ]Wb*b ]Ub+b ]Sb-b ]Qb:b ]Ob;b ]Mb/b ]Kb=b ]Ib>b ]Gb?b ]Eb@b ]Cb[b ]Ab]b ]yb^b ]wb_b ]ub,b ]sb.b ]qb{b ]ob|b ]mb}b ]kb~b ]ib`b ]gbac ]ebbc ]cbcc ]abdc ] [dc @ [cc @ecbc @cbac @eb`b @gb~b @ib}b @kb|b @mb{b @ob.b @qb,b @sb_b @ub^b @wb]b @yb[b @Ab@b @Cb?b @Eb>b @Gb=b @Ib/b @Kb;b @Mb:b @Ob-b @Qb+b @Sb*b @Ub)b @Wb(b @Yb&b @1b%b @3b$b @5b#b @7b!b @9b @ @0b8b @9b6b @7b4b @5b2b @3bZb @1bXb @YbVb @WbTb @UbRb @SbPb @QbNb @ObLb @MbJb @KbHb @IbFb @GbDb @EbBb @Cbzb @Abxb @ybvb @wbtb @ubrb @sbpb @qbnb @oblb @mbjb @kbhb @ibfb @gbdb @ebbb @cb ` @ec ? @ [","2fc bgcfc dgchc dicjc dkclc dmcnc docpc dqcrc dsctc ducvc dwcxc dyczc dAcBc dCcDc dEcFc dGcHc dIcJc dKcLc dMcNc dOcPc dQcRc dScTc dUcVc dWcXc dYcZc d1c2c d3c4c d5c6c d7c8c d9c0c d!c#c d$c%c d&c(c d)c*c d+c-c d:c;c d/c=c d>c?c d@c[c d>c]c d/c^c d:c_c d+c,c d)c.c d&c{c d$c|c d!c}c d9c~c d7c`c d5cad d3cbd d1ccd dYcdd dWced dUcfd dScgd dQchd dOcid dMcjd dKckd dIcld dGcmd dEcnd dCcod dAcpd dycqd dwcrd ducsd dsctd dqcud dgcud bgctd bqcsd bscrd bucqd bwcpd bycod bAcnd bvdmd bEcld bGckd bIcjd bKcid bMchd bwdgd bxdfd bSced bUcdd bWccd bYcbd b1cad b3c`c b5c~c b7c}c b9c|c b!c{c b$c.c byd,c b)c_c b+c^c b:c]c b/c[c b>c?c b@c=c b>c;c b/c-c b:c*c b+c(c b)c%c byd#c b$c0c b!c8c b9c6c b7c4c b5c2c b3cZc b1cXc bYcVc bWcTc bUcRc bScPc bxdNc bwdLc bMcJc bKcHc bIcFc bGcDc bEcBc bvdzc bAcxc bycvc bwctc bucrc bscpc bqcfc bgc","2zd bgczd dgcAd dicBd dkcCd dmcDd docEd dqcFd dscGd ducHd dwcId dycJd dAcKd dCcLd dEcMd dGcNd dIcOd dKcPd dMcQd dOcRd dQcSd dScTd dUcUd dWcVd dYcWd d1cXd d3cYd d5cZd d7c1d d9c2d d!c3d d$c4d d&c5d d)c6d d+c7d d:c8d d/c9d d>c c d@c0d d>c!d d/c#d d:c$d d+c%d d)c&d d&c(d d$c)d d!c*d d9c+d d7c-d d5c:d d3c;d d1c/d dYc=d dWc>d dUc?d dSc@d dQc[d dOc]d dMc^d dKc_d dIc,d dGc.d dEc{d dCc|d dAc}d dyc~d dwc`d ducae dscbe dqcce dgcce bgcbe bqcae bsc`d buc~d bwc}d byc|d bAc{d bvd.d bEc,d bGc_d bIc^d bKc]d bMc[d bwd@d bxd?d bSc>d bUc=d bWc/d bYc;d b1c:d b3c-d b5c+d b7c*d b9c)d b!c(d b$c&d byd%d b)c$d b+c#d b:c!d b/c0d b>c c b@c9d b>c8d b/c7d b:c6d b+c5d b)c4d byd3d b$c2d b!c1d b9cZd b7cYd b5cXd b3cWd b1cVd bYcUd bWcTd bUcSd bScRd bxdQd bwdPd bMcOd bKcNd bIcMd bGcLd bEcKd bvdJd bAcId bycHd bwcGd bucFd bscEd bqczd bgc","2fcdeeefcfeeehcfegejcfehelcfeiencfejepcfekercfeletcfemevcfenexcfeoezcfepeBcfeqeDcfereFcfeseHcfeteJcfeueLcfeveNcfewePcfexeRcfeyeTcfezeVcfeAeXcfeBeZcfeCe2cfeDe4cfeEe6cfeFe8cfeGe0cfeHe#cfeIe%cfeJe(cfeKe*cfeLe-cfeMe;cfeNe=cfeOe?cfePe[cfeOe]cfeNe^cfeMe_cfeLe,cfeKe.cfeJe{cfeIe|cfeHe}cfeGe~cfeFe`cfeEeadfeDebdfeCecdfeBeddfeAeedfezefdfeyegdfexehdfeweidfevejdfeuekdfeteldfesemdferendfeqeodfepepdfeoeqdfenerdfemesdfeletdfekeudfeeeuddeeetddeQesddelerddemeqddenepddeoeoddependdeqemdderelddesekddetejddeReiddevehddewegddexefddeyeeddezedddeAecddeBebddeCeaddeSe`cdeEe~cdeFe}cdeGe|cdeHe{cdeIe.cdeJe,cdeKe_cdeLe^cdeMe]cdeNe[cdeOe?cdePe=cdeOe;cdeNe-cdeMe*cdeLe(cdeKe%cdeJe#cdeIe0cdeHe8cdeGe6cdeFe4cdeEe2cdeSeZcdeCeXcdeBeVcdeAeTcdezeRcdeyePcdexeNcdeweLcdeveJcdeReHcdeteFcdeseDcdereBcdeqezcdepexcdeoevcdenetcdemercdelepcdeQefcdeee","2zddeeezdfeeeAdfegeBdfeheCdfeieDdfejeEdfekeFdfeleGdfemeHdfeneIdfeoeJdfepeKdfeqeLdfereMdfeseNdfeteOdfeuePdfeveQdfeweRdfexeSdfeyeTdfezeUdfeAeVdfeBeWdfeCeXdfeDeYdfeEeZdfeFe1dfeGe2dfeHe3dfeIe4dfeJe5dfeKe6dfeLe7dfeMe8dfeNe9dfeOe cfePe0dfeOe!dfeNe#dfeMe$dfeLe%dfeKe&dfeJe(dfeIe)dfeHe*dfeGe+dfeFe-dfeEe:dfeDe;dfeCe/dfeBe=dfeAe>dfeze?dfeye@dfexe[dfewe]dfeve^dfeue_dfete,dfese.dfere{dfeqe|dfepe}dfeoe~dfene`dfemeaefelebefekecefeeecedeeebedeQeaedele`ddeme~ddene}ddeoe|ddepe{ddeqe.ddere,ddese_ddete^ddeRe]ddeve[ddewe@ddexe?ddeye>ddeze=ddeAe/ddeBe;ddeCe:ddeSe-ddeEe+ddeFe*ddeGe)ddeHe(ddeIe&ddeJe%ddeKe$ddeLe#ddeMe!ddeNe0ddeOe cdePe9ddeOe8ddeNe7ddeMe6ddeLe5ddeKe4ddeJe3ddeIe2ddeHe1ddeGeZddeFeYddeEeXddeSeWddeCeVddeBeUddeAeTddezeSddeyeRddexeQddewePddeveOddeReNddeteMddeseLddereKddeqeJddepeIddeoeHddeneGddemeFddeleEddeQezddeee","2TefeeeUe dVeTe dWeXe dWeYe dVeXefeeeTefeee","2dc ] [cc ]abbc ]cbac ]eb`b ]gb~b ]ib}b ]kb|b ]mb{b ]ob.b ]qb,b ]sb_b ]ub^b ]wb]b ]yb[b ]Ab@b ]Cb?b ]Eb>b ]Gb=b ]Ib/b ]Kb;b ]Mb:b ]Ob-b ]Qb+b ]Sb*b ]Ub)b ]Wb(b ]Yb&b ]1b%b ]3b$b ]5b#b ]7b!b ]9b @ ]0b8b ]9b6b ]7b4b ]5b2b ]3bZb ]1bXb ]YbVb ]WbTb ]UbRb ]SbPb ]QbNb ]ObLb ]MbJb ]KbHb ]IbFb ]GbDb ]EbBb ]Cbzb ]Abxb ]ybvb ]wbtb ]ubrb ]sbpb ]qbnb ]oblb ]mbjb ]kbhb ]ibfb ]gbdb ]ebbb ]cb ` ]ab ? ] [ ` ]Zebb ]1edb ]2efb ]3ehb ]4ejb ]5elb ]6enb ]7epb ]8erb ]9etb ]0evb ]!exb ]#ezb ]$eBb ]%eDb ]&eFb ](eHb ])eJb ]*eLb ]+eNb ]-ePb ]:eRb ];eTb ]/eVb ]=eXb ]>eZb ]?e2b ]@e4b ][e6b ]]e8b ]^e @ ]_e!b ]^e#b ]]e$b ][e%b ]@e&b ]?e(b ]>e)b ]=e*b ]/e+b ];e-b ]:e:b ]-e;b ]+e/b ]*e=b ])e>b ](e?b ]&e@b ]%e[b ]$e]b ]#e^b ]!e_b ]0e,b ]9e.b ]8e{b ]7e|b ]6e}b ]5e~b ]4e`b ]3eac ]2ebc ]1ecc ]Zedc ] [","2ud dgctd dqcsd dscrd ducqd dwcpd dycod dAcnd dCcmd dEcld dGckd dIcjd dKcid dMchd dOcgd dQcfd dSced dUcdd dWccd dYcbd d1cad d3c`c d5c~c d7c}c d9c|c d!c{c d$c.c d&c,c d)c_c d+c^c d:c]c d/c[c d>c?c d@c=c d>c;c d/c-c d:c*c d+c(c d)c%c d&c#c d$c0c d!c8c d9c6c d7c4c d5c2c d3cZc d1cXc dYcVc dWcTc dUcRc dScPc dQcNc dOcLc dMcJc dKcHc dIcFc dGcDc dEcBc dCczc dAcxc dycvc dwctc ducrc dscpc dqcfc dgcpc d,erc d.etc d{evc d|exc d}ezc d~eBc d`eDc dafFc dbfHc dcfJc ddfLc defNc dffPc dgfRc dhfTc difVc djfXc dkfZc dlf2c dmf4c dnf6c dof8c dpf0c dqf#c drf%c dsf(c dtf*c duf-c dvf;c dwf=c dxf?c dyf[c dxf]c dwf^c dvf_c duf,c dtf.c dsf{c drf|c dqf}c dpf~c dof`c dnfad dmfbd dlfcd dkfdd djfed diffd dhfgd dgfhd dffid defjd ddfkd dcfld dbfmd dafnd d`eod d~epd d}eqd d|erd d{esd d.etd d,eud dgc","2ce dgcbe dqcae dsc`d duc~d dwc}d dyc|d dAc{d dCc.d dEc,d dGc_d dIc^d dKc]d dMc[d dOc@d dQc?d dSc>d dUc=d dWc/d dYc;d d1c:d d3c-d d5c+d d7c*d d9c)d d!c(d d$c&d d&c%d d)c$d d+c#d d:c!d d/c0d d>c c d@c9d d>c8d d/c7d d:c6d d+c5d d)c4d d&c3d d$c2d d!c1d d9cZd d7cYd d5cXd d3cWd d1cVd dYcUd dWcTd dUcSd dScRd dQcQd dOcPd dMcOd dKcNd dIcMd dGcLd dEcKd dCcJd dAcId dycHd dwcGd ducFd dscEd dqczd dgcEd d,eFd d.eGd d{eHd d|eId d}eJd d~eKd d`eLd dafMd dbfNd dcfOd ddfPd defQd dffRd dgfSd dhfTd difUd djfVd dkfWd dlfXd dmfYd dnfZd dof1d dpf2d dqf3d drf4d dsf5d dtf6d duf7d dvf8d dwf9d dxf c dyf0d dxf!d dwf#d dvf$d duf%d dtf&d dsf(d drf)d dqf*d dpf+d dof-d dnf:d dmf;d dlf/d dkf=d djf>d dif?d dhf@d dgf[d dff]d def^d ddf_d dcf,d dbf.d daf{d d`e|d d~e}d d}e~d d|e`d d{eae d.ebe d,ece dgc","2udfeeetdfekesdfelerdfemeqdfenepdfeoeodfependfeqemdfereldfesekdfetejdfeueidfevehdfewegdfexefdfeyeedfezeddfeAecdfeBebdfeCeadfeDe`cfeEe~cfeFe}cfeGe|cfeHe{cfeIe.cfeJe,cfeKe_cfeLe^cfeMe]cfeNe[cfeOe?cfePe=cfeOe;cfeNe-cfeMe*cfeLe(cfeKe%cfeJe#cfeIe0cfeHe8cfeGe6cfeFe4cfeEe2cfeDeZcfeCeXcfeBeVcfeAeTcfezeRcfeyePcfexeNcfeweLcfeveJcfeueHcfeteFcfeseDcfereBcfeqezcfepexcfeoevcfenetcfemercfelepcfekefcfeeepcfezfrcfeAftcfeBfvcfeCfxcfeDfzcfeEfBcfeFfDcfeGfFcfeHfHcfeIfJcfeJfLcfeKfNcfeLfPcfeMfRcfeNfTcfeOfVcfePfXcfeQfZcfeRf2cfeSf4cfeTf6cfeUf8cfeVf0cfeWf#cfeXf%cfeYf(cfeZf*cfe1f-cfe2f;cfe3f=cfe4f?cfe5f[cfe4f]cfe3f^cfe2f_cfe1f,cfeZf.cfeYf{cfeXf|cfeWf}cfeVf~cfeUf`cfeTfadfeSfbdfeRfcdfeQfddfePfedfeOffdfeNfgdfeMfhdfeLfidfeKfjdfeJfkdfeIfldfeHfmdfeGfndfeFfodfeEfpdfeDfqdfeCfrdfeBfsdfeAftdfezfudfeee","2cefeeebefekeaefele`dfeme~dfene}dfeoe|dfepe{dfeqe.dfere,dfese_dfete^dfeue]dfeve[dfewe@dfexe?dfeye>dfeze=dfeAe/dfeBe;dfeCe:dfeDe-dfeEe+dfeFe*dfeGe)dfeHe(dfeIe&dfeJe%dfeKe$dfeLe#dfeMe!dfeNe0dfeOe cfePe9dfeOe8dfeNe7dfeMe6dfeLe5dfeKe4dfeJe3dfeIe2dfeHe1dfeGeZdfeFeYdfeEeXdfeDeWdfeCeVdfeBeUdfeAeTdfezeSdfeyeRdfexeQdfewePdfeveOdfeueNdfeteMdfeseLdfereKdfeqeJdfepeIdfeoeHdfeneGdfemeFdfeleEdfekezdfeeeEdfezfFdfeAfGdfeBfHdfeCfIdfeDfJdfeEfKdfeFfLdfeGfMdfeHfNdfeIfOdfeJfPdfeKfQdfeLfRdfeMfSdfeNfTdfeOfUdfePfVdfeQfWdfeRfXdfeSfYdfeTfZdfeUf1dfeVf2dfeWf3dfeXf4dfeYf5dfeZf6dfe1f7dfe2f8dfe3f9dfe4f cfe5f0dfe4f!dfe3f#dfe2f$dfe1f%dfeZf&dfeYf(dfeXf)dfeWf*dfeVf+dfeUf-dfeTf:dfeSf;dfeRf/dfeQf=dfePf>dfeOf?dfeNf@dfeMf[dfeLf]dfeKf^dfeJf_dfeIf,dfeHf.dfeGf{dfeFf|dfeEf}dfeDf~dfeCf`dfeBfaefeAfbefezfcefeee","26f ]7f8f ]9f0f ]!f#f ]$f%f ]&f(f ])f*f ]+f-f ]:f;f ]/f=f ]>f?f ]@f[f ]]f^f ]_f,f ].f{f ]|f}f ]~f @ ]`fag ]~fbg ]|fcg ].fdg ]_feg ]]ffg ]@fgg ]>fhg ]/fig ]:fjg ]+fkg ])flg ]&fmg ]$fng ]!fog ]9fpg ]7fqg drgsg dtgug dvgwg dxgyg dzgAg dBgCg dDgEg dFgGg dHgIg dJgKg dLgMg dNgOg dPgQg dRgSg dTgUg dVgWg dXgYg dZg1g d2g3g d4g5g d6g7g d8g9g d0g!g d#g$g d%g&g d(g)g d*g+g d-g:g d;g/g d=g>g d?g@g d[gWe dgcWefeee]gfe^g_gfe,g.gfe{g|gfe}g~gfe`gahfebhchfedhehfefhghfehhihfejhkhfelhmhfenhohfephqhferhshfethuhfevhwhfexhyhfezhAhfeBhChfeDhEhfeFhGhfeHhIhfeJhKhfeLhMhfeNhOhfePhQhfeRhShfeThUhfeVhWhfeXhYhfeZh cfe1h?cfe1h2hfeZh3hfeXh4hfeVh5hfeTh6hfeRh7hfePh8hfeNh9hfeLh0hfeJh!hfeHh#hfeFh$hfeDh%hfeBh&hfezh(hfexh)hfevh*hfeth+hferh-hfeph:hfenh;hfelh/hfejh=hfehh>hfefh?hfedh@hfebh[hfe`g]hfe}g^hfe{g_hfe,g,hfe^g.hfeee.h dgc{h d[g|h d?g}h d=g~h d;g`h d-gai d*gbi d(gci d%gdi d#gei d0gfi d8ggi d6ghi d4gii d2gji dZgki dXgli dVgmi dTgni dRgoi dPgpi dNgqi dLgri dJgsi dHgti dFgui dDgvi dBgwi dzgxi dxgyi dvgzi dtgAi drg6f ]7f","2Bi dCi a dCi m dDi o dEi q dFi s dGi u dHi w dIi y dJi A dKi C dLi E dMi G dNi I dOi K dPi M dQi O dRi Q dSi S dTi U dUi W dVi Y dWi 1 dXi 3 dYi 5 dZi 7 d1i 9 d2i ! d3i $ d4i & d5i ) d6i + d7i : d8i / d = : d ; + d - ) d * & d ( $ d % ! d # 9 d 0 7 d 8 5 d 6 3 d 4 1 d 2 Y d Z W d X U d V S d T Q d R O d P M d N K d L I d J G d H E d F C d D A d B y d z w d x u d v s d t q d r o d p m d n a d cBi d c9i d n0i d p!i d r#i d t$i d v%i d x&i d z(i d B)i d D*i d F+i d H-i d J:i d L;i d N/i d P=i d R>i d T?i d V@i d X[i d Z]i d 2^i d 4_i d 6,i d 8.i d 0{i d #|i d %}i d (~i d *`i d -aj d ;bj d =aj d8i`i d7i~i d6i}i d5i|i d4i{i d3i.i d2i,i d1i_i dZi^i dYi]i dXi[i dWi@i dVi?i dUi>i dTi=i dSi/i dRi;i dQi:i dPi-i dOi+i dNi*i dMi)i dLi(i dKi&i dJi%i dIi$i dHi#i dGi!i dFi0i dEi9i dDiBi dCi","2cjfeeedjfeeeej dVedj dWecj dWefj dVecjfeee","2fc bgcpc bqcrc bsctc bucvc bwcxc byczc bAcBc bvdDc bEcFc bGcHc bIcJc bKcLc bMcNc bwdPc bxdRc bScTc bUcVc bWcXc bYcZc b1c2c b3c4c b5c6c b7c8c b9c0c b!c#c b$c%c byd(c b)c*c b+c-c b:c;c b/c=c b>c?c b@c[c b>c]c b/c^c b:c_c b+c,c b)c.c byd{c b$c|c b!c}c b9c~c b7c`c b5cad b3cbd b1ccd bYcdd bWced bUcfd bScgd bxdhd bwdid bMcjd bKckd bIcld bGcmd bEcnd bvdod bAcpd bycqd bwcrd bucsd bsctd bqcud bgctd b,esd b.erd b{eqd b|epd b}eod b~end b`emd bafld bbfkd bcfjd bdfid befhd bffgd bgffd bhfed bifdd bjfcd bgjbd blfad bmf`c bnf~c bof}c bpf|c bqf{c brf.c bsf,c btf_c buf^c bvf]c bwf[c bxf?c byf=c bxf;c bwf-c bvf*c buf(c btf%c bsf#c brf0c bqf8c bpf6c bof4c bnf2c bmfZc blfXc bgjVc bjfTc bifRc bhfPc bgfNc bffLc befJc bdfHc bcfFc bbfDc bafBc b`ezc b~exc b}evc b|etc b{erc b.epc b,efc bgc","2fcdeeepcdeQercdeletcdemevcdenexcdeoezcdepeBcdeqeDcdereFcdeseHcdeteJcdeReLcdeveNcdewePcdexeRcdeyeTcdezeVcdeAeXcdeBeZcdeCe2cdeSe4cdeEe6cdeFe8cdeGe0cdeHe#cdeIe%cdeJe(cdeKe*cdeLe-cdeMe;cdeNe=cdeOe?cdePe[cdeOe]cdeNe^cdeMe_cdeLe,cdeKe.cdeJe{cdeIe|cdeHe}cdeGe~cdeFe`cdeEeaddeSebddeCecddeBedddeAeeddezefddeyegddexehddeweiddevejddeRekddetelddesemdderenddeqeoddepepddeoeqddenerddemesddeletddeQeuddeeetddezfsddeAfrddeBfqddeCfpddeDfoddeEfnddeFfmddeGflddeHfkddeIfjddeJfiddeKfhddeLfgddeMffddeNfeddehjdddePfcddeQfbddeijaddeSf`cdeTf~cdeUf}cdeVf|cdeWf{cdeXf.cdeYf,cdeZf_cde1f^cde2f]cde3f[cde4f?cde5f=cde4f;cde3f-cde2f*cde1f(cdeZf%cdeYf#cdeXf0cdeWf8cdeVf6cdeUf4cdeTf2cdeSfZcdeijXcdeQfVcdePfTcdehjRcdeNfPcdeMfNcdeLfLcdeKfJcdeJfHcdeIfFcdeHfDcdeGfBcdeFfzcdeEfxcdeDfvcdeCftcdeBfrcdeAfpcdezffcdeee","2We bgc@g b[g>g b?g/g b=g:g b;g+g b-g)g b*g&g b(g$g b%g!g b#g9g b0g7g b8g5g b6g3g b4g1g b2gYg bZgWg bXgUg bVgSg bTgQg bRgOg bPgMg bjjKg bLgIg bkjGg bljEg bFgCg bDgAg bBgyg bzgwg bxgug bvgsg btgqg brgpg @7fog @9fng @!fmg @$flg @&fkg @)fjg @+fig @:fhg @/fgg @>ffg @@feg @]fdg @_fcg @.fbg @|fag @mj @ @`f}f @mj{f @|f,f @.f^f @_f[f @]f?f @@f=f @>f;f @/f-f @:f*f @+f(f @)f%f @&f#f @$f0f @!f8f @9f6f @7fAi brgzi btgyi bvgxi bxgwi bzgvi bBgui bDgti bFgsi bljri bkjqi bLgpi bjjoi bPgni bRgmi bTgli bVgki bXgji bZgii b2ghi b4ggi b6gfi b8gei b0gdi b#gci b%gbi b(gai b*g`h b-g~h b;g}h b=g|h b?g{h b[g.h bgc.hdeee,hde^g_hde,g^hde{g]hde}g[hde`g@hdenj?hdedh>hdefh=hdehh/hdejh;hdelh:hdenh-hdeph+hderh*hdeth)hdevh(hdexh&hdezh%hdeoj$hdeDh#hdeFh!hdeHh0hdeJh9hdeLh8hdeNh7hdePh6hdeRh5hdeTh4hdeVh3hdepj2hdeZh?cde1h cde1hYhdeZhWhdepjUhdeVhShdeThQhdeRhOhdePhMhdeNhKhdeLhIhdeJhGhdeHhEhdeFhChdeDhAhdeojyhdezhwhdexhuhdevhshdethqhderhohdephmhdenhkhdelhihdejhghdehhehdefhchdedhahdenj~gde`g|gde}g.gde{g_gde,g]gde^gWedeeeWe bgc","2zddeeeEddeQeFddeleGddemeHddeneIddeoeJddepeKddeqeLddereMddeseNddeteOddeRePddeveQddeweRddexeSddeyeTddezeUddeAeVddeBeWddeCeXddeSeYddeEeZddeFe1ddeGe2ddeHe3ddeIe4ddeJe5ddeKe6ddeLe7ddeMe8ddeNe9ddeOe cdePe0ddeOe!ddeNe#ddeMe$ddeLe%ddeKe&ddeJe(ddeIe)ddeHe*ddeGe+ddeFe-ddeEe:ddeSe;ddeCe/ddeBe=ddeAe>ddeze?ddeye@ddexe[ddewe]ddeve^ddeRe_ddete,ddese.ddere{ddeqe|ddepe}ddeoe~ddene`ddemeaedelebedeQecedeeebedezfaedeAf`ddeBf~ddeCf}ddeDf|ddeEf{ddeFf.ddeGf,ddeHf_ddeIf^ddeJf]ddeKf[ddeLf@ddeMf?ddeNf>ddehj=ddePf/ddeQf;ddeij:ddeSf-ddeTf+ddeUf*ddeVf)ddeWf(ddeXf&ddeYf%ddeZf$dde1f#dde2f!dde3f0dde4f cde5f9dde4f8dde3f7dde2f6dde1f5ddeZf4ddeYf3ddeXf2ddeWf1ddeVfZddeUfYddeTfXddeSfWddeijVddeQfUddePfTddehjSddeNfRddeMfQddeLfPddeKfOddeJfNddeIfMddeHfLddeGfKddeFfJddeEfIddeDfHddeCfGddeBfFddeAfEddezfzddeee","2zd bgcEd bqcFd bscGd bucHd bwcId bycJd bAcKd bvdLd bEcMd bGcNd bIcOd bKcPd bMcQd bwdRd bxdSd bScTd bUcUd bWcVd bYcWd b1cXd b3cYd b5cZd b7c1d b9c2d b!c3d b$c4d byd5d b)c6d b+c7d b:c8d b/c9d b>c c b@c0d b>c!d b/c#d b:c$d b+c%d b)c&d byd(d b$c)d b!c*d b9c+d b7c-d b5c:d b3c;d b1c/d bYc=d bWc>d bUc?d bSc@d bxd[d bwd]d bMc^d bKc_d bIc,d bGc.d bEc{d bvd|d bAc}d byc~d bwc`d bucae bscbe bqcce bgcbe b,eae b.e`d b{e~d b|e}d b}e|d b~e{d b`e.d baf,d bbf_d bcf^d bdf]d bef[d bff@d bgf?d bhf>d bif=d bjf/d bgj;d blf:d bmf-d bnf+d bof*d bpf)d bqf(d brf&d bsf%d btf$d buf#d bvf!d bwf0d bxf c byf9d bxf8d bwf7d bvf6d buf5d btf4d bsf3d brf2d bqf1d bpfZd bofYd bnfXd bmfWd blfVd bgjUd bjfTd bifSd bhfRd bgfQd bffPd befOd bdfNd bcfMd bbfLd bafKd b`eJd b~eId b}eHd b|eGd b{eFd b.eEd b,ezd bgc","2 ? @ [ ` @ecbb @cbdb @ebfb @gbhb @ibjb @kblb @mbnb @obpb @qbrb @sbtb @ubvb @wbxb @ybzb @AbBb @CbDb @EbFb @GbHb @IbJb @KbLb @MbNb @ObPb @QbRb @SbTb @UbVb @WbXb @YbZb @1b2b @3b4b @5b6b @7b8b @9b @ @0b!b @9b#b @7b$b @5b%b @3b&b @1b(b @Yb)b @Wb*b @Ub+b @Sb-b @Qb:b @Ob;b @Mb/b @Kb=b @Ib>b @Gb?b @Eb@b @Cb[b @Ab]b @yb^b @wb_b @ub,b @sb.b @qb{b @ob|b @mb}b @kb~b @ib`b @gbac @ebbc @cbcc @ecdc @ [cc @qjbc @1eac @2e`b @3e~b @4e}b @5e|b @6e{b @7e.b @8e,b @9e_b @0e^b @!e]b @#e[b @$e@b @%e?b @&e>b @(e=b @)e/b @*e;b @+e:b @-e-b @:e+b @;e*b @/e)b @=e(b @>e&b @?e%b @@e$b @[e#b @]e!b @^e @ @_e8b @^e6b @]e4b @[e2b @@eZb @?eXb @>eVb @=eTb @/eRb @;ePb @:eNb @-eLb @+eJb @*eHb @)eFb @(eDb @&eBb @%ezb @$exb @#evb @!etb @0erb @9epb @8enb @7elb @6ejb @5ehb @4efb @3edb @2ebb @1e ` @qj ? @ [","2Bi b c a b c m b n o b p q b r s b t u b v w b x y b z A b > C b D E b F G b H I b J K b L M b N O b P Q b R S b T U b V W b X Y b Z 1 b 2 3 b 4 5 b 6 7 b 8 9 b 0 ! b # $ b % & b ( ) b * + b - : b ; / b = : b8i + b7i ) b6i & b5i $ brj ! b3i 9 b2i 7 b1i 5 bsj 3 bYi 1 bXi Y bWi W bVi U bUi S bTi Q bSi O bRi M bQi K bPi I bOi G bNi E bMi C bLi A bKi y btj w bIi u bHi s bGi q bFi o bEi m bDi a bCiBi bCi9i bDi0i bEi!i bFi#i bGi$i bHi%i bIi&i btj(i bKi)i bLi*i bMi+i bNi-i bOi:i bPi;i bQi/i bRi=i bSi>i bTi?i bUi@i bVi[i bWi]i bXi^i bYi_i bsj,i b1i.i b2i{i b3i|i brj}i b5i~i b6i`i b7iaj b8ibj b =aj b ;`i b -~i b *}i b (|i b %{i b #.i b 0,i b 8_i b 6^i b 4]i b 2[i b Z@i b X?i b V>i b T=i b R/i b P;i b N:i b L-i b J+i b H*i b F)i b D(i b >&i b z%i b x$i b v#i b t!i b r0i b p9i b nBi b c","2Ye bVeXe bWeuj bWevj bWewj bWexj bWeyj bWezj bWeAj bWeBj bWeCj bWeTe bWeUe bVeTedeeeXedeeeYe bVe","2cj bWedj bWeej bVedjdeeecjdeeefj bVecj bWe","26f @7f8f @9f0f @!f#f @$f%f @&f(f @)f*f @+f-f @:f;f @/f=f @>f?f @@f[f @]f^f @_f,f @.f{f @|f}f @mj @ @`fag @mjbg @|fcg @.fdg @_feg @]ffg @@fgg @>fhg @/fig @:fjg @+fkg @)flg @&fmg @$fng @!fog @9fpg @7fpgDj7fpgEj7fpgFj7fpgGj7fpgHj7fpgIj7fpgJj7fpgKj7fpg ]7fog ]9fng ]!fmg ]$flg ]&fkg ])fjg ]+fig ]:fhg ]/fgg ]>ffg ]@feg ]]fdg ]_fcg ].fbg ]|fag ]~fLj ]`f}f ]~f{f ]|f,f ].f^f ]_f[f ]]f?f ]@f=f ]>f;f ]/f-f ]:f*f ]+f(f ])f%f ]&f#f ]$f0f ]!f8f ]9f6f ]7f6f @7f","2pg @7fqg brgqgDjrgqgMjrgqgNjrgqgOjrgqgHjrgqgPjrgqgQjrgqgRjrgqg drgpg ]7fpg @7f","2qg brgsg btgug bvgwg bxgyg bzgAg bBgCg bDgEg bFgGg bljIg bkjKg bLgMg bjjOg bPgQg bRgSg bTgUg bVgWg bXgYg bZg1g b2g3g b4g5g b6g7g b8g9g b0g!g b#g$g b%g&g b(g)g b*g+g b-g:g b;g/g b=g>g b?g@g b[gWe bgcWe dgc@g d[g>g d?g/g d=g:g d;g+g d-g)g d*g&g d(g$g d%g!g d#g9g d0g7g d8g5g d6g3g d4g1g d2gYg dZgWg dXgUg dVgSg dTgQg dRgOg dPgMg dNgKg dLgIg dJgGg dHgEg dFgCg dDgAg dBgyg dzgwg dxgug dvgsg dtgqg drgqg brg","2We bgcWedeeeWefeeeWe dgcWe bgc","2Wedeee]gde^g_gde,g.gde{g|gde}g~gde`gahdenjchdedhehdefhghdehhihdejhkhdelhmhdenhohdephqhderhshdethuhdevhwhdexhyhdezhAhdeojChdeDhEhdeFhGhdeHhIhdeJhKhdeLhMhdeNhOhdePhQhdeRhShdeThUhdeVhWhdepjYhdeZh cde1h cfe1hYhfeZhWhfeXhUhfeVhShfeThQhfeRhOhfePhMhfeNhKhfeLhIhfeJhGhfeHhEhfeFhChfeDhAhfeBhyhfezhwhfexhuhfevhshfethqhferhohfephmhfenhkhfelhihfejhghfehhehfefhchfedhahfebh~gfe`g|gfe}g.gfe{g_gfe,g]gfe^gWefeeeWedeee","2 cde1h?cde1h?cfe1h cfe1h cde1h","2?cde1h2hdeZh3hdepj4hdeVh5hdeTh6hdeRh7hdePh8hdeNh9hdeLh0hdeJh!hdeHh#hdeFh$hdeDh%hdeoj&hdezh(hdexh)hdevh*hdeth+hderh-hdeph:hdenh;hdelh/hdejh=hdehh>hdefh?hdedh@hdenj[hde`g]hde}g^hde{g_hde,g,hde^g.hdeee.hfeee,hfe^g_hfe,g^hfe{g]hfe}g[hfe`g@hfebh?hfedh>hfefh=hfehh/hfejh;hfelh:hfenh-hfeph+hferh*hfeth)hfevh(hfexh&hfezh%hfeBh$hfeDh#hfeFh!hfeHh0hfeJh9hfeLh8hfeNh7hfePh6hfeRh5hfeTh4hfeVh3hfeXh2hfeZh?cfe1h?cde1h","2.hdeee.h bgc.h dgc.hfeee.hdeee","2.h bgc{h b[g|h b?g}h b=g~h b;g`h b-gai b*gbi b(gci b%gdi b#gei b0gfi b8ggi b6ghi b4gii b2gji bZgki bXgli bVgmi bTgni bRgoi bPgpi bjjqi bLgri bkjsi bljti bFgui bDgvi bBgwi bzgxi bxgyi bvgzi btgAi brgAi drgzi dtgyi dvgxi dxgwi dzgvi dBgui dDgti dFgsi dHgri dJgqi dLgpi dNgoi dPgni dRgmi dTgli dVgki dXgji dZgii d2ghi d4ggi d6gfi d8gei d0gdi d#gci d%gbi d(gai d*g`h d-g~h d;g}h d=g|h d?g{h d[g.h dgc.h bgc","2Ai brg6f @7f6f ]7fAi drgAi brg","2zddeeeEddezfFddeAfGddeBfHddeCfIddeDfJddeEfKddeFfLddeGfMddeHfNddeIfOddeJfPddeKfQddeLfRddeMfSddeNfTddehjUddePfVddeQfWddeijXddeSfYddeTfZddeUf1ddeVf2ddeWf3ddeXf4ddeYf5ddeZf6dde1f7dde2f8dde3f9dde4f cde5f0dde4f!dde3f#dde2f$dde1f%ddeZf&ddeYf(ddeXf)ddeWf*ddeVf+ddeUf-ddeTf:ddeSf;ddeij/ddeQf=ddePf>ddehj?ddeNf@ddeMf[ddeLf]ddeKf^ddeJf_ddeIf,ddeHf.ddeGf{ddeFf|ddeEf}ddeDf~ddeCf`ddeBfaedeAfbedezfcedeeecefeeebefezfaefeAf`dfeBf~dfeCf}dfeDf|dfeEf{dfeFf.dfeGf,dfeHf_dfeIf^dfeJf]dfeKf[dfeLf@dfeMf?dfeNf>dfeOf=dfePf/dfeQf;dfeRf:dfeSf-dfeTf+dfeUf*dfeVf)dfeWf(dfeXf&dfeYf%dfeZf$dfe1f#dfe2f!dfe3f0dfe4f cfe5f9dfe4f8dfe3f7dfe2f6dfe1f5dfeZf4dfeYf3dfeXf2dfeWf1dfeVfZdfeUfYdfeTfXdfeSfWdfeRfVdfeQfUdfePfTdfeOfSdfeNfRdfeMfQdfeLfPdfeKfOdfeJfNdfeIfMdfeHfLdfeGfKdfeFfJdfeEfIdfeDfHdfeCfGdfeBfFdfeAfEdfezfzdfeeezddeee","2fcdeeepcdezfrcdeAftcdeBfvcdeCfxcdeDfzcdeEfBcdeFfDcdeGfFcdeHfHcdeIfJcdeJfLcdeKfNcdeLfPcdeMfRcdeNfTcdehjVcdePfXcdeQfZcdeij2cdeSf4cdeTf6cdeUf8cdeVf0cdeWf#cdeXf%cdeYf(cdeZf*cde1f-cde2f;cde3f=cde4f?cde5f[cde4f]cde3f^cde2f_cde1f,cdeZf.cdeYf{cdeXf|cdeWf}cdeVf~cdeUf`cdeTfaddeSfbddeijcddeQfdddePfeddehjfddeNfgddeMfhddeLfiddeKfjddeJfkddeIflddeHfmddeGfnddeFfoddeEfpddeDfqddeCfrddeBfsddeAftddezfuddeeeudfeeetdfezfsdfeAfrdfeBfqdfeCfpdfeDfodfeEfndfeFfmdfeGfldfeHfkdfeIfjdfeJfidfeKfhdfeLfgdfeMffdfeNfedfeOfddfePfcdfeQfbdfeRfadfeSf`cfeTf~cfeUf}cfeVf|cfeWf{cfeXf.cfeYf,cfeZf_cfe1f^cfe2f]cfe3f[cfe4f?cfe5f=cfe4f;cfe3f-cfe2f*cfe1f(cfeZf%cfeYf#cfeXf0cfeWf8cfeVf6cfeUf4cfeTf2cfeSfZcfeRfXcfeQfVcfePfTcfeOfRcfeNfPcfeMfNcfeLfLcfeKfJcfeJfHcfeIfFcfeHfDcfeGfBcfeFfzcfeEfxcfeDfvcfeCftcfeBfrcfeAfpcfezffcfeeefcdeee","2zd bgcEd b,eFd b.eGd b{eHd b|eId b}eJd b~eKd b`eLd bafMd bbfNd bcfOd bdfPd befQd bffRd bgfSd bhfTd bifUd bjfVd bgjWd blfXd bmfYd bnfZd bof1d bpf2d bqf3d brf4d bsf5d btf6d buf7d bvf8d bwf9d bxf c byf0d bxf!d bwf#d bvf$d buf%d btf&d bsf(d brf)d bqf*d bpf+d bof-d bnf:d bmf;d blf/d bgj=d bjf>d bif?d bhf@d bgf[d bff]d bef^d bdf_d bcf,d bbf.d baf{d b`e|d b~e}d b}e~d b|e`d b{eae b.ebe b,ece bgcce dgcbe d,eae d.e`d d{e~d d|e}d d}e|d d~e{d d`e.d daf,d dbf_d dcf^d ddf]d def[d dff@d dgf?d dhf>d dif=d djf/d dkf;d dlf:d dmf-d dnf+d dof*d dpf)d dqf(d drf&d dsf%d dtf$d duf#d dvf!d dwf0d dxf c dyf9d dxf8d dwf7d dvf6d duf5d dtf4d dsf3d drf2d dqf1d dpfZd dofYd dnfXd dmfWd dlfVd dkfUd djfTd difSd dhfRd dgfQd dffPd defOd ddfNd dcfMd dbfLd dafKd d`eJd d~eId d}eHd d|eGd d{eFd d.eEd d,ezd dgczd bgc","2fc bgcpc b,erc b.etc b{evc b|exc b}ezc b~eBc b`eDc bafFc bbfHc bcfJc bdfLc befNc bffPc bgfRc bhfTc bifVc bjfXc bgjZc blf2c bmf4c bnf6c bof8c bpf0c bqf#c brf%c bsf(c btf*c buf-c bvf;c bwf=c bxf?c byf[c bxf]c bwf^c bvf_c buf,c btf.c bsf{c brf|c bqf}c bpf~c bof`c bnfad bmfbd blfcd bgjdd bjfed biffd bhfgd bgfhd bffid befjd bdfkd bcfld bbfmd bafnd b`eod b~epd b}eqd b|erd b{esd b.etd b,eud bgcud dgctd d,esd d.erd d{eqd d|epd d}eod d~end d`emd dafld dbfkd dcfjd ddfid defhd dffgd dgffd dhfed difdd djfcd dkfbd dlfad dmf`c dnf~c dof}c dpf|c dqf{c drf.c dsf,c dtf_c duf^c dvf]c dwf[c dxf?c dyf=c dxf;c dwf-c dvf*c duf(c dtf%c dsf#c drf0c dqf8c dpf6c dof4c dnf2c dmfZc dlfXc dkfVc djfTc difRc dhfPc dgfNc dffLc defJc ddfHc dcfFc dbfDc dafBc d`ezc d~exc d}evc d|etc d{erc d.epc d,efc dgcfc bgc","2 ? @ [ ` @qjbb @1edb @2efb @3ehb @4ejb @5elb @6enb @7epb @8erb @9etb @0evb @!exb @#ezb @$eBb @%eDb @&eFb @(eHb @)eJb @*eLb @+eNb @-ePb @:eRb @;eTb @/eVb @=eXb @>eZb @?e2b @@e4b @[e6b @]e8b @^e @ @_e!b @^e#b @]e$b @[e%b @@e&b @?e(b @>e)b @=e*b @/e+b @;e-b @:e:b @-e;b @+e/b @*e=b @)e>b @(e?b @&e@b @%e[b @$e]b @#e^b @!e_b @0e,b @9e.b @8e{b @7e|b @6e}b @5e~b @4e`b @3eac @2ebc @1ecc @qjdc @ [dc ] [cc ]Zebc ]1eac ]2e`b ]3e~b ]4e}b ]5e|b ]6e{b ]7e.b ]8e,b ]9e_b ]0e^b ]!e]b ]#e[b ]$e@b ]%e?b ]&e>b ](e=b ])e/b ]*e;b ]+e:b ]-e-b ]:e+b ];e*b ]/e)b ]=e(b ]>e&b ]?e%b ]@e$b ][e#b ]]e!b ]^e @ ]_e8b ]^e6b ]]e4b ][e2b ]@eZb ]?eXb ]>eVb ]=eTb ]/eRb ];ePb ]:eNb ]-eLb ]+eJb ]*eHb ])eFb ](eDb ]&eBb ]%ezb ]$exb ]#evb ]!etb ]0erb ]9epb ]8enb ]7elb ]6ejb ]5ehb ]4efb ]3edb ]2ebb ]1e ` ]Ze ? ] [ ? @ [","2 a bCi m bDi o bEi q bFi s bGi u bHi w bIi y btj A bKi C bLi E bMi G bNi I bOi K bPi M bQi O bRi Q bSi S bTi U bUi W bVi Y bWi 1 bXi 3 bYi 5 bsj 7 b1i 9 b2i ! b3i $ brj & b5i ) b6i + b7i : b8i / b = / d = : d8i + d7i ) d6i & d5i $ d4i ! d3i 9 d2i 7 d1i 5 dZi 3 dYi 1 dXi Y dWi W dVi U dUi S dTi Q dSi O dRi M dQi K dPi I dOi G dNi E dMi C dLi A dKi y dJi w dIi u dHi s dGi q dFi o dEi m dDi a dCi a bCi","2Bi dCi a dCi a bCiBi bCiBi dCi","2Bi bCiBi dCiSj dTjUj dVjWj dXjYj dZj9i dDi0i dEi!i dFi#i dGi$i dHi%i dIi&i dJi(i dKi)i dLi*i dMi+i dNi-i dOi:i dPi;i dQi/i dRi=i dSi>i dTi?i dUi@i dVi[i dWi]i dXi^i dYi_i dZi,i d1i.i d2i{i d3i|i d4i}i d5i~i d6i`i d7iaj d8ibj d =aj d ;`i d -~i d *}i d (|i d %{i d #.i d 0,i d 8_i d 6^i d 4]i d 2[i d Z@i d X?i d V>i d T=i d R/i d P;i d N:i d L-i d J+i d H*i d F)i d D(i d B&i d z%i d x$i d v#i d t!i d r0i d p9i d nBi d cBi b c9i b n0i b p!i b r#i b t$i b v%i b x&i b z(i b >)i b D*i b F+i b H-i b J:i b L;i b N/i b P=i b R>i b T?i b V@i b X[i b Z]i b 2^i b 4_i b 6,i b 8.i b 0{i b #|i b %}i b (~i b *`i b -aj b ;bj b =aj b8i`i b7i~i b6i}i b5i|i brj{i b3i.i b2i,i b1i_i bsj^i bYi]i bXi[i bWi@i bVi?i bUi>i bTi=i bSi/i bRi;i bQi:i bPi-i bOi+i bNi*i bMi)i bLi(i bKi&i btj%i bIi$i bHi#i bGi!i bFi0i bEi9i bDiBi bCi","2 a d cBi d cBi b c a b c a d c","2Te dWeXe dWeXe bWeTe bWeTe dWe","2Ue dVeTe dWeTe bWeUe bVeUe dVe","2TefeeeUe dVeUe bVeTedeeeTefeee","2XefeeeTefeeeTedeeeXedeeeXefeee","2Ye dVeXefeeeXe1jeeXe2jeeXe3jeeXe4jeeXe5jeeXe6jeeXe7jeeXe8jeeXedeeeYe bVeYe dVe","2Xe dWeYe dVeYe bVeXe bWeXe dWe","2ej dVedj dWedj bWeej bVeej dVe","2djfeeeej dVeej bVedjdeeedjfeee","2cjfeeedjfeeedjdeeecjdeeecjfeee","2fj dVecjfeeecjdeeefj bVefj dVe","2cj dWefj dVefj bVecj bWecj dWe","2dj dWecj dWecj bWedj bWedj dWe"],"faceColors":[],"facesToFacets":["1abcdefghijklmn","1opqrstuvwxyzABCDEFGHIJKLMN","1OPQRSTUVWXYZ1234567890!#$%","2 & ( ) * + - : ; / = > ? @ [ ] ^ _ , . { | } ~ `abbb","2cbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBb","2CbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb1b2b","23b4b5b6b7b8b9b0b!b#b$b%b&b(b)b*b+b-b:b;b/b=b>b?b@b[b]b^b_b,b.b{b|b}b~b`bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc1c2c3c4c5c6c7c8c9c0c!c#c$c%c&c(c)c*c+c-c:c;c/c=c>c?c@c[c]c^c_c,c.c{c|c}c~c`cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd1d2d3d4d5d6d7d8d9d0d!d#d$d%d&d(d)d*d+d-d:d;d/d=d>d?d@d[d]d^d_d,d.d{d|d}d~d`daebece","2deeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe1e2e3e4e5e6e7e8e9e0e!e#e$e%e&e(e)e*e+e-e:e;e/e=e>e?e@e[e]e^e_e,e.e{e|e}e~e`eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf1f2f3f4f5f6f7f8f9f0f!f#f$f%f&f(f)f*f+f-f:f;f/f=f>f?f@f[f]f^f_f,f.f{f|f}f~f`fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPg","2QgRgSgTgUgVgWgXgYgZg","21g2g","23g4g5g6g7g8g9g0g!g#g","2$g%g","2&g(g)g*g+g-g:g;g/g=g>g?g@g[g","2]g^g","2_g,g.g{g|g}g~g`gahbhchdhehfh","2ghhh","2ihjhkhlhmhnhohphqhrh","2shth","2uhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShTh","2UhVhWhXhYhZh1h2h3h4h5h6h7h8h9h0h!h#h$h%h&h(h)h*h+h-h","2:h;h/h=h>h?h@h[h]h^h_h,h.h{h|h}h~h`haibicidieifigihi","2iijikiliminioipiqirisitiuiviwixiyiziAiBiCiDiEiFiGiHi","2IiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi1i2i3i4i5i6i7i8i","29i0i!i#i$i%i&i(i)i*i+i-i:i;i","2/i=i","2>i?i@i[i]i^i_i,i.i{i|i}i~i`iajbjcjdjejfjgjhjijjjkjlj","2mjnj","2ojpj","2qjrj","2sjtj","2ujvj","2wjxj","2yjzj","2AjBj","2CjDj","2EjFj","2GjHj","2IjJj","2KjLj"],"floats":"Q~%q#/Jvk^UvHg/kc0[r>U1A[F^G33!k`~%qc{f..8c|?:V;-m/e*iV4KYVLCMXOR>zbvB`EO:91p`JTKa?AGIt,n[Ji]##!b|B&&-*T^pjk:4*qj2c_K>HAsbP]`h/e[Ag7vI7KP|KO#sBbxj9v6GzwNN{V@n1&I{nx|S6ix%s!,&|t7IS#RXrlAw}qL?{?L`8NPEPBbZ+e(S/S6XRD@E)Hy(BbF|cYB:u?UP|WyyiONymwN{Gm6`007+|tJd=z97hjjter8B>Sf38QkJTOs3#e{a.?qu_5YQ8urcCbK9VwVQBE?aRXV_gOS!>18Eknqtn8HLOU0?w:@w6j7%hr!ai7Rj)_~thV$}Te_$a_8H#Q!n4;kACbBwMDX]7zH$}XGQOH5W/KO{Qkxul7xc.:8m53qF~ix2!!QBOUk>ALb0Uvey#2,;HbA_Jv]~N!,aRj,j[qq_8ANFDX}Ma-0902^>AbyF}yB|AZVofmS+3E:21AE]_,sU#:T1xVmSCc)u((ykw)[l.jp(@q?eJ&,B:!ntP6fk#O2-AbNEcCVBu8y*qk7t3DPaC&u$/4(VfKt9fV%>ycKJOZ^&[>TRKmO:Hq*UI&hs_+u_#=d2^H}Bxbbf{Yq|iX7O,k,EhD6L|tXv_+KUA[4>MOM{rc*[))]=IJV/mlM7?pd&yH,-Z=4UT#xYvBH&tb&=JW1po::bQjpTZC;7f2CYH!w>},+#NBIOoc8dV4[o%x{{mm3XEpA[`:l{T0E_|E@C(u-+mb({dD7CD_x~#l(`gC3kf2SWF%H{+4`.1u_Hoc}d-*xPcwIHMK2qZkM+)u[L3b5~xHi-3G{wjL?o%xee3=9lLi8e=HM+3c~#0AY&`]$A.(n>IJWneH5Zfk+fZOuvld>+/8RK%MYPO{A([>y?)I{-;jF=lVzW5d(=muOzMXn5..6kw)iIK)P[~lm-yVUB6d9aeu!&w{tGWjfZl7Um=NS`N!`?ml9Vxs!eLW;De%y{Y;!LQeDu>T=q?LRVc(yMKbxMd%DHYS7Hw%T}X&CN5v^yEjbX56Tm=N@kw)uk2lnTxsB*D-HktU~%R;I/Mey@:RZ[E{5&~2*oKbw?`{M+2-Ji)$@5B2m]Yy,*=lexj6wC2AU([>,g}ibeus;5{?k0~31X}&$[FeLc[/FcyGgxsVWnKb.yG@HYAUUIw$,=ruS)y_@@#lm615t^g2S>IJDI_mRSqs=rNw@c2)Mnz9pECe%ke.nQQ,M7YO(4Jbig&3R[tU~8%#uzfO3o`E(i]jTlh5T+!8Sp%xs./i>XjsQ=}Zd~kU=yvVe[ye0`OylbIXLsjIVEJbH^X@WZ+@Hm%!tt;AgWn*bz}lYg24a7C&X5UvXCRm`]fsxFzQ*upxM]s!7B}twCs)TV@H4-Ib)LR+t-$m},~rZNOZ).rZIW00r3C&0dG4{7/uZxIb9L7N&u4k_D{r$y((}u)Dkzo8=~sHk{LG@yF])pHb8ymwBlHkeu-r&G_>nv^GU|l8(~sHLOdFQi=;/^Gblk7wEhPm{-(r^m{x4p.+Q=67H*OUz=mT$+tnHU35=7NH/+C6kdLx0@(;+~Tez;W4bzpTlK~lJ/67{6gO!QXQ0p.+/x*;WaUe)P,vu$Z/[qcn:$l8;rtuYd2vtv^G[;r]qOXeQU~ye1eWE/4lR]n8];!UB5uDev)DK44uPY#ele*(z56!eDYmh`90}9;[n=>1=.rZNkIBZp(eyC16-Z^F+s}jxus!~es;e1nD>upx`UPOSr/eK_t%bY4$@+oj6Wt#BqRHh]$).^7@bm72Uo^eU?e5nvVSrtbm;*&#q;?A9fs8B5qR34M9Z).eZYzPMge%xxIi~F&$_2}8uK{4=V,Y;tg(KA~eL}1E[uoy8|%m9V)$8Owucxb+[rcD-8V;T$bf_sY,ALqUm}TjyMw%^2{t+.1v>^Dlc0[rLUyH)eq?JOEB#epc)m_Eez6k&6pCe,*Pam-D4gQvl!cuQCs)Mw9u/*oc.5R+FP^{Q?I]9/1gZ_E-nmd6m&~inbm{$dHu$57NmpV7NG5;wvXg0C_V7IP)[u,m994.YZ3Hx|iwT:D4:W`&-$Tg>rD+aqVv)+=i>#2.0;#&.C7w.uR_(~Y9vCQgO-NX+]4XjpSm&6pCCkCQmfG4WdSl1A$pTP9#|{2*y|;;nTOf]]JvtRR*UH,VDbeuSx0)dFK*A,}2%PJcf2n!sccJEZTlS@mFKoWUH]F0F%$NPle(pjNcnRT^$yxAm/+iA|mGV/euwUsGQK;!LJ*;&9Qcr$e.xK?@TSIjs`7GZ:_N1y5S|Mb7t~E]GoUc+}l0:}kJY89mt29GZu7[LTuYsK6v8XTuAk9cK3Lv-T1Pl~Uim257>W!U:9J8.FZ+Se>;vKXe[CuM6z?G~BPlm{n85!{8q;/4R@]K.`8uF2#eBnZDWz#,.(jnOs00BP>AE5>=>BjX)cEB5l(eG.D-=0W.x~?meV#0N%>AL7wAmX>Eny/HvZ+eb9K=n5IzM0.ji7r!5/uuPj(_SkRmOjtCwN[/+K0N/$QwCWyHJ}w7$)kIe2pcw|qYu.Jk5(wCh#pK}.$>HhRx:97Azo^Yj0nVf@pc*B8DF$tmeFAC@Ni8=VSDpW`x)s)8DZKLO#;2WmqcC5!1K4FmT?DCDIrLd!g|u=SyE;cu|_F7=.B9GKqcXpOAIk>jfyHCf*g7w)qSP3Ty/S}tBDKZETE.K{Vl.]nVa:Hbnk%%+[q-F;H>5irnMeIrB}1Urm17WU*,|}}72,rVyXkd,11Ax&-XO:P4up7liLKO&txbLJ2FKowE]R%-LQ5mWx>p&W,NBYxPIaC0xu[(fhyBkC4cOUZAGy>Lb&}.~mZkEI|H[h4c5$~tspn!Pw>LxX:.]IX?,X[jHXdIoekdk8O&(~#Lp)-XT`4!t-]{fRJk+%,2026end;[8hu%mJKZ)P=5-f?&yRtfR1N?#Tp4H.ij^GTZtK4&^^e)u*~)E]LBv9|dCa&%.$~-{WLj]Y;)7_y22I%,&`c#q,);{WAf25?TvYS0iocj`#U1jEmOR(F.HS.#im4O+$den1{wrHn:mr2jvT/*a9:A(gx,pD#P8O?upUHfCQZ.go?!22#lF4g4IU)U~Iv0gN0,#042$&yeJ@}@3:gwOoYlJeF+NQ;AEp)E1Go1v4TOHfLf-FA*7kF7&G^l?/15.0I2DlI?!]_3!K|2a_Fe5xS1Zj^>aCYjWh>+a6B2fQwXHLBCrUv9_ROflaZDth}Mfdhj@H56annO*kdWw_bJ^sA98CpcH%kQi1aEpZRw4vVHB`OL?AYkV!G+eiI&;D0-G6Lm0zACVU.>Mxs58@#2GcLfx660,DI@PO!26Kqc8u/vQxs{wYazHLI2gwXxCfol$B=*nHm2,TINWhTi5IOCi&:*aJ:vjJn]t{Df{#pK1Ve$T;iIdBscl{X@*8h1ffhC*)`8(;X@RLCiixC)Aj5[By-F]PVi9Z0C|/A*PiP6m]-H$BtfpBcCe-#1HWy]>>scUGXxf)T_Rt2DH@}8bj/vO=,j2}($ocdu5NM7v0kjv4)CckhE>2G?j_$OYA^e^a0#ciAyE-&2%ItctjPL/8h+ZTjE}}$UO2kQR`4jCe:C;|Jv@uzD~Iu#0ptHi/{!1B~2_[Jb@#[7v0kj,jusORT3U1NS!wy%=|g2F6/?F&Tu)+LblFE7]PViy(Ssq>D:`%@w@@;)H`!8v!oCc$ROu3Mbj=uzWhTiiA4sAhZEkh[(,^>*,e#8H-aR`l+2|mNb[TdQG6Lmn.7su~X.ks9yID>+1ph2(@->NQB9!KNb2`cWfdhjEA!s5KXDBLBCWh>+-nh2%i^>!K|2snNbZaI?&G^l-?7s(;y*UGo1JeF+@W2A--gw#042?@Mb7yv022#l2C4s.}X.jD#PvT/*qT2AKGn:im4O-2Mb?6F.iocjHFWsEv>T0`c#]Y;)fih2s$~-E]LBffMbX:e)H.ij!zPs9uM?(P=5U(T;J-rexPLv`aEzIzQm2OZ3,QeOEB-ISo#{;@mB4qve1,4GoZn>@:EkvNg4Jdru{hSR7qf@Fi)HK%yeM_FT@{KYBoYl?o24HZruh_qFh.$S.O3O6ICe,EOY-m,6ypOk@M35BV,8GRyzlG6P/;=2nOJeSrkG+_BG5m,k-L5610HHDw`E0/})X}i]9(Vd|`J=frIX9KcnH?,VN(w2gf9vNMq=WLnB+I%dn_f6-K8M{Q9m_v{W{*nu&_cYOgt8ilfIbH:d6Eo!Dj8v~0jkUsQXYyl;h6VwUlW>?s&OH^=d}RI/HTm-T*Uj3P}X!N([>tMD@~@W2>nVT~=dXWKv`Lf%W.|lUH,V68cuhcn5*H7M#YTxS-cuy>KL(ljn`#U1vz8U8i:y9+^)9@#2N1sc`?uzaRNj_a5E-v-[ITp)!S%XhGqBNuybj|}Sq|4lb.Sqr,;-+D(3[#DQx!,:e,`Er>=uc2wb/+b!]uCk|*;ooTZALVr.}WPApnZuT9mbA)N@QA,_Jzolw9Fqq5~t#/Jv!Q/1}i8ies/oglf2S1pTt|~7&vMOAqSd,*}ZYNVvX8,ijCZ3t0HHd]U:JnT/T(Y;K-reI_S^6.ILgR:j#K[rZu}tIo`Ev,*,{5;2_>AbGhV4J9L+/kiVL{TeJ)^v>QX=h}N]wbCbEtpZ~#SCwd{WYv|87gpZD3YmYdt!4ng2)C9Dv8|j[JuVdKCc.S;+;fm&SWgyUgIOV,kdwLa;`mP5mruyb2}jvLIB5Noc)VQ18-CCfAF7?Y#u{#mbU[OyGc[@dr?l{%GqW^,:scm&[oM!@p77}T-[%^s)t14j.Cj6DBY[jlbSTlPk)M{ru1j8PzZ-cLNB]uCep?I=%7F_i=gIGEJbo5uWVxljnQqsZLJWm[(yh>($*XY[>1=K;@@ih>($oB=[x!@Z&t}IFJ92z1?eB:Qy7$9LCMJmMmr0^D:[Zu$4i;{MOO:;p+ocK^)w*y$TCO6;k:Tg.XZ5!ONZG7|ixjk.+!UH|x-4&dD5}?_Hblae(}~y`B~PU*|lQ!G+v5B2m:i$vp7*63K])4#ez^f./eBF{?*Tma~j@OBBiE4cC1JH$x#zb8uU${ROJCCeLgF:JCa4Ai,kq9|X,GB2o^%=dc21}VlVc;VdK^r$ZH%>yrDkYo46WK6[dJXQ#A/ZONs(cZQcE&o!1uCw:8jjCfr0Va0A2l/#UPu^8i)HT1+etG80lRt=;InVs3Hf_,*P!y8C2zRwEv)Uj>F_,/[kf-wC#W0K@#%+|OzBc1scf>F_-l]kF*s!=#$UQh}5RHdwum2DD;cueso5?g^jK8)CW317h-!Q=z@u%:FeLiM>>dN^_Fkj9Bk6[n+[2L(@>32k^t4spn0KVnEKQ!G+r^g2>`;Ly,.2F!KbTMkxxmcn=$SsmHzQaHIXNDQ]!Q|d|=I/ep8SNi,kf-wCqIrL6%%+"}]};
function baseDecode( input ) {
var baseCt = base.length;
var output = [];
var len = parseInt( input[0] ); // num chars of each element
for ( var i=1; i<input.length; i+=len ) {
var str = input.substring(i, i+len).trim();
var val = 0;
for ( var s=0; s<str.length; s++ ) {
var ind = base.indexOf(str[s]);
val += ind * Math.pow(baseCt, s);
}
output.push(val);
}
return output;
}
function floatDecode( input ) {
var baseCt = base.length;
var baseFloatCt = baseFloat.length;
var numString = '';
for ( var i=0; i<input.length; i+=4 ) {
var b90chunk = input.substring(i, i+4).trim();
var quotient = 0;
for ( var s=0; s<b90chunk.length; s++ ) {
var ind = base.indexOf(b90chunk[s]);
quotient += ind * Math.pow(baseCt, s);
}
var buffer = '';
for ( var s=0; s<7; s++ ) {
buffer = baseFloat[ quotient % baseFloatCt ] + buffer;
quotient = parseInt(quotient / baseFloatCt);
}
numString += buffer;
}
var trailingCommas = 0;
for ( var s=1; s<7; s++ ) {
if( numString[ numString.length-s ] == baseFloat[0] ) { trailingCommas++; }
}
numString = numString.substring(0, numString.length - trailingCommas);
return numString;
}
// Decode from base90 and distribute the floats
for ( var obj=0; obj<data.objects.length; obj++ ) {
if (!disableCompression) {
data.objects[obj].floats = JSON.parse('[' + floatDecode( data.objects[obj].floats ) + ']');
data.objects[obj].verts = baseDecode( data.objects[obj].verts );
for ( var v=0; v<data.objects[obj].verts.length; v++ ) {
data.objects[obj].verts[v] = data.objects[obj].floats[ data.objects[obj].verts[v] ];
}
data.objects[obj].facets = baseDecode( data.objects[obj].facets );
for ( var w=0; w<data.objects[obj].wires.length; w++ ) {
data.objects[obj].wires[w] = baseDecode( data.objects[obj].wires[w] );
for ( var wv=0; wv<data.objects[obj].wires[w].length; wv++ ) {
data.objects[obj].wires[w][wv] = data.objects[obj].floats[ data.objects[obj].wires[w][wv] ];
}
}
for ( var f=0; f<data.objects[obj].facesToFacets.length; f++ ) {
data.objects[obj].facesToFacets[f] = baseDecode( data.objects[obj].facesToFacets[f] );
}
}
data.objects[obj].floats = false;
}
// Get bounds for global clipping
for ( var obj=0; obj<data.objects.length; obj++ ) {
if (obj == 0) {
var globalMaxMin = [{min:data.objects[obj].verts[0],max:data.objects[obj].verts[0]},
{min:data.objects[obj].verts[1],max:data.objects[obj].verts[1]},
{min:data.objects[obj].verts[2],max:data.objects[obj].verts[2]}]
}
for ( var v=0; v<data.objects[obj].verts.length; v++ ) {
if ( data.objects[obj].verts[v] < globalMaxMin[v % 3].min ) { globalMaxMin[v % 3].min = data.objects[obj].verts[v]; }
if ( data.objects[obj].verts[v] > globalMaxMin[v % 3].max ) { globalMaxMin[v % 3].max = data.objects[obj].verts[v]; }
}
}
var bigrange = 0;
for ( var i=0; i<globalMaxMin.length; i++ ) { // add a little extra
var range = globalMaxMin[i].max - globalMaxMin[i].min;
if ( range > bigrange ) { bigrange = range; }
globalMaxMin[i].min -= range * 0.01;
globalMaxMin[i].max += range * 0.01;
}
var camCenter = new THREE.Vector3(
0.5 * (globalMaxMin[0].max - globalMaxMin[0].min) + globalMaxMin[0].min,
0.5 * (globalMaxMin[1].max - globalMaxMin[1].min) + globalMaxMin[1].min,
0.5 * (globalMaxMin[2].max - globalMaxMin[2].min) + globalMaxMin[2].min );
var viewSize = 1.5 * bigrange; // make the view area a little bigger than the object
var aspectRatio = window.innerWidth / window.innerHeight;
var originalAspect = aspectRatio
function initCam(camera) {
camera.position.set(
data.camera.position_x,
data.camera.position_y,
data.camera.position_z);
camera.lookAt( camCenter );
camera.updateMatrixWorld();
}
var cameraType = data.camera.type;
var persCamera = new THREE.PerspectiveCamera( data.camera.focalDistance, window.innerWidth / window.innerHeight, 1, 10000 );
initCam(persCamera);
var orthCamera = new THREE.OrthographicCamera(-aspectRatio * viewSize / 2, aspectRatio * viewSize / 2, viewSize / 2, -viewSize / 2, -10000, 10000);
initCam(orthCamera);
function assignMesh( positions, color, opacity ) {
var geometry = new THREE.BufferGeometry();
geometry.setAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
// EdgeSplitModifier is used to combine verts so that smoothing normals can be generated WITHOUT removing the hard edges of the design
// REF: https://threejs.org/examples/?q=edge#webgl_modifier_edgesplit - https://github.com/mrdoob/three.js/pull/20535
var edgeSplit = new EdgeSplitModifier();
var cutOffAngle = 20;
geometry = edgeSplit.modify( geometry, cutOffAngle * Math.PI / 180 );
geometry.computeVertexNormals();
geometry.computeBoundingSphere();
var transparent = false;
if (opacity != 1.0) { transparent = true; }
var material = new THREE.MeshLambertMaterial({
color: color,
side: THREE.DoubleSide,
vertexColors: false,
flatShading: false,
opacity: opacity,
transparent: transparent,
fog: false
});
var meshobj = new THREE.Mesh( geometry, material );
meshobj.name = meshobj.uuid;
faces.push( meshobj.uuid );
scene.add( meshobj );
raycasterObj.push(meshobj);
}
var objects = [];
var positions;
for ( var obj=0; obj<data.objects.length; obj++ ) { // Loop Objects
var faces = []; // Each face gets its own material because they each can have different colors
if (data.objects[obj].facesToFacets.length > 0) {
for ( var f=0; f<data.objects[obj].facesToFacets.length; f++ ) {
var facecolor = data.objects[obj].color;
if (data.objects[obj].faceColors.length > 0) {
facecolor = data.objects[obj].faceColors[f];
}
positions = new Float32Array( data.objects[obj].facesToFacets[f].length * 9 );
for ( var a=0; a<data.objects[obj].facesToFacets[f].length; a++ ) {
for ( var b=0; b<3; b++ ) {
for ( var c=0; c<3; c++ ) {
positions[ 9*a + 3*b + c ] = data.objects[obj].verts[ 3*data.objects[obj].facets[ 3*data.objects[obj].facesToFacets[f][a] + b ] + c ];
}
}
}
assignMesh( positions, facecolor, data.objects[obj].opacity );
}
} else { // No facesToFacets means that there was a tessellate() mismatch inside the CAD. Use all facets in object create this mesh
positions = new Float32Array( data.objects[obj].facets.length * 3 );
for ( var a=0; a<data.objects[obj].facets.length; a++ ) {
for ( var b=0; b<3; b++ ) {
positions[ 3*a + b ] = data.objects[obj].verts[ 3*data.objects[obj].facets[a] + b ];
}
}
assignMesh( positions, data.objects[obj].color, data.objects[obj].opacity );
}
// Wires
// cannot have lines in WebGL that are wider than 1px due to browser limitations so Line2 workaround lib is used
// REF: https://threejs.org/examples/?q=fat#webgl_lines_fat - https://jsfiddle.net/brLk6aud/1/
var wirematerial = new LineMaterial( {
color: new THREE.Color('rgb(0,0,0)'),
linewidth: 2, // in pixels
dashed: false, dashSize: 1, gapSize: 1, dashScale: 3
} );
wirematerial.resolution.set( window.innerWidth, window.innerHeight );
var wires = [];
for ( var w=0; w<data.objects[obj].wires.length; w++ ) {
var wiregeometry = new LineGeometry();
wiregeometry.setPositions( data.objects[obj].wires[w] );
var wire = new Line2( wiregeometry, wirematerial );
wire.computeLineDistances();
wire.scale.set( 1, 1, 1 );
wire.name = wire.uuid;
scene.add( wire );
wires.push( wire.name );
}
objects.push( { name: data.objects[obj].name, faces: faces, wires: wires } );
}
// ---- GUI Init ----
const gui = new GUI( { width: 300 } );
var guiparams = {
wiretype: 'Normal',
wirewidth: wirematerial.linewidth,
wirecolor: '#'+wirematerial.color.getHexString(),
clippingx: 100,
clippingy: 100,
clippingz: 100,
cameraType: cameraType,
navright: function() { navChange( [1,0,0] ); },
navtop: function() { navChange( [0,1,0] ); },
navfront: function() { navChange( [0,0,1] ); }
};
// ---- Wires ----
if (!wirematerial.visible) { guiparams.wiretype = 'None'; }
if (wirematerial.dashed) { guiparams.wiretype = 'Dashed'; }
const wiretypes = { Normal: 'Normal', Dashed: 'Dashed', None: 'None' };
var wireFolder = gui.addFolder( 'Wire' );
wireFolder.add( guiparams, 'wiretype', wiretypes ).name('Wire Display').onChange( wireChange );
wireFolder.add( guiparams, 'wirewidth').min(1).max(5).step(1).name('Wire Width').onChange( wireChange );
wireFolder.addColor( guiparams, 'wirecolor' ).name('Wire Color').onChange( wireChange );
wireFolder.close();
function wireChange() {
for ( var obj=0; obj<objects.length; obj++ ) {
if ( objects[obj].wires.length == 0 ) { continue; }
var m = scene.getObjectByName( objects[obj].wires[0] ).material; // all wires in obj share mat
if (m.dashed) {
if (guiparams.wiretype != 'Dashed') {
m.dashed = false;
delete m.defines.USE_DASH;
}
} else {
if (guiparams.wiretype == 'Dashed') {
m.dashed = true;
// Dashed lines require this as of r122. delete if not dashed
m.defines.USE_DASH = ""; // https://discourse.threejs.org/t/dashed-line2-material/10825
}
}
if (guiparams.wiretype == 'None') {
m.visible = false;
} else {
m.visible = true;
}
m.linewidth = guiparams.wirewidth;
m.color = new THREE.Color(guiparams.wirecolor);
m.needsUpdate = true;
}
}
wireChange();
// ---- Clipping ----
var clippingFolder = gui.addFolder( 'Clipping' );
clippingFolder.add( guiparams, 'clippingx').min(0).max(100).step(1).name('X-Axis Clipping').onChange( clippingChange );
clippingFolder.add( guiparams, 'clippingy').min(0).max(100).step(1).name('Y-Axis Clipping').onChange( clippingChange );
clippingFolder.add( guiparams, 'clippingz').min(0).max(100).step(1).name('Z-Axis Clipping').onChange( clippingChange );
clippingFolder.close();
var clipPlaneX = new THREE.Plane( new THREE.Vector3( -1, 0, 0 ), 0 );
var clipPlaneY = new THREE.Plane( new THREE.Vector3( 0, -1, 0 ), 0 );
var clipPlaneZ = new THREE.Plane( new THREE.Vector3( 0, 0, -1 ), 0 );
function clippingChange() {
if( guiparams.clippingx < 100 || guiparams.clippingy < 100 || guiparams.clippingz < 100 ) {
if (renderer.clippingPlanes.length == 0) {
renderer.clippingPlanes.push( clipPlaneX, clipPlaneY, clipPlaneZ );
}
}
clipPlaneX.constant = (globalMaxMin[0].max - globalMaxMin[0].min) * guiparams.clippingx / 100.0 + globalMaxMin[0].min;
clipPlaneY.constant = (globalMaxMin[1].max - globalMaxMin[1].min) * guiparams.clippingy / 100.0 + globalMaxMin[1].min;
clipPlaneZ.constant = (globalMaxMin[2].max - globalMaxMin[2].min) * guiparams.clippingz / 100.0 + globalMaxMin[2].min;
}
// ---- Camera & Navigation ----
var camFolder = gui.addFolder( 'Camera' );
const cameraTypes = { Perspective: 'Perspective', Orthographic: 'Orthographic' };
camFolder.add( guiparams, 'cameraType', cameraTypes ).name('Wire Display').onChange( cameraChange );
camFolder.add( guiparams, 'navright' ).name('View Right');
camFolder.add( guiparams, 'navtop' ).name('View Top');
camFolder.add( guiparams, 'navfront' ).name('View Front');
function navChange( v ) {
var t = new THREE.Vector3();
new THREE.Box3().setFromObject(scene).getSize( t );
persControls.object.position.set( v[0]*t.x + camCenter.x, v[1]*t.y + camCenter.y, v[2]*t.z + camCenter.z);
persControls.target = camCenter;
persControls.update();
orthControls.object.position.set( v[0]*t.x + camCenter.x, v[1]*t.y + camCenter.y, v[2]*t.z + camCenter.z);
orthControls.target = camCenter;
orthControls.update();
}
function cameraChange( v ) {
cameraType = v;
}
var guiObjData = [];
var guiObjects = gui.addFolder( 'Objects' );
for ( var obj=0; obj<data.objects.length; obj++ ) {
guiObjData.push( {index: obj, color: data.objects[obj].color, opacity:data.objects[obj].opacity } );
var guiObject = guiObjects.addFolder( objects[obj].name );
guiObject.addColor( guiObjData[ guiObjData.length-1 ], 'color' ).name('Color').onChange( GUIObjectChange );
guiObject.add( guiObjData[ guiObjData.length-1 ], 'opacity' ).min(0.0).max(1.0).step(0.05).name('Opacity').onChange( GUIObjectChange );
}
function GUIObjectChange( v ) {
for ( var f=0; f<objects[this.object.index].faces.length; f++ ) {
var m = scene.getObjectByName( objects[this.object.index].faces[f] ).material;
if (this.property == 'color') { m.color.setStyle( v ); }
if (this.property == 'opacity') {
m.opacity = v;
if ( v == 1.0 ) { m.transparent = false; } else { m.transparent = true; }
}
}
if (this.property == 'opacity' && objects[ this.object.index ].wires.length > 0) {
var w = scene.getObjectByName( objects[ this.object.index ].wires[0] ).material; // all wires in obj share mat
w.opacity = v;
if ( v == 1.0 ) { w.transparent = false; } else { w.transparent = true; }
}
}
// Make simple orientation arrows and box - REF: http://jsfiddle.net/b97zd1a3/16/
var arrowCanvasSize = { x: 150, y: 150 }; // in pixels on the lower left
var arrowRenderer = new THREE.WebGLRenderer( { alpha: true } ); // clear
arrowRenderer.setClearColor( 0x000000, 0 );
arrowRenderer.setSize( arrowCanvasSize.x, arrowCanvasSize.y );
var arrowCanvas = document.body.appendChild( arrowRenderer.domElement );
arrowCanvas.setAttribute('id', 'arrowCanvas');
arrowCanvas.style.width = arrowCanvasSize.x;
arrowCanvas.style.height = arrowCanvasSize.y;
var arrowScene = new THREE.Scene();
var arrowCamera = new THREE.PerspectiveCamera( 50, arrowCanvasSize.x / arrowCanvasSize.y, 1, 500 );
arrowCamera.up = persCamera.up; // important!
var arrowPos = new THREE.Vector3( 0,0,0 );
arrowScene.add( new THREE.ArrowHelper( new THREE.Vector3( 1,0,0 ), arrowPos, 60, 0x7F2020, 20, 10 ) );
arrowScene.add( new THREE.ArrowHelper( new THREE.Vector3( 0,1,0 ), arrowPos, 60, 0x207F20, 20, 10 ) );
arrowScene.add( new THREE.ArrowHelper( new THREE.Vector3( 0,0,1 ), arrowPos, 60, 0x20207F, 20, 10 ) );
arrowScene.add(new THREE.Mesh(
new THREE.BoxGeometry( 40, 40, 40 ),
new THREE.MeshLambertMaterial( { color: 0xaaaaaa, flatShading: false } )
));
arrowScene.add(new THREE.HemisphereLight(0xC7E8FF, 0xFFE3B3, 1.2));
// Controls
var persControls = new OrbitControls( persCamera, renderer.domElement );
persControls.target = camCenter; // rotate around center of parts
persControls.update();
var orthControls = new OrbitControls( orthCamera, renderer.domElement );
orthControls.target = camCenter; // rotate around center of parts
orthControls.update();
window.addEventListener( 'resize', onWindowResize, false );
onWindowResize();
var stats = new Stats();
document.body.appendChild( stats.dom );
renderer.domElement.addEventListener( 'mousemove', onMouseMove );
var animate = function () {
requestAnimationFrame( animate );
persControls.update();
if (cameraType == 'Perspective') {
arrowCamera.position.copy( persCamera.position );
arrowCamera.position.sub( persControls.target );
}
orthControls.update();
if (cameraType == 'Orthographic') {
arrowCamera.position.copy( orthCamera.position );
arrowCamera.position.sub( orthControls.target );
}
arrowCamera.lookAt( arrowScene.position );
arrowCamera.position.setLength( 200 );
stats.begin();
if (cameraType == 'Perspective') { renderer.render( scene, persCamera ); }
if (cameraType == 'Orthographic') { renderer.render( scene, orthCamera ); }
arrowRenderer.render( arrowScene, arrowCamera );
stats.end();
};
animate();
function onWindowResize() {
for ( var obj=0; obj<objects.length; obj++ ) {
if (objects[obj].wires.length > 0) {
var w = scene.getObjectByName( objects[obj].wires[0] ).material.resolution.set( window.innerWidth, window.innerHeight ); // all wires in obj share mat
}
}
// Ortho camera needs updating. REF: https://stackoverflow.com/questions/39373113/three-js-resize-window-not-scaling-properly
var aspect = window.innerWidth / window.innerHeight;
var change = originalAspect / aspect;
var newSize = viewSize * change;
orthCamera.left = -aspect * newSize / 2;
orthCamera.right = aspect * newSize / 2;
orthCamera.top = newSize / 2;
orthCamera.bottom = -newSize / 2;
orthCamera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function onMouseMove( e ) {
var c = false;
if (cameraType == 'Orthographic') { c = orthCamera;}
if (cameraType == 'Perspective') { c = persCamera;}
if (!c) { return; }
var raycaster = new THREE.Raycaster();
raycaster.setFromCamera( new THREE.Vector2(
( e.clientX / window.innerWidth ) * 2 - 1,
-( e.clientY / window.innerHeight ) * 2 + 1
), c );
var intersects = raycaster.intersectObjects( raycasterObj );
var chosen = '';
if ( intersects.length > 0 ) {
for ( var i=0; i<intersects.length; i++ ) {
var m = intersects[i].object.material;
if (m.opacity > 0) {
if (m.emissive.getHex() == 0x000000) {
m.emissive.setHex( 0x777777 );
m.needsUpdate = true;
}
chosen = intersects[i].object.name;
break;
}
}
}
for ( var r=0; r<raycasterObj.length; r++ ) {
if (raycasterObj[r].name == chosen) { continue; }
if (raycasterObj[r].material.emissive.getHex() != 0x000000) {
raycasterObj[r].material.emissive.setHex( 0x000000 );
raycasterObj[r].material.needsUpdate = true;
}
}
}
data = false; // free up some ram
</script>
</body>
</html>