diff --git a/hackpads/NumMarcroPad/3DP+Cut Fab/README.md b/hackpads/NumMarcroPad/3DP+Cut Fab/README.md deleted file mode 100644 index 40374fb32..000000000 --- a/hackpads/NumMarcroPad/3DP+Cut Fab/README.md +++ /dev/null @@ -1,4 +0,0 @@ -3dp Body.stl should be printed in black -3dp plate.stl should be printed in white -cut-bottom and cut-middle should be clear -cut-top should be frosted if possible diff --git a/hackpads/NumMarcroPad/3d Assembly b/hackpads/NumMarcroPad/3d Assembly deleted file mode 100644 index 8b1378917..000000000 --- a/hackpads/NumMarcroPad/3d Assembly +++ /dev/null @@ -1 +0,0 @@ - diff --git a/hackpads/NumMarcroPad/3dModels/3dp Body.stl b/hackpads/NumMarcroPad/3dModels/3dp Body.stl deleted file mode 100644 index 1e96bd613..000000000 Binary files a/hackpads/NumMarcroPad/3dModels/3dp Body.stl and /dev/null differ diff --git a/hackpads/NumMarcroPad/3dModels/3dp plate.stl b/hackpads/NumMarcroPad/3dModels/3dp plate.stl deleted file mode 100644 index 072cfcde2..000000000 Binary files a/hackpads/NumMarcroPad/3dModels/3dp plate.stl and /dev/null differ diff --git a/hackpads/NumMarcroPad/3dModels/Assembly 1.stl b/hackpads/NumMarcroPad/3dModels/Assembly 1.stl deleted file mode 100644 index c14d7e1e3..000000000 Binary files a/hackpads/NumMarcroPad/3dModels/Assembly 1.stl and /dev/null differ diff --git a/hackpads/NumMarcroPad/3dModels/Assembly STEP.step b/hackpads/NumMarcroPad/3dModels/Assembly STEP.step deleted file mode 100644 index e60ca2755..000000000 --- a/hackpads/NumMarcroPad/3dModels/Assembly STEP.step +++ /dev/null @@ -1,5722 +0,0 @@ -ISO-10303-21; -HEADER; -/* Generated by software containing ST-Developer - * from STEP Tools, Inc. (www.steptools.com) - */ -/* OPTION: using custom renumber hook */ - -FILE_DESCRIPTION( -/* description */ ('STEP AP242', -'CAx-IF Rec.Pracs.---Representation and Presentation of Product Manufa -cturing Information (PMI)---4.0---2014-10-13', -'CAx-IF Rec.Pracs.---3D Tessellated Geometry---0.4---2014-09-14','2;1'), - -/* implementation_level */ '2;1'); - -FILE_NAME( -/* name */ '67170a1752a9b256796cb20f', -/* time_stamp */ '2024-10-22T02:12:39Z', -/* author */ (''), -/* organization */ (''), -/* preprocessor_version */ 'ST-DEVELOPER v20', -/* originating_system */ ' ', -/* authorisation */ ' '); - -FILE_SCHEMA (('AP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LF { 1 0 10303 442 1 1 4 }')); -ENDSEC; - -DATA; -#10=CIRCLE('',#3497,0.00145); -#11=CIRCLE('',#3498,0.00145); -#12=CIRCLE('',#3499,0.00145); -#13=CIRCLE('',#3500,0.00145); -#14=CIRCLE('',#3501,0.01); -#15=CIRCLE('',#3502,0.01); -#16=CIRCLE('',#3503,0.01); -#17=CIRCLE('',#3504,0.01); -#18=CIRCLE('',#3505,0.0025); -#19=CIRCLE('',#3506,0.0025); -#20=CIRCLE('',#3507,0.0025); -#21=CIRCLE('',#3508,0.0025); -#22=CIRCLE('',#3510,0.00145); -#23=CIRCLE('',#3511,0.00145); -#24=CIRCLE('',#3512,0.00145); -#25=CIRCLE('',#3513,0.00145); -#26=CIRCLE('',#3514,0.01); -#27=CIRCLE('',#3515,0.01); -#28=CIRCLE('',#3516,0.01); -#29=CIRCLE('',#3517,0.01); -#30=CIRCLE('',#3518,0.0025); -#31=CIRCLE('',#3519,0.0025); -#32=CIRCLE('',#3520,0.0025); -#33=CIRCLE('',#3521,0.0025); -#34=CIRCLE('',#3550,0.002); -#35=CIRCLE('',#3551,0.002); -#36=CIRCLE('',#3552,0.002); -#37=CIRCLE('',#3553,0.002); -#38=CIRCLE('',#3557,0.002); -#39=CIRCLE('',#3558,0.002); -#40=CIRCLE('',#3559,0.002); -#41=CIRCLE('',#3560,0.002); -#42=CIRCLE('',#3565,0.00145); -#43=CIRCLE('',#3566,0.00145); -#44=CIRCLE('',#3567,0.00145); -#45=CIRCLE('',#3568,0.00145); -#46=CIRCLE('',#3569,0.01); -#47=CIRCLE('',#3570,0.01); -#48=CIRCLE('',#3571,0.01); -#49=CIRCLE('',#3572,0.01); -#50=CIRCLE('',#3573,0.00575); -#51=CIRCLE('',#3574,0.00575); -#52=CIRCLE('',#3575,0.00575); -#53=CIRCLE('',#3576,0.00575); -#54=CIRCLE('',#3599,0.00145); -#55=CIRCLE('',#3600,0.00145); -#56=CIRCLE('',#3601,0.00145); -#57=CIRCLE('',#3602,0.00145); -#58=CIRCLE('',#3603,0.01); -#59=CIRCLE('',#3604,0.01); -#60=CIRCLE('',#3605,0.01); -#61=CIRCLE('',#3606,0.01); -#62=CIRCLE('',#3608,0.00145); -#63=CIRCLE('',#3609,0.00145); -#64=CIRCLE('',#3610,0.00145); -#65=CIRCLE('',#3611,0.00145); -#66=CIRCLE('',#3612,0.01); -#67=CIRCLE('',#3613,0.01); -#68=CIRCLE('',#3614,0.01); -#69=CIRCLE('',#3615,0.01); -#70=CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#80,#5547); -#71=CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#81,#5549); -#72=CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#82,#5551); -#73=CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#83,#5553); -#74=CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#84,#5555); -#75=NEXT_ASSEMBLY_USAGE_OCCURRENCE('NAUO1','Part 232','Part 232',#5556, -#5557,''); -#76=NEXT_ASSEMBLY_USAGE_OCCURRENCE('NAUO2','Part 234','Part 234',#5556, -#5558,''); -#77=NEXT_ASSEMBLY_USAGE_OCCURRENCE('NAUO3','Part 236','Part 236',#5556, -#5559,''); -#78=NEXT_ASSEMBLY_USAGE_OCCURRENCE('NAUO4','Part 233','Part 233',#5556, -#5560,''); -#79=NEXT_ASSEMBLY_USAGE_OCCURRENCE('NAUO5','Part 235','Part 235',#5556, -#5561,''); -#80=( -REPRESENTATION_RELATIONSHIP(' ',' ',#3404,#3403) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#85) -SHAPE_REPRESENTATION_RELATIONSHIP() -); -#81=( -REPRESENTATION_RELATIONSHIP(' ',' ',#3405,#3403) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#86) -SHAPE_REPRESENTATION_RELATIONSHIP() -); -#82=( -REPRESENTATION_RELATIONSHIP(' ',' ',#3406,#3403) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#87) -SHAPE_REPRESENTATION_RELATIONSHIP() -); -#83=( -REPRESENTATION_RELATIONSHIP(' ',' ',#3407,#3403) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#88) -SHAPE_REPRESENTATION_RELATIONSHIP() -); -#84=( -REPRESENTATION_RELATIONSHIP(' ',' ',#3408,#3403) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#89) -SHAPE_REPRESENTATION_RELATIONSHIP() -); -#85=ITEM_DEFINED_TRANSFORMATION(' ',' ',#3409,#3440); -#86=ITEM_DEFINED_TRANSFORMATION(' ',' ',#3409,#3487); -#87=ITEM_DEFINED_TRANSFORMATION(' ',' ',#3409,#3534); -#88=ITEM_DEFINED_TRANSFORMATION(' ',' ',#3409,#3597); -#89=ITEM_DEFINED_TRANSFORMATION(' ',' ',#3409,#3692); -#90=SHAPE_REPRESENTATION_RELATIONSHIP('','',#3404,#95); -#91=SHAPE_REPRESENTATION_RELATIONSHIP('','',#3405,#96); -#92=SHAPE_REPRESENTATION_RELATIONSHIP('','',#3406,#97); -#93=SHAPE_REPRESENTATION_RELATIONSHIP('','',#3407,#98); -#94=SHAPE_REPRESENTATION_RELATIONSHIP('','',#3408,#99); -#95=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#3392),#5531); -#96=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#3393),#5532); -#97=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#3394),#5533); -#98=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#3395),#5534); -#99=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#3396),#5535); -#100=CYLINDRICAL_SURFACE('',#3432,0.01); -#101=CYLINDRICAL_SURFACE('',#3433,0.01); -#102=CYLINDRICAL_SURFACE('',#3434,0.01); -#103=CYLINDRICAL_SURFACE('',#3435,0.01); -#104=CYLINDRICAL_SURFACE('',#3436,0.00145); -#105=CYLINDRICAL_SURFACE('',#3437,0.00145); -#106=CYLINDRICAL_SURFACE('',#3438,0.00145); -#107=CYLINDRICAL_SURFACE('',#3439,0.00145); -#108=CYLINDRICAL_SURFACE('',#3475,0.01); -#109=CYLINDRICAL_SURFACE('',#3476,0.01); -#110=CYLINDRICAL_SURFACE('',#3477,0.01); -#111=CYLINDRICAL_SURFACE('',#3478,0.01); -#112=CYLINDRICAL_SURFACE('',#3479,0.00575); -#113=CYLINDRICAL_SURFACE('',#3480,0.00575); -#114=CYLINDRICAL_SURFACE('',#3481,0.00575); -#115=CYLINDRICAL_SURFACE('',#3482,0.00575); -#116=CYLINDRICAL_SURFACE('',#3483,0.00145); -#117=CYLINDRICAL_SURFACE('',#3484,0.00145); -#118=CYLINDRICAL_SURFACE('',#3485,0.00145); -#119=CYLINDRICAL_SURFACE('',#3486,0.00145); -#120=CYLINDRICAL_SURFACE('',#3522,0.01); -#121=CYLINDRICAL_SURFACE('',#3523,0.01); -#122=CYLINDRICAL_SURFACE('',#3524,0.01); -#123=CYLINDRICAL_SURFACE('',#3525,0.01); -#124=CYLINDRICAL_SURFACE('',#3526,0.0025); -#125=CYLINDRICAL_SURFACE('',#3527,0.0025); -#126=CYLINDRICAL_SURFACE('',#3528,0.0025); -#127=CYLINDRICAL_SURFACE('',#3529,0.0025); -#128=CYLINDRICAL_SURFACE('',#3530,0.00145); -#129=CYLINDRICAL_SURFACE('',#3531,0.00145); -#130=CYLINDRICAL_SURFACE('',#3532,0.00145); -#131=CYLINDRICAL_SURFACE('',#3533,0.00145); -#132=CYLINDRICAL_SURFACE('',#3577,0.01); -#133=CYLINDRICAL_SURFACE('',#3578,0.01); -#134=CYLINDRICAL_SURFACE('',#3579,0.01); -#135=CYLINDRICAL_SURFACE('',#3580,0.01); -#136=CYLINDRICAL_SURFACE('',#3581,0.00575); -#137=CYLINDRICAL_SURFACE('',#3582,0.00575); -#138=CYLINDRICAL_SURFACE('',#3583,0.00575); -#139=CYLINDRICAL_SURFACE('',#3584,0.00575); -#140=CYLINDRICAL_SURFACE('',#3585,0.00145); -#141=CYLINDRICAL_SURFACE('',#3586,0.00145); -#142=CYLINDRICAL_SURFACE('',#3587,0.00145); -#143=CYLINDRICAL_SURFACE('',#3588,0.00145); -#144=CYLINDRICAL_SURFACE('',#3590,0.002); -#145=CYLINDRICAL_SURFACE('',#3592,0.002); -#146=CYLINDRICAL_SURFACE('',#3594,0.002); -#147=CYLINDRICAL_SURFACE('',#3596,0.002); -#148=CYLINDRICAL_SURFACE('',#3620,0.01); -#149=CYLINDRICAL_SURFACE('',#3621,0.01); -#150=CYLINDRICAL_SURFACE('',#3622,0.01); -#151=CYLINDRICAL_SURFACE('',#3623,0.01); -#152=CYLINDRICAL_SURFACE('',#3624,0.00145); -#153=CYLINDRICAL_SURFACE('',#3625,0.00145); -#154=CYLINDRICAL_SURFACE('',#3626,0.00145); -#155=CYLINDRICAL_SURFACE('',#3627,0.00145); -#156=LINE('',#4607,#492); -#157=LINE('',#4612,#493); -#158=LINE('',#4616,#494); -#159=LINE('',#4620,#495); -#160=LINE('',#4624,#496); -#161=LINE('',#4627,#497); -#162=LINE('',#4628,#498); -#163=LINE('',#4630,#499); -#164=LINE('',#4633,#500); -#165=LINE('',#4634,#501); -#166=LINE('',#4636,#502); -#167=LINE('',#4638,#503); -#168=LINE('',#4640,#504); -#169=LINE('',#4642,#505); -#170=LINE('',#4645,#506); -#171=LINE('',#4646,#507); -#172=LINE('',#4678,#508); -#173=LINE('',#4683,#509); -#174=LINE('',#4687,#510); -#175=LINE('',#4691,#511); -#176=LINE('',#4694,#512); -#177=LINE('',#4699,#513); -#178=LINE('',#4703,#514); -#179=LINE('',#4707,#515); -#180=LINE('',#4719,#516); -#181=LINE('',#4724,#517); -#182=LINE('',#4728,#518); -#183=LINE('',#4732,#519); -#184=LINE('',#4735,#520); -#185=LINE('',#4740,#521); -#186=LINE('',#4744,#522); -#187=LINE('',#4748,#523); -#188=LINE('',#4752,#524); -#189=LINE('',#4753,#525); -#190=LINE('',#4755,#526); -#191=LINE('',#4756,#527); -#192=LINE('',#4758,#528); -#193=LINE('',#4759,#529); -#194=LINE('',#4761,#530); -#195=LINE('',#4762,#531); -#196=LINE('',#4764,#532); -#197=LINE('',#4765,#533); -#198=LINE('',#4767,#534); -#199=LINE('',#4768,#535); -#200=LINE('',#4770,#536); -#201=LINE('',#4771,#537); -#202=LINE('',#4773,#538); -#203=LINE('',#4774,#539); -#204=LINE('',#4789,#540); -#205=LINE('',#4792,#541); -#206=LINE('',#4794,#542); -#207=LINE('',#4796,#543); -#208=LINE('',#4798,#544); -#209=LINE('',#4801,#545); -#210=LINE('',#4803,#546); -#211=LINE('',#4805,#547); -#212=LINE('',#4807,#548); -#213=LINE('',#4810,#549); -#214=LINE('',#4812,#550); -#215=LINE('',#4814,#551); -#216=LINE('',#4816,#552); -#217=LINE('',#4819,#553); -#218=LINE('',#4821,#554); -#219=LINE('',#4823,#555); -#220=LINE('',#4825,#556); -#221=LINE('',#4828,#557); -#222=LINE('',#4830,#558); -#223=LINE('',#4832,#559); -#224=LINE('',#4834,#560); -#225=LINE('',#4837,#561); -#226=LINE('',#4839,#562); -#227=LINE('',#4841,#563); -#228=LINE('',#4843,#564); -#229=LINE('',#4846,#565); -#230=LINE('',#4848,#566); -#231=LINE('',#4850,#567); -#232=LINE('',#4852,#568); -#233=LINE('',#4855,#569); -#234=LINE('',#4857,#570); -#235=LINE('',#4859,#571); -#236=LINE('',#4916,#572); -#237=LINE('',#4921,#573); -#238=LINE('',#4925,#574); -#239=LINE('',#4929,#575); -#240=LINE('',#4932,#576); -#241=LINE('',#4937,#577); -#242=LINE('',#4941,#578); -#243=LINE('',#4945,#579); -#244=LINE('',#4949,#580); -#245=LINE('',#4952,#581); -#246=LINE('',#4953,#582); -#247=LINE('',#4955,#583); -#248=LINE('',#4960,#584); -#249=LINE('',#4964,#585); -#250=LINE('',#4968,#586); -#251=LINE('',#4971,#587); -#252=LINE('',#4973,#588); -#253=LINE('',#4975,#589); -#254=LINE('',#4977,#590); -#255=LINE('',#4980,#591); -#256=LINE('',#4981,#592); -#257=LINE('',#4983,#593); -#258=LINE('',#4986,#594); -#259=LINE('',#4987,#595); -#260=LINE('',#4992,#596); -#261=LINE('',#4996,#597); -#262=LINE('',#5000,#598); -#263=LINE('',#5004,#599); -#264=LINE('',#5005,#600); -#265=LINE('',#5007,#601); -#266=LINE('',#5009,#602); -#267=LINE('',#5011,#603); -#268=LINE('',#5014,#604); -#269=LINE('',#5015,#605); -#270=LINE('',#5017,#606); -#271=LINE('',#5020,#607); -#272=LINE('',#5021,#608); -#273=LINE('',#5023,#609); -#274=LINE('',#5025,#610); -#275=LINE('',#5027,#611); -#276=LINE('',#5058,#612); -#277=LINE('',#5059,#613); -#278=LINE('',#5061,#614); -#279=LINE('',#5063,#615); -#280=LINE('',#5065,#616); -#281=LINE('',#5067,#617); -#282=LINE('',#5069,#618); -#283=LINE('',#5071,#619); -#284=LINE('',#5083,#620); -#285=LINE('',#5088,#621); -#286=LINE('',#5092,#622); -#287=LINE('',#5096,#623); -#288=LINE('',#5099,#624); -#289=LINE('',#5102,#625); -#290=LINE('',#5104,#626); -#291=LINE('',#5106,#627); -#292=LINE('',#5107,#628); -#293=LINE('',#5110,#629); -#294=LINE('',#5112,#630); -#295=LINE('',#5114,#631); -#296=LINE('',#5115,#632); -#297=LINE('',#5118,#633); -#298=LINE('',#5120,#634); -#299=LINE('',#5122,#635); -#300=LINE('',#5123,#636); -#301=LINE('',#5126,#637); -#302=LINE('',#5128,#638); -#303=LINE('',#5130,#639); -#304=LINE('',#5131,#640); -#305=LINE('',#5134,#641); -#306=LINE('',#5136,#642); -#307=LINE('',#5138,#643); -#308=LINE('',#5139,#644); -#309=LINE('',#5142,#645); -#310=LINE('',#5144,#646); -#311=LINE('',#5146,#647); -#312=LINE('',#5147,#648); -#313=LINE('',#5150,#649); -#314=LINE('',#5152,#650); -#315=LINE('',#5154,#651); -#316=LINE('',#5155,#652); -#317=LINE('',#5158,#653); -#318=LINE('',#5160,#654); -#319=LINE('',#5162,#655); -#320=LINE('',#5163,#656); -#321=LINE('',#5166,#657); -#322=LINE('',#5168,#658); -#323=LINE('',#5170,#659); -#324=LINE('',#5171,#660); -#325=LINE('',#5174,#661); -#326=LINE('',#5176,#662); -#327=LINE('',#5178,#663); -#328=LINE('',#5179,#664); -#329=LINE('',#5182,#665); -#330=LINE('',#5184,#666); -#331=LINE('',#5186,#667); -#332=LINE('',#5187,#668); -#333=LINE('',#5190,#669); -#334=LINE('',#5192,#670); -#335=LINE('',#5194,#671); -#336=LINE('',#5195,#672); -#337=LINE('',#5198,#673); -#338=LINE('',#5200,#674); -#339=LINE('',#5202,#675); -#340=LINE('',#5203,#676); -#341=LINE('',#5206,#677); -#342=LINE('',#5208,#678); -#343=LINE('',#5210,#679); -#344=LINE('',#5211,#680); -#345=LINE('',#5214,#681); -#346=LINE('',#5216,#682); -#347=LINE('',#5218,#683); -#348=LINE('',#5219,#684); -#349=LINE('',#5222,#685); -#350=LINE('',#5224,#686); -#351=LINE('',#5226,#687); -#352=LINE('',#5228,#688); -#353=LINE('',#5231,#689); -#354=LINE('',#5233,#690); -#355=LINE('',#5235,#691); -#356=LINE('',#5236,#692); -#357=LINE('',#5239,#693); -#358=LINE('',#5241,#694); -#359=LINE('',#5243,#695); -#360=LINE('',#5244,#696); -#361=LINE('',#5247,#697); -#362=LINE('',#5249,#698); -#363=LINE('',#5251,#699); -#364=LINE('',#5252,#700); -#365=LINE('',#5255,#701); -#366=LINE('',#5257,#702); -#367=LINE('',#5259,#703); -#368=LINE('',#5260,#704); -#369=LINE('',#5263,#705); -#370=LINE('',#5265,#706); -#371=LINE('',#5267,#707); -#372=LINE('',#5268,#708); -#373=LINE('',#5271,#709); -#374=LINE('',#5273,#710); -#375=LINE('',#5275,#711); -#376=LINE('',#5276,#712); -#377=LINE('',#5279,#713); -#378=LINE('',#5281,#714); -#379=LINE('',#5283,#715); -#380=LINE('',#5284,#716); -#381=LINE('',#5287,#717); -#382=LINE('',#5289,#718); -#383=LINE('',#5291,#719); -#384=LINE('',#5300,#720); -#385=LINE('',#5305,#721); -#386=LINE('',#5309,#722); -#387=LINE('',#5313,#723); -#388=LINE('',#5316,#724); -#389=LINE('',#5319,#725); -#390=LINE('',#5321,#726); -#391=LINE('',#5323,#727); -#392=LINE('',#5324,#728); -#393=LINE('',#5327,#729); -#394=LINE('',#5329,#730); -#395=LINE('',#5331,#731); -#396=LINE('',#5332,#732); -#397=LINE('',#5335,#733); -#398=LINE('',#5337,#734); -#399=LINE('',#5339,#735); -#400=LINE('',#5340,#736); -#401=LINE('',#5343,#737); -#402=LINE('',#5345,#738); -#403=LINE('',#5347,#739); -#404=LINE('',#5348,#740); -#405=LINE('',#5351,#741); -#406=LINE('',#5353,#742); -#407=LINE('',#5355,#743); -#408=LINE('',#5356,#744); -#409=LINE('',#5359,#745); -#410=LINE('',#5361,#746); -#411=LINE('',#5363,#747); -#412=LINE('',#5364,#748); -#413=LINE('',#5367,#749); -#414=LINE('',#5369,#750); -#415=LINE('',#5371,#751); -#416=LINE('',#5372,#752); -#417=LINE('',#5375,#753); -#418=LINE('',#5377,#754); -#419=LINE('',#5379,#755); -#420=LINE('',#5381,#756); -#421=LINE('',#5382,#757); -#422=LINE('',#5384,#758); -#423=LINE('',#5385,#759); -#424=LINE('',#5387,#760); -#425=LINE('',#5388,#761); -#426=LINE('',#5390,#762); -#427=LINE('',#5391,#763); -#428=LINE('',#5401,#764); -#429=LINE('',#5402,#765); -#430=LINE('',#5404,#766); -#431=LINE('',#5406,#767); -#432=LINE('',#5409,#768); -#433=LINE('',#5410,#769); -#434=LINE('',#5412,#770); -#435=LINE('',#5414,#771); -#436=LINE('',#5417,#772); -#437=LINE('',#5418,#773); -#438=LINE('',#5420,#774); -#439=LINE('',#5422,#775); -#440=LINE('',#5425,#776); -#441=LINE('',#5426,#777); -#442=LINE('',#5428,#778); -#443=LINE('',#5430,#779); -#444=LINE('',#5433,#780); -#445=LINE('',#5434,#781); -#446=LINE('',#5436,#782); -#447=LINE('',#5438,#783); -#448=LINE('',#5441,#784); -#449=LINE('',#5442,#785); -#450=LINE('',#5444,#786); -#451=LINE('',#5446,#787); -#452=LINE('',#5449,#788); -#453=LINE('',#5450,#789); -#454=LINE('',#5452,#790); -#455=LINE('',#5454,#791); -#456=LINE('',#5457,#792); -#457=LINE('',#5458,#793); -#458=LINE('',#5460,#794); -#459=LINE('',#5462,#795); -#460=LINE('',#5465,#796); -#461=LINE('',#5466,#797); -#462=LINE('',#5468,#798); -#463=LINE('',#5470,#799); -#464=LINE('',#5473,#800); -#465=LINE('',#5474,#801); -#466=LINE('',#5476,#802); -#467=LINE('',#5478,#803); -#468=LINE('',#5481,#804); -#469=LINE('',#5482,#805); -#470=LINE('',#5484,#806); -#471=LINE('',#5486,#807); -#472=LINE('',#5489,#808); -#473=LINE('',#5490,#809); -#474=LINE('',#5492,#810); -#475=LINE('',#5494,#811); -#476=LINE('',#5497,#812); -#477=LINE('',#5498,#813); -#478=LINE('',#5500,#814); -#479=LINE('',#5502,#815); -#480=LINE('',#5505,#816); -#481=LINE('',#5506,#817); -#482=LINE('',#5508,#818); -#483=LINE('',#5510,#819); -#484=LINE('',#5513,#820); -#485=LINE('',#5514,#821); -#486=LINE('',#5516,#822); -#487=LINE('',#5518,#823); -#488=LINE('',#5521,#824); -#489=LINE('',#5522,#825); -#490=LINE('',#5524,#826); -#491=LINE('',#5526,#827); -#492=VECTOR('',#3705,1.); -#493=VECTOR('',#3708,1.); -#494=VECTOR('',#3711,1.); -#495=VECTOR('',#3714,1.); -#496=VECTOR('',#3719,1.); -#497=VECTOR('',#3720,1.); -#498=VECTOR('',#3721,1.); -#499=VECTOR('',#3724,1.); -#500=VECTOR('',#3725,1.); -#501=VECTOR('',#3726,1.); -#502=VECTOR('',#3729,1.); -#503=VECTOR('',#3730,1.); -#504=VECTOR('',#3731,1.); -#505=VECTOR('',#3734,1.); -#506=VECTOR('',#3735,1.); -#507=VECTOR('',#3736,1.); -#508=VECTOR('',#3783,1.); -#509=VECTOR('',#3786,1.); -#510=VECTOR('',#3789,1.); -#511=VECTOR('',#3792,1.); -#512=VECTOR('',#3795,1.); -#513=VECTOR('',#3798,1.); -#514=VECTOR('',#3801,1.); -#515=VECTOR('',#3804,1.); -#516=VECTOR('',#3817,1.); -#517=VECTOR('',#3820,1.); -#518=VECTOR('',#3823,1.); -#519=VECTOR('',#3826,1.); -#520=VECTOR('',#3829,1.); -#521=VECTOR('',#3832,1.); -#522=VECTOR('',#3835,1.); -#523=VECTOR('',#3838,1.); -#524=VECTOR('',#3843,1.); -#525=VECTOR('',#3844,1.); -#526=VECTOR('',#3847,1.); -#527=VECTOR('',#3848,1.); -#528=VECTOR('',#3851,1.); -#529=VECTOR('',#3852,1.); -#530=VECTOR('',#3855,1.); -#531=VECTOR('',#3856,1.); -#532=VECTOR('',#3859,1.); -#533=VECTOR('',#3860,1.); -#534=VECTOR('',#3863,1.); -#535=VECTOR('',#3864,1.); -#536=VECTOR('',#3867,1.); -#537=VECTOR('',#3868,1.); -#538=VECTOR('',#3871,1.); -#539=VECTOR('',#3872,1.); -#540=VECTOR('',#3901,1.); -#541=VECTOR('',#3902,1.); -#542=VECTOR('',#3903,1.); -#543=VECTOR('',#3904,1.); -#544=VECTOR('',#3907,1.); -#545=VECTOR('',#3908,1.); -#546=VECTOR('',#3909,1.); -#547=VECTOR('',#3910,1.); -#548=VECTOR('',#3913,1.); -#549=VECTOR('',#3914,1.); -#550=VECTOR('',#3915,1.); -#551=VECTOR('',#3916,1.); -#552=VECTOR('',#3919,1.); -#553=VECTOR('',#3920,1.); -#554=VECTOR('',#3921,1.); -#555=VECTOR('',#3922,1.); -#556=VECTOR('',#3925,1.); -#557=VECTOR('',#3926,1.); -#558=VECTOR('',#3927,1.); -#559=VECTOR('',#3928,1.); -#560=VECTOR('',#3931,1.); -#561=VECTOR('',#3932,1.); -#562=VECTOR('',#3933,1.); -#563=VECTOR('',#3934,1.); -#564=VECTOR('',#3937,1.); -#565=VECTOR('',#3938,1.); -#566=VECTOR('',#3939,1.); -#567=VECTOR('',#3940,1.); -#568=VECTOR('',#3943,1.); -#569=VECTOR('',#3944,1.); -#570=VECTOR('',#3945,1.); -#571=VECTOR('',#3946,1.); -#572=VECTOR('',#4035,1.); -#573=VECTOR('',#4038,1.); -#574=VECTOR('',#4041,1.); -#575=VECTOR('',#4044,1.); -#576=VECTOR('',#4047,1.); -#577=VECTOR('',#4050,1.); -#578=VECTOR('',#4053,1.); -#579=VECTOR('',#4056,1.); -#580=VECTOR('',#4061,1.); -#581=VECTOR('',#4062,1.); -#582=VECTOR('',#4063,1.); -#583=VECTOR('',#4066,1.); -#584=VECTOR('',#4069,1.); -#585=VECTOR('',#4072,1.); -#586=VECTOR('',#4075,1.); -#587=VECTOR('',#4078,1.); -#588=VECTOR('',#4079,1.); -#589=VECTOR('',#4080,1.); -#590=VECTOR('',#4083,1.); -#591=VECTOR('',#4084,1.); -#592=VECTOR('',#4085,1.); -#593=VECTOR('',#4088,1.); -#594=VECTOR('',#4089,1.); -#595=VECTOR('',#4090,1.); -#596=VECTOR('',#4095,1.); -#597=VECTOR('',#4098,1.); -#598=VECTOR('',#4101,1.); -#599=VECTOR('',#4104,1.); -#600=VECTOR('',#4105,1.); -#601=VECTOR('',#4106,1.); -#602=VECTOR('',#4107,1.); -#603=VECTOR('',#4110,1.); -#604=VECTOR('',#4111,1.); -#605=VECTOR('',#4112,1.); -#606=VECTOR('',#4115,1.); -#607=VECTOR('',#4116,1.); -#608=VECTOR('',#4117,1.); -#609=VECTOR('',#4120,1.); -#610=VECTOR('',#4121,1.); -#611=VECTOR('',#4122,1.); -#612=VECTOR('',#4175,1.); -#613=VECTOR('',#4176,1.); -#614=VECTOR('',#4179,1.); -#615=VECTOR('',#4182,1.); -#616=VECTOR('',#4185,1.); -#617=VECTOR('',#4188,1.); -#618=VECTOR('',#4191,1.); -#619=VECTOR('',#4194,1.); -#620=VECTOR('',#4209,1.); -#621=VECTOR('',#4212,1.); -#622=VECTOR('',#4215,1.); -#623=VECTOR('',#4218,1.); -#624=VECTOR('',#4221,1.); -#625=VECTOR('',#4222,1.); -#626=VECTOR('',#4223,1.); -#627=VECTOR('',#4224,1.); -#628=VECTOR('',#4225,1.); -#629=VECTOR('',#4226,1.); -#630=VECTOR('',#4227,1.); -#631=VECTOR('',#4228,1.); -#632=VECTOR('',#4229,1.); -#633=VECTOR('',#4230,1.); -#634=VECTOR('',#4231,1.); -#635=VECTOR('',#4232,1.); -#636=VECTOR('',#4233,1.); -#637=VECTOR('',#4234,1.); -#638=VECTOR('',#4235,1.); -#639=VECTOR('',#4236,1.); -#640=VECTOR('',#4237,1.); -#641=VECTOR('',#4238,1.); -#642=VECTOR('',#4239,1.); -#643=VECTOR('',#4240,1.); -#644=VECTOR('',#4241,1.); -#645=VECTOR('',#4242,1.); -#646=VECTOR('',#4243,1.); -#647=VECTOR('',#4244,1.); -#648=VECTOR('',#4245,1.); -#649=VECTOR('',#4246,1.); -#650=VECTOR('',#4247,1.); -#651=VECTOR('',#4248,1.); -#652=VECTOR('',#4249,1.); -#653=VECTOR('',#4250,1.); -#654=VECTOR('',#4251,1.); -#655=VECTOR('',#4252,1.); -#656=VECTOR('',#4253,1.); -#657=VECTOR('',#4254,1.); -#658=VECTOR('',#4255,1.); -#659=VECTOR('',#4256,1.); -#660=VECTOR('',#4257,1.); -#661=VECTOR('',#4258,1.); -#662=VECTOR('',#4259,1.); -#663=VECTOR('',#4260,1.); -#664=VECTOR('',#4261,1.); -#665=VECTOR('',#4262,1.); -#666=VECTOR('',#4263,1.); -#667=VECTOR('',#4264,1.); -#668=VECTOR('',#4265,1.); -#669=VECTOR('',#4266,1.); -#670=VECTOR('',#4267,1.); -#671=VECTOR('',#4268,1.); -#672=VECTOR('',#4269,1.); -#673=VECTOR('',#4270,1.); -#674=VECTOR('',#4271,1.); -#675=VECTOR('',#4272,1.); -#676=VECTOR('',#4273,1.); -#677=VECTOR('',#4274,1.); -#678=VECTOR('',#4275,1.); -#679=VECTOR('',#4276,1.); -#680=VECTOR('',#4277,1.); -#681=VECTOR('',#4278,1.); -#682=VECTOR('',#4279,1.); -#683=VECTOR('',#4280,1.); -#684=VECTOR('',#4281,1.); -#685=VECTOR('',#4282,1.); -#686=VECTOR('',#4283,1.); -#687=VECTOR('',#4284,1.); -#688=VECTOR('',#4287,1.); -#689=VECTOR('',#4288,1.); -#690=VECTOR('',#4289,1.); -#691=VECTOR('',#4290,1.); -#692=VECTOR('',#4291,1.); -#693=VECTOR('',#4292,1.); -#694=VECTOR('',#4293,1.); -#695=VECTOR('',#4294,1.); -#696=VECTOR('',#4295,1.); -#697=VECTOR('',#4296,1.); -#698=VECTOR('',#4297,1.); -#699=VECTOR('',#4298,1.); -#700=VECTOR('',#4299,1.); -#701=VECTOR('',#4300,1.); -#702=VECTOR('',#4301,1.); -#703=VECTOR('',#4302,1.); -#704=VECTOR('',#4303,1.); -#705=VECTOR('',#4304,1.); -#706=VECTOR('',#4305,1.); -#707=VECTOR('',#4306,1.); -#708=VECTOR('',#4307,1.); -#709=VECTOR('',#4308,1.); -#710=VECTOR('',#4309,1.); -#711=VECTOR('',#4310,1.); -#712=VECTOR('',#4311,1.); -#713=VECTOR('',#4312,1.); -#714=VECTOR('',#4313,1.); -#715=VECTOR('',#4314,1.); -#716=VECTOR('',#4315,1.); -#717=VECTOR('',#4316,1.); -#718=VECTOR('',#4317,1.); -#719=VECTOR('',#4318,1.); -#720=VECTOR('',#4327,1.); -#721=VECTOR('',#4330,1.); -#722=VECTOR('',#4333,1.); -#723=VECTOR('',#4336,1.); -#724=VECTOR('',#4339,1.); -#725=VECTOR('',#4340,1.); -#726=VECTOR('',#4341,1.); -#727=VECTOR('',#4342,1.); -#728=VECTOR('',#4343,1.); -#729=VECTOR('',#4344,1.); -#730=VECTOR('',#4345,1.); -#731=VECTOR('',#4346,1.); -#732=VECTOR('',#4347,1.); -#733=VECTOR('',#4348,1.); -#734=VECTOR('',#4349,1.); -#735=VECTOR('',#4350,1.); -#736=VECTOR('',#4351,1.); -#737=VECTOR('',#4352,1.); -#738=VECTOR('',#4353,1.); -#739=VECTOR('',#4354,1.); -#740=VECTOR('',#4355,1.); -#741=VECTOR('',#4356,1.); -#742=VECTOR('',#4357,1.); -#743=VECTOR('',#4358,1.); -#744=VECTOR('',#4359,1.); -#745=VECTOR('',#4360,1.); -#746=VECTOR('',#4361,1.); -#747=VECTOR('',#4362,1.); -#748=VECTOR('',#4363,1.); -#749=VECTOR('',#4364,1.); -#750=VECTOR('',#4365,1.); -#751=VECTOR('',#4366,1.); -#752=VECTOR('',#4367,1.); -#753=VECTOR('',#4368,1.); -#754=VECTOR('',#4369,1.); -#755=VECTOR('',#4370,1.); -#756=VECTOR('',#4373,1.); -#757=VECTOR('',#4374,1.); -#758=VECTOR('',#4377,1.); -#759=VECTOR('',#4378,1.); -#760=VECTOR('',#4381,1.); -#761=VECTOR('',#4382,1.); -#762=VECTOR('',#4385,1.); -#763=VECTOR('',#4386,1.); -#764=VECTOR('',#4405,1.); -#765=VECTOR('',#4406,1.); -#766=VECTOR('',#4409,1.); -#767=VECTOR('',#4412,1.); -#768=VECTOR('',#4417,1.); -#769=VECTOR('',#4418,1.); -#770=VECTOR('',#4421,1.); -#771=VECTOR('',#4424,1.); -#772=VECTOR('',#4429,1.); -#773=VECTOR('',#4430,1.); -#774=VECTOR('',#4433,1.); -#775=VECTOR('',#4436,1.); -#776=VECTOR('',#4441,1.); -#777=VECTOR('',#4442,1.); -#778=VECTOR('',#4445,1.); -#779=VECTOR('',#4448,1.); -#780=VECTOR('',#4453,1.); -#781=VECTOR('',#4454,1.); -#782=VECTOR('',#4457,1.); -#783=VECTOR('',#4460,1.); -#784=VECTOR('',#4465,1.); -#785=VECTOR('',#4466,1.); -#786=VECTOR('',#4469,1.); -#787=VECTOR('',#4472,1.); -#788=VECTOR('',#4477,1.); -#789=VECTOR('',#4478,1.); -#790=VECTOR('',#4481,1.); -#791=VECTOR('',#4484,1.); -#792=VECTOR('',#4489,1.); -#793=VECTOR('',#4490,1.); -#794=VECTOR('',#4493,1.); -#795=VECTOR('',#4496,1.); -#796=VECTOR('',#4501,1.); -#797=VECTOR('',#4502,1.); -#798=VECTOR('',#4505,1.); -#799=VECTOR('',#4508,1.); -#800=VECTOR('',#4513,1.); -#801=VECTOR('',#4514,1.); -#802=VECTOR('',#4517,1.); -#803=VECTOR('',#4520,1.); -#804=VECTOR('',#4525,1.); -#805=VECTOR('',#4526,1.); -#806=VECTOR('',#4529,1.); -#807=VECTOR('',#4532,1.); -#808=VECTOR('',#4537,1.); -#809=VECTOR('',#4538,1.); -#810=VECTOR('',#4541,1.); -#811=VECTOR('',#4544,1.); -#812=VECTOR('',#4549,1.); -#813=VECTOR('',#4550,1.); -#814=VECTOR('',#4553,1.); -#815=VECTOR('',#4556,1.); -#816=VECTOR('',#4561,1.); -#817=VECTOR('',#4562,1.); -#818=VECTOR('',#4565,1.); -#819=VECTOR('',#4568,1.); -#820=VECTOR('',#4573,1.); -#821=VECTOR('',#4574,1.); -#822=VECTOR('',#4577,1.); -#823=VECTOR('',#4580,1.); -#824=VECTOR('',#4585,1.); -#825=VECTOR('',#4586,1.); -#826=VECTOR('',#4589,1.); -#827=VECTOR('',#4592,1.); -#828=ORIENTED_EDGE('',*,*,#1724,.F.); -#829=ORIENTED_EDGE('',*,*,#1725,.F.); -#830=ORIENTED_EDGE('',*,*,#1726,.F.); -#831=ORIENTED_EDGE('',*,*,#1727,.F.); -#832=ORIENTED_EDGE('',*,*,#1728,.F.); -#833=ORIENTED_EDGE('',*,*,#1729,.T.); -#834=ORIENTED_EDGE('',*,*,#1730,.T.); -#835=ORIENTED_EDGE('',*,*,#1731,.T.); -#836=ORIENTED_EDGE('',*,*,#1732,.T.); -#837=ORIENTED_EDGE('',*,*,#1733,.T.); -#838=ORIENTED_EDGE('',*,*,#1734,.F.); -#839=ORIENTED_EDGE('',*,*,#1735,.T.); -#840=ORIENTED_EDGE('',*,*,#1736,.T.); -#841=ORIENTED_EDGE('',*,*,#1737,.T.); -#842=ORIENTED_EDGE('',*,*,#1734,.T.); -#843=ORIENTED_EDGE('',*,*,#1738,.T.); -#844=ORIENTED_EDGE('',*,*,#1739,.F.); -#845=ORIENTED_EDGE('',*,*,#1740,.T.); -#846=ORIENTED_EDGE('',*,*,#1732,.F.); -#847=ORIENTED_EDGE('',*,*,#1741,.T.); -#848=ORIENTED_EDGE('',*,*,#1730,.F.); -#849=ORIENTED_EDGE('',*,*,#1742,.T.); -#850=ORIENTED_EDGE('',*,*,#1743,.F.); -#851=ORIENTED_EDGE('',*,*,#1744,.T.); -#852=ORIENTED_EDGE('',*,*,#1745,.T.); -#853=ORIENTED_EDGE('',*,*,#1746,.T.); -#854=ORIENTED_EDGE('',*,*,#1728,.T.); -#855=ORIENTED_EDGE('',*,*,#1747,.T.); -#856=ORIENTED_EDGE('',*,*,#1748,.T.); -#857=ORIENTED_EDGE('',*,*,#1749,.T.); -#858=ORIENTED_EDGE('',*,*,#1750,.T.); -#859=ORIENTED_EDGE('',*,*,#1751,.T.); -#860=ORIENTED_EDGE('',*,*,#1743,.T.); -#861=ORIENTED_EDGE('',*,*,#1752,.T.); -#862=ORIENTED_EDGE('',*,*,#1745,.F.); -#863=ORIENTED_EDGE('',*,*,#1753,.T.); -#864=ORIENTED_EDGE('',*,*,#1736,.F.); -#865=ORIENTED_EDGE('',*,*,#1754,.T.); -#866=ORIENTED_EDGE('',*,*,#1739,.T.); -#867=ORIENTED_EDGE('',*,*,#1755,.T.); -#868=ORIENTED_EDGE('',*,*,#1752,.F.); -#869=ORIENTED_EDGE('',*,*,#1742,.F.); -#870=ORIENTED_EDGE('',*,*,#1729,.F.); -#871=ORIENTED_EDGE('',*,*,#1746,.F.); -#872=ORIENTED_EDGE('',*,*,#1753,.F.); -#873=ORIENTED_EDGE('',*,*,#1747,.F.); -#874=ORIENTED_EDGE('',*,*,#1735,.F.); -#875=ORIENTED_EDGE('',*,*,#1737,.F.); -#876=ORIENTED_EDGE('',*,*,#1754,.F.); -#877=ORIENTED_EDGE('',*,*,#1738,.F.); -#878=ORIENTED_EDGE('',*,*,#1733,.F.); -#879=ORIENTED_EDGE('',*,*,#1740,.F.); -#880=ORIENTED_EDGE('',*,*,#1755,.F.); -#881=ORIENTED_EDGE('',*,*,#1741,.F.); -#882=ORIENTED_EDGE('',*,*,#1731,.F.); -#883=ORIENTED_EDGE('',*,*,#1744,.F.); -#884=ORIENTED_EDGE('',*,*,#1727,.T.); -#885=ORIENTED_EDGE('',*,*,#1751,.F.); -#886=ORIENTED_EDGE('',*,*,#1726,.T.); -#887=ORIENTED_EDGE('',*,*,#1750,.F.); -#888=ORIENTED_EDGE('',*,*,#1725,.T.); -#889=ORIENTED_EDGE('',*,*,#1749,.F.); -#890=ORIENTED_EDGE('',*,*,#1724,.T.); -#891=ORIENTED_EDGE('',*,*,#1748,.F.); -#892=ORIENTED_EDGE('',*,*,#1756,.F.); -#893=ORIENTED_EDGE('',*,*,#1757,.F.); -#894=ORIENTED_EDGE('',*,*,#1758,.F.); -#895=ORIENTED_EDGE('',*,*,#1759,.F.); -#896=ORIENTED_EDGE('',*,*,#1760,.T.); -#897=ORIENTED_EDGE('',*,*,#1761,.T.); -#898=ORIENTED_EDGE('',*,*,#1762,.F.); -#899=ORIENTED_EDGE('',*,*,#1763,.T.); -#900=ORIENTED_EDGE('',*,*,#1764,.F.); -#901=ORIENTED_EDGE('',*,*,#1765,.T.); -#902=ORIENTED_EDGE('',*,*,#1766,.T.); -#903=ORIENTED_EDGE('',*,*,#1767,.T.); -#904=ORIENTED_EDGE('',*,*,#1768,.F.); -#905=ORIENTED_EDGE('',*,*,#1769,.T.); -#906=ORIENTED_EDGE('',*,*,#1770,.F.); -#907=ORIENTED_EDGE('',*,*,#1771,.T.); -#908=ORIENTED_EDGE('',*,*,#1772,.T.); -#909=ORIENTED_EDGE('',*,*,#1773,.T.); -#910=ORIENTED_EDGE('',*,*,#1774,.T.); -#911=ORIENTED_EDGE('',*,*,#1775,.T.); -#912=ORIENTED_EDGE('',*,*,#1776,.T.); -#913=ORIENTED_EDGE('',*,*,#1777,.T.); -#914=ORIENTED_EDGE('',*,*,#1778,.T.); -#915=ORIENTED_EDGE('',*,*,#1779,.T.); -#916=ORIENTED_EDGE('',*,*,#1780,.T.); -#917=ORIENTED_EDGE('',*,*,#1781,.T.); -#918=ORIENTED_EDGE('',*,*,#1782,.F.); -#919=ORIENTED_EDGE('',*,*,#1783,.T.); -#920=ORIENTED_EDGE('',*,*,#1784,.F.); -#921=ORIENTED_EDGE('',*,*,#1785,.T.); -#922=ORIENTED_EDGE('',*,*,#1786,.T.); -#923=ORIENTED_EDGE('',*,*,#1787,.T.); -#924=ORIENTED_EDGE('',*,*,#1788,.F.); -#925=ORIENTED_EDGE('',*,*,#1789,.T.); -#926=ORIENTED_EDGE('',*,*,#1790,.F.); -#927=ORIENTED_EDGE('',*,*,#1791,.T.); -#928=ORIENTED_EDGE('',*,*,#1792,.T.); -#929=ORIENTED_EDGE('',*,*,#1793,.T.); -#930=ORIENTED_EDGE('',*,*,#1794,.T.); -#931=ORIENTED_EDGE('',*,*,#1795,.T.); -#932=ORIENTED_EDGE('',*,*,#1784,.T.); -#933=ORIENTED_EDGE('',*,*,#1796,.T.); -#934=ORIENTED_EDGE('',*,*,#1766,.F.); -#935=ORIENTED_EDGE('',*,*,#1797,.T.); -#936=ORIENTED_EDGE('',*,*,#1786,.F.); -#937=ORIENTED_EDGE('',*,*,#1798,.T.); -#938=ORIENTED_EDGE('',*,*,#1764,.T.); -#939=ORIENTED_EDGE('',*,*,#1799,.T.); -#940=ORIENTED_EDGE('',*,*,#1762,.T.); -#941=ORIENTED_EDGE('',*,*,#1800,.T.); -#942=ORIENTED_EDGE('',*,*,#1780,.F.); -#943=ORIENTED_EDGE('',*,*,#1801,.T.); -#944=ORIENTED_EDGE('',*,*,#1782,.T.); -#945=ORIENTED_EDGE('',*,*,#1802,.T.); -#946=ORIENTED_EDGE('',*,*,#1760,.F.); -#947=ORIENTED_EDGE('',*,*,#1803,.T.); -#948=ORIENTED_EDGE('',*,*,#1788,.T.); -#949=ORIENTED_EDGE('',*,*,#1804,.T.); -#950=ORIENTED_EDGE('',*,*,#1770,.T.); -#951=ORIENTED_EDGE('',*,*,#1805,.T.); -#952=ORIENTED_EDGE('',*,*,#1794,.F.); -#953=ORIENTED_EDGE('',*,*,#1806,.T.); -#954=ORIENTED_EDGE('',*,*,#1772,.F.); -#955=ORIENTED_EDGE('',*,*,#1807,.T.); -#956=ORIENTED_EDGE('',*,*,#1774,.F.); -#957=ORIENTED_EDGE('',*,*,#1808,.T.); -#958=ORIENTED_EDGE('',*,*,#1792,.F.); -#959=ORIENTED_EDGE('',*,*,#1809,.T.); -#960=ORIENTED_EDGE('',*,*,#1790,.T.); -#961=ORIENTED_EDGE('',*,*,#1810,.T.); -#962=ORIENTED_EDGE('',*,*,#1768,.T.); -#963=ORIENTED_EDGE('',*,*,#1811,.T.); -#964=ORIENTED_EDGE('',*,*,#1781,.F.); -#965=ORIENTED_EDGE('',*,*,#1800,.F.); -#966=ORIENTED_EDGE('',*,*,#1761,.F.); -#967=ORIENTED_EDGE('',*,*,#1802,.F.); -#968=ORIENTED_EDGE('',*,*,#1783,.F.); -#969=ORIENTED_EDGE('',*,*,#1803,.F.); -#970=ORIENTED_EDGE('',*,*,#1767,.F.); -#971=ORIENTED_EDGE('',*,*,#1796,.F.); -#972=ORIENTED_EDGE('',*,*,#1785,.F.); -#973=ORIENTED_EDGE('',*,*,#1797,.F.); -#974=ORIENTED_EDGE('',*,*,#1765,.F.); -#975=ORIENTED_EDGE('',*,*,#1798,.F.); -#976=ORIENTED_EDGE('',*,*,#1787,.F.); -#977=ORIENTED_EDGE('',*,*,#1799,.F.); -#978=ORIENTED_EDGE('',*,*,#1763,.F.); -#979=ORIENTED_EDGE('',*,*,#1801,.F.); -#980=ORIENTED_EDGE('',*,*,#1773,.F.); -#981=ORIENTED_EDGE('',*,*,#1806,.F.); -#982=ORIENTED_EDGE('',*,*,#1793,.F.); -#983=ORIENTED_EDGE('',*,*,#1808,.F.); -#984=ORIENTED_EDGE('',*,*,#1771,.F.); -#985=ORIENTED_EDGE('',*,*,#1804,.F.); -#986=ORIENTED_EDGE('',*,*,#1795,.F.); -#987=ORIENTED_EDGE('',*,*,#1807,.F.); -#988=ORIENTED_EDGE('',*,*,#1769,.F.); -#989=ORIENTED_EDGE('',*,*,#1810,.F.); -#990=ORIENTED_EDGE('',*,*,#1789,.F.); -#991=ORIENTED_EDGE('',*,*,#1805,.F.); -#992=ORIENTED_EDGE('',*,*,#1775,.F.); -#993=ORIENTED_EDGE('',*,*,#1809,.F.); -#994=ORIENTED_EDGE('',*,*,#1791,.F.); -#995=ORIENTED_EDGE('',*,*,#1811,.F.); -#996=ORIENTED_EDGE('',*,*,#1759,.T.); -#997=ORIENTED_EDGE('',*,*,#1779,.F.); -#998=ORIENTED_EDGE('',*,*,#1758,.T.); -#999=ORIENTED_EDGE('',*,*,#1778,.F.); -#1000=ORIENTED_EDGE('',*,*,#1757,.T.); -#1001=ORIENTED_EDGE('',*,*,#1777,.F.); -#1002=ORIENTED_EDGE('',*,*,#1756,.T.); -#1003=ORIENTED_EDGE('',*,*,#1776,.F.); -#1004=ORIENTED_EDGE('',*,*,#1812,.T.); -#1005=ORIENTED_EDGE('',*,*,#1813,.T.); -#1006=ORIENTED_EDGE('',*,*,#1814,.F.); -#1007=ORIENTED_EDGE('',*,*,#1815,.T.); -#1008=ORIENTED_EDGE('',*,*,#1816,.T.); -#1009=ORIENTED_EDGE('',*,*,#1817,.T.); -#1010=ORIENTED_EDGE('',*,*,#1818,.F.); -#1011=ORIENTED_EDGE('',*,*,#1819,.T.); -#1012=ORIENTED_EDGE('',*,*,#1820,.T.); -#1013=ORIENTED_EDGE('',*,*,#1821,.T.); -#1014=ORIENTED_EDGE('',*,*,#1822,.F.); -#1015=ORIENTED_EDGE('',*,*,#1823,.T.); -#1016=ORIENTED_EDGE('',*,*,#1824,.T.); -#1017=ORIENTED_EDGE('',*,*,#1825,.T.); -#1018=ORIENTED_EDGE('',*,*,#1826,.F.); -#1019=ORIENTED_EDGE('',*,*,#1827,.T.); -#1020=ORIENTED_EDGE('',*,*,#1828,.F.); -#1021=ORIENTED_EDGE('',*,*,#1829,.T.); -#1022=ORIENTED_EDGE('',*,*,#1830,.T.); -#1023=ORIENTED_EDGE('',*,*,#1831,.T.); -#1024=ORIENTED_EDGE('',*,*,#1832,.F.); -#1025=ORIENTED_EDGE('',*,*,#1833,.T.); -#1026=ORIENTED_EDGE('',*,*,#1834,.T.); -#1027=ORIENTED_EDGE('',*,*,#1835,.T.); -#1028=ORIENTED_EDGE('',*,*,#1836,.F.); -#1029=ORIENTED_EDGE('',*,*,#1837,.T.); -#1030=ORIENTED_EDGE('',*,*,#1838,.T.); -#1031=ORIENTED_EDGE('',*,*,#1839,.T.); -#1032=ORIENTED_EDGE('',*,*,#1840,.T.); -#1033=ORIENTED_EDGE('',*,*,#1841,.T.); -#1034=ORIENTED_EDGE('',*,*,#1842,.F.); -#1035=ORIENTED_EDGE('',*,*,#1843,.T.); -#1036=ORIENTED_EDGE('',*,*,#1844,.F.); -#1037=ORIENTED_EDGE('',*,*,#1845,.F.); -#1038=ORIENTED_EDGE('',*,*,#1846,.F.); -#1039=ORIENTED_EDGE('',*,*,#1847,.F.); -#1040=ORIENTED_EDGE('',*,*,#1834,.F.); -#1041=ORIENTED_EDGE('',*,*,#1848,.T.); -#1042=ORIENTED_EDGE('',*,*,#1836,.T.); -#1043=ORIENTED_EDGE('',*,*,#1849,.T.); -#1044=ORIENTED_EDGE('',*,*,#1824,.F.); -#1045=ORIENTED_EDGE('',*,*,#1850,.T.); -#1046=ORIENTED_EDGE('',*,*,#1828,.T.); -#1047=ORIENTED_EDGE('',*,*,#1851,.T.); -#1048=ORIENTED_EDGE('',*,*,#1840,.F.); -#1049=ORIENTED_EDGE('',*,*,#1852,.T.); -#1050=ORIENTED_EDGE('',*,*,#1814,.T.); -#1051=ORIENTED_EDGE('',*,*,#1853,.T.); -#1052=ORIENTED_EDGE('',*,*,#1818,.T.); -#1053=ORIENTED_EDGE('',*,*,#1854,.T.); -#1054=ORIENTED_EDGE('',*,*,#1822,.T.); -#1055=ORIENTED_EDGE('',*,*,#1855,.T.); -#1056=ORIENTED_EDGE('',*,*,#1856,.T.); -#1057=ORIENTED_EDGE('',*,*,#1857,.T.); -#1058=ORIENTED_EDGE('',*,*,#1858,.T.); -#1059=ORIENTED_EDGE('',*,*,#1859,.T.); -#1060=ORIENTED_EDGE('',*,*,#1838,.F.); -#1061=ORIENTED_EDGE('',*,*,#1860,.T.); -#1062=ORIENTED_EDGE('',*,*,#1832,.T.); -#1063=ORIENTED_EDGE('',*,*,#1861,.T.); -#1064=ORIENTED_EDGE('',*,*,#1830,.F.); -#1065=ORIENTED_EDGE('',*,*,#1862,.T.); -#1066=ORIENTED_EDGE('',*,*,#1826,.T.); -#1067=ORIENTED_EDGE('',*,*,#1863,.T.); -#1068=ORIENTED_EDGE('',*,*,#1812,.F.); -#1069=ORIENTED_EDGE('',*,*,#1864,.T.); -#1070=ORIENTED_EDGE('',*,*,#1842,.T.); -#1071=ORIENTED_EDGE('',*,*,#1865,.T.); -#1072=ORIENTED_EDGE('',*,*,#1820,.F.); -#1073=ORIENTED_EDGE('',*,*,#1866,.T.); -#1074=ORIENTED_EDGE('',*,*,#1816,.F.); -#1075=ORIENTED_EDGE('',*,*,#1867,.T.); -#1076=ORIENTED_EDGE('',*,*,#1848,.F.); -#1077=ORIENTED_EDGE('',*,*,#1833,.F.); -#1078=ORIENTED_EDGE('',*,*,#1860,.F.); -#1079=ORIENTED_EDGE('',*,*,#1837,.F.); -#1080=ORIENTED_EDGE('',*,*,#1849,.F.); -#1081=ORIENTED_EDGE('',*,*,#1839,.F.); -#1082=ORIENTED_EDGE('',*,*,#1863,.F.); -#1083=ORIENTED_EDGE('',*,*,#1825,.F.); -#1084=ORIENTED_EDGE('',*,*,#1850,.F.); -#1085=ORIENTED_EDGE('',*,*,#1827,.F.); -#1086=ORIENTED_EDGE('',*,*,#1862,.F.); -#1087=ORIENTED_EDGE('',*,*,#1829,.F.); -#1088=ORIENTED_EDGE('',*,*,#1851,.F.); -#1089=ORIENTED_EDGE('',*,*,#1831,.F.); -#1090=ORIENTED_EDGE('',*,*,#1861,.F.); -#1091=ORIENTED_EDGE('',*,*,#1835,.F.); -#1092=ORIENTED_EDGE('',*,*,#1855,.F.); -#1093=ORIENTED_EDGE('',*,*,#1821,.F.); -#1094=ORIENTED_EDGE('',*,*,#1865,.F.); -#1095=ORIENTED_EDGE('',*,*,#1841,.F.); -#1096=ORIENTED_EDGE('',*,*,#1854,.F.); -#1097=ORIENTED_EDGE('',*,*,#1817,.F.); -#1098=ORIENTED_EDGE('',*,*,#1866,.F.); -#1099=ORIENTED_EDGE('',*,*,#1823,.F.); -#1100=ORIENTED_EDGE('',*,*,#1853,.F.); -#1101=ORIENTED_EDGE('',*,*,#1813,.F.); -#1102=ORIENTED_EDGE('',*,*,#1867,.F.); -#1103=ORIENTED_EDGE('',*,*,#1819,.F.); -#1104=ORIENTED_EDGE('',*,*,#1852,.F.); -#1105=ORIENTED_EDGE('',*,*,#1843,.F.); -#1106=ORIENTED_EDGE('',*,*,#1864,.F.); -#1107=ORIENTED_EDGE('',*,*,#1815,.F.); -#1108=ORIENTED_EDGE('',*,*,#1847,.T.); -#1109=ORIENTED_EDGE('',*,*,#1859,.F.); -#1110=ORIENTED_EDGE('',*,*,#1846,.T.); -#1111=ORIENTED_EDGE('',*,*,#1858,.F.); -#1112=ORIENTED_EDGE('',*,*,#1845,.T.); -#1113=ORIENTED_EDGE('',*,*,#1857,.F.); -#1114=ORIENTED_EDGE('',*,*,#1844,.T.); -#1115=ORIENTED_EDGE('',*,*,#1856,.F.); -#1116=ORIENTED_EDGE('',*,*,#1868,.F.); -#1117=ORIENTED_EDGE('',*,*,#1869,.F.); -#1118=ORIENTED_EDGE('',*,*,#1870,.F.); -#1119=ORIENTED_EDGE('',*,*,#1871,.F.); -#1120=ORIENTED_EDGE('',*,*,#1872,.T.); -#1121=ORIENTED_EDGE('',*,*,#1873,.T.); -#1122=ORIENTED_EDGE('',*,*,#1874,.F.); -#1123=ORIENTED_EDGE('',*,*,#1875,.T.); -#1124=ORIENTED_EDGE('',*,*,#1876,.F.); -#1125=ORIENTED_EDGE('',*,*,#1877,.T.); -#1126=ORIENTED_EDGE('',*,*,#1878,.T.); -#1127=ORIENTED_EDGE('',*,*,#1879,.T.); -#1128=ORIENTED_EDGE('',*,*,#1880,.F.); -#1129=ORIENTED_EDGE('',*,*,#1881,.T.); -#1130=ORIENTED_EDGE('',*,*,#1882,.T.); -#1131=ORIENTED_EDGE('',*,*,#1883,.T.); -#1132=ORIENTED_EDGE('',*,*,#1884,.T.); -#1133=ORIENTED_EDGE('',*,*,#1885,.T.); -#1134=ORIENTED_EDGE('',*,*,#1886,.F.); -#1135=ORIENTED_EDGE('',*,*,#1887,.T.); -#1136=ORIENTED_EDGE('',*,*,#1888,.F.); -#1137=ORIENTED_EDGE('',*,*,#1889,.T.); -#1138=ORIENTED_EDGE('',*,*,#1872,.F.); -#1139=ORIENTED_EDGE('',*,*,#1890,.T.); -#1140=ORIENTED_EDGE('',*,*,#1891,.F.); -#1141=ORIENTED_EDGE('',*,*,#1892,.F.); -#1142=ORIENTED_EDGE('',*,*,#1893,.F.); -#1143=ORIENTED_EDGE('',*,*,#1894,.F.); -#1144=ORIENTED_EDGE('',*,*,#1895,.T.); -#1145=ORIENTED_EDGE('',*,*,#1896,.F.); -#1146=ORIENTED_EDGE('',*,*,#1897,.T.); -#1147=ORIENTED_EDGE('',*,*,#1898,.F.); -#1148=ORIENTED_EDGE('',*,*,#1874,.T.); -#1149=ORIENTED_EDGE('',*,*,#1899,.T.); -#1150=ORIENTED_EDGE('',*,*,#1900,.T.); -#1151=ORIENTED_EDGE('',*,*,#1901,.T.); -#1152=ORIENTED_EDGE('',*,*,#1902,.T.); -#1153=ORIENTED_EDGE('',*,*,#1903,.T.); -#1154=ORIENTED_EDGE('',*,*,#1876,.T.); -#1155=ORIENTED_EDGE('',*,*,#1904,.T.); -#1156=ORIENTED_EDGE('',*,*,#1905,.F.); -#1157=ORIENTED_EDGE('',*,*,#1906,.T.); -#1158=ORIENTED_EDGE('',*,*,#1878,.F.); -#1159=ORIENTED_EDGE('',*,*,#1907,.T.); -#1160=ORIENTED_EDGE('',*,*,#1908,.T.); -#1161=ORIENTED_EDGE('',*,*,#1909,.T.); -#1162=ORIENTED_EDGE('',*,*,#1910,.T.); -#1163=ORIENTED_EDGE('',*,*,#1911,.F.); -#1164=ORIENTED_EDGE('',*,*,#1912,.T.); -#1165=ORIENTED_EDGE('',*,*,#1913,.F.); -#1166=ORIENTED_EDGE('',*,*,#1914,.T.); -#1167=ORIENTED_EDGE('',*,*,#1915,.T.); -#1168=ORIENTED_EDGE('',*,*,#1884,.F.); -#1169=ORIENTED_EDGE('',*,*,#1916,.T.); -#1170=ORIENTED_EDGE('',*,*,#1917,.F.); -#1171=ORIENTED_EDGE('',*,*,#1918,.T.); -#1172=ORIENTED_EDGE('',*,*,#1919,.T.); -#1173=ORIENTED_EDGE('',*,*,#1920,.T.); -#1174=ORIENTED_EDGE('',*,*,#1886,.T.); -#1175=ORIENTED_EDGE('',*,*,#1921,.T.); -#1176=ORIENTED_EDGE('',*,*,#1922,.T.); -#1177=ORIENTED_EDGE('',*,*,#1923,.T.); -#1178=ORIENTED_EDGE('',*,*,#1880,.T.); -#1179=ORIENTED_EDGE('',*,*,#1924,.T.); -#1180=ORIENTED_EDGE('',*,*,#1882,.F.); -#1181=ORIENTED_EDGE('',*,*,#1925,.T.); -#1182=ORIENTED_EDGE('',*,*,#1926,.F.); -#1183=ORIENTED_EDGE('',*,*,#1927,.T.); -#1184=ORIENTED_EDGE('',*,*,#1928,.T.); -#1185=ORIENTED_EDGE('',*,*,#1929,.T.); -#1186=ORIENTED_EDGE('',*,*,#1930,.T.); -#1187=ORIENTED_EDGE('',*,*,#1931,.T.); -#1188=ORIENTED_EDGE('',*,*,#1900,.F.); -#1189=ORIENTED_EDGE('',*,*,#1932,.T.); -#1190=ORIENTED_EDGE('',*,*,#1888,.T.); -#1191=ORIENTED_EDGE('',*,*,#1933,.T.); -#1192=ORIENTED_EDGE('',*,*,#1905,.T.); -#1193=ORIENTED_EDGE('',*,*,#1934,.T.); -#1194=ORIENTED_EDGE('',*,*,#1902,.F.); -#1195=ORIENTED_EDGE('',*,*,#1935,.T.); -#1196=ORIENTED_EDGE('',*,*,#1919,.F.); -#1197=ORIENTED_EDGE('',*,*,#1936,.T.); -#1198=ORIENTED_EDGE('',*,*,#1917,.T.); -#1199=ORIENTED_EDGE('',*,*,#1937,.T.); -#1200=ORIENTED_EDGE('',*,*,#1926,.T.); -#1201=ORIENTED_EDGE('',*,*,#1938,.T.); -#1202=ORIENTED_EDGE('',*,*,#1922,.F.); -#1203=ORIENTED_EDGE('',*,*,#1939,.T.); -#1204=ORIENTED_EDGE('',*,*,#1932,.F.); -#1205=ORIENTED_EDGE('',*,*,#1899,.F.); -#1206=ORIENTED_EDGE('',*,*,#1873,.F.); -#1207=ORIENTED_EDGE('',*,*,#1889,.F.); -#1208=ORIENTED_EDGE('',*,*,#1933,.F.); -#1209=ORIENTED_EDGE('',*,*,#1890,.F.); -#1210=ORIENTED_EDGE('',*,*,#1879,.F.); -#1211=ORIENTED_EDGE('',*,*,#1906,.F.); -#1212=ORIENTED_EDGE('',*,*,#1934,.F.); -#1213=ORIENTED_EDGE('',*,*,#1907,.F.); -#1214=ORIENTED_EDGE('',*,*,#1877,.F.); -#1215=ORIENTED_EDGE('',*,*,#1903,.F.); -#1216=ORIENTED_EDGE('',*,*,#1935,.F.); -#1217=ORIENTED_EDGE('',*,*,#1904,.F.); -#1218=ORIENTED_EDGE('',*,*,#1875,.F.); -#1219=ORIENTED_EDGE('',*,*,#1901,.F.); -#1220=ORIENTED_EDGE('',*,*,#1938,.F.); -#1221=ORIENTED_EDGE('',*,*,#1925,.F.); -#1222=ORIENTED_EDGE('',*,*,#1881,.F.); -#1223=ORIENTED_EDGE('',*,*,#1923,.F.); -#1224=ORIENTED_EDGE('',*,*,#1939,.F.); -#1225=ORIENTED_EDGE('',*,*,#1924,.F.); -#1226=ORIENTED_EDGE('',*,*,#1887,.F.); -#1227=ORIENTED_EDGE('',*,*,#1920,.F.); -#1228=ORIENTED_EDGE('',*,*,#1937,.F.); -#1229=ORIENTED_EDGE('',*,*,#1916,.F.); -#1230=ORIENTED_EDGE('',*,*,#1883,.F.); -#1231=ORIENTED_EDGE('',*,*,#1927,.F.); -#1232=ORIENTED_EDGE('',*,*,#1936,.F.); -#1233=ORIENTED_EDGE('',*,*,#1921,.F.); -#1234=ORIENTED_EDGE('',*,*,#1885,.F.); -#1235=ORIENTED_EDGE('',*,*,#1918,.F.); -#1236=ORIENTED_EDGE('',*,*,#1871,.T.); -#1237=ORIENTED_EDGE('',*,*,#1931,.F.); -#1238=ORIENTED_EDGE('',*,*,#1870,.T.); -#1239=ORIENTED_EDGE('',*,*,#1930,.F.); -#1240=ORIENTED_EDGE('',*,*,#1869,.T.); -#1241=ORIENTED_EDGE('',*,*,#1929,.F.); -#1242=ORIENTED_EDGE('',*,*,#1868,.T.); -#1243=ORIENTED_EDGE('',*,*,#1928,.F.); -#1244=ORIENTED_EDGE('',*,*,#1940,.T.); -#1245=ORIENTED_EDGE('',*,*,#1891,.T.); -#1246=ORIENTED_EDGE('',*,*,#1941,.F.); -#1247=ORIENTED_EDGE('',*,*,#1909,.F.); -#1248=ORIENTED_EDGE('',*,*,#1941,.T.); -#1249=ORIENTED_EDGE('',*,*,#1898,.T.); -#1250=ORIENTED_EDGE('',*,*,#1942,.F.); -#1251=ORIENTED_EDGE('',*,*,#1910,.F.); -#1252=ORIENTED_EDGE('',*,*,#1911,.T.); -#1253=ORIENTED_EDGE('',*,*,#1942,.T.); -#1254=ORIENTED_EDGE('',*,*,#1897,.F.); -#1255=ORIENTED_EDGE('',*,*,#1943,.F.); -#1256=ORIENTED_EDGE('',*,*,#1943,.T.); -#1257=ORIENTED_EDGE('',*,*,#1896,.T.); -#1258=ORIENTED_EDGE('',*,*,#1944,.F.); -#1259=ORIENTED_EDGE('',*,*,#1912,.F.); -#1260=ORIENTED_EDGE('',*,*,#1913,.T.); -#1261=ORIENTED_EDGE('',*,*,#1944,.T.); -#1262=ORIENTED_EDGE('',*,*,#1895,.F.); -#1263=ORIENTED_EDGE('',*,*,#1945,.F.); -#1264=ORIENTED_EDGE('',*,*,#1945,.T.); -#1265=ORIENTED_EDGE('',*,*,#1894,.T.); -#1266=ORIENTED_EDGE('',*,*,#1946,.F.); -#1267=ORIENTED_EDGE('',*,*,#1914,.F.); -#1268=ORIENTED_EDGE('',*,*,#1946,.T.); -#1269=ORIENTED_EDGE('',*,*,#1893,.T.); -#1270=ORIENTED_EDGE('',*,*,#1947,.F.); -#1271=ORIENTED_EDGE('',*,*,#1915,.F.); -#1272=ORIENTED_EDGE('',*,*,#1947,.T.); -#1273=ORIENTED_EDGE('',*,*,#1892,.T.); -#1274=ORIENTED_EDGE('',*,*,#1940,.F.); -#1275=ORIENTED_EDGE('',*,*,#1908,.F.); -#1276=ORIENTED_EDGE('',*,*,#1948,.F.); -#1277=ORIENTED_EDGE('',*,*,#1949,.F.); -#1278=ORIENTED_EDGE('',*,*,#1950,.F.); -#1279=ORIENTED_EDGE('',*,*,#1951,.F.); -#1280=ORIENTED_EDGE('',*,*,#1952,.T.); -#1281=ORIENTED_EDGE('',*,*,#1953,.T.); -#1282=ORIENTED_EDGE('',*,*,#1954,.F.); -#1283=ORIENTED_EDGE('',*,*,#1955,.T.); -#1284=ORIENTED_EDGE('',*,*,#1956,.T.); -#1285=ORIENTED_EDGE('',*,*,#1957,.T.); -#1286=ORIENTED_EDGE('',*,*,#1958,.F.); -#1287=ORIENTED_EDGE('',*,*,#1959,.T.); -#1288=ORIENTED_EDGE('',*,*,#1960,.T.); -#1289=ORIENTED_EDGE('',*,*,#1961,.T.); -#1290=ORIENTED_EDGE('',*,*,#1962,.T.); -#1291=ORIENTED_EDGE('',*,*,#1963,.T.); -#1292=ORIENTED_EDGE('',*,*,#1964,.T.); -#1293=ORIENTED_EDGE('',*,*,#1965,.T.); -#1294=ORIENTED_EDGE('',*,*,#1966,.T.); -#1295=ORIENTED_EDGE('',*,*,#1967,.T.); -#1296=ORIENTED_EDGE('',*,*,#1968,.T.); -#1297=ORIENTED_EDGE('',*,*,#1969,.T.); -#1298=ORIENTED_EDGE('',*,*,#1970,.T.); -#1299=ORIENTED_EDGE('',*,*,#1971,.T.); -#1300=ORIENTED_EDGE('',*,*,#1972,.T.); -#1301=ORIENTED_EDGE('',*,*,#1973,.T.); -#1302=ORIENTED_EDGE('',*,*,#1974,.T.); -#1303=ORIENTED_EDGE('',*,*,#1975,.T.); -#1304=ORIENTED_EDGE('',*,*,#1976,.T.); -#1305=ORIENTED_EDGE('',*,*,#1977,.T.); -#1306=ORIENTED_EDGE('',*,*,#1978,.T.); -#1307=ORIENTED_EDGE('',*,*,#1979,.T.); -#1308=ORIENTED_EDGE('',*,*,#1980,.T.); -#1309=ORIENTED_EDGE('',*,*,#1981,.T.); -#1310=ORIENTED_EDGE('',*,*,#1982,.T.); -#1311=ORIENTED_EDGE('',*,*,#1983,.T.); -#1312=ORIENTED_EDGE('',*,*,#1984,.T.); -#1313=ORIENTED_EDGE('',*,*,#1985,.T.); -#1314=ORIENTED_EDGE('',*,*,#1986,.T.); -#1315=ORIENTED_EDGE('',*,*,#1987,.T.); -#1316=ORIENTED_EDGE('',*,*,#1988,.T.); -#1317=ORIENTED_EDGE('',*,*,#1989,.T.); -#1318=ORIENTED_EDGE('',*,*,#1990,.T.); -#1319=ORIENTED_EDGE('',*,*,#1991,.T.); -#1320=ORIENTED_EDGE('',*,*,#1992,.T.); -#1321=ORIENTED_EDGE('',*,*,#1993,.T.); -#1322=ORIENTED_EDGE('',*,*,#1994,.T.); -#1323=ORIENTED_EDGE('',*,*,#1995,.T.); -#1324=ORIENTED_EDGE('',*,*,#1996,.T.); -#1325=ORIENTED_EDGE('',*,*,#1997,.T.); -#1326=ORIENTED_EDGE('',*,*,#1998,.T.); -#1327=ORIENTED_EDGE('',*,*,#1999,.T.); -#1328=ORIENTED_EDGE('',*,*,#2000,.T.); -#1329=ORIENTED_EDGE('',*,*,#2001,.T.); -#1330=ORIENTED_EDGE('',*,*,#2002,.T.); -#1331=ORIENTED_EDGE('',*,*,#2003,.T.); -#1332=ORIENTED_EDGE('',*,*,#2004,.T.); -#1333=ORIENTED_EDGE('',*,*,#2005,.T.); -#1334=ORIENTED_EDGE('',*,*,#2006,.T.); -#1335=ORIENTED_EDGE('',*,*,#2007,.T.); -#1336=ORIENTED_EDGE('',*,*,#2008,.T.); -#1337=ORIENTED_EDGE('',*,*,#2009,.T.); -#1338=ORIENTED_EDGE('',*,*,#2010,.T.); -#1339=ORIENTED_EDGE('',*,*,#2011,.T.); -#1340=ORIENTED_EDGE('',*,*,#2012,.T.); -#1341=ORIENTED_EDGE('',*,*,#2013,.T.); -#1342=ORIENTED_EDGE('',*,*,#2014,.T.); -#1343=ORIENTED_EDGE('',*,*,#2015,.T.); -#1344=ORIENTED_EDGE('',*,*,#2016,.T.); -#1345=ORIENTED_EDGE('',*,*,#2017,.T.); -#1346=ORIENTED_EDGE('',*,*,#2018,.T.); -#1347=ORIENTED_EDGE('',*,*,#2019,.T.); -#1348=ORIENTED_EDGE('',*,*,#2020,.T.); -#1349=ORIENTED_EDGE('',*,*,#2021,.T.); -#1350=ORIENTED_EDGE('',*,*,#2022,.T.); -#1351=ORIENTED_EDGE('',*,*,#2023,.T.); -#1352=ORIENTED_EDGE('',*,*,#2024,.T.); -#1353=ORIENTED_EDGE('',*,*,#2025,.T.); -#1354=ORIENTED_EDGE('',*,*,#2026,.T.); -#1355=ORIENTED_EDGE('',*,*,#2027,.T.); -#1356=ORIENTED_EDGE('',*,*,#2028,.T.); -#1357=ORIENTED_EDGE('',*,*,#2029,.T.); -#1358=ORIENTED_EDGE('',*,*,#2030,.T.); -#1359=ORIENTED_EDGE('',*,*,#2031,.T.); -#1360=ORIENTED_EDGE('',*,*,#2032,.T.); -#1361=ORIENTED_EDGE('',*,*,#2033,.T.); -#1362=ORIENTED_EDGE('',*,*,#2034,.T.); -#1363=ORIENTED_EDGE('',*,*,#2035,.T.); -#1364=ORIENTED_EDGE('',*,*,#2036,.T.); -#1365=ORIENTED_EDGE('',*,*,#2037,.T.); -#1366=ORIENTED_EDGE('',*,*,#2038,.T.); -#1367=ORIENTED_EDGE('',*,*,#2039,.T.); -#1368=ORIENTED_EDGE('',*,*,#2040,.T.); -#1369=ORIENTED_EDGE('',*,*,#2041,.T.); -#1370=ORIENTED_EDGE('',*,*,#2042,.T.); -#1371=ORIENTED_EDGE('',*,*,#2043,.T.); -#1372=ORIENTED_EDGE('',*,*,#2044,.T.); -#1373=ORIENTED_EDGE('',*,*,#2045,.T.); -#1374=ORIENTED_EDGE('',*,*,#2046,.T.); -#1375=ORIENTED_EDGE('',*,*,#2047,.T.); -#1376=ORIENTED_EDGE('',*,*,#2048,.T.); -#1377=ORIENTED_EDGE('',*,*,#2049,.T.); -#1378=ORIENTED_EDGE('',*,*,#2050,.T.); -#1379=ORIENTED_EDGE('',*,*,#2051,.T.); -#1380=ORIENTED_EDGE('',*,*,#2052,.T.); -#1381=ORIENTED_EDGE('',*,*,#2053,.T.); -#1382=ORIENTED_EDGE('',*,*,#2054,.T.); -#1383=ORIENTED_EDGE('',*,*,#2055,.T.); -#1384=ORIENTED_EDGE('',*,*,#2056,.T.); -#1385=ORIENTED_EDGE('',*,*,#2057,.T.); -#1386=ORIENTED_EDGE('',*,*,#2058,.T.); -#1387=ORIENTED_EDGE('',*,*,#2059,.T.); -#1388=ORIENTED_EDGE('',*,*,#2060,.T.); -#1389=ORIENTED_EDGE('',*,*,#2061,.T.); -#1390=ORIENTED_EDGE('',*,*,#2062,.F.); -#1391=ORIENTED_EDGE('',*,*,#2063,.T.); -#1392=ORIENTED_EDGE('',*,*,#2064,.T.); -#1393=ORIENTED_EDGE('',*,*,#2065,.T.); -#1394=ORIENTED_EDGE('',*,*,#2066,.F.); -#1395=ORIENTED_EDGE('',*,*,#2067,.T.); -#1396=ORIENTED_EDGE('',*,*,#2068,.T.); -#1397=ORIENTED_EDGE('',*,*,#2069,.T.); -#1398=ORIENTED_EDGE('',*,*,#2070,.T.); -#1399=ORIENTED_EDGE('',*,*,#2071,.T.); -#1400=ORIENTED_EDGE('',*,*,#2072,.T.); -#1401=ORIENTED_EDGE('',*,*,#2073,.T.); -#1402=ORIENTED_EDGE('',*,*,#2074,.T.); -#1403=ORIENTED_EDGE('',*,*,#2075,.T.); -#1404=ORIENTED_EDGE('',*,*,#2076,.T.); -#1405=ORIENTED_EDGE('',*,*,#2077,.T.); -#1406=ORIENTED_EDGE('',*,*,#2078,.T.); -#1407=ORIENTED_EDGE('',*,*,#2079,.T.); -#1408=ORIENTED_EDGE('',*,*,#2080,.T.); -#1409=ORIENTED_EDGE('',*,*,#2081,.T.); -#1410=ORIENTED_EDGE('',*,*,#2082,.T.); -#1411=ORIENTED_EDGE('',*,*,#2083,.T.); -#1412=ORIENTED_EDGE('',*,*,#2084,.T.); -#1413=ORIENTED_EDGE('',*,*,#2085,.T.); -#1414=ORIENTED_EDGE('',*,*,#2086,.T.); -#1415=ORIENTED_EDGE('',*,*,#2087,.T.); -#1416=ORIENTED_EDGE('',*,*,#2088,.T.); -#1417=ORIENTED_EDGE('',*,*,#2089,.T.); -#1418=ORIENTED_EDGE('',*,*,#2090,.T.); -#1419=ORIENTED_EDGE('',*,*,#2091,.T.); -#1420=ORIENTED_EDGE('',*,*,#2092,.T.); -#1421=ORIENTED_EDGE('',*,*,#2093,.T.); -#1422=ORIENTED_EDGE('',*,*,#2094,.T.); -#1423=ORIENTED_EDGE('',*,*,#2095,.T.); -#1424=ORIENTED_EDGE('',*,*,#2096,.T.); -#1425=ORIENTED_EDGE('',*,*,#2097,.T.); -#1426=ORIENTED_EDGE('',*,*,#2098,.T.); -#1427=ORIENTED_EDGE('',*,*,#2099,.T.); -#1428=ORIENTED_EDGE('',*,*,#2064,.F.); -#1429=ORIENTED_EDGE('',*,*,#2100,.T.); -#1430=ORIENTED_EDGE('',*,*,#1958,.T.); -#1431=ORIENTED_EDGE('',*,*,#2101,.T.); -#1432=ORIENTED_EDGE('',*,*,#2062,.T.); -#1433=ORIENTED_EDGE('',*,*,#2102,.T.); -#1434=ORIENTED_EDGE('',*,*,#1952,.F.); -#1435=ORIENTED_EDGE('',*,*,#2103,.T.); -#1436=ORIENTED_EDGE('',*,*,#1954,.T.); -#1437=ORIENTED_EDGE('',*,*,#2104,.T.); -#1438=ORIENTED_EDGE('',*,*,#2060,.F.); -#1439=ORIENTED_EDGE('',*,*,#2105,.T.); -#1440=ORIENTED_EDGE('',*,*,#2066,.T.); -#1441=ORIENTED_EDGE('',*,*,#2106,.T.); -#1442=ORIENTED_EDGE('',*,*,#1956,.F.); -#1443=ORIENTED_EDGE('',*,*,#2107,.T.); -#1444=ORIENTED_EDGE('',*,*,#1953,.F.); -#1445=ORIENTED_EDGE('',*,*,#2102,.F.); -#1446=ORIENTED_EDGE('',*,*,#2061,.F.); -#1447=ORIENTED_EDGE('',*,*,#2104,.F.); -#1448=ORIENTED_EDGE('',*,*,#1959,.F.); -#1449=ORIENTED_EDGE('',*,*,#2100,.F.); -#1450=ORIENTED_EDGE('',*,*,#2063,.F.); -#1451=ORIENTED_EDGE('',*,*,#2103,.F.); -#1452=ORIENTED_EDGE('',*,*,#1957,.F.); -#1453=ORIENTED_EDGE('',*,*,#2106,.F.); -#1454=ORIENTED_EDGE('',*,*,#2065,.F.); -#1455=ORIENTED_EDGE('',*,*,#2101,.F.); -#1456=ORIENTED_EDGE('',*,*,#1955,.F.); -#1457=ORIENTED_EDGE('',*,*,#2105,.F.); -#1458=ORIENTED_EDGE('',*,*,#2067,.F.); -#1459=ORIENTED_EDGE('',*,*,#2107,.F.); -#1460=ORIENTED_EDGE('',*,*,#1951,.T.); -#1461=ORIENTED_EDGE('',*,*,#2059,.F.); -#1462=ORIENTED_EDGE('',*,*,#1950,.T.); -#1463=ORIENTED_EDGE('',*,*,#2058,.F.); -#1464=ORIENTED_EDGE('',*,*,#1949,.T.); -#1465=ORIENTED_EDGE('',*,*,#2057,.F.); -#1466=ORIENTED_EDGE('',*,*,#1948,.T.); -#1467=ORIENTED_EDGE('',*,*,#2056,.F.); -#1468=ORIENTED_EDGE('',*,*,#2108,.T.); -#1469=ORIENTED_EDGE('',*,*,#2052,.F.); -#1470=ORIENTED_EDGE('',*,*,#2109,.F.); -#1471=ORIENTED_EDGE('',*,*,#1961,.F.); -#1472=ORIENTED_EDGE('',*,*,#2109,.T.); -#1473=ORIENTED_EDGE('',*,*,#2055,.F.); -#1474=ORIENTED_EDGE('',*,*,#2110,.F.); -#1475=ORIENTED_EDGE('',*,*,#1962,.F.); -#1476=ORIENTED_EDGE('',*,*,#2110,.T.); -#1477=ORIENTED_EDGE('',*,*,#2054,.F.); -#1478=ORIENTED_EDGE('',*,*,#2111,.F.); -#1479=ORIENTED_EDGE('',*,*,#1963,.F.); -#1480=ORIENTED_EDGE('',*,*,#2111,.T.); -#1481=ORIENTED_EDGE('',*,*,#2053,.F.); -#1482=ORIENTED_EDGE('',*,*,#2108,.F.); -#1483=ORIENTED_EDGE('',*,*,#1960,.F.); -#1484=ORIENTED_EDGE('',*,*,#2112,.T.); -#1485=ORIENTED_EDGE('',*,*,#2068,.F.); -#1486=ORIENTED_EDGE('',*,*,#2113,.F.); -#1487=ORIENTED_EDGE('',*,*,#1965,.F.); -#1488=ORIENTED_EDGE('',*,*,#2113,.T.); -#1489=ORIENTED_EDGE('',*,*,#2071,.F.); -#1490=ORIENTED_EDGE('',*,*,#2114,.F.); -#1491=ORIENTED_EDGE('',*,*,#1966,.F.); -#1492=ORIENTED_EDGE('',*,*,#2114,.T.); -#1493=ORIENTED_EDGE('',*,*,#2070,.F.); -#1494=ORIENTED_EDGE('',*,*,#2115,.F.); -#1495=ORIENTED_EDGE('',*,*,#1967,.F.); -#1496=ORIENTED_EDGE('',*,*,#2115,.T.); -#1497=ORIENTED_EDGE('',*,*,#2069,.F.); -#1498=ORIENTED_EDGE('',*,*,#2112,.F.); -#1499=ORIENTED_EDGE('',*,*,#1964,.F.); -#1500=ORIENTED_EDGE('',*,*,#2116,.T.); -#1501=ORIENTED_EDGE('',*,*,#2048,.F.); -#1502=ORIENTED_EDGE('',*,*,#2117,.F.); -#1503=ORIENTED_EDGE('',*,*,#1969,.F.); -#1504=ORIENTED_EDGE('',*,*,#2117,.T.); -#1505=ORIENTED_EDGE('',*,*,#2051,.F.); -#1506=ORIENTED_EDGE('',*,*,#2118,.F.); -#1507=ORIENTED_EDGE('',*,*,#1970,.F.); -#1508=ORIENTED_EDGE('',*,*,#2118,.T.); -#1509=ORIENTED_EDGE('',*,*,#2050,.F.); -#1510=ORIENTED_EDGE('',*,*,#2119,.F.); -#1511=ORIENTED_EDGE('',*,*,#1971,.F.); -#1512=ORIENTED_EDGE('',*,*,#2119,.T.); -#1513=ORIENTED_EDGE('',*,*,#2049,.F.); -#1514=ORIENTED_EDGE('',*,*,#2116,.F.); -#1515=ORIENTED_EDGE('',*,*,#1968,.F.); -#1516=ORIENTED_EDGE('',*,*,#2120,.T.); -#1517=ORIENTED_EDGE('',*,*,#2072,.F.); -#1518=ORIENTED_EDGE('',*,*,#2121,.F.); -#1519=ORIENTED_EDGE('',*,*,#1973,.F.); -#1520=ORIENTED_EDGE('',*,*,#2121,.T.); -#1521=ORIENTED_EDGE('',*,*,#2075,.F.); -#1522=ORIENTED_EDGE('',*,*,#2122,.F.); -#1523=ORIENTED_EDGE('',*,*,#1974,.F.); -#1524=ORIENTED_EDGE('',*,*,#2122,.T.); -#1525=ORIENTED_EDGE('',*,*,#2074,.F.); -#1526=ORIENTED_EDGE('',*,*,#2123,.F.); -#1527=ORIENTED_EDGE('',*,*,#1975,.F.); -#1528=ORIENTED_EDGE('',*,*,#2123,.T.); -#1529=ORIENTED_EDGE('',*,*,#2073,.F.); -#1530=ORIENTED_EDGE('',*,*,#2120,.F.); -#1531=ORIENTED_EDGE('',*,*,#1972,.F.); -#1532=ORIENTED_EDGE('',*,*,#2124,.T.); -#1533=ORIENTED_EDGE('',*,*,#2044,.F.); -#1534=ORIENTED_EDGE('',*,*,#2125,.F.); -#1535=ORIENTED_EDGE('',*,*,#1977,.F.); -#1536=ORIENTED_EDGE('',*,*,#2125,.T.); -#1537=ORIENTED_EDGE('',*,*,#2047,.F.); -#1538=ORIENTED_EDGE('',*,*,#2126,.F.); -#1539=ORIENTED_EDGE('',*,*,#1978,.F.); -#1540=ORIENTED_EDGE('',*,*,#2126,.T.); -#1541=ORIENTED_EDGE('',*,*,#2046,.F.); -#1542=ORIENTED_EDGE('',*,*,#2127,.F.); -#1543=ORIENTED_EDGE('',*,*,#1979,.F.); -#1544=ORIENTED_EDGE('',*,*,#2127,.T.); -#1545=ORIENTED_EDGE('',*,*,#2045,.F.); -#1546=ORIENTED_EDGE('',*,*,#2124,.F.); -#1547=ORIENTED_EDGE('',*,*,#1976,.F.); -#1548=ORIENTED_EDGE('',*,*,#2128,.T.); -#1549=ORIENTED_EDGE('',*,*,#2076,.F.); -#1550=ORIENTED_EDGE('',*,*,#2129,.F.); -#1551=ORIENTED_EDGE('',*,*,#1981,.F.); -#1552=ORIENTED_EDGE('',*,*,#2129,.T.); -#1553=ORIENTED_EDGE('',*,*,#2079,.F.); -#1554=ORIENTED_EDGE('',*,*,#2130,.F.); -#1555=ORIENTED_EDGE('',*,*,#1982,.F.); -#1556=ORIENTED_EDGE('',*,*,#2130,.T.); -#1557=ORIENTED_EDGE('',*,*,#2078,.F.); -#1558=ORIENTED_EDGE('',*,*,#2131,.F.); -#1559=ORIENTED_EDGE('',*,*,#1983,.F.); -#1560=ORIENTED_EDGE('',*,*,#2131,.T.); -#1561=ORIENTED_EDGE('',*,*,#2077,.F.); -#1562=ORIENTED_EDGE('',*,*,#2128,.F.); -#1563=ORIENTED_EDGE('',*,*,#1980,.F.); -#1564=ORIENTED_EDGE('',*,*,#2132,.T.); -#1565=ORIENTED_EDGE('',*,*,#2040,.F.); -#1566=ORIENTED_EDGE('',*,*,#2133,.F.); -#1567=ORIENTED_EDGE('',*,*,#1985,.F.); -#1568=ORIENTED_EDGE('',*,*,#2133,.T.); -#1569=ORIENTED_EDGE('',*,*,#2043,.F.); -#1570=ORIENTED_EDGE('',*,*,#2134,.F.); -#1571=ORIENTED_EDGE('',*,*,#1986,.F.); -#1572=ORIENTED_EDGE('',*,*,#2134,.T.); -#1573=ORIENTED_EDGE('',*,*,#2042,.F.); -#1574=ORIENTED_EDGE('',*,*,#2135,.F.); -#1575=ORIENTED_EDGE('',*,*,#1987,.F.); -#1576=ORIENTED_EDGE('',*,*,#2135,.T.); -#1577=ORIENTED_EDGE('',*,*,#2041,.F.); -#1578=ORIENTED_EDGE('',*,*,#2132,.F.); -#1579=ORIENTED_EDGE('',*,*,#1984,.F.); -#1580=ORIENTED_EDGE('',*,*,#2136,.T.); -#1581=ORIENTED_EDGE('',*,*,#2080,.F.); -#1582=ORIENTED_EDGE('',*,*,#2137,.F.); -#1583=ORIENTED_EDGE('',*,*,#1989,.F.); -#1584=ORIENTED_EDGE('',*,*,#2137,.T.); -#1585=ORIENTED_EDGE('',*,*,#2083,.F.); -#1586=ORIENTED_EDGE('',*,*,#2138,.F.); -#1587=ORIENTED_EDGE('',*,*,#1990,.F.); -#1588=ORIENTED_EDGE('',*,*,#2138,.T.); -#1589=ORIENTED_EDGE('',*,*,#2082,.F.); -#1590=ORIENTED_EDGE('',*,*,#2139,.F.); -#1591=ORIENTED_EDGE('',*,*,#1991,.F.); -#1592=ORIENTED_EDGE('',*,*,#2139,.T.); -#1593=ORIENTED_EDGE('',*,*,#2081,.F.); -#1594=ORIENTED_EDGE('',*,*,#2136,.F.); -#1595=ORIENTED_EDGE('',*,*,#1988,.F.); -#1596=ORIENTED_EDGE('',*,*,#2140,.T.); -#1597=ORIENTED_EDGE('',*,*,#2036,.F.); -#1598=ORIENTED_EDGE('',*,*,#2141,.F.); -#1599=ORIENTED_EDGE('',*,*,#1993,.F.); -#1600=ORIENTED_EDGE('',*,*,#2141,.T.); -#1601=ORIENTED_EDGE('',*,*,#2039,.F.); -#1602=ORIENTED_EDGE('',*,*,#2142,.F.); -#1603=ORIENTED_EDGE('',*,*,#1994,.F.); -#1604=ORIENTED_EDGE('',*,*,#2142,.T.); -#1605=ORIENTED_EDGE('',*,*,#2038,.F.); -#1606=ORIENTED_EDGE('',*,*,#2143,.F.); -#1607=ORIENTED_EDGE('',*,*,#1995,.F.); -#1608=ORIENTED_EDGE('',*,*,#2143,.T.); -#1609=ORIENTED_EDGE('',*,*,#2037,.F.); -#1610=ORIENTED_EDGE('',*,*,#2140,.F.); -#1611=ORIENTED_EDGE('',*,*,#1992,.F.); -#1612=ORIENTED_EDGE('',*,*,#2144,.T.); -#1613=ORIENTED_EDGE('',*,*,#2084,.F.); -#1614=ORIENTED_EDGE('',*,*,#2145,.F.); -#1615=ORIENTED_EDGE('',*,*,#1997,.F.); -#1616=ORIENTED_EDGE('',*,*,#2145,.T.); -#1617=ORIENTED_EDGE('',*,*,#2087,.F.); -#1618=ORIENTED_EDGE('',*,*,#2146,.F.); -#1619=ORIENTED_EDGE('',*,*,#1998,.F.); -#1620=ORIENTED_EDGE('',*,*,#2146,.T.); -#1621=ORIENTED_EDGE('',*,*,#2086,.F.); -#1622=ORIENTED_EDGE('',*,*,#2147,.F.); -#1623=ORIENTED_EDGE('',*,*,#1999,.F.); -#1624=ORIENTED_EDGE('',*,*,#2147,.T.); -#1625=ORIENTED_EDGE('',*,*,#2085,.F.); -#1626=ORIENTED_EDGE('',*,*,#2144,.F.); -#1627=ORIENTED_EDGE('',*,*,#1996,.F.); -#1628=ORIENTED_EDGE('',*,*,#2148,.T.); -#1629=ORIENTED_EDGE('',*,*,#2032,.F.); -#1630=ORIENTED_EDGE('',*,*,#2149,.F.); -#1631=ORIENTED_EDGE('',*,*,#2001,.F.); -#1632=ORIENTED_EDGE('',*,*,#2149,.T.); -#1633=ORIENTED_EDGE('',*,*,#2035,.F.); -#1634=ORIENTED_EDGE('',*,*,#2150,.F.); -#1635=ORIENTED_EDGE('',*,*,#2002,.F.); -#1636=ORIENTED_EDGE('',*,*,#2150,.T.); -#1637=ORIENTED_EDGE('',*,*,#2034,.F.); -#1638=ORIENTED_EDGE('',*,*,#2151,.F.); -#1639=ORIENTED_EDGE('',*,*,#2003,.F.); -#1640=ORIENTED_EDGE('',*,*,#2151,.T.); -#1641=ORIENTED_EDGE('',*,*,#2033,.F.); -#1642=ORIENTED_EDGE('',*,*,#2148,.F.); -#1643=ORIENTED_EDGE('',*,*,#2000,.F.); -#1644=ORIENTED_EDGE('',*,*,#2152,.T.); -#1645=ORIENTED_EDGE('',*,*,#2088,.F.); -#1646=ORIENTED_EDGE('',*,*,#2153,.F.); -#1647=ORIENTED_EDGE('',*,*,#2005,.F.); -#1648=ORIENTED_EDGE('',*,*,#2153,.T.); -#1649=ORIENTED_EDGE('',*,*,#2091,.F.); -#1650=ORIENTED_EDGE('',*,*,#2154,.F.); -#1651=ORIENTED_EDGE('',*,*,#2006,.F.); -#1652=ORIENTED_EDGE('',*,*,#2154,.T.); -#1653=ORIENTED_EDGE('',*,*,#2090,.F.); -#1654=ORIENTED_EDGE('',*,*,#2155,.F.); -#1655=ORIENTED_EDGE('',*,*,#2007,.F.); -#1656=ORIENTED_EDGE('',*,*,#2155,.T.); -#1657=ORIENTED_EDGE('',*,*,#2089,.F.); -#1658=ORIENTED_EDGE('',*,*,#2152,.F.); -#1659=ORIENTED_EDGE('',*,*,#2004,.F.); -#1660=ORIENTED_EDGE('',*,*,#2156,.T.); -#1661=ORIENTED_EDGE('',*,*,#2028,.F.); -#1662=ORIENTED_EDGE('',*,*,#2157,.F.); -#1663=ORIENTED_EDGE('',*,*,#2009,.F.); -#1664=ORIENTED_EDGE('',*,*,#2157,.T.); -#1665=ORIENTED_EDGE('',*,*,#2031,.F.); -#1666=ORIENTED_EDGE('',*,*,#2158,.F.); -#1667=ORIENTED_EDGE('',*,*,#2010,.F.); -#1668=ORIENTED_EDGE('',*,*,#2158,.T.); -#1669=ORIENTED_EDGE('',*,*,#2030,.F.); -#1670=ORIENTED_EDGE('',*,*,#2159,.F.); -#1671=ORIENTED_EDGE('',*,*,#2011,.F.); -#1672=ORIENTED_EDGE('',*,*,#2159,.T.); -#1673=ORIENTED_EDGE('',*,*,#2029,.F.); -#1674=ORIENTED_EDGE('',*,*,#2156,.F.); -#1675=ORIENTED_EDGE('',*,*,#2008,.F.); -#1676=ORIENTED_EDGE('',*,*,#2160,.T.); -#1677=ORIENTED_EDGE('',*,*,#2092,.F.); -#1678=ORIENTED_EDGE('',*,*,#2161,.F.); -#1679=ORIENTED_EDGE('',*,*,#2013,.F.); -#1680=ORIENTED_EDGE('',*,*,#2161,.T.); -#1681=ORIENTED_EDGE('',*,*,#2095,.F.); -#1682=ORIENTED_EDGE('',*,*,#2162,.F.); -#1683=ORIENTED_EDGE('',*,*,#2014,.F.); -#1684=ORIENTED_EDGE('',*,*,#2162,.T.); -#1685=ORIENTED_EDGE('',*,*,#2094,.F.); -#1686=ORIENTED_EDGE('',*,*,#2163,.F.); -#1687=ORIENTED_EDGE('',*,*,#2015,.F.); -#1688=ORIENTED_EDGE('',*,*,#2163,.T.); -#1689=ORIENTED_EDGE('',*,*,#2093,.F.); -#1690=ORIENTED_EDGE('',*,*,#2160,.F.); -#1691=ORIENTED_EDGE('',*,*,#2012,.F.); -#1692=ORIENTED_EDGE('',*,*,#2164,.T.); -#1693=ORIENTED_EDGE('',*,*,#2024,.F.); -#1694=ORIENTED_EDGE('',*,*,#2165,.F.); -#1695=ORIENTED_EDGE('',*,*,#2017,.F.); -#1696=ORIENTED_EDGE('',*,*,#2165,.T.); -#1697=ORIENTED_EDGE('',*,*,#2027,.F.); -#1698=ORIENTED_EDGE('',*,*,#2166,.F.); -#1699=ORIENTED_EDGE('',*,*,#2018,.F.); -#1700=ORIENTED_EDGE('',*,*,#2166,.T.); -#1701=ORIENTED_EDGE('',*,*,#2026,.F.); -#1702=ORIENTED_EDGE('',*,*,#2167,.F.); -#1703=ORIENTED_EDGE('',*,*,#2019,.F.); -#1704=ORIENTED_EDGE('',*,*,#2167,.T.); -#1705=ORIENTED_EDGE('',*,*,#2025,.F.); -#1706=ORIENTED_EDGE('',*,*,#2164,.F.); -#1707=ORIENTED_EDGE('',*,*,#2016,.F.); -#1708=ORIENTED_EDGE('',*,*,#2168,.T.); -#1709=ORIENTED_EDGE('',*,*,#2096,.F.); -#1710=ORIENTED_EDGE('',*,*,#2169,.F.); -#1711=ORIENTED_EDGE('',*,*,#2021,.F.); -#1712=ORIENTED_EDGE('',*,*,#2169,.T.); -#1713=ORIENTED_EDGE('',*,*,#2099,.F.); -#1714=ORIENTED_EDGE('',*,*,#2170,.F.); -#1715=ORIENTED_EDGE('',*,*,#2022,.F.); -#1716=ORIENTED_EDGE('',*,*,#2170,.T.); -#1717=ORIENTED_EDGE('',*,*,#2098,.F.); -#1718=ORIENTED_EDGE('',*,*,#2171,.F.); -#1719=ORIENTED_EDGE('',*,*,#2023,.F.); -#1720=ORIENTED_EDGE('',*,*,#2171,.T.); -#1721=ORIENTED_EDGE('',*,*,#2097,.F.); -#1722=ORIENTED_EDGE('',*,*,#2168,.F.); -#1723=ORIENTED_EDGE('',*,*,#2020,.F.); -#1724=EDGE_CURVE('',#2172,#2172,#2484,.T.); -#1725=EDGE_CURVE('',#2173,#2173,#2485,.T.); -#1726=EDGE_CURVE('',#2174,#2174,#2486,.T.); -#1727=EDGE_CURVE('',#2175,#2175,#2487,.T.); -#1728=EDGE_CURVE('',#2176,#2177,#156,.T.); -#1729=EDGE_CURVE('',#2176,#2178,#2488,.T.); -#1730=EDGE_CURVE('',#2178,#2179,#157,.T.); -#1731=EDGE_CURVE('',#2179,#2180,#2489,.T.); -#1732=EDGE_CURVE('',#2180,#2181,#158,.T.); -#1733=EDGE_CURVE('',#2181,#2182,#2490,.T.); -#1734=EDGE_CURVE('',#2183,#2182,#159,.T.); -#1735=EDGE_CURVE('',#2183,#2177,#2491,.T.); -#1736=EDGE_CURVE('',#2184,#2185,#160,.T.); -#1737=EDGE_CURVE('',#2185,#2183,#161,.T.); -#1738=EDGE_CURVE('',#2182,#2184,#162,.F.); -#1739=EDGE_CURVE('',#2186,#2187,#163,.T.); -#1740=EDGE_CURVE('',#2186,#2181,#164,.T.); -#1741=EDGE_CURVE('',#2180,#2187,#165,.F.); -#1742=EDGE_CURVE('',#2178,#2188,#166,.F.); -#1743=EDGE_CURVE('',#2189,#2188,#167,.T.); -#1744=EDGE_CURVE('',#2189,#2179,#168,.T.); -#1745=EDGE_CURVE('',#2190,#2191,#169,.T.); -#1746=EDGE_CURVE('',#2191,#2176,#170,.T.); -#1747=EDGE_CURVE('',#2177,#2190,#171,.F.); -#1748=EDGE_CURVE('',#2192,#2192,#2492,.T.); -#1749=EDGE_CURVE('',#2193,#2193,#2493,.T.); -#1750=EDGE_CURVE('',#2194,#2194,#2494,.T.); -#1751=EDGE_CURVE('',#2195,#2195,#2495,.T.); -#1752=EDGE_CURVE('',#2188,#2191,#2496,.F.); -#1753=EDGE_CURVE('',#2190,#2185,#2497,.F.); -#1754=EDGE_CURVE('',#2184,#2186,#2498,.F.); -#1755=EDGE_CURVE('',#2187,#2189,#2499,.F.); -#1756=EDGE_CURVE('',#2196,#2196,#2500,.T.); -#1757=EDGE_CURVE('',#2197,#2197,#2501,.T.); -#1758=EDGE_CURVE('',#2198,#2198,#2502,.T.); -#1759=EDGE_CURVE('',#2199,#2199,#2503,.T.); -#1760=EDGE_CURVE('',#2200,#2201,#172,.T.); -#1761=EDGE_CURVE('',#2201,#2202,#2504,.T.); -#1762=EDGE_CURVE('',#2203,#2202,#173,.T.); -#1763=EDGE_CURVE('',#2203,#2204,#2505,.T.); -#1764=EDGE_CURVE('',#2205,#2204,#174,.T.); -#1765=EDGE_CURVE('',#2205,#2206,#2506,.T.); -#1766=EDGE_CURVE('',#2206,#2207,#175,.T.); -#1767=EDGE_CURVE('',#2207,#2200,#2507,.T.); -#1768=EDGE_CURVE('',#2208,#2209,#176,.T.); -#1769=EDGE_CURVE('',#2208,#2210,#2508,.F.); -#1770=EDGE_CURVE('',#2211,#2210,#177,.T.); -#1771=EDGE_CURVE('',#2211,#2212,#2509,.F.); -#1772=EDGE_CURVE('',#2212,#2213,#178,.T.); -#1773=EDGE_CURVE('',#2213,#2214,#2510,.F.); -#1774=EDGE_CURVE('',#2214,#2215,#179,.T.); -#1775=EDGE_CURVE('',#2215,#2209,#2511,.F.); -#1776=EDGE_CURVE('',#2216,#2216,#2512,.T.); -#1777=EDGE_CURVE('',#2217,#2217,#2513,.T.); -#1778=EDGE_CURVE('',#2218,#2218,#2514,.T.); -#1779=EDGE_CURVE('',#2219,#2219,#2515,.T.); -#1780=EDGE_CURVE('',#2220,#2221,#180,.T.); -#1781=EDGE_CURVE('',#2221,#2222,#2516,.F.); -#1782=EDGE_CURVE('',#2223,#2222,#181,.T.); -#1783=EDGE_CURVE('',#2223,#2224,#2517,.F.); -#1784=EDGE_CURVE('',#2225,#2224,#182,.T.); -#1785=EDGE_CURVE('',#2225,#2226,#2518,.F.); -#1786=EDGE_CURVE('',#2226,#2227,#183,.T.); -#1787=EDGE_CURVE('',#2227,#2220,#2519,.F.); -#1788=EDGE_CURVE('',#2228,#2229,#184,.T.); -#1789=EDGE_CURVE('',#2228,#2230,#2520,.T.); -#1790=EDGE_CURVE('',#2231,#2230,#185,.T.); -#1791=EDGE_CURVE('',#2231,#2232,#2521,.T.); -#1792=EDGE_CURVE('',#2232,#2233,#186,.T.); -#1793=EDGE_CURVE('',#2233,#2234,#2522,.T.); -#1794=EDGE_CURVE('',#2234,#2235,#187,.T.); -#1795=EDGE_CURVE('',#2235,#2229,#2523,.T.); -#1796=EDGE_CURVE('',#2224,#2207,#188,.T.); -#1797=EDGE_CURVE('',#2206,#2225,#189,.F.); -#1798=EDGE_CURVE('',#2226,#2205,#190,.T.); -#1799=EDGE_CURVE('',#2204,#2227,#191,.F.); -#1800=EDGE_CURVE('',#2202,#2221,#192,.F.); -#1801=EDGE_CURVE('',#2220,#2203,#193,.T.); -#1802=EDGE_CURVE('',#2222,#2201,#194,.T.); -#1803=EDGE_CURVE('',#2200,#2223,#195,.F.); -#1804=EDGE_CURVE('',#2229,#2211,#196,.F.); -#1805=EDGE_CURVE('',#2210,#2228,#197,.T.); -#1806=EDGE_CURVE('',#2234,#2213,#198,.F.); -#1807=EDGE_CURVE('',#2212,#2235,#199,.T.); -#1808=EDGE_CURVE('',#2214,#2233,#200,.T.); -#1809=EDGE_CURVE('',#2232,#2215,#201,.F.); -#1810=EDGE_CURVE('',#2230,#2208,#202,.F.); -#1811=EDGE_CURVE('',#2209,#2231,#203,.T.); -#1812=EDGE_CURVE('',#2236,#2237,#204,.T.); -#1813=EDGE_CURVE('',#2237,#2238,#205,.F.); -#1814=EDGE_CURVE('',#2239,#2238,#206,.T.); -#1815=EDGE_CURVE('',#2239,#2236,#207,.T.); -#1816=EDGE_CURVE('',#2240,#2241,#208,.T.); -#1817=EDGE_CURVE('',#2241,#2242,#209,.F.); -#1818=EDGE_CURVE('',#2243,#2242,#210,.T.); -#1819=EDGE_CURVE('',#2243,#2240,#211,.T.); -#1820=EDGE_CURVE('',#2244,#2245,#212,.T.); -#1821=EDGE_CURVE('',#2245,#2246,#213,.F.); -#1822=EDGE_CURVE('',#2247,#2246,#214,.T.); -#1823=EDGE_CURVE('',#2247,#2244,#215,.T.); -#1824=EDGE_CURVE('',#2248,#2249,#216,.T.); -#1825=EDGE_CURVE('',#2249,#2250,#217,.T.); -#1826=EDGE_CURVE('',#2251,#2250,#218,.T.); -#1827=EDGE_CURVE('',#2251,#2248,#219,.F.); -#1828=EDGE_CURVE('',#2252,#2253,#220,.T.); -#1829=EDGE_CURVE('',#2252,#2254,#221,.T.); -#1830=EDGE_CURVE('',#2254,#2255,#222,.T.); -#1831=EDGE_CURVE('',#2255,#2253,#223,.F.); -#1832=EDGE_CURVE('',#2256,#2257,#224,.T.); -#1833=EDGE_CURVE('',#2256,#2258,#225,.F.); -#1834=EDGE_CURVE('',#2258,#2259,#226,.T.); -#1835=EDGE_CURVE('',#2259,#2257,#227,.T.); -#1836=EDGE_CURVE('',#2260,#2261,#228,.T.); -#1837=EDGE_CURVE('',#2260,#2262,#229,.T.); -#1838=EDGE_CURVE('',#2262,#2263,#230,.T.); -#1839=EDGE_CURVE('',#2263,#2261,#231,.F.); -#1840=EDGE_CURVE('',#2264,#2265,#232,.T.); -#1841=EDGE_CURVE('',#2265,#2266,#233,.T.); -#1842=EDGE_CURVE('',#2267,#2266,#234,.T.); -#1843=EDGE_CURVE('',#2267,#2264,#235,.F.); -#1844=EDGE_CURVE('',#2268,#2268,#10,.T.); -#1845=EDGE_CURVE('',#2269,#2269,#11,.T.); -#1846=EDGE_CURVE('',#2270,#2270,#12,.T.); -#1847=EDGE_CURVE('',#2271,#2271,#13,.T.); -#1848=EDGE_CURVE('',#2258,#2260,#14,.T.); -#1849=EDGE_CURVE('',#2261,#2249,#15,.T.); -#1850=EDGE_CURVE('',#2248,#2252,#16,.T.); -#1851=EDGE_CURVE('',#2253,#2259,#17,.T.); -#1852=EDGE_CURVE('',#2264,#2239,#18,.F.); -#1853=EDGE_CURVE('',#2238,#2243,#19,.F.); -#1854=EDGE_CURVE('',#2242,#2247,#20,.F.); -#1855=EDGE_CURVE('',#2246,#2265,#21,.F.); -#1856=EDGE_CURVE('',#2272,#2272,#22,.T.); -#1857=EDGE_CURVE('',#2273,#2273,#23,.T.); -#1858=EDGE_CURVE('',#2274,#2274,#24,.T.); -#1859=EDGE_CURVE('',#2275,#2275,#25,.T.); -#1860=EDGE_CURVE('',#2262,#2256,#26,.F.); -#1861=EDGE_CURVE('',#2257,#2255,#27,.F.); -#1862=EDGE_CURVE('',#2254,#2251,#28,.F.); -#1863=EDGE_CURVE('',#2250,#2263,#29,.F.); -#1864=EDGE_CURVE('',#2236,#2267,#30,.T.); -#1865=EDGE_CURVE('',#2266,#2245,#31,.T.); -#1866=EDGE_CURVE('',#2244,#2241,#32,.T.); -#1867=EDGE_CURVE('',#2240,#2237,#33,.T.); -#1868=EDGE_CURVE('',#2276,#2276,#2524,.T.); -#1869=EDGE_CURVE('',#2277,#2277,#2525,.T.); -#1870=EDGE_CURVE('',#2278,#2278,#2526,.T.); -#1871=EDGE_CURVE('',#2279,#2279,#2527,.T.); -#1872=EDGE_CURVE('',#2280,#2281,#236,.T.); -#1873=EDGE_CURVE('',#2281,#2282,#2528,.T.); -#1874=EDGE_CURVE('',#2283,#2282,#237,.T.); -#1875=EDGE_CURVE('',#2283,#2284,#2529,.T.); -#1876=EDGE_CURVE('',#2285,#2284,#238,.T.); -#1877=EDGE_CURVE('',#2285,#2286,#2530,.T.); -#1878=EDGE_CURVE('',#2286,#2287,#239,.T.); -#1879=EDGE_CURVE('',#2287,#2280,#2531,.T.); -#1880=EDGE_CURVE('',#2288,#2289,#240,.T.); -#1881=EDGE_CURVE('',#2288,#2290,#2532,.F.); -#1882=EDGE_CURVE('',#2290,#2291,#241,.T.); -#1883=EDGE_CURVE('',#2291,#2292,#2533,.F.); -#1884=EDGE_CURVE('',#2292,#2293,#242,.T.); -#1885=EDGE_CURVE('',#2293,#2294,#2534,.F.); -#1886=EDGE_CURVE('',#2295,#2294,#243,.T.); -#1887=EDGE_CURVE('',#2295,#2289,#2535,.F.); -#1888=EDGE_CURVE('',#2296,#2297,#244,.T.); -#1889=EDGE_CURVE('',#2296,#2281,#245,.T.); -#1890=EDGE_CURVE('',#2280,#2297,#246,.F.); -#1891=EDGE_CURVE('',#2298,#2299,#247,.T.); -#1892=EDGE_CURVE('',#2300,#2298,#34,.T.); -#1893=EDGE_CURVE('',#2301,#2300,#248,.T.); -#1894=EDGE_CURVE('',#2302,#2301,#35,.T.); -#1895=EDGE_CURVE('',#2302,#2303,#249,.T.); -#1896=EDGE_CURVE('',#2304,#2303,#36,.T.); -#1897=EDGE_CURVE('',#2304,#2305,#250,.T.); -#1898=EDGE_CURVE('',#2299,#2305,#37,.T.); -#1899=EDGE_CURVE('',#2282,#2306,#251,.F.); -#1900=EDGE_CURVE('',#2306,#2307,#252,.T.); -#1901=EDGE_CURVE('',#2307,#2283,#253,.T.); -#1902=EDGE_CURVE('',#2308,#2309,#254,.T.); -#1903=EDGE_CURVE('',#2309,#2285,#255,.T.); -#1904=EDGE_CURVE('',#2284,#2308,#256,.F.); -#1905=EDGE_CURVE('',#2310,#2311,#257,.T.); -#1906=EDGE_CURVE('',#2310,#2287,#258,.T.); -#1907=EDGE_CURVE('',#2286,#2311,#259,.F.); -#1908=EDGE_CURVE('',#2312,#2313,#38,.T.); -#1909=EDGE_CURVE('',#2313,#2314,#260,.T.); -#1910=EDGE_CURVE('',#2314,#2315,#39,.T.); -#1911=EDGE_CURVE('',#2316,#2315,#261,.T.); -#1912=EDGE_CURVE('',#2316,#2317,#40,.T.); -#1913=EDGE_CURVE('',#2318,#2317,#262,.T.); -#1914=EDGE_CURVE('',#2318,#2319,#41,.T.); -#1915=EDGE_CURVE('',#2319,#2312,#263,.T.); -#1916=EDGE_CURVE('',#2292,#2320,#264,.F.); -#1917=EDGE_CURVE('',#2321,#2320,#265,.T.); -#1918=EDGE_CURVE('',#2321,#2293,#266,.T.); -#1919=EDGE_CURVE('',#2322,#2323,#267,.T.); -#1920=EDGE_CURVE('',#2323,#2295,#268,.T.); -#1921=EDGE_CURVE('',#2294,#2322,#269,.F.); -#1922=EDGE_CURVE('',#2324,#2325,#270,.T.); -#1923=EDGE_CURVE('',#2325,#2288,#271,.T.); -#1924=EDGE_CURVE('',#2289,#2324,#272,.F.); -#1925=EDGE_CURVE('',#2290,#2326,#273,.F.); -#1926=EDGE_CURVE('',#2327,#2326,#274,.T.); -#1927=EDGE_CURVE('',#2327,#2291,#275,.T.); -#1928=EDGE_CURVE('',#2328,#2328,#42,.T.); -#1929=EDGE_CURVE('',#2329,#2329,#43,.T.); -#1930=EDGE_CURVE('',#2330,#2330,#44,.T.); -#1931=EDGE_CURVE('',#2331,#2331,#45,.T.); -#1932=EDGE_CURVE('',#2306,#2296,#46,.F.); -#1933=EDGE_CURVE('',#2297,#2310,#47,.F.); -#1934=EDGE_CURVE('',#2311,#2309,#48,.F.); -#1935=EDGE_CURVE('',#2308,#2307,#49,.F.); -#1936=EDGE_CURVE('',#2322,#2321,#50,.T.); -#1937=EDGE_CURVE('',#2320,#2327,#51,.T.); -#1938=EDGE_CURVE('',#2326,#2325,#52,.T.); -#1939=EDGE_CURVE('',#2324,#2323,#53,.T.); -#1940=EDGE_CURVE('',#2313,#2298,#276,.T.); -#1941=EDGE_CURVE('',#2314,#2299,#277,.T.); -#1942=EDGE_CURVE('',#2315,#2305,#278,.T.); -#1943=EDGE_CURVE('',#2316,#2304,#279,.T.); -#1944=EDGE_CURVE('',#2317,#2303,#280,.T.); -#1945=EDGE_CURVE('',#2318,#2302,#281,.T.); -#1946=EDGE_CURVE('',#2319,#2301,#282,.T.); -#1947=EDGE_CURVE('',#2312,#2300,#283,.T.); -#1948=EDGE_CURVE('',#2332,#2332,#54,.T.); -#1949=EDGE_CURVE('',#2333,#2333,#55,.T.); -#1950=EDGE_CURVE('',#2334,#2334,#56,.T.); -#1951=EDGE_CURVE('',#2335,#2335,#57,.T.); -#1952=EDGE_CURVE('',#2336,#2337,#284,.T.); -#1953=EDGE_CURVE('',#2337,#2338,#58,.T.); -#1954=EDGE_CURVE('',#2339,#2338,#285,.T.); -#1955=EDGE_CURVE('',#2339,#2340,#59,.T.); -#1956=EDGE_CURVE('',#2340,#2341,#286,.T.); -#1957=EDGE_CURVE('',#2341,#2342,#60,.T.); -#1958=EDGE_CURVE('',#2343,#2342,#287,.T.); -#1959=EDGE_CURVE('',#2343,#2336,#61,.T.); -#1960=EDGE_CURVE('',#2344,#2345,#288,.T.); -#1961=EDGE_CURVE('',#2345,#2346,#289,.T.); -#1962=EDGE_CURVE('',#2346,#2347,#290,.T.); -#1963=EDGE_CURVE('',#2347,#2344,#291,.T.); -#1964=EDGE_CURVE('',#2348,#2349,#292,.T.); -#1965=EDGE_CURVE('',#2349,#2350,#293,.T.); -#1966=EDGE_CURVE('',#2350,#2351,#294,.T.); -#1967=EDGE_CURVE('',#2351,#2348,#295,.T.); -#1968=EDGE_CURVE('',#2352,#2353,#296,.T.); -#1969=EDGE_CURVE('',#2353,#2354,#297,.T.); -#1970=EDGE_CURVE('',#2354,#2355,#298,.T.); -#1971=EDGE_CURVE('',#2355,#2352,#299,.T.); -#1972=EDGE_CURVE('',#2356,#2357,#300,.T.); -#1973=EDGE_CURVE('',#2357,#2358,#301,.T.); -#1974=EDGE_CURVE('',#2358,#2359,#302,.T.); -#1975=EDGE_CURVE('',#2359,#2356,#303,.T.); -#1976=EDGE_CURVE('',#2360,#2361,#304,.T.); -#1977=EDGE_CURVE('',#2361,#2362,#305,.T.); -#1978=EDGE_CURVE('',#2362,#2363,#306,.T.); -#1979=EDGE_CURVE('',#2363,#2360,#307,.T.); -#1980=EDGE_CURVE('',#2364,#2365,#308,.T.); -#1981=EDGE_CURVE('',#2365,#2366,#309,.T.); -#1982=EDGE_CURVE('',#2366,#2367,#310,.T.); -#1983=EDGE_CURVE('',#2367,#2364,#311,.T.); -#1984=EDGE_CURVE('',#2368,#2369,#312,.T.); -#1985=EDGE_CURVE('',#2369,#2370,#313,.T.); -#1986=EDGE_CURVE('',#2370,#2371,#314,.T.); -#1987=EDGE_CURVE('',#2371,#2368,#315,.T.); -#1988=EDGE_CURVE('',#2372,#2373,#316,.T.); -#1989=EDGE_CURVE('',#2373,#2374,#317,.T.); -#1990=EDGE_CURVE('',#2374,#2375,#318,.T.); -#1991=EDGE_CURVE('',#2375,#2372,#319,.T.); -#1992=EDGE_CURVE('',#2376,#2377,#320,.T.); -#1993=EDGE_CURVE('',#2377,#2378,#321,.T.); -#1994=EDGE_CURVE('',#2378,#2379,#322,.T.); -#1995=EDGE_CURVE('',#2379,#2376,#323,.T.); -#1996=EDGE_CURVE('',#2380,#2381,#324,.T.); -#1997=EDGE_CURVE('',#2381,#2382,#325,.T.); -#1998=EDGE_CURVE('',#2382,#2383,#326,.T.); -#1999=EDGE_CURVE('',#2383,#2380,#327,.T.); -#2000=EDGE_CURVE('',#2384,#2385,#328,.T.); -#2001=EDGE_CURVE('',#2385,#2386,#329,.T.); -#2002=EDGE_CURVE('',#2386,#2387,#330,.T.); -#2003=EDGE_CURVE('',#2387,#2384,#331,.T.); -#2004=EDGE_CURVE('',#2388,#2389,#332,.T.); -#2005=EDGE_CURVE('',#2389,#2390,#333,.T.); -#2006=EDGE_CURVE('',#2390,#2391,#334,.T.); -#2007=EDGE_CURVE('',#2391,#2388,#335,.T.); -#2008=EDGE_CURVE('',#2392,#2393,#336,.T.); -#2009=EDGE_CURVE('',#2393,#2394,#337,.T.); -#2010=EDGE_CURVE('',#2394,#2395,#338,.T.); -#2011=EDGE_CURVE('',#2395,#2392,#339,.T.); -#2012=EDGE_CURVE('',#2396,#2397,#340,.T.); -#2013=EDGE_CURVE('',#2397,#2398,#341,.T.); -#2014=EDGE_CURVE('',#2398,#2399,#342,.T.); -#2015=EDGE_CURVE('',#2399,#2396,#343,.T.); -#2016=EDGE_CURVE('',#2400,#2401,#344,.T.); -#2017=EDGE_CURVE('',#2401,#2402,#345,.T.); -#2018=EDGE_CURVE('',#2402,#2403,#346,.T.); -#2019=EDGE_CURVE('',#2403,#2400,#347,.T.); -#2020=EDGE_CURVE('',#2404,#2405,#348,.T.); -#2021=EDGE_CURVE('',#2405,#2406,#349,.T.); -#2022=EDGE_CURVE('',#2406,#2407,#350,.T.); -#2023=EDGE_CURVE('',#2407,#2404,#351,.T.); -#2024=EDGE_CURVE('',#2408,#2409,#352,.T.); -#2025=EDGE_CURVE('',#2409,#2410,#353,.T.); -#2026=EDGE_CURVE('',#2410,#2411,#354,.T.); -#2027=EDGE_CURVE('',#2411,#2408,#355,.T.); -#2028=EDGE_CURVE('',#2412,#2413,#356,.T.); -#2029=EDGE_CURVE('',#2413,#2414,#357,.T.); -#2030=EDGE_CURVE('',#2414,#2415,#358,.T.); -#2031=EDGE_CURVE('',#2415,#2412,#359,.T.); -#2032=EDGE_CURVE('',#2416,#2417,#360,.T.); -#2033=EDGE_CURVE('',#2417,#2418,#361,.T.); -#2034=EDGE_CURVE('',#2418,#2419,#362,.T.); -#2035=EDGE_CURVE('',#2419,#2416,#363,.T.); -#2036=EDGE_CURVE('',#2420,#2421,#364,.T.); -#2037=EDGE_CURVE('',#2421,#2422,#365,.T.); -#2038=EDGE_CURVE('',#2422,#2423,#366,.T.); -#2039=EDGE_CURVE('',#2423,#2420,#367,.T.); -#2040=EDGE_CURVE('',#2424,#2425,#368,.T.); -#2041=EDGE_CURVE('',#2425,#2426,#369,.T.); -#2042=EDGE_CURVE('',#2426,#2427,#370,.T.); -#2043=EDGE_CURVE('',#2427,#2424,#371,.T.); -#2044=EDGE_CURVE('',#2428,#2429,#372,.T.); -#2045=EDGE_CURVE('',#2429,#2430,#373,.T.); -#2046=EDGE_CURVE('',#2430,#2431,#374,.T.); -#2047=EDGE_CURVE('',#2431,#2428,#375,.T.); -#2048=EDGE_CURVE('',#2432,#2433,#376,.T.); -#2049=EDGE_CURVE('',#2433,#2434,#377,.T.); -#2050=EDGE_CURVE('',#2434,#2435,#378,.T.); -#2051=EDGE_CURVE('',#2435,#2432,#379,.T.); -#2052=EDGE_CURVE('',#2436,#2437,#380,.T.); -#2053=EDGE_CURVE('',#2437,#2438,#381,.T.); -#2054=EDGE_CURVE('',#2438,#2439,#382,.T.); -#2055=EDGE_CURVE('',#2439,#2436,#383,.T.); -#2056=EDGE_CURVE('',#2440,#2440,#62,.T.); -#2057=EDGE_CURVE('',#2441,#2441,#63,.T.); -#2058=EDGE_CURVE('',#2442,#2442,#64,.T.); -#2059=EDGE_CURVE('',#2443,#2443,#65,.T.); -#2060=EDGE_CURVE('',#2444,#2445,#384,.T.); -#2061=EDGE_CURVE('',#2445,#2446,#66,.F.); -#2062=EDGE_CURVE('',#2447,#2446,#385,.T.); -#2063=EDGE_CURVE('',#2447,#2448,#67,.F.); -#2064=EDGE_CURVE('',#2448,#2449,#386,.T.); -#2065=EDGE_CURVE('',#2449,#2450,#68,.F.); -#2066=EDGE_CURVE('',#2451,#2450,#387,.T.); -#2067=EDGE_CURVE('',#2451,#2444,#69,.F.); -#2068=EDGE_CURVE('',#2452,#2453,#388,.T.); -#2069=EDGE_CURVE('',#2453,#2454,#389,.T.); -#2070=EDGE_CURVE('',#2454,#2455,#390,.T.); -#2071=EDGE_CURVE('',#2455,#2452,#391,.T.); -#2072=EDGE_CURVE('',#2456,#2457,#392,.T.); -#2073=EDGE_CURVE('',#2457,#2458,#393,.T.); -#2074=EDGE_CURVE('',#2458,#2459,#394,.T.); -#2075=EDGE_CURVE('',#2459,#2456,#395,.T.); -#2076=EDGE_CURVE('',#2460,#2461,#396,.T.); -#2077=EDGE_CURVE('',#2461,#2462,#397,.T.); -#2078=EDGE_CURVE('',#2462,#2463,#398,.T.); -#2079=EDGE_CURVE('',#2463,#2460,#399,.T.); -#2080=EDGE_CURVE('',#2464,#2465,#400,.T.); -#2081=EDGE_CURVE('',#2465,#2466,#401,.T.); -#2082=EDGE_CURVE('',#2466,#2467,#402,.T.); -#2083=EDGE_CURVE('',#2467,#2464,#403,.T.); -#2084=EDGE_CURVE('',#2468,#2469,#404,.T.); -#2085=EDGE_CURVE('',#2469,#2470,#405,.T.); -#2086=EDGE_CURVE('',#2470,#2471,#406,.T.); -#2087=EDGE_CURVE('',#2471,#2468,#407,.T.); -#2088=EDGE_CURVE('',#2472,#2473,#408,.T.); -#2089=EDGE_CURVE('',#2473,#2474,#409,.T.); -#2090=EDGE_CURVE('',#2474,#2475,#410,.T.); -#2091=EDGE_CURVE('',#2475,#2472,#411,.T.); -#2092=EDGE_CURVE('',#2476,#2477,#412,.T.); -#2093=EDGE_CURVE('',#2477,#2478,#413,.T.); -#2094=EDGE_CURVE('',#2478,#2479,#414,.T.); -#2095=EDGE_CURVE('',#2479,#2476,#415,.T.); -#2096=EDGE_CURVE('',#2480,#2481,#416,.T.); -#2097=EDGE_CURVE('',#2481,#2482,#417,.T.); -#2098=EDGE_CURVE('',#2482,#2483,#418,.T.); -#2099=EDGE_CURVE('',#2483,#2480,#419,.T.); -#2100=EDGE_CURVE('',#2448,#2343,#420,.F.); -#2101=EDGE_CURVE('',#2342,#2449,#421,.T.); -#2102=EDGE_CURVE('',#2446,#2337,#422,.F.); -#2103=EDGE_CURVE('',#2336,#2447,#423,.T.); -#2104=EDGE_CURVE('',#2338,#2445,#424,.T.); -#2105=EDGE_CURVE('',#2444,#2339,#425,.F.); -#2106=EDGE_CURVE('',#2450,#2341,#426,.F.); -#2107=EDGE_CURVE('',#2340,#2451,#427,.T.); -#2108=EDGE_CURVE('',#2345,#2437,#428,.T.); -#2109=EDGE_CURVE('',#2346,#2436,#429,.T.); -#2110=EDGE_CURVE('',#2347,#2439,#430,.T.); -#2111=EDGE_CURVE('',#2344,#2438,#431,.T.); -#2112=EDGE_CURVE('',#2349,#2453,#432,.T.); -#2113=EDGE_CURVE('',#2350,#2452,#433,.T.); -#2114=EDGE_CURVE('',#2351,#2455,#434,.T.); -#2115=EDGE_CURVE('',#2348,#2454,#435,.T.); -#2116=EDGE_CURVE('',#2353,#2433,#436,.T.); -#2117=EDGE_CURVE('',#2354,#2432,#437,.T.); -#2118=EDGE_CURVE('',#2355,#2435,#438,.T.); -#2119=EDGE_CURVE('',#2352,#2434,#439,.T.); -#2120=EDGE_CURVE('',#2357,#2457,#440,.T.); -#2121=EDGE_CURVE('',#2358,#2456,#441,.T.); -#2122=EDGE_CURVE('',#2359,#2459,#442,.T.); -#2123=EDGE_CURVE('',#2356,#2458,#443,.T.); -#2124=EDGE_CURVE('',#2361,#2429,#444,.T.); -#2125=EDGE_CURVE('',#2362,#2428,#445,.T.); -#2126=EDGE_CURVE('',#2363,#2431,#446,.T.); -#2127=EDGE_CURVE('',#2360,#2430,#447,.T.); -#2128=EDGE_CURVE('',#2365,#2461,#448,.T.); -#2129=EDGE_CURVE('',#2366,#2460,#449,.T.); -#2130=EDGE_CURVE('',#2367,#2463,#450,.T.); -#2131=EDGE_CURVE('',#2364,#2462,#451,.T.); -#2132=EDGE_CURVE('',#2369,#2425,#452,.T.); -#2133=EDGE_CURVE('',#2370,#2424,#453,.T.); -#2134=EDGE_CURVE('',#2371,#2427,#454,.T.); -#2135=EDGE_CURVE('',#2368,#2426,#455,.T.); -#2136=EDGE_CURVE('',#2373,#2465,#456,.T.); -#2137=EDGE_CURVE('',#2374,#2464,#457,.T.); -#2138=EDGE_CURVE('',#2375,#2467,#458,.T.); -#2139=EDGE_CURVE('',#2372,#2466,#459,.T.); -#2140=EDGE_CURVE('',#2377,#2421,#460,.T.); -#2141=EDGE_CURVE('',#2378,#2420,#461,.T.); -#2142=EDGE_CURVE('',#2379,#2423,#462,.T.); -#2143=EDGE_CURVE('',#2376,#2422,#463,.T.); -#2144=EDGE_CURVE('',#2381,#2469,#464,.T.); -#2145=EDGE_CURVE('',#2382,#2468,#465,.T.); -#2146=EDGE_CURVE('',#2383,#2471,#466,.T.); -#2147=EDGE_CURVE('',#2380,#2470,#467,.T.); -#2148=EDGE_CURVE('',#2385,#2417,#468,.T.); -#2149=EDGE_CURVE('',#2386,#2416,#469,.T.); -#2150=EDGE_CURVE('',#2387,#2419,#470,.T.); -#2151=EDGE_CURVE('',#2384,#2418,#471,.T.); -#2152=EDGE_CURVE('',#2389,#2473,#472,.T.); -#2153=EDGE_CURVE('',#2390,#2472,#473,.T.); -#2154=EDGE_CURVE('',#2391,#2475,#474,.T.); -#2155=EDGE_CURVE('',#2388,#2474,#475,.T.); -#2156=EDGE_CURVE('',#2393,#2413,#476,.T.); -#2157=EDGE_CURVE('',#2394,#2412,#477,.T.); -#2158=EDGE_CURVE('',#2395,#2415,#478,.T.); -#2159=EDGE_CURVE('',#2392,#2414,#479,.T.); -#2160=EDGE_CURVE('',#2397,#2477,#480,.T.); -#2161=EDGE_CURVE('',#2398,#2476,#481,.T.); -#2162=EDGE_CURVE('',#2399,#2479,#482,.T.); -#2163=EDGE_CURVE('',#2396,#2478,#483,.T.); -#2164=EDGE_CURVE('',#2401,#2409,#484,.T.); -#2165=EDGE_CURVE('',#2402,#2408,#485,.T.); -#2166=EDGE_CURVE('',#2403,#2411,#486,.T.); -#2167=EDGE_CURVE('',#2400,#2410,#487,.T.); -#2168=EDGE_CURVE('',#2405,#2481,#488,.T.); -#2169=EDGE_CURVE('',#2406,#2480,#489,.T.); -#2170=EDGE_CURVE('',#2407,#2483,#490,.T.); -#2171=EDGE_CURVE('',#2404,#2482,#491,.T.); -#2172=VERTEX_POINT('',#4600); -#2173=VERTEX_POINT('',#4602); -#2174=VERTEX_POINT('',#4604); -#2175=VERTEX_POINT('',#4606); -#2176=VERTEX_POINT('',#4608); -#2177=VERTEX_POINT('',#4609); -#2178=VERTEX_POINT('',#4611); -#2179=VERTEX_POINT('',#4613); -#2180=VERTEX_POINT('',#4615); -#2181=VERTEX_POINT('',#4617); -#2182=VERTEX_POINT('',#4619); -#2183=VERTEX_POINT('',#4621); -#2184=VERTEX_POINT('',#4625); -#2185=VERTEX_POINT('',#4626); -#2186=VERTEX_POINT('',#4631); -#2187=VERTEX_POINT('',#4632); -#2188=VERTEX_POINT('',#4637); -#2189=VERTEX_POINT('',#4639); -#2190=VERTEX_POINT('',#4643); -#2191=VERTEX_POINT('',#4644); -#2192=VERTEX_POINT('',#4649); -#2193=VERTEX_POINT('',#4651); -#2194=VERTEX_POINT('',#4653); -#2195=VERTEX_POINT('',#4655); -#2196=VERTEX_POINT('',#4671); -#2197=VERTEX_POINT('',#4673); -#2198=VERTEX_POINT('',#4675); -#2199=VERTEX_POINT('',#4677); -#2200=VERTEX_POINT('',#4679); -#2201=VERTEX_POINT('',#4680); -#2202=VERTEX_POINT('',#4682); -#2203=VERTEX_POINT('',#4684); -#2204=VERTEX_POINT('',#4686); -#2205=VERTEX_POINT('',#4688); -#2206=VERTEX_POINT('',#4690); -#2207=VERTEX_POINT('',#4692); -#2208=VERTEX_POINT('',#4695); -#2209=VERTEX_POINT('',#4696); -#2210=VERTEX_POINT('',#4698); -#2211=VERTEX_POINT('',#4700); -#2212=VERTEX_POINT('',#4702); -#2213=VERTEX_POINT('',#4704); -#2214=VERTEX_POINT('',#4706); -#2215=VERTEX_POINT('',#4708); -#2216=VERTEX_POINT('',#4712); -#2217=VERTEX_POINT('',#4714); -#2218=VERTEX_POINT('',#4716); -#2219=VERTEX_POINT('',#4718); -#2220=VERTEX_POINT('',#4720); -#2221=VERTEX_POINT('',#4721); -#2222=VERTEX_POINT('',#4723); -#2223=VERTEX_POINT('',#4725); -#2224=VERTEX_POINT('',#4727); -#2225=VERTEX_POINT('',#4729); -#2226=VERTEX_POINT('',#4731); -#2227=VERTEX_POINT('',#4733); -#2228=VERTEX_POINT('',#4736); -#2229=VERTEX_POINT('',#4737); -#2230=VERTEX_POINT('',#4739); -#2231=VERTEX_POINT('',#4741); -#2232=VERTEX_POINT('',#4743); -#2233=VERTEX_POINT('',#4745); -#2234=VERTEX_POINT('',#4747); -#2235=VERTEX_POINT('',#4749); -#2236=VERTEX_POINT('',#4790); -#2237=VERTEX_POINT('',#4791); -#2238=VERTEX_POINT('',#4793); -#2239=VERTEX_POINT('',#4795); -#2240=VERTEX_POINT('',#4799); -#2241=VERTEX_POINT('',#4800); -#2242=VERTEX_POINT('',#4802); -#2243=VERTEX_POINT('',#4804); -#2244=VERTEX_POINT('',#4808); -#2245=VERTEX_POINT('',#4809); -#2246=VERTEX_POINT('',#4811); -#2247=VERTEX_POINT('',#4813); -#2248=VERTEX_POINT('',#4817); -#2249=VERTEX_POINT('',#4818); -#2250=VERTEX_POINT('',#4820); -#2251=VERTEX_POINT('',#4822); -#2252=VERTEX_POINT('',#4826); -#2253=VERTEX_POINT('',#4827); -#2254=VERTEX_POINT('',#4829); -#2255=VERTEX_POINT('',#4831); -#2256=VERTEX_POINT('',#4835); -#2257=VERTEX_POINT('',#4836); -#2258=VERTEX_POINT('',#4838); -#2259=VERTEX_POINT('',#4840); -#2260=VERTEX_POINT('',#4844); -#2261=VERTEX_POINT('',#4845); -#2262=VERTEX_POINT('',#4847); -#2263=VERTEX_POINT('',#4849); -#2264=VERTEX_POINT('',#4853); -#2265=VERTEX_POINT('',#4854); -#2266=VERTEX_POINT('',#4856); -#2267=VERTEX_POINT('',#4858); -#2268=VERTEX_POINT('',#4862); -#2269=VERTEX_POINT('',#4864); -#2270=VERTEX_POINT('',#4866); -#2271=VERTEX_POINT('',#4868); -#2272=VERTEX_POINT('',#4879); -#2273=VERTEX_POINT('',#4881); -#2274=VERTEX_POINT('',#4883); -#2275=VERTEX_POINT('',#4885); -#2276=VERTEX_POINT('',#4909); -#2277=VERTEX_POINT('',#4911); -#2278=VERTEX_POINT('',#4913); -#2279=VERTEX_POINT('',#4915); -#2280=VERTEX_POINT('',#4917); -#2281=VERTEX_POINT('',#4918); -#2282=VERTEX_POINT('',#4920); -#2283=VERTEX_POINT('',#4922); -#2284=VERTEX_POINT('',#4924); -#2285=VERTEX_POINT('',#4926); -#2286=VERTEX_POINT('',#4928); -#2287=VERTEX_POINT('',#4930); -#2288=VERTEX_POINT('',#4933); -#2289=VERTEX_POINT('',#4934); -#2290=VERTEX_POINT('',#4936); -#2291=VERTEX_POINT('',#4938); -#2292=VERTEX_POINT('',#4940); -#2293=VERTEX_POINT('',#4942); -#2294=VERTEX_POINT('',#4944); -#2295=VERTEX_POINT('',#4946); -#2296=VERTEX_POINT('',#4950); -#2297=VERTEX_POINT('',#4951); -#2298=VERTEX_POINT('',#4956); -#2299=VERTEX_POINT('',#4957); -#2300=VERTEX_POINT('',#4959); -#2301=VERTEX_POINT('',#4961); -#2302=VERTEX_POINT('',#4963); -#2303=VERTEX_POINT('',#4965); -#2304=VERTEX_POINT('',#4967); -#2305=VERTEX_POINT('',#4969); -#2306=VERTEX_POINT('',#4972); -#2307=VERTEX_POINT('',#4974); -#2308=VERTEX_POINT('',#4978); -#2309=VERTEX_POINT('',#4979); -#2310=VERTEX_POINT('',#4984); -#2311=VERTEX_POINT('',#4985); -#2312=VERTEX_POINT('',#4990); -#2313=VERTEX_POINT('',#4991); -#2314=VERTEX_POINT('',#4993); -#2315=VERTEX_POINT('',#4995); -#2316=VERTEX_POINT('',#4997); -#2317=VERTEX_POINT('',#4999); -#2318=VERTEX_POINT('',#5001); -#2319=VERTEX_POINT('',#5003); -#2320=VERTEX_POINT('',#5006); -#2321=VERTEX_POINT('',#5008); -#2322=VERTEX_POINT('',#5012); -#2323=VERTEX_POINT('',#5013); -#2324=VERTEX_POINT('',#5018); -#2325=VERTEX_POINT('',#5019); -#2326=VERTEX_POINT('',#5024); -#2327=VERTEX_POINT('',#5026); -#2328=VERTEX_POINT('',#5030); -#2329=VERTEX_POINT('',#5032); -#2330=VERTEX_POINT('',#5034); -#2331=VERTEX_POINT('',#5036); -#2332=VERTEX_POINT('',#5076); -#2333=VERTEX_POINT('',#5078); -#2334=VERTEX_POINT('',#5080); -#2335=VERTEX_POINT('',#5082); -#2336=VERTEX_POINT('',#5084); -#2337=VERTEX_POINT('',#5085); -#2338=VERTEX_POINT('',#5087); -#2339=VERTEX_POINT('',#5089); -#2340=VERTEX_POINT('',#5091); -#2341=VERTEX_POINT('',#5093); -#2342=VERTEX_POINT('',#5095); -#2343=VERTEX_POINT('',#5097); -#2344=VERTEX_POINT('',#5100); -#2345=VERTEX_POINT('',#5101); -#2346=VERTEX_POINT('',#5103); -#2347=VERTEX_POINT('',#5105); -#2348=VERTEX_POINT('',#5108); -#2349=VERTEX_POINT('',#5109); -#2350=VERTEX_POINT('',#5111); -#2351=VERTEX_POINT('',#5113); -#2352=VERTEX_POINT('',#5116); -#2353=VERTEX_POINT('',#5117); -#2354=VERTEX_POINT('',#5119); -#2355=VERTEX_POINT('',#5121); -#2356=VERTEX_POINT('',#5124); -#2357=VERTEX_POINT('',#5125); -#2358=VERTEX_POINT('',#5127); -#2359=VERTEX_POINT('',#5129); -#2360=VERTEX_POINT('',#5132); -#2361=VERTEX_POINT('',#5133); -#2362=VERTEX_POINT('',#5135); -#2363=VERTEX_POINT('',#5137); -#2364=VERTEX_POINT('',#5140); -#2365=VERTEX_POINT('',#5141); -#2366=VERTEX_POINT('',#5143); -#2367=VERTEX_POINT('',#5145); -#2368=VERTEX_POINT('',#5148); -#2369=VERTEX_POINT('',#5149); -#2370=VERTEX_POINT('',#5151); -#2371=VERTEX_POINT('',#5153); -#2372=VERTEX_POINT('',#5156); -#2373=VERTEX_POINT('',#5157); -#2374=VERTEX_POINT('',#5159); -#2375=VERTEX_POINT('',#5161); -#2376=VERTEX_POINT('',#5164); -#2377=VERTEX_POINT('',#5165); -#2378=VERTEX_POINT('',#5167); -#2379=VERTEX_POINT('',#5169); -#2380=VERTEX_POINT('',#5172); -#2381=VERTEX_POINT('',#5173); -#2382=VERTEX_POINT('',#5175); -#2383=VERTEX_POINT('',#5177); -#2384=VERTEX_POINT('',#5180); -#2385=VERTEX_POINT('',#5181); -#2386=VERTEX_POINT('',#5183); -#2387=VERTEX_POINT('',#5185); -#2388=VERTEX_POINT('',#5188); -#2389=VERTEX_POINT('',#5189); -#2390=VERTEX_POINT('',#5191); -#2391=VERTEX_POINT('',#5193); -#2392=VERTEX_POINT('',#5196); -#2393=VERTEX_POINT('',#5197); -#2394=VERTEX_POINT('',#5199); -#2395=VERTEX_POINT('',#5201); -#2396=VERTEX_POINT('',#5204); -#2397=VERTEX_POINT('',#5205); -#2398=VERTEX_POINT('',#5207); -#2399=VERTEX_POINT('',#5209); -#2400=VERTEX_POINT('',#5212); -#2401=VERTEX_POINT('',#5213); -#2402=VERTEX_POINT('',#5215); -#2403=VERTEX_POINT('',#5217); -#2404=VERTEX_POINT('',#5220); -#2405=VERTEX_POINT('',#5221); -#2406=VERTEX_POINT('',#5223); -#2407=VERTEX_POINT('',#5225); -#2408=VERTEX_POINT('',#5229); -#2409=VERTEX_POINT('',#5230); -#2410=VERTEX_POINT('',#5232); -#2411=VERTEX_POINT('',#5234); -#2412=VERTEX_POINT('',#5237); -#2413=VERTEX_POINT('',#5238); -#2414=VERTEX_POINT('',#5240); -#2415=VERTEX_POINT('',#5242); -#2416=VERTEX_POINT('',#5245); -#2417=VERTEX_POINT('',#5246); -#2418=VERTEX_POINT('',#5248); -#2419=VERTEX_POINT('',#5250); -#2420=VERTEX_POINT('',#5253); -#2421=VERTEX_POINT('',#5254); -#2422=VERTEX_POINT('',#5256); -#2423=VERTEX_POINT('',#5258); -#2424=VERTEX_POINT('',#5261); -#2425=VERTEX_POINT('',#5262); -#2426=VERTEX_POINT('',#5264); -#2427=VERTEX_POINT('',#5266); -#2428=VERTEX_POINT('',#5269); -#2429=VERTEX_POINT('',#5270); -#2430=VERTEX_POINT('',#5272); -#2431=VERTEX_POINT('',#5274); -#2432=VERTEX_POINT('',#5277); -#2433=VERTEX_POINT('',#5278); -#2434=VERTEX_POINT('',#5280); -#2435=VERTEX_POINT('',#5282); -#2436=VERTEX_POINT('',#5285); -#2437=VERTEX_POINT('',#5286); -#2438=VERTEX_POINT('',#5288); -#2439=VERTEX_POINT('',#5290); -#2440=VERTEX_POINT('',#5293); -#2441=VERTEX_POINT('',#5295); -#2442=VERTEX_POINT('',#5297); -#2443=VERTEX_POINT('',#5299); -#2444=VERTEX_POINT('',#5301); -#2445=VERTEX_POINT('',#5302); -#2446=VERTEX_POINT('',#5304); -#2447=VERTEX_POINT('',#5306); -#2448=VERTEX_POINT('',#5308); -#2449=VERTEX_POINT('',#5310); -#2450=VERTEX_POINT('',#5312); -#2451=VERTEX_POINT('',#5314); -#2452=VERTEX_POINT('',#5317); -#2453=VERTEX_POINT('',#5318); -#2454=VERTEX_POINT('',#5320); -#2455=VERTEX_POINT('',#5322); -#2456=VERTEX_POINT('',#5325); -#2457=VERTEX_POINT('',#5326); -#2458=VERTEX_POINT('',#5328); -#2459=VERTEX_POINT('',#5330); -#2460=VERTEX_POINT('',#5333); -#2461=VERTEX_POINT('',#5334); -#2462=VERTEX_POINT('',#5336); -#2463=VERTEX_POINT('',#5338); -#2464=VERTEX_POINT('',#5341); -#2465=VERTEX_POINT('',#5342); -#2466=VERTEX_POINT('',#5344); -#2467=VERTEX_POINT('',#5346); -#2468=VERTEX_POINT('',#5349); -#2469=VERTEX_POINT('',#5350); -#2470=VERTEX_POINT('',#5352); -#2471=VERTEX_POINT('',#5354); -#2472=VERTEX_POINT('',#5357); -#2473=VERTEX_POINT('',#5358); -#2474=VERTEX_POINT('',#5360); -#2475=VERTEX_POINT('',#5362); -#2476=VERTEX_POINT('',#5365); -#2477=VERTEX_POINT('',#5366); -#2478=VERTEX_POINT('',#5368); -#2479=VERTEX_POINT('',#5370); -#2480=VERTEX_POINT('',#5373); -#2481=VERTEX_POINT('',#5374); -#2482=VERTEX_POINT('',#5376); -#2483=VERTEX_POINT('',#5378); -#2484=ELLIPSE('',#3411,0.00145138139348681,0.00145); -#2485=ELLIPSE('',#3412,0.00145138139348681,0.00145); -#2486=ELLIPSE('',#3413,0.00145138139348682,0.00145); -#2487=ELLIPSE('',#3414,0.00145138139348682,0.00145); -#2488=ELLIPSE('',#3415,0.0100095268516332,0.01); -#2489=ELLIPSE('',#3416,0.0100095268516332,0.01); -#2490=ELLIPSE('',#3417,0.0100095268516332,0.01); -#2491=ELLIPSE('',#3418,0.0100095268516332,0.01); -#2492=ELLIPSE('',#3424,0.00145138139348681,0.00145); -#2493=ELLIPSE('',#3425,0.00145138139348681,0.00145); -#2494=ELLIPSE('',#3426,0.00145138139348682,0.00145); -#2495=ELLIPSE('',#3427,0.00145138139348682,0.00145); -#2496=ELLIPSE('',#3428,0.0100095268516332,0.01); -#2497=ELLIPSE('',#3429,0.0100095268516332,0.01); -#2498=ELLIPSE('',#3430,0.0100095268516332,0.01); -#2499=ELLIPSE('',#3431,0.0100095268516332,0.01); -#2500=ELLIPSE('',#3442,0.00145138139348681,0.00145); -#2501=ELLIPSE('',#3443,0.00145138139348681,0.00145); -#2502=ELLIPSE('',#3444,0.00145138139348682,0.00145); -#2503=ELLIPSE('',#3445,0.00145138139348682,0.00145); -#2504=ELLIPSE('',#3446,0.0100095268516332,0.01); -#2505=ELLIPSE('',#3447,0.0100095268516332,0.01); -#2506=ELLIPSE('',#3448,0.0100095268516332,0.01); -#2507=ELLIPSE('',#3449,0.0100095268516332,0.01); -#2508=ELLIPSE('',#3450,0.00575547793968909,0.00575); -#2509=ELLIPSE('',#3451,0.00575547793968909,0.00575); -#2510=ELLIPSE('',#3452,0.00575547793968909,0.00575); -#2511=ELLIPSE('',#3453,0.00575547793968909,0.00575); -#2512=ELLIPSE('',#3455,0.00145138139348681,0.00145); -#2513=ELLIPSE('',#3456,0.00145138139348681,0.00145); -#2514=ELLIPSE('',#3457,0.00145138139348682,0.00145); -#2515=ELLIPSE('',#3458,0.00145138139348682,0.00145); -#2516=ELLIPSE('',#3459,0.0100095268516332,0.01); -#2517=ELLIPSE('',#3460,0.0100095268516332,0.01); -#2518=ELLIPSE('',#3461,0.0100095268516332,0.01); -#2519=ELLIPSE('',#3462,0.0100095268516332,0.01); -#2520=ELLIPSE('',#3463,0.00575547793968909,0.00575); -#2521=ELLIPSE('',#3464,0.00575547793968909,0.00575); -#2522=ELLIPSE('',#3465,0.00575547793968909,0.00575); -#2523=ELLIPSE('',#3466,0.00575547793968909,0.00575); -#2524=ELLIPSE('',#3536,0.00145138139348681,0.00145); -#2525=ELLIPSE('',#3537,0.00145138139348681,0.00145); -#2526=ELLIPSE('',#3538,0.00145138139348682,0.00145); -#2527=ELLIPSE('',#3539,0.00145138139348682,0.00145); -#2528=ELLIPSE('',#3540,0.0100095268516332,0.01); -#2529=ELLIPSE('',#3541,0.0100095268516332,0.01); -#2530=ELLIPSE('',#3542,0.0100095268516332,0.01); -#2531=ELLIPSE('',#3543,0.0100095268516332,0.01); -#2532=ELLIPSE('',#3544,0.00575547793968909,0.00575); -#2533=ELLIPSE('',#3545,0.00575547793968909,0.00575); -#2534=ELLIPSE('',#3546,0.00575547793968909,0.00575); -#2535=ELLIPSE('',#3547,0.00575547793968909,0.00575); -#2536=EDGE_LOOP('',(#828)); -#2537=EDGE_LOOP('',(#829)); -#2538=EDGE_LOOP('',(#830)); -#2539=EDGE_LOOP('',(#831)); -#2540=EDGE_LOOP('',(#832,#833,#834,#835,#836,#837,#838,#839)); -#2541=EDGE_LOOP('',(#840,#841,#842,#843)); -#2542=EDGE_LOOP('',(#844,#845,#846,#847)); -#2543=EDGE_LOOP('',(#848,#849,#850,#851)); -#2544=EDGE_LOOP('',(#852,#853,#854,#855)); -#2545=EDGE_LOOP('',(#856)); -#2546=EDGE_LOOP('',(#857)); -#2547=EDGE_LOOP('',(#858)); -#2548=EDGE_LOOP('',(#859)); -#2549=EDGE_LOOP('',(#860,#861,#862,#863,#864,#865,#866,#867)); -#2550=EDGE_LOOP('',(#868,#869,#870,#871)); -#2551=EDGE_LOOP('',(#872,#873,#874,#875)); -#2552=EDGE_LOOP('',(#876,#877,#878,#879)); -#2553=EDGE_LOOP('',(#880,#881,#882,#883)); -#2554=EDGE_LOOP('',(#884)); -#2555=EDGE_LOOP('',(#885)); -#2556=EDGE_LOOP('',(#886)); -#2557=EDGE_LOOP('',(#887)); -#2558=EDGE_LOOP('',(#888)); -#2559=EDGE_LOOP('',(#889)); -#2560=EDGE_LOOP('',(#890)); -#2561=EDGE_LOOP('',(#891)); -#2562=EDGE_LOOP('',(#892)); -#2563=EDGE_LOOP('',(#893)); -#2564=EDGE_LOOP('',(#894)); -#2565=EDGE_LOOP('',(#895)); -#2566=EDGE_LOOP('',(#896,#897,#898,#899,#900,#901,#902,#903)); -#2567=EDGE_LOOP('',(#904,#905,#906,#907,#908,#909,#910,#911)); -#2568=EDGE_LOOP('',(#912)); -#2569=EDGE_LOOP('',(#913)); -#2570=EDGE_LOOP('',(#914)); -#2571=EDGE_LOOP('',(#915)); -#2572=EDGE_LOOP('',(#916,#917,#918,#919,#920,#921,#922,#923)); -#2573=EDGE_LOOP('',(#924,#925,#926,#927,#928,#929,#930,#931)); -#2574=EDGE_LOOP('',(#932,#933,#934,#935)); -#2575=EDGE_LOOP('',(#936,#937,#938,#939)); -#2576=EDGE_LOOP('',(#940,#941,#942,#943)); -#2577=EDGE_LOOP('',(#944,#945,#946,#947)); -#2578=EDGE_LOOP('',(#948,#949,#950,#951)); -#2579=EDGE_LOOP('',(#952,#953,#954,#955)); -#2580=EDGE_LOOP('',(#956,#957,#958,#959)); -#2581=EDGE_LOOP('',(#960,#961,#962,#963)); -#2582=EDGE_LOOP('',(#964,#965,#966,#967)); -#2583=EDGE_LOOP('',(#968,#969,#970,#971)); -#2584=EDGE_LOOP('',(#972,#973,#974,#975)); -#2585=EDGE_LOOP('',(#976,#977,#978,#979)); -#2586=EDGE_LOOP('',(#980,#981,#982,#983)); -#2587=EDGE_LOOP('',(#984,#985,#986,#987)); -#2588=EDGE_LOOP('',(#988,#989,#990,#991)); -#2589=EDGE_LOOP('',(#992,#993,#994,#995)); -#2590=EDGE_LOOP('',(#996)); -#2591=EDGE_LOOP('',(#997)); -#2592=EDGE_LOOP('',(#998)); -#2593=EDGE_LOOP('',(#999)); -#2594=EDGE_LOOP('',(#1000)); -#2595=EDGE_LOOP('',(#1001)); -#2596=EDGE_LOOP('',(#1002)); -#2597=EDGE_LOOP('',(#1003)); -#2598=EDGE_LOOP('',(#1004,#1005,#1006,#1007)); -#2599=EDGE_LOOP('',(#1008,#1009,#1010,#1011)); -#2600=EDGE_LOOP('',(#1012,#1013,#1014,#1015)); -#2601=EDGE_LOOP('',(#1016,#1017,#1018,#1019)); -#2602=EDGE_LOOP('',(#1020,#1021,#1022,#1023)); -#2603=EDGE_LOOP('',(#1024,#1025,#1026,#1027)); -#2604=EDGE_LOOP('',(#1028,#1029,#1030,#1031)); -#2605=EDGE_LOOP('',(#1032,#1033,#1034,#1035)); -#2606=EDGE_LOOP('',(#1036)); -#2607=EDGE_LOOP('',(#1037)); -#2608=EDGE_LOOP('',(#1038)); -#2609=EDGE_LOOP('',(#1039)); -#2610=EDGE_LOOP('',(#1040,#1041,#1042,#1043,#1044,#1045,#1046,#1047)); -#2611=EDGE_LOOP('',(#1048,#1049,#1050,#1051,#1052,#1053,#1054,#1055)); -#2612=EDGE_LOOP('',(#1056)); -#2613=EDGE_LOOP('',(#1057)); -#2614=EDGE_LOOP('',(#1058)); -#2615=EDGE_LOOP('',(#1059)); -#2616=EDGE_LOOP('',(#1060,#1061,#1062,#1063,#1064,#1065,#1066,#1067)); -#2617=EDGE_LOOP('',(#1068,#1069,#1070,#1071,#1072,#1073,#1074,#1075)); -#2618=EDGE_LOOP('',(#1076,#1077,#1078,#1079)); -#2619=EDGE_LOOP('',(#1080,#1081,#1082,#1083)); -#2620=EDGE_LOOP('',(#1084,#1085,#1086,#1087)); -#2621=EDGE_LOOP('',(#1088,#1089,#1090,#1091)); -#2622=EDGE_LOOP('',(#1092,#1093,#1094,#1095)); -#2623=EDGE_LOOP('',(#1096,#1097,#1098,#1099)); -#2624=EDGE_LOOP('',(#1100,#1101,#1102,#1103)); -#2625=EDGE_LOOP('',(#1104,#1105,#1106,#1107)); -#2626=EDGE_LOOP('',(#1108)); -#2627=EDGE_LOOP('',(#1109)); -#2628=EDGE_LOOP('',(#1110)); -#2629=EDGE_LOOP('',(#1111)); -#2630=EDGE_LOOP('',(#1112)); -#2631=EDGE_LOOP('',(#1113)); -#2632=EDGE_LOOP('',(#1114)); -#2633=EDGE_LOOP('',(#1115)); -#2634=EDGE_LOOP('',(#1116)); -#2635=EDGE_LOOP('',(#1117)); -#2636=EDGE_LOOP('',(#1118)); -#2637=EDGE_LOOP('',(#1119)); -#2638=EDGE_LOOP('',(#1120,#1121,#1122,#1123,#1124,#1125,#1126,#1127)); -#2639=EDGE_LOOP('',(#1128,#1129,#1130,#1131,#1132,#1133,#1134,#1135)); -#2640=EDGE_LOOP('',(#1136,#1137,#1138,#1139)); -#2641=EDGE_LOOP('',(#1140,#1141,#1142,#1143,#1144,#1145,#1146,#1147)); -#2642=EDGE_LOOP('',(#1148,#1149,#1150,#1151)); -#2643=EDGE_LOOP('',(#1152,#1153,#1154,#1155)); -#2644=EDGE_LOOP('',(#1156,#1157,#1158,#1159)); -#2645=EDGE_LOOP('',(#1160,#1161,#1162,#1163,#1164,#1165,#1166,#1167)); -#2646=EDGE_LOOP('',(#1168,#1169,#1170,#1171)); -#2647=EDGE_LOOP('',(#1172,#1173,#1174,#1175)); -#2648=EDGE_LOOP('',(#1176,#1177,#1178,#1179)); -#2649=EDGE_LOOP('',(#1180,#1181,#1182,#1183)); -#2650=EDGE_LOOP('',(#1184)); -#2651=EDGE_LOOP('',(#1185)); -#2652=EDGE_LOOP('',(#1186)); -#2653=EDGE_LOOP('',(#1187)); -#2654=EDGE_LOOP('',(#1188,#1189,#1190,#1191,#1192,#1193,#1194,#1195)); -#2655=EDGE_LOOP('',(#1196,#1197,#1198,#1199,#1200,#1201,#1202,#1203)); -#2656=EDGE_LOOP('',(#1204,#1205,#1206,#1207)); -#2657=EDGE_LOOP('',(#1208,#1209,#1210,#1211)); -#2658=EDGE_LOOP('',(#1212,#1213,#1214,#1215)); -#2659=EDGE_LOOP('',(#1216,#1217,#1218,#1219)); -#2660=EDGE_LOOP('',(#1220,#1221,#1222,#1223)); -#2661=EDGE_LOOP('',(#1224,#1225,#1226,#1227)); -#2662=EDGE_LOOP('',(#1228,#1229,#1230,#1231)); -#2663=EDGE_LOOP('',(#1232,#1233,#1234,#1235)); -#2664=EDGE_LOOP('',(#1236)); -#2665=EDGE_LOOP('',(#1237)); -#2666=EDGE_LOOP('',(#1238)); -#2667=EDGE_LOOP('',(#1239)); -#2668=EDGE_LOOP('',(#1240)); -#2669=EDGE_LOOP('',(#1241)); -#2670=EDGE_LOOP('',(#1242)); -#2671=EDGE_LOOP('',(#1243)); -#2672=EDGE_LOOP('',(#1244,#1245,#1246,#1247)); -#2673=EDGE_LOOP('',(#1248,#1249,#1250,#1251)); -#2674=EDGE_LOOP('',(#1252,#1253,#1254,#1255)); -#2675=EDGE_LOOP('',(#1256,#1257,#1258,#1259)); -#2676=EDGE_LOOP('',(#1260,#1261,#1262,#1263)); -#2677=EDGE_LOOP('',(#1264,#1265,#1266,#1267)); -#2678=EDGE_LOOP('',(#1268,#1269,#1270,#1271)); -#2679=EDGE_LOOP('',(#1272,#1273,#1274,#1275)); -#2680=EDGE_LOOP('',(#1276)); -#2681=EDGE_LOOP('',(#1277)); -#2682=EDGE_LOOP('',(#1278)); -#2683=EDGE_LOOP('',(#1279)); -#2684=EDGE_LOOP('',(#1280,#1281,#1282,#1283,#1284,#1285,#1286,#1287)); -#2685=EDGE_LOOP('',(#1288,#1289,#1290,#1291)); -#2686=EDGE_LOOP('',(#1292,#1293,#1294,#1295)); -#2687=EDGE_LOOP('',(#1296,#1297,#1298,#1299)); -#2688=EDGE_LOOP('',(#1300,#1301,#1302,#1303)); -#2689=EDGE_LOOP('',(#1304,#1305,#1306,#1307)); -#2690=EDGE_LOOP('',(#1308,#1309,#1310,#1311)); -#2691=EDGE_LOOP('',(#1312,#1313,#1314,#1315)); -#2692=EDGE_LOOP('',(#1316,#1317,#1318,#1319)); -#2693=EDGE_LOOP('',(#1320,#1321,#1322,#1323)); -#2694=EDGE_LOOP('',(#1324,#1325,#1326,#1327)); -#2695=EDGE_LOOP('',(#1328,#1329,#1330,#1331)); -#2696=EDGE_LOOP('',(#1332,#1333,#1334,#1335)); -#2697=EDGE_LOOP('',(#1336,#1337,#1338,#1339)); -#2698=EDGE_LOOP('',(#1340,#1341,#1342,#1343)); -#2699=EDGE_LOOP('',(#1344,#1345,#1346,#1347)); -#2700=EDGE_LOOP('',(#1348,#1349,#1350,#1351)); -#2701=EDGE_LOOP('',(#1352,#1353,#1354,#1355)); -#2702=EDGE_LOOP('',(#1356,#1357,#1358,#1359)); -#2703=EDGE_LOOP('',(#1360,#1361,#1362,#1363)); -#2704=EDGE_LOOP('',(#1364,#1365,#1366,#1367)); -#2705=EDGE_LOOP('',(#1368,#1369,#1370,#1371)); -#2706=EDGE_LOOP('',(#1372,#1373,#1374,#1375)); -#2707=EDGE_LOOP('',(#1376,#1377,#1378,#1379)); -#2708=EDGE_LOOP('',(#1380,#1381,#1382,#1383)); -#2709=EDGE_LOOP('',(#1384)); -#2710=EDGE_LOOP('',(#1385)); -#2711=EDGE_LOOP('',(#1386)); -#2712=EDGE_LOOP('',(#1387)); -#2713=EDGE_LOOP('',(#1388,#1389,#1390,#1391,#1392,#1393,#1394,#1395)); -#2714=EDGE_LOOP('',(#1396,#1397,#1398,#1399)); -#2715=EDGE_LOOP('',(#1400,#1401,#1402,#1403)); -#2716=EDGE_LOOP('',(#1404,#1405,#1406,#1407)); -#2717=EDGE_LOOP('',(#1408,#1409,#1410,#1411)); -#2718=EDGE_LOOP('',(#1412,#1413,#1414,#1415)); -#2719=EDGE_LOOP('',(#1416,#1417,#1418,#1419)); -#2720=EDGE_LOOP('',(#1420,#1421,#1422,#1423)); -#2721=EDGE_LOOP('',(#1424,#1425,#1426,#1427)); -#2722=EDGE_LOOP('',(#1428,#1429,#1430,#1431)); -#2723=EDGE_LOOP('',(#1432,#1433,#1434,#1435)); -#2724=EDGE_LOOP('',(#1436,#1437,#1438,#1439)); -#2725=EDGE_LOOP('',(#1440,#1441,#1442,#1443)); -#2726=EDGE_LOOP('',(#1444,#1445,#1446,#1447)); -#2727=EDGE_LOOP('',(#1448,#1449,#1450,#1451)); -#2728=EDGE_LOOP('',(#1452,#1453,#1454,#1455)); -#2729=EDGE_LOOP('',(#1456,#1457,#1458,#1459)); -#2730=EDGE_LOOP('',(#1460)); -#2731=EDGE_LOOP('',(#1461)); -#2732=EDGE_LOOP('',(#1462)); -#2733=EDGE_LOOP('',(#1463)); -#2734=EDGE_LOOP('',(#1464)); -#2735=EDGE_LOOP('',(#1465)); -#2736=EDGE_LOOP('',(#1466)); -#2737=EDGE_LOOP('',(#1467)); -#2738=EDGE_LOOP('',(#1468,#1469,#1470,#1471)); -#2739=EDGE_LOOP('',(#1472,#1473,#1474,#1475)); -#2740=EDGE_LOOP('',(#1476,#1477,#1478,#1479)); -#2741=EDGE_LOOP('',(#1480,#1481,#1482,#1483)); -#2742=EDGE_LOOP('',(#1484,#1485,#1486,#1487)); -#2743=EDGE_LOOP('',(#1488,#1489,#1490,#1491)); -#2744=EDGE_LOOP('',(#1492,#1493,#1494,#1495)); -#2745=EDGE_LOOP('',(#1496,#1497,#1498,#1499)); -#2746=EDGE_LOOP('',(#1500,#1501,#1502,#1503)); -#2747=EDGE_LOOP('',(#1504,#1505,#1506,#1507)); -#2748=EDGE_LOOP('',(#1508,#1509,#1510,#1511)); -#2749=EDGE_LOOP('',(#1512,#1513,#1514,#1515)); -#2750=EDGE_LOOP('',(#1516,#1517,#1518,#1519)); -#2751=EDGE_LOOP('',(#1520,#1521,#1522,#1523)); -#2752=EDGE_LOOP('',(#1524,#1525,#1526,#1527)); -#2753=EDGE_LOOP('',(#1528,#1529,#1530,#1531)); -#2754=EDGE_LOOP('',(#1532,#1533,#1534,#1535)); -#2755=EDGE_LOOP('',(#1536,#1537,#1538,#1539)); -#2756=EDGE_LOOP('',(#1540,#1541,#1542,#1543)); -#2757=EDGE_LOOP('',(#1544,#1545,#1546,#1547)); -#2758=EDGE_LOOP('',(#1548,#1549,#1550,#1551)); -#2759=EDGE_LOOP('',(#1552,#1553,#1554,#1555)); -#2760=EDGE_LOOP('',(#1556,#1557,#1558,#1559)); -#2761=EDGE_LOOP('',(#1560,#1561,#1562,#1563)); -#2762=EDGE_LOOP('',(#1564,#1565,#1566,#1567)); -#2763=EDGE_LOOP('',(#1568,#1569,#1570,#1571)); -#2764=EDGE_LOOP('',(#1572,#1573,#1574,#1575)); -#2765=EDGE_LOOP('',(#1576,#1577,#1578,#1579)); -#2766=EDGE_LOOP('',(#1580,#1581,#1582,#1583)); -#2767=EDGE_LOOP('',(#1584,#1585,#1586,#1587)); -#2768=EDGE_LOOP('',(#1588,#1589,#1590,#1591)); -#2769=EDGE_LOOP('',(#1592,#1593,#1594,#1595)); -#2770=EDGE_LOOP('',(#1596,#1597,#1598,#1599)); -#2771=EDGE_LOOP('',(#1600,#1601,#1602,#1603)); -#2772=EDGE_LOOP('',(#1604,#1605,#1606,#1607)); -#2773=EDGE_LOOP('',(#1608,#1609,#1610,#1611)); -#2774=EDGE_LOOP('',(#1612,#1613,#1614,#1615)); -#2775=EDGE_LOOP('',(#1616,#1617,#1618,#1619)); -#2776=EDGE_LOOP('',(#1620,#1621,#1622,#1623)); -#2777=EDGE_LOOP('',(#1624,#1625,#1626,#1627)); -#2778=EDGE_LOOP('',(#1628,#1629,#1630,#1631)); -#2779=EDGE_LOOP('',(#1632,#1633,#1634,#1635)); -#2780=EDGE_LOOP('',(#1636,#1637,#1638,#1639)); -#2781=EDGE_LOOP('',(#1640,#1641,#1642,#1643)); -#2782=EDGE_LOOP('',(#1644,#1645,#1646,#1647)); -#2783=EDGE_LOOP('',(#1648,#1649,#1650,#1651)); -#2784=EDGE_LOOP('',(#1652,#1653,#1654,#1655)); -#2785=EDGE_LOOP('',(#1656,#1657,#1658,#1659)); -#2786=EDGE_LOOP('',(#1660,#1661,#1662,#1663)); -#2787=EDGE_LOOP('',(#1664,#1665,#1666,#1667)); -#2788=EDGE_LOOP('',(#1668,#1669,#1670,#1671)); -#2789=EDGE_LOOP('',(#1672,#1673,#1674,#1675)); -#2790=EDGE_LOOP('',(#1676,#1677,#1678,#1679)); -#2791=EDGE_LOOP('',(#1680,#1681,#1682,#1683)); -#2792=EDGE_LOOP('',(#1684,#1685,#1686,#1687)); -#2793=EDGE_LOOP('',(#1688,#1689,#1690,#1691)); -#2794=EDGE_LOOP('',(#1692,#1693,#1694,#1695)); -#2795=EDGE_LOOP('',(#1696,#1697,#1698,#1699)); -#2796=EDGE_LOOP('',(#1700,#1701,#1702,#1703)); -#2797=EDGE_LOOP('',(#1704,#1705,#1706,#1707)); -#2798=EDGE_LOOP('',(#1708,#1709,#1710,#1711)); -#2799=EDGE_LOOP('',(#1712,#1713,#1714,#1715)); -#2800=EDGE_LOOP('',(#1716,#1717,#1718,#1719)); -#2801=EDGE_LOOP('',(#1720,#1721,#1722,#1723)); -#2802=FACE_BOUND('',#2536,.T.); -#2803=FACE_BOUND('',#2537,.T.); -#2804=FACE_BOUND('',#2538,.T.); -#2805=FACE_BOUND('',#2539,.T.); -#2806=FACE_BOUND('',#2540,.T.); -#2807=FACE_BOUND('',#2541,.T.); -#2808=FACE_BOUND('',#2542,.T.); -#2809=FACE_BOUND('',#2543,.T.); -#2810=FACE_BOUND('',#2544,.T.); -#2811=FACE_BOUND('',#2545,.T.); -#2812=FACE_BOUND('',#2546,.T.); -#2813=FACE_BOUND('',#2547,.T.); -#2814=FACE_BOUND('',#2548,.T.); -#2815=FACE_BOUND('',#2549,.T.); -#2816=FACE_BOUND('',#2550,.T.); -#2817=FACE_BOUND('',#2551,.T.); -#2818=FACE_BOUND('',#2552,.T.); -#2819=FACE_BOUND('',#2553,.T.); -#2820=FACE_BOUND('',#2554,.T.); -#2821=FACE_BOUND('',#2555,.T.); -#2822=FACE_BOUND('',#2556,.T.); -#2823=FACE_BOUND('',#2557,.T.); -#2824=FACE_BOUND('',#2558,.T.); -#2825=FACE_BOUND('',#2559,.T.); -#2826=FACE_BOUND('',#2560,.T.); -#2827=FACE_BOUND('',#2561,.T.); -#2828=FACE_BOUND('',#2562,.T.); -#2829=FACE_BOUND('',#2563,.T.); -#2830=FACE_BOUND('',#2564,.T.); -#2831=FACE_BOUND('',#2565,.T.); -#2832=FACE_BOUND('',#2566,.T.); -#2833=FACE_BOUND('',#2567,.T.); -#2834=FACE_BOUND('',#2568,.T.); -#2835=FACE_BOUND('',#2569,.T.); -#2836=FACE_BOUND('',#2570,.T.); -#2837=FACE_BOUND('',#2571,.T.); -#2838=FACE_BOUND('',#2572,.T.); -#2839=FACE_BOUND('',#2573,.T.); -#2840=FACE_BOUND('',#2574,.T.); -#2841=FACE_BOUND('',#2575,.T.); -#2842=FACE_BOUND('',#2576,.T.); -#2843=FACE_BOUND('',#2577,.T.); -#2844=FACE_BOUND('',#2578,.T.); -#2845=FACE_BOUND('',#2579,.T.); -#2846=FACE_BOUND('',#2580,.T.); -#2847=FACE_BOUND('',#2581,.T.); -#2848=FACE_BOUND('',#2582,.T.); -#2849=FACE_BOUND('',#2583,.T.); -#2850=FACE_BOUND('',#2584,.T.); -#2851=FACE_BOUND('',#2585,.T.); -#2852=FACE_BOUND('',#2586,.T.); -#2853=FACE_BOUND('',#2587,.T.); -#2854=FACE_BOUND('',#2588,.T.); -#2855=FACE_BOUND('',#2589,.T.); -#2856=FACE_BOUND('',#2590,.T.); -#2857=FACE_BOUND('',#2591,.T.); -#2858=FACE_BOUND('',#2592,.T.); -#2859=FACE_BOUND('',#2593,.T.); -#2860=FACE_BOUND('',#2594,.T.); -#2861=FACE_BOUND('',#2595,.T.); -#2862=FACE_BOUND('',#2596,.T.); -#2863=FACE_BOUND('',#2597,.T.); -#2864=FACE_BOUND('',#2598,.T.); -#2865=FACE_BOUND('',#2599,.T.); -#2866=FACE_BOUND('',#2600,.T.); -#2867=FACE_BOUND('',#2601,.T.); -#2868=FACE_BOUND('',#2602,.T.); -#2869=FACE_BOUND('',#2603,.T.); -#2870=FACE_BOUND('',#2604,.T.); -#2871=FACE_BOUND('',#2605,.T.); -#2872=FACE_BOUND('',#2606,.T.); -#2873=FACE_BOUND('',#2607,.T.); -#2874=FACE_BOUND('',#2608,.T.); -#2875=FACE_BOUND('',#2609,.T.); -#2876=FACE_BOUND('',#2610,.T.); -#2877=FACE_BOUND('',#2611,.T.); -#2878=FACE_BOUND('',#2612,.T.); -#2879=FACE_BOUND('',#2613,.T.); -#2880=FACE_BOUND('',#2614,.T.); -#2881=FACE_BOUND('',#2615,.T.); -#2882=FACE_BOUND('',#2616,.T.); -#2883=FACE_BOUND('',#2617,.T.); -#2884=FACE_BOUND('',#2618,.T.); -#2885=FACE_BOUND('',#2619,.T.); -#2886=FACE_BOUND('',#2620,.T.); -#2887=FACE_BOUND('',#2621,.T.); -#2888=FACE_BOUND('',#2622,.T.); -#2889=FACE_BOUND('',#2623,.T.); -#2890=FACE_BOUND('',#2624,.T.); -#2891=FACE_BOUND('',#2625,.T.); -#2892=FACE_BOUND('',#2626,.T.); -#2893=FACE_BOUND('',#2627,.T.); -#2894=FACE_BOUND('',#2628,.T.); -#2895=FACE_BOUND('',#2629,.T.); -#2896=FACE_BOUND('',#2630,.T.); -#2897=FACE_BOUND('',#2631,.T.); -#2898=FACE_BOUND('',#2632,.T.); -#2899=FACE_BOUND('',#2633,.T.); -#2900=FACE_BOUND('',#2634,.T.); -#2901=FACE_BOUND('',#2635,.T.); -#2902=FACE_BOUND('',#2636,.T.); -#2903=FACE_BOUND('',#2637,.T.); -#2904=FACE_BOUND('',#2638,.T.); -#2905=FACE_BOUND('',#2639,.T.); -#2906=FACE_BOUND('',#2640,.T.); -#2907=FACE_BOUND('',#2641,.T.); -#2908=FACE_BOUND('',#2642,.T.); -#2909=FACE_BOUND('',#2643,.T.); -#2910=FACE_BOUND('',#2644,.T.); -#2911=FACE_BOUND('',#2645,.T.); -#2912=FACE_BOUND('',#2646,.T.); -#2913=FACE_BOUND('',#2647,.T.); -#2914=FACE_BOUND('',#2648,.T.); -#2915=FACE_BOUND('',#2649,.T.); -#2916=FACE_BOUND('',#2650,.T.); -#2917=FACE_BOUND('',#2651,.T.); -#2918=FACE_BOUND('',#2652,.T.); -#2919=FACE_BOUND('',#2653,.T.); -#2920=FACE_BOUND('',#2654,.T.); -#2921=FACE_BOUND('',#2655,.T.); -#2922=FACE_BOUND('',#2656,.T.); -#2923=FACE_BOUND('',#2657,.T.); -#2924=FACE_BOUND('',#2658,.T.); -#2925=FACE_BOUND('',#2659,.T.); -#2926=FACE_BOUND('',#2660,.T.); -#2927=FACE_BOUND('',#2661,.T.); -#2928=FACE_BOUND('',#2662,.T.); -#2929=FACE_BOUND('',#2663,.T.); -#2930=FACE_BOUND('',#2664,.T.); -#2931=FACE_BOUND('',#2665,.T.); -#2932=FACE_BOUND('',#2666,.T.); -#2933=FACE_BOUND('',#2667,.T.); -#2934=FACE_BOUND('',#2668,.T.); -#2935=FACE_BOUND('',#2669,.T.); -#2936=FACE_BOUND('',#2670,.T.); -#2937=FACE_BOUND('',#2671,.T.); -#2938=FACE_BOUND('',#2672,.T.); -#2939=FACE_BOUND('',#2673,.T.); -#2940=FACE_BOUND('',#2674,.T.); -#2941=FACE_BOUND('',#2675,.T.); -#2942=FACE_BOUND('',#2676,.T.); -#2943=FACE_BOUND('',#2677,.T.); -#2944=FACE_BOUND('',#2678,.T.); -#2945=FACE_BOUND('',#2679,.T.); -#2946=FACE_BOUND('',#2680,.T.); -#2947=FACE_BOUND('',#2681,.T.); -#2948=FACE_BOUND('',#2682,.T.); -#2949=FACE_BOUND('',#2683,.T.); -#2950=FACE_BOUND('',#2684,.T.); -#2951=FACE_BOUND('',#2685,.T.); -#2952=FACE_BOUND('',#2686,.T.); -#2953=FACE_BOUND('',#2687,.T.); -#2954=FACE_BOUND('',#2688,.T.); -#2955=FACE_BOUND('',#2689,.T.); -#2956=FACE_BOUND('',#2690,.T.); -#2957=FACE_BOUND('',#2691,.T.); -#2958=FACE_BOUND('',#2692,.T.); -#2959=FACE_BOUND('',#2693,.T.); -#2960=FACE_BOUND('',#2694,.T.); -#2961=FACE_BOUND('',#2695,.T.); -#2962=FACE_BOUND('',#2696,.T.); -#2963=FACE_BOUND('',#2697,.T.); -#2964=FACE_BOUND('',#2698,.T.); -#2965=FACE_BOUND('',#2699,.T.); -#2966=FACE_BOUND('',#2700,.T.); -#2967=FACE_BOUND('',#2701,.T.); -#2968=FACE_BOUND('',#2702,.T.); -#2969=FACE_BOUND('',#2703,.T.); -#2970=FACE_BOUND('',#2704,.T.); -#2971=FACE_BOUND('',#2705,.T.); -#2972=FACE_BOUND('',#2706,.T.); -#2973=FACE_BOUND('',#2707,.T.); -#2974=FACE_BOUND('',#2708,.T.); -#2975=FACE_BOUND('',#2709,.T.); -#2976=FACE_BOUND('',#2710,.T.); -#2977=FACE_BOUND('',#2711,.T.); -#2978=FACE_BOUND('',#2712,.T.); -#2979=FACE_BOUND('',#2713,.T.); -#2980=FACE_BOUND('',#2714,.T.); -#2981=FACE_BOUND('',#2715,.T.); -#2982=FACE_BOUND('',#2716,.T.); -#2983=FACE_BOUND('',#2717,.T.); -#2984=FACE_BOUND('',#2718,.T.); -#2985=FACE_BOUND('',#2719,.T.); -#2986=FACE_BOUND('',#2720,.T.); -#2987=FACE_BOUND('',#2721,.T.); -#2988=FACE_BOUND('',#2722,.T.); -#2989=FACE_BOUND('',#2723,.T.); -#2990=FACE_BOUND('',#2724,.T.); -#2991=FACE_BOUND('',#2725,.T.); -#2992=FACE_BOUND('',#2726,.T.); -#2993=FACE_BOUND('',#2727,.T.); -#2994=FACE_BOUND('',#2728,.T.); -#2995=FACE_BOUND('',#2729,.T.); -#2996=FACE_BOUND('',#2730,.T.); -#2997=FACE_BOUND('',#2731,.T.); -#2998=FACE_BOUND('',#2732,.T.); -#2999=FACE_BOUND('',#2733,.T.); -#3000=FACE_BOUND('',#2734,.T.); -#3001=FACE_BOUND('',#2735,.T.); -#3002=FACE_BOUND('',#2736,.T.); -#3003=FACE_BOUND('',#2737,.T.); -#3004=FACE_BOUND('',#2738,.T.); -#3005=FACE_BOUND('',#2739,.T.); -#3006=FACE_BOUND('',#2740,.T.); -#3007=FACE_BOUND('',#2741,.T.); -#3008=FACE_BOUND('',#2742,.T.); -#3009=FACE_BOUND('',#2743,.T.); -#3010=FACE_BOUND('',#2744,.T.); -#3011=FACE_BOUND('',#2745,.T.); -#3012=FACE_BOUND('',#2746,.T.); -#3013=FACE_BOUND('',#2747,.T.); -#3014=FACE_BOUND('',#2748,.T.); -#3015=FACE_BOUND('',#2749,.T.); -#3016=FACE_BOUND('',#2750,.T.); -#3017=FACE_BOUND('',#2751,.T.); -#3018=FACE_BOUND('',#2752,.T.); -#3019=FACE_BOUND('',#2753,.T.); -#3020=FACE_BOUND('',#2754,.T.); -#3021=FACE_BOUND('',#2755,.T.); -#3022=FACE_BOUND('',#2756,.T.); -#3023=FACE_BOUND('',#2757,.T.); -#3024=FACE_BOUND('',#2758,.T.); -#3025=FACE_BOUND('',#2759,.T.); -#3026=FACE_BOUND('',#2760,.T.); -#3027=FACE_BOUND('',#2761,.T.); -#3028=FACE_BOUND('',#2762,.T.); -#3029=FACE_BOUND('',#2763,.T.); -#3030=FACE_BOUND('',#2764,.T.); -#3031=FACE_BOUND('',#2765,.T.); -#3032=FACE_BOUND('',#2766,.T.); -#3033=FACE_BOUND('',#2767,.T.); -#3034=FACE_BOUND('',#2768,.T.); -#3035=FACE_BOUND('',#2769,.T.); -#3036=FACE_BOUND('',#2770,.T.); -#3037=FACE_BOUND('',#2771,.T.); -#3038=FACE_BOUND('',#2772,.T.); -#3039=FACE_BOUND('',#2773,.T.); -#3040=FACE_BOUND('',#2774,.T.); -#3041=FACE_BOUND('',#2775,.T.); -#3042=FACE_BOUND('',#2776,.T.); -#3043=FACE_BOUND('',#2777,.T.); -#3044=FACE_BOUND('',#2778,.T.); -#3045=FACE_BOUND('',#2779,.T.); -#3046=FACE_BOUND('',#2780,.T.); -#3047=FACE_BOUND('',#2781,.T.); -#3048=FACE_BOUND('',#2782,.T.); -#3049=FACE_BOUND('',#2783,.T.); -#3050=FACE_BOUND('',#2784,.T.); -#3051=FACE_BOUND('',#2785,.T.); -#3052=FACE_BOUND('',#2786,.T.); -#3053=FACE_BOUND('',#2787,.T.); -#3054=FACE_BOUND('',#2788,.T.); -#3055=FACE_BOUND('',#2789,.T.); -#3056=FACE_BOUND('',#2790,.T.); -#3057=FACE_BOUND('',#2791,.T.); -#3058=FACE_BOUND('',#2792,.T.); -#3059=FACE_BOUND('',#2793,.T.); -#3060=FACE_BOUND('',#2794,.T.); -#3061=FACE_BOUND('',#2795,.T.); -#3062=FACE_BOUND('',#2796,.T.); -#3063=FACE_BOUND('',#2797,.T.); -#3064=FACE_BOUND('',#2798,.T.); -#3065=FACE_BOUND('',#2799,.T.); -#3066=FACE_BOUND('',#2800,.T.); -#3067=FACE_BOUND('',#2801,.T.); -#3068=PLANE('',#3410); -#3069=PLANE('',#3419); -#3070=PLANE('',#3420); -#3071=PLANE('',#3421); -#3072=PLANE('',#3422); -#3073=PLANE('',#3423); -#3074=PLANE('',#3441); -#3075=PLANE('',#3454); -#3076=PLANE('',#3467); -#3077=PLANE('',#3468); -#3078=PLANE('',#3469); -#3079=PLANE('',#3470); -#3080=PLANE('',#3471); -#3081=PLANE('',#3472); -#3082=PLANE('',#3473); -#3083=PLANE('',#3474); -#3084=PLANE('',#3488); -#3085=PLANE('',#3489); -#3086=PLANE('',#3490); -#3087=PLANE('',#3491); -#3088=PLANE('',#3492); -#3089=PLANE('',#3493); -#3090=PLANE('',#3494); -#3091=PLANE('',#3495); -#3092=PLANE('',#3496); -#3093=PLANE('',#3509); -#3094=PLANE('',#3535); -#3095=PLANE('',#3548); -#3096=PLANE('',#3549); -#3097=PLANE('',#3554); -#3098=PLANE('',#3555); -#3099=PLANE('',#3556); -#3100=PLANE('',#3561); -#3101=PLANE('',#3562); -#3102=PLANE('',#3563); -#3103=PLANE('',#3564); -#3104=PLANE('',#3589); -#3105=PLANE('',#3591); -#3106=PLANE('',#3593); -#3107=PLANE('',#3595); -#3108=PLANE('',#3598); -#3109=PLANE('',#3607); -#3110=PLANE('',#3616); -#3111=PLANE('',#3617); -#3112=PLANE('',#3618); -#3113=PLANE('',#3619); -#3114=PLANE('',#3628); -#3115=PLANE('',#3629); -#3116=PLANE('',#3630); -#3117=PLANE('',#3631); -#3118=PLANE('',#3632); -#3119=PLANE('',#3633); -#3120=PLANE('',#3634); -#3121=PLANE('',#3635); -#3122=PLANE('',#3636); -#3123=PLANE('',#3637); -#3124=PLANE('',#3638); -#3125=PLANE('',#3639); -#3126=PLANE('',#3640); -#3127=PLANE('',#3641); -#3128=PLANE('',#3642); -#3129=PLANE('',#3643); -#3130=PLANE('',#3644); -#3131=PLANE('',#3645); -#3132=PLANE('',#3646); -#3133=PLANE('',#3647); -#3134=PLANE('',#3648); -#3135=PLANE('',#3649); -#3136=PLANE('',#3650); -#3137=PLANE('',#3651); -#3138=PLANE('',#3652); -#3139=PLANE('',#3653); -#3140=PLANE('',#3654); -#3141=PLANE('',#3655); -#3142=PLANE('',#3656); -#3143=PLANE('',#3657); -#3144=PLANE('',#3658); -#3145=PLANE('',#3659); -#3146=PLANE('',#3660); -#3147=PLANE('',#3661); -#3148=PLANE('',#3662); -#3149=PLANE('',#3663); -#3150=PLANE('',#3664); -#3151=PLANE('',#3665); -#3152=PLANE('',#3666); -#3153=PLANE('',#3667); -#3154=PLANE('',#3668); -#3155=PLANE('',#3669); -#3156=PLANE('',#3670); -#3157=PLANE('',#3671); -#3158=PLANE('',#3672); -#3159=PLANE('',#3673); -#3160=PLANE('',#3674); -#3161=PLANE('',#3675); -#3162=PLANE('',#3676); -#3163=PLANE('',#3677); -#3164=PLANE('',#3678); -#3165=PLANE('',#3679); -#3166=PLANE('',#3680); -#3167=PLANE('',#3681); -#3168=PLANE('',#3682); -#3169=PLANE('',#3683); -#3170=PLANE('',#3684); -#3171=PLANE('',#3685); -#3172=PLANE('',#3686); -#3173=PLANE('',#3687); -#3174=PLANE('',#3688); -#3175=PLANE('',#3689); -#3176=PLANE('',#3690); -#3177=PLANE('',#3691); -#3178=ADVANCED_FACE('',(#2802,#2803,#2804,#2805,#2806),#3068,.T.); -#3179=ADVANCED_FACE('',(#2807),#3069,.F.); -#3180=ADVANCED_FACE('',(#2808),#3070,.T.); -#3181=ADVANCED_FACE('',(#2809),#3071,.T.); -#3182=ADVANCED_FACE('',(#2810),#3072,.F.); -#3183=ADVANCED_FACE('',(#2811,#2812,#2813,#2814,#2815),#3073,.F.); -#3184=ADVANCED_FACE('',(#2816),#100,.T.); -#3185=ADVANCED_FACE('',(#2817),#101,.T.); -#3186=ADVANCED_FACE('',(#2818),#102,.T.); -#3187=ADVANCED_FACE('',(#2819),#103,.T.); -#3188=ADVANCED_FACE('',(#2820,#2821),#104,.F.); -#3189=ADVANCED_FACE('',(#2822,#2823),#105,.F.); -#3190=ADVANCED_FACE('',(#2824,#2825),#106,.F.); -#3191=ADVANCED_FACE('',(#2826,#2827),#107,.F.); -#3192=ADVANCED_FACE('',(#2828,#2829,#2830,#2831,#2832,#2833),#3074,.T.); -#3193=ADVANCED_FACE('',(#2834,#2835,#2836,#2837,#2838,#2839),#3075,.F.); -#3194=ADVANCED_FACE('',(#2840),#3076,.F.); -#3195=ADVANCED_FACE('',(#2841),#3077,.T.); -#3196=ADVANCED_FACE('',(#2842),#3078,.T.); -#3197=ADVANCED_FACE('',(#2843),#3079,.F.); -#3198=ADVANCED_FACE('',(#2844),#3080,.T.); -#3199=ADVANCED_FACE('',(#2845),#3081,.F.); -#3200=ADVANCED_FACE('',(#2846),#3082,.F.); -#3201=ADVANCED_FACE('',(#2847),#3083,.T.); -#3202=ADVANCED_FACE('',(#2848),#108,.T.); -#3203=ADVANCED_FACE('',(#2849),#109,.T.); -#3204=ADVANCED_FACE('',(#2850),#110,.T.); -#3205=ADVANCED_FACE('',(#2851),#111,.T.); -#3206=ADVANCED_FACE('',(#2852),#112,.F.); -#3207=ADVANCED_FACE('',(#2853),#113,.F.); -#3208=ADVANCED_FACE('',(#2854),#114,.F.); -#3209=ADVANCED_FACE('',(#2855),#115,.F.); -#3210=ADVANCED_FACE('',(#2856,#2857),#116,.F.); -#3211=ADVANCED_FACE('',(#2858,#2859),#117,.F.); -#3212=ADVANCED_FACE('',(#2860,#2861),#118,.F.); -#3213=ADVANCED_FACE('',(#2862,#2863),#119,.F.); -#3214=ADVANCED_FACE('',(#2864),#3084,.F.); -#3215=ADVANCED_FACE('',(#2865),#3085,.F.); -#3216=ADVANCED_FACE('',(#2866),#3086,.F.); -#3217=ADVANCED_FACE('',(#2867),#3087,.T.); -#3218=ADVANCED_FACE('',(#2868),#3088,.F.); -#3219=ADVANCED_FACE('',(#2869),#3089,.T.); -#3220=ADVANCED_FACE('',(#2870),#3090,.F.); -#3221=ADVANCED_FACE('',(#2871),#3091,.T.); -#3222=ADVANCED_FACE('',(#2872,#2873,#2874,#2875,#2876,#2877),#3092,.T.); -#3223=ADVANCED_FACE('',(#2878,#2879,#2880,#2881,#2882,#2883),#3093,.F.); -#3224=ADVANCED_FACE('',(#2884),#120,.T.); -#3225=ADVANCED_FACE('',(#2885),#121,.T.); -#3226=ADVANCED_FACE('',(#2886),#122,.T.); -#3227=ADVANCED_FACE('',(#2887),#123,.T.); -#3228=ADVANCED_FACE('',(#2888),#124,.F.); -#3229=ADVANCED_FACE('',(#2889),#125,.F.); -#3230=ADVANCED_FACE('',(#2890),#126,.F.); -#3231=ADVANCED_FACE('',(#2891),#127,.F.); -#3232=ADVANCED_FACE('',(#2892,#2893),#128,.F.); -#3233=ADVANCED_FACE('',(#2894,#2895),#129,.F.); -#3234=ADVANCED_FACE('',(#2896,#2897),#130,.F.); -#3235=ADVANCED_FACE('',(#2898,#2899),#131,.F.); -#3236=ADVANCED_FACE('',(#2900,#2901,#2902,#2903,#2904,#2905),#3094,.T.); -#3237=ADVANCED_FACE('',(#2906),#3095,.F.); -#3238=ADVANCED_FACE('',(#2907,#2908),#3096,.T.); -#3239=ADVANCED_FACE('',(#2909),#3097,.T.); -#3240=ADVANCED_FACE('',(#2910),#3098,.F.); -#3241=ADVANCED_FACE('',(#2911,#2912),#3099,.F.); -#3242=ADVANCED_FACE('',(#2913),#3100,.T.); -#3243=ADVANCED_FACE('',(#2914),#3101,.T.); -#3244=ADVANCED_FACE('',(#2915),#3102,.F.); -#3245=ADVANCED_FACE('',(#2916,#2917,#2918,#2919,#2920,#2921),#3103,.F.); -#3246=ADVANCED_FACE('',(#2922),#132,.T.); -#3247=ADVANCED_FACE('',(#2923),#133,.T.); -#3248=ADVANCED_FACE('',(#2924),#134,.T.); -#3249=ADVANCED_FACE('',(#2925),#135,.T.); -#3250=ADVANCED_FACE('',(#2926),#136,.F.); -#3251=ADVANCED_FACE('',(#2927),#137,.F.); -#3252=ADVANCED_FACE('',(#2928),#138,.F.); -#3253=ADVANCED_FACE('',(#2929),#139,.F.); -#3254=ADVANCED_FACE('',(#2930,#2931),#140,.F.); -#3255=ADVANCED_FACE('',(#2932,#2933),#141,.F.); -#3256=ADVANCED_FACE('',(#2934,#2935),#142,.F.); -#3257=ADVANCED_FACE('',(#2936,#2937),#143,.F.); -#3258=ADVANCED_FACE('',(#2938),#3104,.F.); -#3259=ADVANCED_FACE('',(#2939),#144,.F.); -#3260=ADVANCED_FACE('',(#2940),#3105,.T.); -#3261=ADVANCED_FACE('',(#2941),#145,.F.); -#3262=ADVANCED_FACE('',(#2942),#3106,.T.); -#3263=ADVANCED_FACE('',(#2943),#146,.F.); -#3264=ADVANCED_FACE('',(#2944),#3107,.F.); -#3265=ADVANCED_FACE('',(#2945),#147,.F.); -#3266=ADVANCED_FACE('',(#2946,#2947,#2948,#2949,#2950,#2951,#2952,#2953, -#2954,#2955,#2956,#2957,#2958,#2959,#2960,#2961,#2962,#2963,#2964,#2965, -#2966),#3108,.T.); -#3267=ADVANCED_FACE('',(#2967,#2968,#2969,#2970,#2971,#2972,#2973,#2974, -#2975,#2976,#2977,#2978,#2979,#2980,#2981,#2982,#2983,#2984,#2985,#2986, -#2987),#3109,.F.); -#3268=ADVANCED_FACE('',(#2988),#3110,.T.); -#3269=ADVANCED_FACE('',(#2989),#3111,.F.); -#3270=ADVANCED_FACE('',(#2990),#3112,.T.); -#3271=ADVANCED_FACE('',(#2991),#3113,.F.); -#3272=ADVANCED_FACE('',(#2992),#148,.T.); -#3273=ADVANCED_FACE('',(#2993),#149,.T.); -#3274=ADVANCED_FACE('',(#2994),#150,.T.); -#3275=ADVANCED_FACE('',(#2995),#151,.T.); -#3276=ADVANCED_FACE('',(#2996,#2997),#152,.F.); -#3277=ADVANCED_FACE('',(#2998,#2999),#153,.F.); -#3278=ADVANCED_FACE('',(#3000,#3001),#154,.F.); -#3279=ADVANCED_FACE('',(#3002,#3003),#155,.F.); -#3280=ADVANCED_FACE('',(#3004),#3114,.T.); -#3281=ADVANCED_FACE('',(#3005),#3115,.T.); -#3282=ADVANCED_FACE('',(#3006),#3116,.T.); -#3283=ADVANCED_FACE('',(#3007),#3117,.T.); -#3284=ADVANCED_FACE('',(#3008),#3118,.T.); -#3285=ADVANCED_FACE('',(#3009),#3119,.T.); -#3286=ADVANCED_FACE('',(#3010),#3120,.T.); -#3287=ADVANCED_FACE('',(#3011),#3121,.T.); -#3288=ADVANCED_FACE('',(#3012),#3122,.T.); -#3289=ADVANCED_FACE('',(#3013),#3123,.T.); -#3290=ADVANCED_FACE('',(#3014),#3124,.T.); -#3291=ADVANCED_FACE('',(#3015),#3125,.T.); -#3292=ADVANCED_FACE('',(#3016),#3126,.T.); -#3293=ADVANCED_FACE('',(#3017),#3127,.T.); -#3294=ADVANCED_FACE('',(#3018),#3128,.T.); -#3295=ADVANCED_FACE('',(#3019),#3129,.T.); -#3296=ADVANCED_FACE('',(#3020),#3130,.T.); -#3297=ADVANCED_FACE('',(#3021),#3131,.T.); -#3298=ADVANCED_FACE('',(#3022),#3132,.T.); -#3299=ADVANCED_FACE('',(#3023),#3133,.T.); -#3300=ADVANCED_FACE('',(#3024),#3134,.T.); -#3301=ADVANCED_FACE('',(#3025),#3135,.T.); -#3302=ADVANCED_FACE('',(#3026),#3136,.T.); -#3303=ADVANCED_FACE('',(#3027),#3137,.T.); -#3304=ADVANCED_FACE('',(#3028),#3138,.T.); -#3305=ADVANCED_FACE('',(#3029),#3139,.T.); -#3306=ADVANCED_FACE('',(#3030),#3140,.T.); -#3307=ADVANCED_FACE('',(#3031),#3141,.T.); -#3308=ADVANCED_FACE('',(#3032),#3142,.T.); -#3309=ADVANCED_FACE('',(#3033),#3143,.T.); -#3310=ADVANCED_FACE('',(#3034),#3144,.T.); -#3311=ADVANCED_FACE('',(#3035),#3145,.T.); -#3312=ADVANCED_FACE('',(#3036),#3146,.T.); -#3313=ADVANCED_FACE('',(#3037),#3147,.T.); -#3314=ADVANCED_FACE('',(#3038),#3148,.T.); -#3315=ADVANCED_FACE('',(#3039),#3149,.T.); -#3316=ADVANCED_FACE('',(#3040),#3150,.T.); -#3317=ADVANCED_FACE('',(#3041),#3151,.T.); -#3318=ADVANCED_FACE('',(#3042),#3152,.T.); -#3319=ADVANCED_FACE('',(#3043),#3153,.T.); -#3320=ADVANCED_FACE('',(#3044),#3154,.T.); -#3321=ADVANCED_FACE('',(#3045),#3155,.T.); -#3322=ADVANCED_FACE('',(#3046),#3156,.T.); -#3323=ADVANCED_FACE('',(#3047),#3157,.T.); -#3324=ADVANCED_FACE('',(#3048),#3158,.T.); -#3325=ADVANCED_FACE('',(#3049),#3159,.T.); -#3326=ADVANCED_FACE('',(#3050),#3160,.T.); -#3327=ADVANCED_FACE('',(#3051),#3161,.T.); -#3328=ADVANCED_FACE('',(#3052),#3162,.T.); -#3329=ADVANCED_FACE('',(#3053),#3163,.T.); -#3330=ADVANCED_FACE('',(#3054),#3164,.T.); -#3331=ADVANCED_FACE('',(#3055),#3165,.T.); -#3332=ADVANCED_FACE('',(#3056),#3166,.T.); -#3333=ADVANCED_FACE('',(#3057),#3167,.T.); -#3334=ADVANCED_FACE('',(#3058),#3168,.T.); -#3335=ADVANCED_FACE('',(#3059),#3169,.T.); -#3336=ADVANCED_FACE('',(#3060),#3170,.T.); -#3337=ADVANCED_FACE('',(#3061),#3171,.T.); -#3338=ADVANCED_FACE('',(#3062),#3172,.T.); -#3339=ADVANCED_FACE('',(#3063),#3173,.T.); -#3340=ADVANCED_FACE('',(#3064),#3174,.T.); -#3341=ADVANCED_FACE('',(#3065),#3175,.T.); -#3342=ADVANCED_FACE('',(#3066),#3176,.T.); -#3343=ADVANCED_FACE('',(#3067),#3177,.T.); -#3344=CLOSED_SHELL('',(#3178,#3179,#3180,#3181,#3182,#3183,#3184,#3185, -#3186,#3187,#3188,#3189,#3190,#3191)); -#3345=CLOSED_SHELL('',(#3192,#3193,#3194,#3195,#3196,#3197,#3198,#3199, -#3200,#3201,#3202,#3203,#3204,#3205,#3206,#3207,#3208,#3209,#3210,#3211, -#3212,#3213)); -#3346=CLOSED_SHELL('',(#3214,#3215,#3216,#3217,#3218,#3219,#3220,#3221, -#3222,#3223,#3224,#3225,#3226,#3227,#3228,#3229,#3230,#3231,#3232,#3233, -#3234,#3235)); -#3347=CLOSED_SHELL('',(#3236,#3237,#3238,#3239,#3240,#3241,#3242,#3243, -#3244,#3245,#3246,#3247,#3248,#3249,#3250,#3251,#3252,#3253,#3254,#3255, -#3256,#3257,#3258,#3259,#3260,#3261,#3262,#3263,#3264,#3265)); -#3348=CLOSED_SHELL('',(#3266,#3267,#3268,#3269,#3270,#3271,#3272,#3273, -#3274,#3275,#3276,#3277,#3278,#3279,#3280,#3281,#3282,#3283,#3284,#3285, -#3286,#3287,#3288,#3289,#3290,#3291,#3292,#3293,#3294,#3295,#3296,#3297, -#3298,#3299,#3300,#3301,#3302,#3303,#3304,#3305,#3306,#3307,#3308,#3309, -#3310,#3311,#3312,#3313,#3314,#3315,#3316,#3317,#3318,#3319,#3320,#3321, -#3322,#3323,#3324,#3325,#3326,#3327,#3328,#3329,#3330,#3331,#3332,#3333, -#3334,#3335,#3336,#3337,#3338,#3339,#3340,#3341,#3342,#3343)); -#3349=STYLED_ITEM('',(#3354),#3392); -#3350=STYLED_ITEM('',(#3355),#3393); -#3351=STYLED_ITEM('',(#3356),#3394); -#3352=STYLED_ITEM('',(#3357),#3395); -#3353=STYLED_ITEM('',(#3358),#3396); -#3354=PRESENTATION_STYLE_ASSIGNMENT((#3359)); -#3355=PRESENTATION_STYLE_ASSIGNMENT((#3360)); -#3356=PRESENTATION_STYLE_ASSIGNMENT((#3361)); -#3357=PRESENTATION_STYLE_ASSIGNMENT((#3362)); -#3358=PRESENTATION_STYLE_ASSIGNMENT((#3363)); -#3359=SURFACE_STYLE_USAGE(.BOTH.,#3364); -#3360=SURFACE_STYLE_USAGE(.BOTH.,#3365); -#3361=SURFACE_STYLE_USAGE(.BOTH.,#3366); -#3362=SURFACE_STYLE_USAGE(.BOTH.,#3367); -#3363=SURFACE_STYLE_USAGE(.BOTH.,#3368); -#3364=SURFACE_SIDE_STYLE('',(#3375,#3369)); -#3365=SURFACE_SIDE_STYLE('',(#3376,#3370)); -#3366=SURFACE_SIDE_STYLE('',(#3377)); -#3367=SURFACE_SIDE_STYLE('',(#3378)); -#3368=SURFACE_SIDE_STYLE('',(#3379,#3371)); -#3369=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.CONSTANT_SHADING.,#3390, -(#3372)); -#3370=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.CONSTANT_SHADING.,#3390, -(#3373)); -#3371=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.CONSTANT_SHADING.,#3390, -(#3374)); -#3372=SURFACE_STYLE_TRANSPARENT(0.733333333333333); -#3373=SURFACE_STYLE_TRANSPARENT(0.733333333333333); -#3374=SURFACE_STYLE_TRANSPARENT(0.733333333333333); -#3375=SURFACE_STYLE_FILL_AREA(#3380); -#3376=SURFACE_STYLE_FILL_AREA(#3381); -#3377=SURFACE_STYLE_FILL_AREA(#3382); -#3378=SURFACE_STYLE_FILL_AREA(#3383); -#3379=SURFACE_STYLE_FILL_AREA(#3384); -#3380=FILL_AREA_STYLE('',(#3385)); -#3381=FILL_AREA_STYLE('',(#3386)); -#3382=FILL_AREA_STYLE('',(#3387)); -#3383=FILL_AREA_STYLE('',(#3388)); -#3384=FILL_AREA_STYLE('',(#3389)); -#3385=FILL_AREA_STYLE_COLOUR('',#3390); -#3386=FILL_AREA_STYLE_COLOUR('',#3390); -#3387=FILL_AREA_STYLE_COLOUR('',#3390); -#3388=FILL_AREA_STYLE_COLOUR('',#3391); -#3389=FILL_AREA_STYLE_COLOUR('',#3390); -#3390=COLOUR_RGB('',0.917647058823529,0.917647058823529,0.917647058823529); -#3391=COLOUR_RGB('',0.301960784313725,0.301960784313725,0.301960784313725); -#3392=MANIFOLD_SOLID_BREP('Part 232',#3344); -#3393=MANIFOLD_SOLID_BREP('Part 234',#3345); -#3394=MANIFOLD_SOLID_BREP('Part 236',#3346); -#3395=MANIFOLD_SOLID_BREP('Part 233',#3347); -#3396=MANIFOLD_SOLID_BREP('Part 235',#3348); -#3397=SHAPE_DEFINITION_REPRESENTATION(#5545,#3403); -#3398=SHAPE_DEFINITION_REPRESENTATION(#5546,#3404); -#3399=SHAPE_DEFINITION_REPRESENTATION(#5548,#3405); -#3400=SHAPE_DEFINITION_REPRESENTATION(#5550,#3406); -#3401=SHAPE_DEFINITION_REPRESENTATION(#5552,#3407); -#3402=SHAPE_DEFINITION_REPRESENTATION(#5554,#3408); -#3403=SHAPE_REPRESENTATION('Assembly 1',(#3409,#3440,#3487,#3534,#3597, -#3692),#5530); -#3404=SHAPE_REPRESENTATION('Part 232',(#3409),#5531); -#3405=SHAPE_REPRESENTATION('Part 234',(#3409),#5532); -#3406=SHAPE_REPRESENTATION('Part 236',(#3409),#5533); -#3407=SHAPE_REPRESENTATION('Part 233',(#3409),#5534); -#3408=SHAPE_REPRESENTATION('Part 235',(#3409),#5535); -#3409=AXIS2_PLACEMENT_3D('',#4597,#3693,#3694); -#3410=AXIS2_PLACEMENT_3D('',#4598,#3695,#3696); -#3411=AXIS2_PLACEMENT_3D('',#4599,#3697,#3698); -#3412=AXIS2_PLACEMENT_3D('',#4601,#3699,#3700); -#3413=AXIS2_PLACEMENT_3D('',#4603,#3701,#3702); -#3414=AXIS2_PLACEMENT_3D('',#4605,#3703,#3704); -#3415=AXIS2_PLACEMENT_3D('',#4610,#3706,#3707); -#3416=AXIS2_PLACEMENT_3D('',#4614,#3709,#3710); -#3417=AXIS2_PLACEMENT_3D('',#4618,#3712,#3713); -#3418=AXIS2_PLACEMENT_3D('',#4622,#3715,#3716); -#3419=AXIS2_PLACEMENT_3D('',#4623,#3717,#3718); -#3420=AXIS2_PLACEMENT_3D('',#4629,#3722,#3723); -#3421=AXIS2_PLACEMENT_3D('',#4635,#3727,#3728); -#3422=AXIS2_PLACEMENT_3D('',#4641,#3732,#3733); -#3423=AXIS2_PLACEMENT_3D('',#4647,#3737,#3738); -#3424=AXIS2_PLACEMENT_3D('',#4648,#3739,#3740); -#3425=AXIS2_PLACEMENT_3D('',#4650,#3741,#3742); -#3426=AXIS2_PLACEMENT_3D('',#4652,#3743,#3744); -#3427=AXIS2_PLACEMENT_3D('',#4654,#3745,#3746); -#3428=AXIS2_PLACEMENT_3D('',#4656,#3747,#3748); -#3429=AXIS2_PLACEMENT_3D('',#4657,#3749,#3750); -#3430=AXIS2_PLACEMENT_3D('',#4658,#3751,#3752); -#3431=AXIS2_PLACEMENT_3D('',#4659,#3753,#3754); -#3432=AXIS2_PLACEMENT_3D('',#4660,#3755,#3756); -#3433=AXIS2_PLACEMENT_3D('',#4661,#3757,#3758); -#3434=AXIS2_PLACEMENT_3D('',#4662,#3759,#3760); -#3435=AXIS2_PLACEMENT_3D('',#4663,#3761,#3762); -#3436=AXIS2_PLACEMENT_3D('',#4664,#3763,#3764); -#3437=AXIS2_PLACEMENT_3D('',#4665,#3765,#3766); -#3438=AXIS2_PLACEMENT_3D('',#4666,#3767,#3768); -#3439=AXIS2_PLACEMENT_3D('',#4667,#3769,#3770); -#3440=AXIS2_PLACEMENT_3D('',#4668,#3771,#3772); -#3441=AXIS2_PLACEMENT_3D('',#4669,#3773,#3774); -#3442=AXIS2_PLACEMENT_3D('',#4670,#3775,#3776); -#3443=AXIS2_PLACEMENT_3D('',#4672,#3777,#3778); -#3444=AXIS2_PLACEMENT_3D('',#4674,#3779,#3780); -#3445=AXIS2_PLACEMENT_3D('',#4676,#3781,#3782); -#3446=AXIS2_PLACEMENT_3D('',#4681,#3784,#3785); -#3447=AXIS2_PLACEMENT_3D('',#4685,#3787,#3788); -#3448=AXIS2_PLACEMENT_3D('',#4689,#3790,#3791); -#3449=AXIS2_PLACEMENT_3D('',#4693,#3793,#3794); -#3450=AXIS2_PLACEMENT_3D('',#4697,#3796,#3797); -#3451=AXIS2_PLACEMENT_3D('',#4701,#3799,#3800); -#3452=AXIS2_PLACEMENT_3D('',#4705,#3802,#3803); -#3453=AXIS2_PLACEMENT_3D('',#4709,#3805,#3806); -#3454=AXIS2_PLACEMENT_3D('',#4710,#3807,#3808); -#3455=AXIS2_PLACEMENT_3D('',#4711,#3809,#3810); -#3456=AXIS2_PLACEMENT_3D('',#4713,#3811,#3812); -#3457=AXIS2_PLACEMENT_3D('',#4715,#3813,#3814); -#3458=AXIS2_PLACEMENT_3D('',#4717,#3815,#3816); -#3459=AXIS2_PLACEMENT_3D('',#4722,#3818,#3819); -#3460=AXIS2_PLACEMENT_3D('',#4726,#3821,#3822); -#3461=AXIS2_PLACEMENT_3D('',#4730,#3824,#3825); -#3462=AXIS2_PLACEMENT_3D('',#4734,#3827,#3828); -#3463=AXIS2_PLACEMENT_3D('',#4738,#3830,#3831); -#3464=AXIS2_PLACEMENT_3D('',#4742,#3833,#3834); -#3465=AXIS2_PLACEMENT_3D('',#4746,#3836,#3837); -#3466=AXIS2_PLACEMENT_3D('',#4750,#3839,#3840); -#3467=AXIS2_PLACEMENT_3D('',#4751,#3841,#3842); -#3468=AXIS2_PLACEMENT_3D('',#4754,#3845,#3846); -#3469=AXIS2_PLACEMENT_3D('',#4757,#3849,#3850); -#3470=AXIS2_PLACEMENT_3D('',#4760,#3853,#3854); -#3471=AXIS2_PLACEMENT_3D('',#4763,#3857,#3858); -#3472=AXIS2_PLACEMENT_3D('',#4766,#3861,#3862); -#3473=AXIS2_PLACEMENT_3D('',#4769,#3865,#3866); -#3474=AXIS2_PLACEMENT_3D('',#4772,#3869,#3870); -#3475=AXIS2_PLACEMENT_3D('',#4775,#3873,#3874); -#3476=AXIS2_PLACEMENT_3D('',#4776,#3875,#3876); -#3477=AXIS2_PLACEMENT_3D('',#4777,#3877,#3878); -#3478=AXIS2_PLACEMENT_3D('',#4778,#3879,#3880); -#3479=AXIS2_PLACEMENT_3D('',#4779,#3881,#3882); -#3480=AXIS2_PLACEMENT_3D('',#4780,#3883,#3884); -#3481=AXIS2_PLACEMENT_3D('',#4781,#3885,#3886); -#3482=AXIS2_PLACEMENT_3D('',#4782,#3887,#3888); -#3483=AXIS2_PLACEMENT_3D('',#4783,#3889,#3890); -#3484=AXIS2_PLACEMENT_3D('',#4784,#3891,#3892); -#3485=AXIS2_PLACEMENT_3D('',#4785,#3893,#3894); -#3486=AXIS2_PLACEMENT_3D('',#4786,#3895,#3896); -#3487=AXIS2_PLACEMENT_3D('',#4787,#3897,#3898); -#3488=AXIS2_PLACEMENT_3D('',#4788,#3899,#3900); -#3489=AXIS2_PLACEMENT_3D('',#4797,#3905,#3906); -#3490=AXIS2_PLACEMENT_3D('',#4806,#3911,#3912); -#3491=AXIS2_PLACEMENT_3D('',#4815,#3917,#3918); -#3492=AXIS2_PLACEMENT_3D('',#4824,#3923,#3924); -#3493=AXIS2_PLACEMENT_3D('',#4833,#3929,#3930); -#3494=AXIS2_PLACEMENT_3D('',#4842,#3935,#3936); -#3495=AXIS2_PLACEMENT_3D('',#4851,#3941,#3942); -#3496=AXIS2_PLACEMENT_3D('',#4860,#3947,#3948); -#3497=AXIS2_PLACEMENT_3D('',#4861,#3949,#3950); -#3498=AXIS2_PLACEMENT_3D('',#4863,#3951,#3952); -#3499=AXIS2_PLACEMENT_3D('',#4865,#3953,#3954); -#3500=AXIS2_PLACEMENT_3D('',#4867,#3955,#3956); -#3501=AXIS2_PLACEMENT_3D('',#4869,#3957,#3958); -#3502=AXIS2_PLACEMENT_3D('',#4870,#3959,#3960); -#3503=AXIS2_PLACEMENT_3D('',#4871,#3961,#3962); -#3504=AXIS2_PLACEMENT_3D('',#4872,#3963,#3964); -#3505=AXIS2_PLACEMENT_3D('',#4873,#3965,#3966); -#3506=AXIS2_PLACEMENT_3D('',#4874,#3967,#3968); -#3507=AXIS2_PLACEMENT_3D('',#4875,#3969,#3970); -#3508=AXIS2_PLACEMENT_3D('',#4876,#3971,#3972); -#3509=AXIS2_PLACEMENT_3D('',#4877,#3973,#3974); -#3510=AXIS2_PLACEMENT_3D('',#4878,#3975,#3976); -#3511=AXIS2_PLACEMENT_3D('',#4880,#3977,#3978); -#3512=AXIS2_PLACEMENT_3D('',#4882,#3979,#3980); -#3513=AXIS2_PLACEMENT_3D('',#4884,#3981,#3982); -#3514=AXIS2_PLACEMENT_3D('',#4886,#3983,#3984); -#3515=AXIS2_PLACEMENT_3D('',#4887,#3985,#3986); -#3516=AXIS2_PLACEMENT_3D('',#4888,#3987,#3988); -#3517=AXIS2_PLACEMENT_3D('',#4889,#3989,#3990); -#3518=AXIS2_PLACEMENT_3D('',#4890,#3991,#3992); -#3519=AXIS2_PLACEMENT_3D('',#4891,#3993,#3994); -#3520=AXIS2_PLACEMENT_3D('',#4892,#3995,#3996); -#3521=AXIS2_PLACEMENT_3D('',#4893,#3997,#3998); -#3522=AXIS2_PLACEMENT_3D('',#4894,#3999,#4000); -#3523=AXIS2_PLACEMENT_3D('',#4895,#4001,#4002); -#3524=AXIS2_PLACEMENT_3D('',#4896,#4003,#4004); -#3525=AXIS2_PLACEMENT_3D('',#4897,#4005,#4006); -#3526=AXIS2_PLACEMENT_3D('',#4898,#4007,#4008); -#3527=AXIS2_PLACEMENT_3D('',#4899,#4009,#4010); -#3528=AXIS2_PLACEMENT_3D('',#4900,#4011,#4012); -#3529=AXIS2_PLACEMENT_3D('',#4901,#4013,#4014); -#3530=AXIS2_PLACEMENT_3D('',#4902,#4015,#4016); -#3531=AXIS2_PLACEMENT_3D('',#4903,#4017,#4018); -#3532=AXIS2_PLACEMENT_3D('',#4904,#4019,#4020); -#3533=AXIS2_PLACEMENT_3D('',#4905,#4021,#4022); -#3534=AXIS2_PLACEMENT_3D('',#4906,#4023,#4024); -#3535=AXIS2_PLACEMENT_3D('',#4907,#4025,#4026); -#3536=AXIS2_PLACEMENT_3D('',#4908,#4027,#4028); -#3537=AXIS2_PLACEMENT_3D('',#4910,#4029,#4030); -#3538=AXIS2_PLACEMENT_3D('',#4912,#4031,#4032); -#3539=AXIS2_PLACEMENT_3D('',#4914,#4033,#4034); -#3540=AXIS2_PLACEMENT_3D('',#4919,#4036,#4037); -#3541=AXIS2_PLACEMENT_3D('',#4923,#4039,#4040); -#3542=AXIS2_PLACEMENT_3D('',#4927,#4042,#4043); -#3543=AXIS2_PLACEMENT_3D('',#4931,#4045,#4046); -#3544=AXIS2_PLACEMENT_3D('',#4935,#4048,#4049); -#3545=AXIS2_PLACEMENT_3D('',#4939,#4051,#4052); -#3546=AXIS2_PLACEMENT_3D('',#4943,#4054,#4055); -#3547=AXIS2_PLACEMENT_3D('',#4947,#4057,#4058); -#3548=AXIS2_PLACEMENT_3D('',#4948,#4059,#4060); -#3549=AXIS2_PLACEMENT_3D('',#4954,#4064,#4065); -#3550=AXIS2_PLACEMENT_3D('',#4958,#4067,#4068); -#3551=AXIS2_PLACEMENT_3D('',#4962,#4070,#4071); -#3552=AXIS2_PLACEMENT_3D('',#4966,#4073,#4074); -#3553=AXIS2_PLACEMENT_3D('',#4970,#4076,#4077); -#3554=AXIS2_PLACEMENT_3D('',#4976,#4081,#4082); -#3555=AXIS2_PLACEMENT_3D('',#4982,#4086,#4087); -#3556=AXIS2_PLACEMENT_3D('',#4988,#4091,#4092); -#3557=AXIS2_PLACEMENT_3D('',#4989,#4093,#4094); -#3558=AXIS2_PLACEMENT_3D('',#4994,#4096,#4097); -#3559=AXIS2_PLACEMENT_3D('',#4998,#4099,#4100); -#3560=AXIS2_PLACEMENT_3D('',#5002,#4102,#4103); -#3561=AXIS2_PLACEMENT_3D('',#5010,#4108,#4109); -#3562=AXIS2_PLACEMENT_3D('',#5016,#4113,#4114); -#3563=AXIS2_PLACEMENT_3D('',#5022,#4118,#4119); -#3564=AXIS2_PLACEMENT_3D('',#5028,#4123,#4124); -#3565=AXIS2_PLACEMENT_3D('',#5029,#4125,#4126); -#3566=AXIS2_PLACEMENT_3D('',#5031,#4127,#4128); -#3567=AXIS2_PLACEMENT_3D('',#5033,#4129,#4130); -#3568=AXIS2_PLACEMENT_3D('',#5035,#4131,#4132); -#3569=AXIS2_PLACEMENT_3D('',#5037,#4133,#4134); -#3570=AXIS2_PLACEMENT_3D('',#5038,#4135,#4136); -#3571=AXIS2_PLACEMENT_3D('',#5039,#4137,#4138); -#3572=AXIS2_PLACEMENT_3D('',#5040,#4139,#4140); -#3573=AXIS2_PLACEMENT_3D('',#5041,#4141,#4142); -#3574=AXIS2_PLACEMENT_3D('',#5042,#4143,#4144); -#3575=AXIS2_PLACEMENT_3D('',#5043,#4145,#4146); -#3576=AXIS2_PLACEMENT_3D('',#5044,#4147,#4148); -#3577=AXIS2_PLACEMENT_3D('',#5045,#4149,#4150); -#3578=AXIS2_PLACEMENT_3D('',#5046,#4151,#4152); -#3579=AXIS2_PLACEMENT_3D('',#5047,#4153,#4154); -#3580=AXIS2_PLACEMENT_3D('',#5048,#4155,#4156); -#3581=AXIS2_PLACEMENT_3D('',#5049,#4157,#4158); -#3582=AXIS2_PLACEMENT_3D('',#5050,#4159,#4160); -#3583=AXIS2_PLACEMENT_3D('',#5051,#4161,#4162); -#3584=AXIS2_PLACEMENT_3D('',#5052,#4163,#4164); -#3585=AXIS2_PLACEMENT_3D('',#5053,#4165,#4166); -#3586=AXIS2_PLACEMENT_3D('',#5054,#4167,#4168); -#3587=AXIS2_PLACEMENT_3D('',#5055,#4169,#4170); -#3588=AXIS2_PLACEMENT_3D('',#5056,#4171,#4172); -#3589=AXIS2_PLACEMENT_3D('',#5057,#4173,#4174); -#3590=AXIS2_PLACEMENT_3D('',#5060,#4177,#4178); -#3591=AXIS2_PLACEMENT_3D('',#5062,#4180,#4181); -#3592=AXIS2_PLACEMENT_3D('',#5064,#4183,#4184); -#3593=AXIS2_PLACEMENT_3D('',#5066,#4186,#4187); -#3594=AXIS2_PLACEMENT_3D('',#5068,#4189,#4190); -#3595=AXIS2_PLACEMENT_3D('',#5070,#4192,#4193); -#3596=AXIS2_PLACEMENT_3D('',#5072,#4195,#4196); -#3597=AXIS2_PLACEMENT_3D('',#5073,#4197,#4198); -#3598=AXIS2_PLACEMENT_3D('',#5074,#4199,#4200); -#3599=AXIS2_PLACEMENT_3D('',#5075,#4201,#4202); -#3600=AXIS2_PLACEMENT_3D('',#5077,#4203,#4204); -#3601=AXIS2_PLACEMENT_3D('',#5079,#4205,#4206); -#3602=AXIS2_PLACEMENT_3D('',#5081,#4207,#4208); -#3603=AXIS2_PLACEMENT_3D('',#5086,#4210,#4211); -#3604=AXIS2_PLACEMENT_3D('',#5090,#4213,#4214); -#3605=AXIS2_PLACEMENT_3D('',#5094,#4216,#4217); -#3606=AXIS2_PLACEMENT_3D('',#5098,#4219,#4220); -#3607=AXIS2_PLACEMENT_3D('',#5227,#4285,#4286); -#3608=AXIS2_PLACEMENT_3D('',#5292,#4319,#4320); -#3609=AXIS2_PLACEMENT_3D('',#5294,#4321,#4322); -#3610=AXIS2_PLACEMENT_3D('',#5296,#4323,#4324); -#3611=AXIS2_PLACEMENT_3D('',#5298,#4325,#4326); -#3612=AXIS2_PLACEMENT_3D('',#5303,#4328,#4329); -#3613=AXIS2_PLACEMENT_3D('',#5307,#4331,#4332); -#3614=AXIS2_PLACEMENT_3D('',#5311,#4334,#4335); -#3615=AXIS2_PLACEMENT_3D('',#5315,#4337,#4338); -#3616=AXIS2_PLACEMENT_3D('',#5380,#4371,#4372); -#3617=AXIS2_PLACEMENT_3D('',#5383,#4375,#4376); -#3618=AXIS2_PLACEMENT_3D('',#5386,#4379,#4380); -#3619=AXIS2_PLACEMENT_3D('',#5389,#4383,#4384); -#3620=AXIS2_PLACEMENT_3D('',#5392,#4387,#4388); -#3621=AXIS2_PLACEMENT_3D('',#5393,#4389,#4390); -#3622=AXIS2_PLACEMENT_3D('',#5394,#4391,#4392); -#3623=AXIS2_PLACEMENT_3D('',#5395,#4393,#4394); -#3624=AXIS2_PLACEMENT_3D('',#5396,#4395,#4396); -#3625=AXIS2_PLACEMENT_3D('',#5397,#4397,#4398); -#3626=AXIS2_PLACEMENT_3D('',#5398,#4399,#4400); -#3627=AXIS2_PLACEMENT_3D('',#5399,#4401,#4402); -#3628=AXIS2_PLACEMENT_3D('',#5400,#4403,#4404); -#3629=AXIS2_PLACEMENT_3D('',#5403,#4407,#4408); -#3630=AXIS2_PLACEMENT_3D('',#5405,#4410,#4411); -#3631=AXIS2_PLACEMENT_3D('',#5407,#4413,#4414); -#3632=AXIS2_PLACEMENT_3D('',#5408,#4415,#4416); -#3633=AXIS2_PLACEMENT_3D('',#5411,#4419,#4420); -#3634=AXIS2_PLACEMENT_3D('',#5413,#4422,#4423); -#3635=AXIS2_PLACEMENT_3D('',#5415,#4425,#4426); -#3636=AXIS2_PLACEMENT_3D('',#5416,#4427,#4428); -#3637=AXIS2_PLACEMENT_3D('',#5419,#4431,#4432); -#3638=AXIS2_PLACEMENT_3D('',#5421,#4434,#4435); -#3639=AXIS2_PLACEMENT_3D('',#5423,#4437,#4438); -#3640=AXIS2_PLACEMENT_3D('',#5424,#4439,#4440); -#3641=AXIS2_PLACEMENT_3D('',#5427,#4443,#4444); -#3642=AXIS2_PLACEMENT_3D('',#5429,#4446,#4447); -#3643=AXIS2_PLACEMENT_3D('',#5431,#4449,#4450); -#3644=AXIS2_PLACEMENT_3D('',#5432,#4451,#4452); -#3645=AXIS2_PLACEMENT_3D('',#5435,#4455,#4456); -#3646=AXIS2_PLACEMENT_3D('',#5437,#4458,#4459); -#3647=AXIS2_PLACEMENT_3D('',#5439,#4461,#4462); -#3648=AXIS2_PLACEMENT_3D('',#5440,#4463,#4464); -#3649=AXIS2_PLACEMENT_3D('',#5443,#4467,#4468); -#3650=AXIS2_PLACEMENT_3D('',#5445,#4470,#4471); -#3651=AXIS2_PLACEMENT_3D('',#5447,#4473,#4474); -#3652=AXIS2_PLACEMENT_3D('',#5448,#4475,#4476); -#3653=AXIS2_PLACEMENT_3D('',#5451,#4479,#4480); -#3654=AXIS2_PLACEMENT_3D('',#5453,#4482,#4483); -#3655=AXIS2_PLACEMENT_3D('',#5455,#4485,#4486); -#3656=AXIS2_PLACEMENT_3D('',#5456,#4487,#4488); -#3657=AXIS2_PLACEMENT_3D('',#5459,#4491,#4492); -#3658=AXIS2_PLACEMENT_3D('',#5461,#4494,#4495); -#3659=AXIS2_PLACEMENT_3D('',#5463,#4497,#4498); -#3660=AXIS2_PLACEMENT_3D('',#5464,#4499,#4500); -#3661=AXIS2_PLACEMENT_3D('',#5467,#4503,#4504); -#3662=AXIS2_PLACEMENT_3D('',#5469,#4506,#4507); -#3663=AXIS2_PLACEMENT_3D('',#5471,#4509,#4510); -#3664=AXIS2_PLACEMENT_3D('',#5472,#4511,#4512); -#3665=AXIS2_PLACEMENT_3D('',#5475,#4515,#4516); -#3666=AXIS2_PLACEMENT_3D('',#5477,#4518,#4519); -#3667=AXIS2_PLACEMENT_3D('',#5479,#4521,#4522); -#3668=AXIS2_PLACEMENT_3D('',#5480,#4523,#4524); -#3669=AXIS2_PLACEMENT_3D('',#5483,#4527,#4528); -#3670=AXIS2_PLACEMENT_3D('',#5485,#4530,#4531); -#3671=AXIS2_PLACEMENT_3D('',#5487,#4533,#4534); -#3672=AXIS2_PLACEMENT_3D('',#5488,#4535,#4536); -#3673=AXIS2_PLACEMENT_3D('',#5491,#4539,#4540); -#3674=AXIS2_PLACEMENT_3D('',#5493,#4542,#4543); -#3675=AXIS2_PLACEMENT_3D('',#5495,#4545,#4546); -#3676=AXIS2_PLACEMENT_3D('',#5496,#4547,#4548); -#3677=AXIS2_PLACEMENT_3D('',#5499,#4551,#4552); -#3678=AXIS2_PLACEMENT_3D('',#5501,#4554,#4555); -#3679=AXIS2_PLACEMENT_3D('',#5503,#4557,#4558); -#3680=AXIS2_PLACEMENT_3D('',#5504,#4559,#4560); -#3681=AXIS2_PLACEMENT_3D('',#5507,#4563,#4564); -#3682=AXIS2_PLACEMENT_3D('',#5509,#4566,#4567); -#3683=AXIS2_PLACEMENT_3D('',#5511,#4569,#4570); -#3684=AXIS2_PLACEMENT_3D('',#5512,#4571,#4572); -#3685=AXIS2_PLACEMENT_3D('',#5515,#4575,#4576); -#3686=AXIS2_PLACEMENT_3D('',#5517,#4578,#4579); -#3687=AXIS2_PLACEMENT_3D('',#5519,#4581,#4582); -#3688=AXIS2_PLACEMENT_3D('',#5520,#4583,#4584); -#3689=AXIS2_PLACEMENT_3D('',#5523,#4587,#4588); -#3690=AXIS2_PLACEMENT_3D('',#5525,#4590,#4591); -#3691=AXIS2_PLACEMENT_3D('',#5527,#4593,#4594); -#3692=AXIS2_PLACEMENT_3D('',#5528,#4595,#4596); -#3693=DIRECTION('',(0.,0.,1.)); -#3694=DIRECTION('',(1.,0.,0.)); -#3695=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3696=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3697=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3698=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3699=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3700=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3701=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3702=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3703=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3704=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3705=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3706=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3707=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3708=DIRECTION('',(1.,0.,0.)); -#3709=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3710=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3711=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3712=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3713=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3714=DIRECTION('',(1.,0.,0.)); -#3715=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3716=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3717=DIRECTION('',(0.,0.,-1.)); -#3718=DIRECTION('',(0.,1.,0.)); -#3719=DIRECTION('',(-1.,0.,0.)); -#3720=DIRECTION('',(0.,-1.,0.)); -#3721=DIRECTION('',(0.,-1.,0.)); -#3722=DIRECTION('',(1.,0.,0.)); -#3723=DIRECTION('',(0.,-1.,0.)); -#3724=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3725=DIRECTION('',(0.,-1.,0.)); -#3726=DIRECTION('',(0.,-1.,0.)); -#3727=DIRECTION('',(0.,0.,-1.)); -#3728=DIRECTION('',(0.,1.,0.)); -#3729=DIRECTION('',(0.,-1.,0.)); -#3730=DIRECTION('',(-1.,0.,0.)); -#3731=DIRECTION('',(0.,-1.,0.)); -#3732=DIRECTION('',(1.,0.,0.)); -#3733=DIRECTION('',(0.,-1.,0.)); -#3734=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3735=DIRECTION('',(0.,-1.,0.)); -#3736=DIRECTION('',(0.,-1.,0.)); -#3737=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3738=DIRECTION('',(1.,0.,0.)); -#3739=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3740=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3741=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3742=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3743=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3744=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3745=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3746=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3747=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3748=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3749=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3750=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3751=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3752=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3753=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3754=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3755=DIRECTION('',(0.,1.,0.)); -#3756=DIRECTION('',(1.,0.,0.)); -#3757=DIRECTION('',(0.,-1.,0.)); -#3758=DIRECTION('',(-1.,0.,0.)); -#3759=DIRECTION('',(0.,1.,0.)); -#3760=DIRECTION('',(1.,0.,0.)); -#3761=DIRECTION('',(0.,-1.,0.)); -#3762=DIRECTION('',(-1.,0.,0.)); -#3763=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3764=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3765=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3766=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3767=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3768=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3769=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3770=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3771=DIRECTION('',(0.,0.,1.)); -#3772=DIRECTION('',(1.,0.,0.)); -#3773=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3774=DIRECTION('',(1.,0.,0.)); -#3775=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3776=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3777=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3778=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3779=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3780=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3781=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3782=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3783=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3784=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3785=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3786=DIRECTION('',(-1.,0.,0.)); -#3787=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3788=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3789=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3790=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3791=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3792=DIRECTION('',(-1.,0.,0.)); -#3793=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3794=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3795=DIRECTION('',(-3.50451730157718E-9,0.043619387365336,0.999048221581858)); -#3796=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3797=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3798=DIRECTION('',(1.,1.53156296879815E-10,3.50785591600121E-9)); -#3799=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3800=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3801=DIRECTION('',(-3.50451730157718E-9,0.043619387365336,0.999048221581858)); -#3802=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3803=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3804=DIRECTION('',(1.,1.53156296879815E-10,3.50785591600121E-9)); -#3805=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3806=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3807=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3808=DIRECTION('',(1.,0.,0.)); -#3809=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3810=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3811=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3812=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3813=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3814=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3815=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3816=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#3817=DIRECTION('',(-1.,0.,0.)); -#3818=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3819=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3820=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3821=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3822=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3823=DIRECTION('',(-1.,0.,0.)); -#3824=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3825=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3826=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3827=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3828=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3829=DIRECTION('',(-1.,-1.53156296879815E-10,-3.50785591600121E-9)); -#3830=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3831=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3832=DIRECTION('',(3.50451730157718E-9,-0.043619387365336,-0.999048221581858)); -#3833=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3834=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3835=DIRECTION('',(-1.,-1.53156296879815E-10,-3.50785591600121E-9)); -#3836=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3837=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#3838=DIRECTION('',(3.50451730157718E-9,-0.043619387365336,-0.999048221581858)); -#3839=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#3840=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#3841=DIRECTION('',(0.,0.,-1.)); -#3842=DIRECTION('',(0.,1.,0.)); -#3843=DIRECTION('',(0.,-1.,0.)); -#3844=DIRECTION('',(0.,-1.,0.)); -#3845=DIRECTION('',(1.,0.,0.)); -#3846=DIRECTION('',(0.,-1.,0.)); -#3847=DIRECTION('',(0.,-1.,0.)); -#3848=DIRECTION('',(0.,-1.,0.)); -#3849=DIRECTION('',(0.,0.,-1.)); -#3850=DIRECTION('',(0.,1.,0.)); -#3851=DIRECTION('',(0.,-1.,0.)); -#3852=DIRECTION('',(0.,-1.,0.)); -#3853=DIRECTION('',(1.,0.,0.)); -#3854=DIRECTION('',(0.,-1.,0.)); -#3855=DIRECTION('',(0.,-1.,0.)); -#3856=DIRECTION('',(0.,-1.,0.)); -#3857=DIRECTION('',(-3.50785591600121E-9,0.,1.)); -#3858=DIRECTION('',(1.,0.,3.50785591600121E-9)); -#3859=DIRECTION('',(0.,1.,0.)); -#3860=DIRECTION('',(0.,1.,0.)); -#3861=DIRECTION('',(-1.,0.,-3.50785600321499E-9)); -#3862=DIRECTION('',(-3.50785600321499E-9,0.,1.)); -#3863=DIRECTION('',(0.,1.,0.)); -#3864=DIRECTION('',(0.,1.,0.)); -#3865=DIRECTION('',(-3.50785591600121E-9,0.,1.)); -#3866=DIRECTION('',(1.,0.,3.50785591600121E-9)); -#3867=DIRECTION('',(0.,1.,0.)); -#3868=DIRECTION('',(0.,1.,0.)); -#3869=DIRECTION('',(-1.,0.,-3.50785600321499E-9)); -#3870=DIRECTION('',(-3.50785600321499E-9,0.,1.)); -#3871=DIRECTION('',(0.,1.,0.)); -#3872=DIRECTION('',(0.,1.,0.)); -#3873=DIRECTION('',(0.,1.,0.)); -#3874=DIRECTION('',(1.,0.,0.)); -#3875=DIRECTION('',(0.,-1.,0.)); -#3876=DIRECTION('',(-1.,0.,0.)); -#3877=DIRECTION('',(0.,1.,0.)); -#3878=DIRECTION('',(1.,0.,0.)); -#3879=DIRECTION('',(0.,-1.,0.)); -#3880=DIRECTION('',(-1.,0.,0.)); -#3881=DIRECTION('',(0.,-1.,0.)); -#3882=DIRECTION('',(-1.,0.,0.)); -#3883=DIRECTION('',(0.,1.,0.)); -#3884=DIRECTION('',(1.,0.,0.)); -#3885=DIRECTION('',(0.,-1.,0.)); -#3886=DIRECTION('',(-1.,0.,0.)); -#3887=DIRECTION('',(0.,1.,0.)); -#3888=DIRECTION('',(1.,0.,0.)); -#3889=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3890=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3891=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3892=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3893=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3894=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3895=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3896=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3897=DIRECTION('',(0.,0.,1.)); -#3898=DIRECTION('',(1.,0.,0.)); -#3899=DIRECTION('',(8.15663058499816E-53,-1.22464679797E-16,-1.)); -#3900=DIRECTION('',(0.,1.,-1.22464679797E-16)); -#3901=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#3902=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3903=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#3904=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3905=DIRECTION('',(1.,5.36917864561054E-21,-2.71710907218902E-16)); -#3906=DIRECTION('',(-2.71710907218902E-16,0.,-1.)); -#3907=DIRECTION('',(2.71710907218902E-16,1.22464679797E-16,1.)); -#3908=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3909=DIRECTION('',(2.71710907218902E-16,1.22464679797E-16,1.)); -#3910=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3911=DIRECTION('',(1.79201926782281E-16,1.22464679797E-16,1.)); -#3912=DIRECTION('',(1.,0.,-1.79201926782281E-16)); -#3913=DIRECTION('',(-1.,-5.36917864562187E-21,1.79201926782281E-16)); -#3914=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3915=DIRECTION('',(-1.,-5.36917864562187E-21,1.79201926782281E-16)); -#3916=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3917=DIRECTION('',(-8.15663058499816E-53,1.22464679797E-16,1.)); -#3918=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#3919=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#3920=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3921=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#3922=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3923=DIRECTION('',(-1.,-5.36917864564382E-21,6.65209322755303E-37)); -#3924=DIRECTION('',(-5.36917864564382E-21,1.,0.)); -#3925=DIRECTION('',(-7.67457914364118E-39,-1.22464679797E-16,-1.)); -#3926=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3927=DIRECTION('',(-7.67457914364118E-39,-1.22464679797E-16,-1.)); -#3928=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3929=DIRECTION('',(8.15663058499816E-53,-1.22464679797E-16,-1.)); -#3930=DIRECTION('',(0.,1.,-1.22464679797E-16)); -#3931=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#3932=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3933=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#3934=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3935=DIRECTION('',(1.,5.36917864564382E-21,-6.65209322755303E-37)); -#3936=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#3937=DIRECTION('',(7.67457914364118E-39,1.22464679797E-16,1.)); -#3938=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3939=DIRECTION('',(7.67457914364118E-39,1.22464679797E-16,1.)); -#3940=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3941=DIRECTION('',(1.,5.36917864564382E-21,-6.68646183712941E-37)); -#3942=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#3943=DIRECTION('',(1.11114401012792E-38,1.22464679797E-16,1.)); -#3944=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3945=DIRECTION('',(1.11114401012792E-38,1.22464679797E-16,1.)); -#3946=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#3947=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3948=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#3949=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3950=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3951=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3952=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3953=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3954=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3955=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3956=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3957=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3958=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3959=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3960=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3961=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3962=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3963=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3964=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3965=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3966=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3967=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3968=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3969=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3970=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3971=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3972=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3973=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3974=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#3975=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3976=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3977=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3978=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3979=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3980=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3981=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3982=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3983=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3984=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3985=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3986=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3987=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3988=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3989=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3990=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3991=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3992=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3993=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3994=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3995=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3996=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3997=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#3998=DIRECTION('',(0.,1.22464679797E-16,1.)); -#3999=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4000=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4001=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4002=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4003=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4004=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4005=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4006=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4007=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4008=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4009=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4010=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4011=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4012=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4013=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4014=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4015=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4016=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4017=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4018=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4019=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4020=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4021=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4022=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4023=DIRECTION('',(0.,0.,1.)); -#4024=DIRECTION('',(1.,0.,0.)); -#4025=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4026=DIRECTION('',(1.,0.,0.)); -#4027=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4028=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#4029=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4030=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#4031=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4032=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#4033=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4034=DIRECTION('',(-1.23091564782285E-19,0.043619387365336,0.999048221581858)); -#4035=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#4036=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4037=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#4038=DIRECTION('',(-1.,0.,0.)); -#4039=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4040=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#4041=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#4042=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4043=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#4044=DIRECTION('',(-1.,0.,0.)); -#4045=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4046=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#4047=DIRECTION('',(-1.,-1.53156296879815E-10,-3.50785591600121E-9)); -#4048=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4049=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#4050=DIRECTION('',(3.50451730157718E-9,-0.043619387365336,-0.999048221581858)); -#4051=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4052=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#4053=DIRECTION('',(-1.,-1.53156296879815E-10,-3.50785591600121E-9)); -#4054=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4055=DIRECTION('',(0.,-0.043619387365336,-0.999048221581858)); -#4056=DIRECTION('',(3.50451730157718E-9,-0.043619387365336,-0.999048221581858)); -#4057=DIRECTION('',(0.,-0.999048221581858,0.043619387365336)); -#4058=DIRECTION('',(0.,0.043619387365336,0.999048221581858)); -#4059=DIRECTION('',(1.,0.,0.)); -#4060=DIRECTION('',(0.,-1.,0.)); -#4061=DIRECTION('',(0.,0.,1.)); -#4062=DIRECTION('',(0.,-1.,0.)); -#4063=DIRECTION('',(0.,-1.,0.)); -#4064=DIRECTION('',(0.,0.,-1.)); -#4065=DIRECTION('',(0.,1.,0.)); -#4066=DIRECTION('',(-1.,0.,0.)); -#4067=DIRECTION('',(0.,0.,-1.)); -#4068=DIRECTION('',(0.,1.,0.)); -#4069=DIRECTION('',(2.89120579329468E-16,-1.,0.)); -#4070=DIRECTION('',(0.,0.,-1.)); -#4071=DIRECTION('',(0.,1.,0.)); -#4072=DIRECTION('',(-1.,0.,0.)); -#4073=DIRECTION('',(0.,0.,-1.)); -#4074=DIRECTION('',(0.,1.,0.)); -#4075=DIRECTION('',(2.89120579329468E-16,-1.,0.)); -#4076=DIRECTION('',(0.,0.,-1.)); -#4077=DIRECTION('',(0.,1.,0.)); -#4078=DIRECTION('',(0.,-1.,0.)); -#4079=DIRECTION('',(1.,0.,0.)); -#4080=DIRECTION('',(0.,-1.,0.)); -#4081=DIRECTION('',(1.,0.,0.)); -#4082=DIRECTION('',(0.,-1.,0.)); -#4083=DIRECTION('',(0.,0.,1.)); -#4084=DIRECTION('',(0.,-1.,0.)); -#4085=DIRECTION('',(0.,-1.,0.)); -#4086=DIRECTION('',(0.,0.,-1.)); -#4087=DIRECTION('',(0.,1.,0.)); -#4088=DIRECTION('',(1.,0.,0.)); -#4089=DIRECTION('',(0.,-1.,0.)); -#4090=DIRECTION('',(0.,-1.,0.)); -#4091=DIRECTION('',(3.50785591600121E-9,0.,-1.)); -#4092=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4093=DIRECTION('',(3.50785591600121E-9,0.,-1.)); -#4094=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4095=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4096=DIRECTION('',(3.50785591600121E-9,0.,-1.)); -#4097=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4098=DIRECTION('',(2.89120579329468E-16,-1.,1.01419333463857E-24)); -#4099=DIRECTION('',(3.50785591600121E-9,0.,-1.)); -#4100=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4101=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4102=DIRECTION('',(3.50785591600121E-9,0.,-1.)); -#4103=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4104=DIRECTION('',(2.89120579329468E-16,-1.,1.01419333463857E-24)); -#4105=DIRECTION('',(0.,-1.,0.)); -#4106=DIRECTION('',(1.,0.,3.50785591600121E-9)); -#4107=DIRECTION('',(0.,-1.,0.)); -#4108=DIRECTION('',(1.,0.,3.50785600321499E-9)); -#4109=DIRECTION('',(3.50785600321499E-9,0.,-1.)); -#4110=DIRECTION('',(-3.50785600321499E-9,0.,1.)); -#4111=DIRECTION('',(0.,-1.,0.)); -#4112=DIRECTION('',(0.,-1.,0.)); -#4113=DIRECTION('',(3.50785591600121E-9,0.,-1.)); -#4114=DIRECTION('',(-1.,0.,-3.50785591600121E-9)); -#4115=DIRECTION('',(1.,0.,3.50785591600121E-9)); -#4116=DIRECTION('',(0.,-1.,0.)); -#4117=DIRECTION('',(0.,-1.,0.)); -#4118=DIRECTION('',(1.,0.,3.50785600321499E-9)); -#4119=DIRECTION('',(3.50785600321499E-9,0.,-1.)); -#4120=DIRECTION('',(0.,-1.,0.)); -#4121=DIRECTION('',(-3.50785600321499E-9,0.,1.)); -#4122=DIRECTION('',(0.,-1.,0.)); -#4123=DIRECTION('',(0.,-1.,0.)); -#4124=DIRECTION('',(1.,0.,0.)); -#4125=DIRECTION('',(0.,-1.,0.)); -#4126=DIRECTION('',(-1.,0.,0.)); -#4127=DIRECTION('',(0.,-1.,0.)); -#4128=DIRECTION('',(-1.,0.,0.)); -#4129=DIRECTION('',(0.,-1.,0.)); -#4130=DIRECTION('',(-1.,0.,0.)); -#4131=DIRECTION('',(0.,-1.,0.)); -#4132=DIRECTION('',(-1.,0.,0.)); -#4133=DIRECTION('',(0.,-1.,0.)); -#4134=DIRECTION('',(-1.,0.,0.)); -#4135=DIRECTION('',(0.,-1.,0.)); -#4136=DIRECTION('',(-1.,0.,0.)); -#4137=DIRECTION('',(0.,-1.,0.)); -#4138=DIRECTION('',(-1.,0.,0.)); -#4139=DIRECTION('',(0.,-1.,0.)); -#4140=DIRECTION('',(-1.,0.,0.)); -#4141=DIRECTION('',(0.,-1.,0.)); -#4142=DIRECTION('',(-1.,0.,0.)); -#4143=DIRECTION('',(0.,-1.,0.)); -#4144=DIRECTION('',(-1.,0.,0.)); -#4145=DIRECTION('',(0.,-1.,0.)); -#4146=DIRECTION('',(-1.,0.,0.)); -#4147=DIRECTION('',(0.,-1.,0.)); -#4148=DIRECTION('',(-1.,0.,0.)); -#4149=DIRECTION('',(0.,1.,0.)); -#4150=DIRECTION('',(1.,0.,0.)); -#4151=DIRECTION('',(0.,-1.,0.)); -#4152=DIRECTION('',(-1.,0.,0.)); -#4153=DIRECTION('',(0.,1.,0.)); -#4154=DIRECTION('',(1.,0.,0.)); -#4155=DIRECTION('',(0.,-1.,0.)); -#4156=DIRECTION('',(-1.,0.,0.)); -#4157=DIRECTION('',(0.,-1.,0.)); -#4158=DIRECTION('',(-1.,0.,0.)); -#4159=DIRECTION('',(0.,1.,0.)); -#4160=DIRECTION('',(1.,0.,0.)); -#4161=DIRECTION('',(0.,1.,0.)); -#4162=DIRECTION('',(1.,0.,0.)); -#4163=DIRECTION('',(0.,-1.,0.)); -#4164=DIRECTION('',(-1.,0.,0.)); -#4165=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4166=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4167=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4168=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4169=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4170=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4171=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4172=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4173=DIRECTION('',(0.,-1.,0.)); -#4174=DIRECTION('',(-1.,0.,0.)); -#4175=DIRECTION('',(0.,0.,-1.)); -#4176=DIRECTION('',(0.,0.,-1.)); -#4177=DIRECTION('',(0.,0.,-1.)); -#4178=DIRECTION('',(0.,1.,0.)); -#4179=DIRECTION('',(0.,0.,-1.)); -#4180=DIRECTION('',(1.,2.89120579329468E-16,0.)); -#4181=DIRECTION('',(2.89120579329468E-16,-1.,0.)); -#4182=DIRECTION('',(0.,0.,-1.)); -#4183=DIRECTION('',(0.,0.,-1.)); -#4184=DIRECTION('',(0.,1.,0.)); -#4185=DIRECTION('',(0.,0.,-1.)); -#4186=DIRECTION('',(0.,-1.,0.)); -#4187=DIRECTION('',(-1.,0.,0.)); -#4188=DIRECTION('',(0.,0.,-1.)); -#4189=DIRECTION('',(0.,0.,-1.)); -#4190=DIRECTION('',(0.,1.,0.)); -#4191=DIRECTION('',(0.,0.,-1.)); -#4192=DIRECTION('',(1.,2.89120579329468E-16,0.)); -#4193=DIRECTION('',(2.89120579329468E-16,-1.,0.)); -#4194=DIRECTION('',(0.,0.,-1.)); -#4195=DIRECTION('',(0.,0.,-1.)); -#4196=DIRECTION('',(0.,1.,0.)); -#4197=DIRECTION('',(0.,0.,1.)); -#4198=DIRECTION('',(1.,0.,0.)); -#4199=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4200=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4201=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4202=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4203=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4204=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4205=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4206=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4207=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4208=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4209=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4210=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4211=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4212=DIRECTION('',(-7.67457914364118E-39,-1.22464679797E-16,-1.)); -#4213=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4214=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4215=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4216=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4217=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4218=DIRECTION('',(7.67457914364118E-39,1.22464679797E-16,1.)); -#4219=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4220=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4221=DIRECTION('',(-7.75384519631554E-39,-1.22464679797E-16,-1.)); -#4222=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4223=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4224=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4225=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4226=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4227=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4228=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4229=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4230=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4231=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4232=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4233=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4234=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4235=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4236=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4237=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4238=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4239=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4240=DIRECTION('',(1.,5.36917864561347E-21,-2.47817639425259E-16)); -#4241=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4242=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4243=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4244=DIRECTION('',(1.,5.36917864561347E-21,-2.47817639425259E-16)); -#4245=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4246=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4247=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4248=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4249=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4250=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4251=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4252=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4253=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4254=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4255=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4256=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4257=DIRECTION('',(-7.75384519631554E-39,-1.22464679797E-16,-1.)); -#4258=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4259=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4260=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4261=DIRECTION('',(-7.75384519631554E-39,-1.22464679797E-16,-1.)); -#4262=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4263=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4264=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4265=DIRECTION('',(-7.75384519631554E-39,-1.22464679797E-16,-1.)); -#4266=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4267=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4268=DIRECTION('',(1.,5.36917864561347E-21,-2.47817639425259E-16)); -#4269=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4270=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4271=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4272=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4273=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4274=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4275=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4276=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4277=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4278=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4279=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4280=DIRECTION('',(1.,5.36917864562864E-21,-1.23908819712629E-16)); -#4281=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4282=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4283=DIRECTION('',(7.75384519631587E-39,1.22464679797E-16,1.)); -#4284=DIRECTION('',(1.,5.36917864561347E-21,-2.47817639425259E-16)); -#4285=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4286=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4287=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4288=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4289=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4290=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4291=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4292=DIRECTION('',(1.23908819712629E-16,1.22464679797E-16,1.)); -#4293=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4294=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4295=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4296=DIRECTION('',(7.75384519631554E-39,1.22464679797E-16,1.)); -#4297=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4298=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4299=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4300=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4301=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4302=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4303=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4304=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4305=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4306=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4307=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4308=DIRECTION('',(1.23908819712629E-16,1.22464679797E-16,1.)); -#4309=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4310=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4311=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4312=DIRECTION('',(1.23908819712629E-16,1.22464679797E-16,1.)); -#4313=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4314=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4315=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4316=DIRECTION('',(7.75384519631554E-39,1.22464679797E-16,1.)); -#4317=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4318=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4319=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4320=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4321=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4322=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4323=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4324=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4325=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4326=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4327=DIRECTION('',(-7.67457914364118E-39,-1.22464679797E-16,-1.)); -#4328=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4329=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4330=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4331=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4332=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4333=DIRECTION('',(7.67457914364118E-39,1.22464679797E-16,1.)); -#4334=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4335=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4336=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4337=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4338=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4339=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4340=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4341=DIRECTION('',(-1.,-5.36917864564382E-21,6.57534743611662E-37)); -#4342=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4343=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4344=DIRECTION('',(1.23908819712629E-16,1.22464679797E-16,1.)); -#4345=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4346=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4347=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4348=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4349=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425258E-16)); -#4350=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4351=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4352=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4353=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4354=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4355=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4356=DIRECTION('',(7.75384519631554E-39,1.22464679797E-16,1.)); -#4357=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4358=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4359=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4360=DIRECTION('',(7.75384519631554E-39,1.22464679797E-16,1.)); -#4361=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4362=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4363=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4364=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4365=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4366=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4367=DIRECTION('',(1.,5.36917864564382E-21,-6.57534743611662E-37)); -#4368=DIRECTION('',(2.47817639425259E-16,1.22464679797E-16,1.)); -#4369=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4370=DIRECTION('',(-7.75384519631581E-39,-1.22464679797E-16,-1.)); -#4371=DIRECTION('',(-1.,-5.36917864564382E-21,6.65209322755304E-37)); -#4372=DIRECTION('',(-5.36917864564382E-21,1.,0.)); -#4373=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4374=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4375=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4376=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4377=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4378=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4379=DIRECTION('',(1.,5.36917864564382E-21,-6.65209322755304E-37)); -#4380=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4381=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4382=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4383=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4384=DIRECTION('',(0.,1.,-1.22464679797E-16)); -#4385=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4386=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4387=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4388=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4389=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4390=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4391=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4392=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4393=DIRECTION('',(5.36917864564382E-21,-1.,1.22464679797E-16)); -#4394=DIRECTION('',(0.,-1.22464679797E-16,-1.)); -#4395=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4396=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4397=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4398=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4399=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4400=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4401=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4402=DIRECTION('',(0.,1.22464679797E-16,1.)); -#4403=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4404=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4405=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4406=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4407=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4408=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4409=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4410=DIRECTION('',(1.02760700283441E-52,-1.22464679797E-16,-1.)); -#4411=DIRECTION('',(0.,1.,-1.22464679797E-16)); -#4412=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4413=DIRECTION('',(-1.,-5.36917864564382E-21,6.65288588807978E-37)); -#4414=DIRECTION('',(-5.36917864564382E-21,1.,0.)); -#4415=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4416=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4417=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4418=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4419=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4420=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4421=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4422=DIRECTION('',(1.02760700283441E-52,-1.22464679797E-16,-1.)); -#4423=DIRECTION('',(0.,1.,-1.22464679797E-16)); -#4424=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4425=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4426=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4427=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4428=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4429=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4430=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4431=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4432=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4433=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4434=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4435=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4436=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4437=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4438=DIRECTION('',(1.23908819712629E-16,0.,1.)); -#4439=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4440=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4441=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4442=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4443=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4444=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4445=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4446=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4447=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4448=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4449=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4450=DIRECTION('',(1.23908819712629E-16,0.,1.)); -#4451=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4452=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4453=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4454=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4455=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4456=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4457=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4458=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4459=DIRECTION('',(-1.,0.,2.47817639425259E-16)); -#4460=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4461=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4462=DIRECTION('',(1.23908819712629E-16,0.,1.)); -#4463=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4464=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4465=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4466=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4467=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4468=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4469=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4470=DIRECTION('',(-2.47817639425258E-16,-1.22464679797E-16,-1.)); -#4471=DIRECTION('',(-1.,0.,2.47817639425259E-16)); -#4472=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4473=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4474=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4475=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4476=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4477=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4478=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4479=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4480=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4481=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4482=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4483=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4484=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4485=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4486=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4487=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4488=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4489=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4490=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4491=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4492=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4493=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4494=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4495=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4496=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4497=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4498=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4499=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4500=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4501=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4502=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4503=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4504=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4505=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4506=DIRECTION('',(1.02760700283441E-52,-1.22464679797E-16,-1.)); -#4507=DIRECTION('',(0.,1.,-1.22464679797E-16)); -#4508=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4509=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4510=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4511=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4512=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4513=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4514=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4515=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4516=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4517=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4518=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4519=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4520=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4521=DIRECTION('',(-1.,-5.36917864564382E-21,6.65288588807978E-37)); -#4522=DIRECTION('',(-5.36917864564382E-21,1.,0.)); -#4523=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4524=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4525=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4526=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4527=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4528=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4529=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4530=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4531=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4532=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4533=DIRECTION('',(-1.,-5.36917864564382E-21,6.65288588807978E-37)); -#4534=DIRECTION('',(-5.36917864564382E-21,1.,0.)); -#4535=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4536=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4537=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4538=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4539=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4540=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4541=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4542=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4543=DIRECTION('',(-1.,0.,2.47817639425259E-16)); -#4544=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4545=DIRECTION('',(-1.,-5.36917864564382E-21,6.65288588807978E-37)); -#4546=DIRECTION('',(-5.36917864564382E-21,1.,0.)); -#4547=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4548=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4549=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4550=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4551=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4552=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4553=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4554=DIRECTION('',(1.02760700283441E-52,-1.22464679797E-16,-1.)); -#4555=DIRECTION('',(0.,1.,-1.22464679797E-16)); -#4556=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4557=DIRECTION('',(-1.,-5.36917864562864E-21,1.23908819712629E-16)); -#4558=DIRECTION('',(1.23908819712629E-16,0.,1.)); -#4559=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4560=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4561=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4562=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4563=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4564=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4565=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4566=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4567=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4568=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4569=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4570=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4571=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4572=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4573=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4574=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4575=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4576=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4577=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4578=DIRECTION('',(-1.23908819712629E-16,-1.22464679797E-16,-1.)); -#4579=DIRECTION('',(-1.,0.,1.23908819712629E-16)); -#4580=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4581=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4582=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4583=DIRECTION('',(-1.02760700283441E-52,1.22464679797E-16,1.)); -#4584=DIRECTION('',(0.,-1.,1.22464679797E-16)); -#4585=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4586=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4587=DIRECTION('',(1.,5.36917864564382E-21,-6.65288588807978E-37)); -#4588=DIRECTION('',(5.36917864564382E-21,-1.,0.)); -#4589=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4590=DIRECTION('',(-2.47817639425259E-16,-1.22464679797E-16,-1.)); -#4591=DIRECTION('',(-1.,0.,2.47817639425259E-16)); -#4592=DIRECTION('',(-5.36917864564382E-21,1.,-1.22464679797E-16)); -#4593=DIRECTION('',(-1.,-5.36917864561347E-21,2.47817639425259E-16)); -#4594=DIRECTION('',(2.47817639425259E-16,0.,1.)); -#4595=DIRECTION('',(0.,0.,1.)); -#4596=DIRECTION('',(1.,0.,0.)); -#4597=CARTESIAN_POINT('',(0.,0.,0.)); -#4598=CARTESIAN_POINT('',(0.,-0.015,0.0560066729355677)); -#4599=CARTESIAN_POINT('',(-0.0432210898258786,-0.0152401351859968,0.0505066729355677)); -#4600=CARTESIAN_POINT('',(-0.0432210898258786,-0.0151768268187795,0.0519566729355677)); -#4601=CARTESIAN_POINT('',(0.0432210898258786,-0.0152401351859968,0.0505066729355677)); -#4602=CARTESIAN_POINT('',(0.0432210898258786,-0.0151768268187795,0.0519566729355677)); -#4603=CARTESIAN_POINT('',(0.0432210898258786,-0.0196504731130742,-0.0505066729355677)); -#4604=CARTESIAN_POINT('',(0.0432210898258786,-0.0195871647458569,-0.0490566729355677)); -#4605=CARTESIAN_POINT('',(-0.0432210898258786,-0.0196504731130742,-0.0505066729355677)); -#4606=CARTESIAN_POINT('',(-0.0432210898258786,-0.0195871647458569,-0.0490566729355677)); -#4607=CARTESIAN_POINT('',(-0.0487210898258785,-0.015,0.0560066729355677)); -#4608=CARTESIAN_POINT('',(-0.0487210898258785,-0.0194539988699859,-0.0460066729355677)); -#4609=CARTESIAN_POINT('',(-0.0487210898258785,-0.0154366094290851,0.0460066729355677)); -#4610=CARTESIAN_POINT('',(-0.0387210898258785,-0.0194539988699859,-0.0460066729355677)); -#4611=CARTESIAN_POINT('',(-0.0387210898258785,-0.019890608299071,-0.0560066729355677)); -#4612=CARTESIAN_POINT('',(0.,-0.019890608299071,-0.0560066729355677)); -#4613=CARTESIAN_POINT('',(0.0387210898258785,-0.019890608299071,-0.0560066729355677)); -#4614=CARTESIAN_POINT('',(0.0387210898258785,-0.0194539988699859,-0.0460066729355677)); -#4615=CARTESIAN_POINT('',(0.0487210898258785,-0.0194539988699859,-0.0460066729355677)); -#4616=CARTESIAN_POINT('',(0.0487210898258785,-0.015,0.0560066729355677)); -#4617=CARTESIAN_POINT('',(0.0487210898258785,-0.0154366094290851,0.0460066729355677)); -#4618=CARTESIAN_POINT('',(0.0387210898258785,-0.0154366094290851,0.0460066729355677)); -#4619=CARTESIAN_POINT('',(0.0387210898258785,-0.015,0.0560066729355677)); -#4620=CARTESIAN_POINT('',(0.,-0.015,0.0560066729355677)); -#4621=CARTESIAN_POINT('',(-0.0387210898258785,-0.015,0.0560066729355677)); -#4622=CARTESIAN_POINT('',(-0.0387210898258785,-0.0154366094290851,0.0460066729355677)); -#4623=CARTESIAN_POINT('',(0.,-0.00865,0.0560066729355677)); -#4624=CARTESIAN_POINT('',(0.,-0.01199714194451,0.0560066729355677)); -#4625=CARTESIAN_POINT('',(0.0387210898258785,-0.01199714194451,0.0560066729355677)); -#4626=CARTESIAN_POINT('',(-0.0387210898258785,-0.01199714194451,0.0560066729355677)); -#4627=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,0.0560066729355677)); -#4628=CARTESIAN_POINT('',(0.0387210898258785,-0.01199714194451,0.0560066729355677)); -#4629=CARTESIAN_POINT('',(0.0487210898258785,-0.00865,6.93889390390723E-18)); -#4630=CARTESIAN_POINT('',(0.0487210898258785,-0.014431425090958,0.000252422470826164)); -#4631=CARTESIAN_POINT('',(0.0487210898258785,-0.0124337513735952,0.0460066729355677)); -#4632=CARTESIAN_POINT('',(0.0487210898258785,-0.016451140814496,-0.0460066729355677)); -#4633=CARTESIAN_POINT('',(0.0487210898258785,-0.015,0.0460066729355677)); -#4634=CARTESIAN_POINT('',(0.0487210898258785,-0.00865,-0.0460066729355677)); -#4635=CARTESIAN_POINT('',(0.,-0.00865,-0.0560066729355677)); -#4636=CARTESIAN_POINT('',(-0.0387210898258785,-0.0168877502435811,-0.0560066729355677)); -#4637=CARTESIAN_POINT('',(-0.0387210898258785,-0.0168877502435811,-0.0560066729355677)); -#4638=CARTESIAN_POINT('',(0.,-0.0168877502435811,-0.0560066729355677)); -#4639=CARTESIAN_POINT('',(0.0387210898258785,-0.0168877502435811,-0.0560066729355677)); -#4640=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,-0.0560066729355677)); -#4641=CARTESIAN_POINT('',(-0.0487210898258785,-0.00865,6.93889390390723E-18)); -#4642=CARTESIAN_POINT('',(-0.0487210898258785,-0.014431425090958,0.000252422470826164)); -#4643=CARTESIAN_POINT('',(-0.0487210898258785,-0.0124337513735952,0.0460066729355677)); -#4644=CARTESIAN_POINT('',(-0.0487210898258785,-0.016451140814496,-0.0460066729355677)); -#4645=CARTESIAN_POINT('',(-0.0487210898258785,-0.019890608299071,-0.0460066729355677)); -#4646=CARTESIAN_POINT('',(-0.0487210898258785,-0.00865,0.0460066729355677)); -#4647=CARTESIAN_POINT('',(5.02064047892306E-19,-0.01444815948479,-0.000130858162096006)); -#4648=CARTESIAN_POINT('',(-0.0432210898258786,-0.0122372771305068,0.0505066729355677)); -#4649=CARTESIAN_POINT('',(-0.0432210898258786,-0.0121739687632895,0.0519566729355677)); -#4650=CARTESIAN_POINT('',(0.0432210898258786,-0.0122372771305068,0.0505066729355677)); -#4651=CARTESIAN_POINT('',(0.0432210898258786,-0.0121739687632895,0.0519566729355677)); -#4652=CARTESIAN_POINT('',(0.0432210898258786,-0.0166476150575843,-0.0505066729355677)); -#4653=CARTESIAN_POINT('',(0.0432210898258786,-0.016584306690367,-0.0490566729355677)); -#4654=CARTESIAN_POINT('',(-0.0432210898258786,-0.0166476150575843,-0.0505066729355677)); -#4655=CARTESIAN_POINT('',(-0.0432210898258786,-0.016584306690367,-0.0490566729355677)); -#4656=CARTESIAN_POINT('',(-0.0387210898258785,-0.0164511408144959,-0.0460066729355677)); -#4657=CARTESIAN_POINT('',(-0.0387210898258785,-0.0124337513735952,0.0460066729355677)); -#4658=CARTESIAN_POINT('',(0.0387210898258785,-0.0124337513735952,0.0460066729355677)); -#4659=CARTESIAN_POINT('',(0.0387210898258785,-0.0164511408144959,-0.0460066729355677)); -#4660=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,-0.0460066729355677)); -#4661=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,0.0460066729355677)); -#4662=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,0.0460066729355677)); -#4663=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,-0.0460066729355677)); -#4664=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#4665=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#4666=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#4667=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#4668=CARTESIAN_POINT('',(0.,0.,0.)); -#4669=CARTESIAN_POINT('',(5.02064047892306E-19,-0.01444815948479,-0.000130858162096006)); -#4670=CARTESIAN_POINT('',(-0.0432210898258786,-0.0122372771305068,0.0505066729355677)); -#4671=CARTESIAN_POINT('',(-0.0432210898258786,-0.0121739687632895,0.0519566729355677)); -#4672=CARTESIAN_POINT('',(0.0432210898258786,-0.0122372771305068,0.0505066729355677)); -#4673=CARTESIAN_POINT('',(0.0432210898258786,-0.0121739687632895,0.0519566729355677)); -#4674=CARTESIAN_POINT('',(0.0432210898258786,-0.0166476150575843,-0.0505066729355677)); -#4675=CARTESIAN_POINT('',(0.0432210898258786,-0.016584306690367,-0.0490566729355677)); -#4676=CARTESIAN_POINT('',(-0.0432210898258786,-0.0166476150575843,-0.0505066729355677)); -#4677=CARTESIAN_POINT('',(-0.0432210898258786,-0.016584306690367,-0.0490566729355677)); -#4678=CARTESIAN_POINT('',(-0.0487210898258785,-0.014431425090958,0.000252422470826164)); -#4679=CARTESIAN_POINT('',(-0.0487210898258785,-0.0124337513735952,0.0460066729355677)); -#4680=CARTESIAN_POINT('',(-0.0487210898258785,-0.016451140814496,-0.0460066729355677)); -#4681=CARTESIAN_POINT('',(-0.0387210898258785,-0.0164511408144959,-0.0460066729355677)); -#4682=CARTESIAN_POINT('',(-0.0387210898258785,-0.0168877502435811,-0.0560066729355677)); -#4683=CARTESIAN_POINT('',(0.,-0.0168877502435811,-0.0560066729355677)); -#4684=CARTESIAN_POINT('',(0.0387210898258785,-0.0168877502435811,-0.0560066729355677)); -#4685=CARTESIAN_POINT('',(0.0387210898258785,-0.0164511408144959,-0.0460066729355677)); -#4686=CARTESIAN_POINT('',(0.0487210898258785,-0.016451140814496,-0.0460066729355677)); -#4687=CARTESIAN_POINT('',(0.0487210898258785,-0.014431425090958,0.000252422470826164)); -#4688=CARTESIAN_POINT('',(0.0487210898258785,-0.0124337513735952,0.0460066729355677)); -#4689=CARTESIAN_POINT('',(0.0387210898258785,-0.0124337513735952,0.0460066729355677)); -#4690=CARTESIAN_POINT('',(0.0387210898258785,-0.01199714194451,0.0560066729355677)); -#4691=CARTESIAN_POINT('',(0.,-0.01199714194451,0.0560066729355677)); -#4692=CARTESIAN_POINT('',(-0.0387210898258785,-0.01199714194451,0.0560066729355677)); -#4693=CARTESIAN_POINT('',(-0.0387210898258785,-0.0124337513735952,0.0460066729355677)); -#4694=CARTESIAN_POINT('',(0.0430642357731859,-0.0144466325294721,-9.58851354924725E-5)); -#4695=CARTESIAN_POINT('',(0.0430642359292992,-0.0163897162173708,-0.0445998183641056)); -#4696=CARTESIAN_POINT('',(0.0430642356163998,-0.0124951759575292,0.0445998186662319)); -#4697=CARTESIAN_POINT('',(0.0373142359292992,-0.0163897162182515,-0.0445998183842758)); -#4698=CARTESIAN_POINT('',(0.0373142359494694,-0.0166407666399754,-0.0503498183842757)); -#4699=CARTESIAN_POINT('',(1.76619603484107E-10,-0.0166407666456903,-0.0503498185151687)); -#4700=CARTESIAN_POINT('',(-0.0373142355962296,-0.0166407666514052,-0.0503498186460617)); -#4701=CARTESIAN_POINT('',(-0.0373142356163998,-0.0163897162296812,-0.0445998186460616)); -#4702=CARTESIAN_POINT('',(-0.0430642356163998,-0.0163897162305619,-0.0445998186662319)); -#4703=CARTESIAN_POINT('',(-0.0430642357725131,-0.0144466325426381,-9.58854370439077E-5)); -#4704=CARTESIAN_POINT('',(-0.0430642359292992,-0.0124951759707203,0.0445998183641056)); -#4705=CARTESIAN_POINT('',(-0.0373142359292992,-0.0124951759698397,0.0445998183842758)); -#4706=CARTESIAN_POINT('',(-0.0373142359494694,-0.0122441255481158,0.0503498183842758)); -#4707=CARTESIAN_POINT('',(-1.77293587282027E-10,-0.0122441255424008,0.0503498185151687)); -#4708=CARTESIAN_POINT('',(0.0373142355962296,-0.0122441255366859,0.0503498186460617)); -#4709=CARTESIAN_POINT('',(0.0373142356163998,-0.0124951759584099,0.0445998186460617)); -#4710=CARTESIAN_POINT('',(5.02064047892306E-19,-0.0114510148200444,-0.000261716324192014)); -#4711=CARTESIAN_POINT('',(-0.0432210898258786,-0.0092344190750169,0.0505066729355677)); -#4712=CARTESIAN_POINT('',(-0.0432210898258786,-0.00917111070779956,0.0519566729355677)); -#4713=CARTESIAN_POINT('',(0.0432210898258786,-0.0092344190750169,0.0505066729355677)); -#4714=CARTESIAN_POINT('',(0.0432210898258786,-0.00917111070779956,0.0519566729355677)); -#4715=CARTESIAN_POINT('',(0.0432210898258786,-0.0136447570020943,-0.0505066729355677)); -#4716=CARTESIAN_POINT('',(0.0432210898258786,-0.013581448634877,-0.0490566729355677)); -#4717=CARTESIAN_POINT('',(-0.0432210898258786,-0.0136447570020943,-0.0505066729355677)); -#4718=CARTESIAN_POINT('',(-0.0432210898258786,-0.013581448634877,-0.0490566729355677)); -#4719=CARTESIAN_POINT('',(0.,-0.0138848921880911,-0.0560066729355677)); -#4720=CARTESIAN_POINT('',(0.0387210898258785,-0.0138848921880911,-0.0560066729355677)); -#4721=CARTESIAN_POINT('',(-0.0387210898258785,-0.0138848921880911,-0.0560066729355677)); -#4722=CARTESIAN_POINT('',(-0.0387210898258785,-0.013448282759006,-0.0460066729355677)); -#4723=CARTESIAN_POINT('',(-0.0487210898258785,-0.013448282759006,-0.0460066729355677)); -#4724=CARTESIAN_POINT('',(-0.0487210898258785,-0.0114342804262124,0.000121564308730155)); -#4725=CARTESIAN_POINT('',(-0.0487210898258785,-0.0094308933181052,0.0460066729355677)); -#4726=CARTESIAN_POINT('',(-0.0387210898258785,-0.0094308933181052,0.0460066729355677)); -#4727=CARTESIAN_POINT('',(-0.0387210898258785,-0.00899428388902008,0.0560066729355677)); -#4728=CARTESIAN_POINT('',(0.,-0.00899428388902008,0.0560066729355677)); -#4729=CARTESIAN_POINT('',(0.0387210898258785,-0.00899428388902008,0.0560066729355677)); -#4730=CARTESIAN_POINT('',(0.0387210898258785,-0.0094308933181052,0.0460066729355677)); -#4731=CARTESIAN_POINT('',(0.0487210898258785,-0.0094308933181052,0.0460066729355677)); -#4732=CARTESIAN_POINT('',(0.0487210898258785,-0.0114342804262124,0.000121564308730155)); -#4733=CARTESIAN_POINT('',(0.0487210898258785,-0.013448282759006,-0.0460066729355677)); -#4734=CARTESIAN_POINT('',(0.0387210898258785,-0.013448282759006,-0.0460066729355677)); -#4735=CARTESIAN_POINT('',(1.76036782645462E-10,-0.0136379085902003,-0.0503498185151687)); -#4736=CARTESIAN_POINT('',(0.0373142359494694,-0.0136379085844854,-0.0503498183842757)); -#4737=CARTESIAN_POINT('',(-0.0373142355962296,-0.0136379085959152,-0.0503498186460617)); -#4738=CARTESIAN_POINT('',(0.0373142359292992,-0.0133868581627615,-0.0445998183842758)); -#4739=CARTESIAN_POINT('',(0.0430642359292992,-0.0133868581618808,-0.0445998183641056)); -#4740=CARTESIAN_POINT('',(0.0430642357737675,-0.0114510148134614,-0.000261716173416297)); -#4741=CARTESIAN_POINT('',(0.0430642356163998,-0.00949231790203927,0.0445998186662319)); -#4742=CARTESIAN_POINT('',(0.0373142356163998,-0.00949231790291992,0.0445998186460617)); -#4743=CARTESIAN_POINT('',(0.0373142355962296,-0.00924126748119597,0.0503498186460617)); -#4744=CARTESIAN_POINT('',(-1.77876408120671E-10,-0.00924126748691088,0.0503498185151687)); -#4745=CARTESIAN_POINT('',(-0.0373142359494694,-0.00924126749262579,0.0503498183842758)); -#4746=CARTESIAN_POINT('',(-0.0373142359292992,-0.00949231791434974,0.0445998183842758)); -#4747=CARTESIAN_POINT('',(-0.0430642359292992,-0.00949231791523039,0.0445998183641056)); -#4748=CARTESIAN_POINT('',(-0.0430642357719314,-0.0114510148266274,-0.000261716474967732)); -#4749=CARTESIAN_POINT('',(-0.0430642356163998,-0.0133868581750719,-0.0445998186662319)); -#4750=CARTESIAN_POINT('',(-0.0373142356163998,-0.0133868581741913,-0.0445998186460616)); -#4751=CARTESIAN_POINT('',(0.,-0.00865,0.0560066729355677)); -#4752=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,0.0560066729355677)); -#4753=CARTESIAN_POINT('',(0.0387210898258785,-0.00899428388902008,0.0560066729355677)); -#4754=CARTESIAN_POINT('',(0.0487210898258785,-0.00865,6.93889390390723E-18)); -#4755=CARTESIAN_POINT('',(0.0487210898258785,-0.01199714194451,0.0460066729355677)); -#4756=CARTESIAN_POINT('',(0.0487210898258785,-0.00865,-0.0460066729355677)); -#4757=CARTESIAN_POINT('',(0.,-0.00865,-0.0560066729355677)); -#4758=CARTESIAN_POINT('',(-0.0387210898258785,-0.0138848921880911,-0.0560066729355677)); -#4759=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,-0.0560066729355677)); -#4760=CARTESIAN_POINT('',(-0.0487210898258785,-0.00865,6.93889390390723E-18)); -#4761=CARTESIAN_POINT('',(-0.0487210898258785,-0.0168877502435811,-0.0460066729355677)); -#4762=CARTESIAN_POINT('',(-0.0487210898258785,-0.00865,0.0460066729355677)); -#4763=CARTESIAN_POINT('',(1.7661990979771E-10,-0.0166427666522859,-0.0503498185151687)); -#4764=CARTESIAN_POINT('',(-0.0373142355962296,-0.0166427666522859,-0.0503498186460617)); -#4765=CARTESIAN_POINT('',(0.0373142359494694,-0.0136379085836048,-0.0503498183842757)); -#4766=CARTESIAN_POINT('',(-0.0430642357728495,-0.0166427666522859,-1.51063141151839E-10)); -#4767=CARTESIAN_POINT('',(-0.0430642359292992,-0.0122441255424008,0.0445998183641056)); -#4768=CARTESIAN_POINT('',(-0.0430642356163998,-0.0166427666522859,-0.0445998186662319)); -#4769=CARTESIAN_POINT('',(-1.76619907698333E-10,-0.0166427666522859,0.0503498185151687)); -#4770=CARTESIAN_POINT('',(-0.0373142359494694,-0.00924126748691088,0.0503498183842758)); -#4771=CARTESIAN_POINT('',(0.0373142355962296,-0.0166427666522859,0.0503498186460617)); -#4772=CARTESIAN_POINT('',(0.0430642357728495,-0.0166427666522859,1.51063134807473E-10)); -#4773=CARTESIAN_POINT('',(0.0430642359292992,-0.0166407666390948,-0.0445998183641056)); -#4774=CARTESIAN_POINT('',(0.0430642356163998,-0.0166427666522859,0.0445998186662319)); -#4775=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,-0.0460066729355677)); -#4776=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,0.0460066729355677)); -#4777=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,0.0460066729355677)); -#4778=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,-0.0460066729355677)); -#4779=CARTESIAN_POINT('',(-0.0373142359292992,-0.0166427666522859,0.0445998183842758)); -#4780=CARTESIAN_POINT('',(-0.0373142356163998,-0.0166427666522859,-0.0445998186460616)); -#4781=CARTESIAN_POINT('',(0.0373142359292992,-0.0166427666522859,-0.0445998183842758)); -#4782=CARTESIAN_POINT('',(0.0373142356163998,-0.0166427666522859,0.0445998186460617)); -#4783=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#4784=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#4785=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#4786=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#4787=CARTESIAN_POINT('',(0.,0.,0.)); -#4788=CARTESIAN_POINT('',(-2.14767145825753E-23,0.010692519685039,-0.0306066729355676)); -#4789=CARTESIAN_POINT('',(1.49687035487111E-39,0.006692519685039,-0.0306066729355676)); -#4790=CARTESIAN_POINT('',(-0.0362210898258786,0.006692519685039,-0.0306066729355676)); -#4791=CARTESIAN_POINT('',(0.0362210898258786,0.006692519685039,-0.0306066729355676)); -#4792=CARTESIAN_POINT('',(0.0362210898258786,0.010692519685039,-0.0306066729355676)); -#4793=CARTESIAN_POINT('',(0.0362210898258786,0.010692519685039,-0.0306066729355676)); -#4794=CARTESIAN_POINT('',(-2.14767145825753E-23,0.010692519685039,-0.0306066729355676)); -#4795=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,-0.0306066729355676)); -#4796=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,-0.0306066729355676)); -#4797=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0077)); -#4798=CARTESIAN_POINT('',(0.0387210898258785,0.006692519685039,0.0077)); -#4799=CARTESIAN_POINT('',(0.0387210898258785,0.006692519685039,-0.0281066729355677)); -#4800=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503901,0.0435066729355677)); -#4801=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0435066729355677)); -#4802=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0435066729355677)); -#4803=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0077)); -#4804=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,-0.0281066729355677)); -#4805=CARTESIAN_POINT('',(0.0387210898258785,0.006692519685039,-0.0281066729355677)); -#4806=CARTESIAN_POINT('',(6.93887242719265E-18,0.010692519685039,0.0460066729355677)); -#4807=CARTESIAN_POINT('',(6.93889390390723E-18,0.00669251968503901,0.0460066729355677)); -#4808=CARTESIAN_POINT('',(0.0362210898258786,0.00669251968503901,0.0460066729355677)); -#4809=CARTESIAN_POINT('',(-0.0362210898258786,0.00669251968503901,0.0460066729355677)); -#4810=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,0.0460066729355677)); -#4811=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,0.0460066729355677)); -#4812=CARTESIAN_POINT('',(6.93887242719265E-18,0.010692519685039,0.0460066729355677)); -#4813=CARTESIAN_POINT('',(0.0362210898258786,0.010692519685039,0.0460066729355677)); -#4814=CARTESIAN_POINT('',(0.0362210898258786,0.00669251968503901,0.0460066729355677)); -#4815=CARTESIAN_POINT('',(-2.14767145825753E-23,0.010692519685039,0.0560066729355677)); -#4816=CARTESIAN_POINT('',(-2.14767145825753E-23,0.010692519685039,0.0560066729355677)); -#4817=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0560066729355677)); -#4818=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,0.0560066729355677)); -#4819=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503901,0.0560066729355677)); -#4820=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503901,0.0560066729355677)); -#4821=CARTESIAN_POINT('',(4.29827644016037E-40,0.00669251968503901,0.0560066729355677)); -#4822=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503901,0.0560066729355677)); -#4823=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0560066729355677)); -#4824=CARTESIAN_POINT('',(0.0487210898258785,0.010692519685039,-4.89858719188002E-19)); -#4825=CARTESIAN_POINT('',(0.0487210898258785,0.010692519685039,-4.89858719188002E-19)); -#4826=CARTESIAN_POINT('',(0.0487210898258785,0.010692519685039,0.0460066729355677)); -#4827=CARTESIAN_POINT('',(0.0487210898258785,0.010692519685039,-0.0460066729355677)); -#4828=CARTESIAN_POINT('',(0.0487210898258785,0.00669251968503901,0.0460066729355677)); -#4829=CARTESIAN_POINT('',(0.0487210898258785,0.00669251968503901,0.0460066729355677)); -#4830=CARTESIAN_POINT('',(0.0487210898258785,0.006692519685039,-3.20358093071521E-38)); -#4831=CARTESIAN_POINT('',(0.0487210898258785,0.006692519685039,-0.0460066729355677)); -#4832=CARTESIAN_POINT('',(0.0487210898258785,0.010692519685039,-0.0460066729355677)); -#4833=CARTESIAN_POINT('',(-2.14767145825753E-23,0.010692519685039,-0.0560066729355677)); -#4834=CARTESIAN_POINT('',(-4.29827644016041E-40,0.00669251968503899,-0.0560066729355677)); -#4835=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503899,-0.0560066729355677)); -#4836=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503899,-0.0560066729355677)); -#4837=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,-0.0560066729355677)); -#4838=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,-0.0560066729355677)); -#4839=CARTESIAN_POINT('',(-2.14767145825753E-23,0.010692519685039,-0.0560066729355677)); -#4840=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,-0.0560066729355677)); -#4841=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503899,-0.0560066729355677)); -#4842=CARTESIAN_POINT('',(-0.0487210898258785,0.010692519685039,-4.89858719188002E-19)); -#4843=CARTESIAN_POINT('',(-0.0487210898258785,0.010692519685039,-4.89858719188002E-19)); -#4844=CARTESIAN_POINT('',(-0.0487210898258785,0.010692519685039,-0.0460066729355677)); -#4845=CARTESIAN_POINT('',(-0.0487210898258785,0.010692519685039,0.0460066729355677)); -#4846=CARTESIAN_POINT('',(-0.0487210898258785,0.00669251968503899,-0.0460066729355677)); -#4847=CARTESIAN_POINT('',(-0.0487210898258785,0.006692519685039,-0.0460066729355677)); -#4848=CARTESIAN_POINT('',(-0.0487210898258785,0.006692519685039,3.20358093071275E-38)); -#4849=CARTESIAN_POINT('',(-0.0487210898258785,0.00669251968503901,0.0460066729355677)); -#4850=CARTESIAN_POINT('',(-0.0487210898258785,0.010692519685039,0.0460066729355677)); -#4851=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,0.0077)); -#4852=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,0.0077)); -#4853=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,-0.0281066729355677)); -#4854=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,0.0435066729355677)); -#4855=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,0.0435066729355677)); -#4856=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503901,0.0435066729355677)); -#4857=CARTESIAN_POINT('',(-0.0387210898258785,0.006692519685039,0.0077)); -#4858=CARTESIAN_POINT('',(-0.0387210898258785,0.006692519685039,-0.0281066729355677)); -#4859=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,-0.0281066729355677)); -#4860=CARTESIAN_POINT('',(-5.74100483610375E-23,0.010692519685039,-1.30945599945142E-18)); -#4861=CARTESIAN_POINT('',(-0.0432210898258786,0.010692519685039,0.0505066729355677)); -#4862=CARTESIAN_POINT('',(-0.0432210898258786,0.010692519685039,0.0519566729355677)); -#4863=CARTESIAN_POINT('',(0.0432210898258786,0.010692519685039,0.0505066729355677)); -#4864=CARTESIAN_POINT('',(0.0432210898258786,0.010692519685039,0.0519566729355677)); -#4865=CARTESIAN_POINT('',(0.0432210898258786,0.010692519685039,-0.0505066729355677)); -#4866=CARTESIAN_POINT('',(0.0432210898258786,0.010692519685039,-0.0490566729355677)); -#4867=CARTESIAN_POINT('',(-0.0432210898258786,0.010692519685039,-0.0505066729355677)); -#4868=CARTESIAN_POINT('',(-0.0432210898258786,0.010692519685039,-0.0490566729355677)); -#4869=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,-0.0460066729355677)); -#4870=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,0.0460066729355677)); -#4871=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0460066729355677)); -#4872=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,-0.0460066729355677)); -#4873=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,-0.0281066729355677)); -#4874=CARTESIAN_POINT('',(0.0362210898258786,0.010692519685039,-0.0281066729355677)); -#4875=CARTESIAN_POINT('',(0.0362210898258786,0.010692519685039,0.0435066729355677)); -#4876=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,0.0435066729355677)); -#4877=CARTESIAN_POINT('',(-3.59333337784623E-23,0.006692519685039,-8.19597280263423E-19)); -#4878=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,0.0505066729355677)); -#4879=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,0.0519566729355677)); -#4880=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,0.0505066729355677)); -#4881=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,0.0519566729355677)); -#4882=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,-0.0505066729355677)); -#4883=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,-0.0490566729355677)); -#4884=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,-0.0505066729355677)); -#4885=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,-0.0490566729355677)); -#4886=CARTESIAN_POINT('',(-0.0387210898258785,0.006692519685039,-0.0460066729355677)); -#4887=CARTESIAN_POINT('',(0.0387210898258785,0.006692519685039,-0.0460066729355677)); -#4888=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503901,0.0460066729355677)); -#4889=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503901,0.0460066729355677)); -#4890=CARTESIAN_POINT('',(-0.0362210898258786,0.006692519685039,-0.0281066729355677)); -#4891=CARTESIAN_POINT('',(-0.0362210898258786,0.00669251968503901,0.0435066729355677)); -#4892=CARTESIAN_POINT('',(0.0362210898258786,0.00669251968503901,0.0435066729355677)); -#4893=CARTESIAN_POINT('',(0.0362210898258786,0.006692519685039,-0.0281066729355677)); -#4894=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,-0.0460066729355677)); -#4895=CARTESIAN_POINT('',(-0.0387210898258785,0.010692519685039,0.0460066729355677)); -#4896=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,0.0460066729355677)); -#4897=CARTESIAN_POINT('',(0.0387210898258785,0.010692519685039,-0.0460066729355677)); -#4898=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,0.0435066729355677)); -#4899=CARTESIAN_POINT('',(0.0362210898258786,0.010692519685039,0.0435066729355677)); -#4900=CARTESIAN_POINT('',(0.0362210898258786,0.010692519685039,-0.0281066729355677)); -#4901=CARTESIAN_POINT('',(-0.0362210898258786,0.010692519685039,-0.0281066729355677)); -#4902=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#4903=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#4904=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#4905=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#4906=CARTESIAN_POINT('',(0.,0.,0.)); -#4907=CARTESIAN_POINT('',(5.02064047892306E-19,-0.0114510148200444,-0.000261716324192014)); -#4908=CARTESIAN_POINT('',(-0.0432210898258786,-0.0092344190750169,0.0505066729355677)); -#4909=CARTESIAN_POINT('',(-0.0432210898258786,-0.00917111070779956,0.0519566729355677)); -#4910=CARTESIAN_POINT('',(0.0432210898258786,-0.0092344190750169,0.0505066729355677)); -#4911=CARTESIAN_POINT('',(0.0432210898258786,-0.00917111070779956,0.0519566729355677)); -#4912=CARTESIAN_POINT('',(0.0432210898258786,-0.0136447570020943,-0.0505066729355677)); -#4913=CARTESIAN_POINT('',(0.0432210898258786,-0.013581448634877,-0.0490566729355677)); -#4914=CARTESIAN_POINT('',(-0.0432210898258786,-0.0136447570020943,-0.0505066729355677)); -#4915=CARTESIAN_POINT('',(-0.0432210898258786,-0.013581448634877,-0.0490566729355677)); -#4916=CARTESIAN_POINT('',(-0.0487210898258785,-0.0114342804262124,0.000121564308730155)); -#4917=CARTESIAN_POINT('',(-0.0487210898258785,-0.0094308933181052,0.0460066729355677)); -#4918=CARTESIAN_POINT('',(-0.0487210898258785,-0.013448282759006,-0.0460066729355677)); -#4919=CARTESIAN_POINT('',(-0.0387210898258785,-0.013448282759006,-0.0460066729355677)); -#4920=CARTESIAN_POINT('',(-0.0387210898258785,-0.0138848921880911,-0.0560066729355677)); -#4921=CARTESIAN_POINT('',(0.,-0.0138848921880911,-0.0560066729355677)); -#4922=CARTESIAN_POINT('',(0.0387210898258785,-0.0138848921880911,-0.0560066729355677)); -#4923=CARTESIAN_POINT('',(0.0387210898258785,-0.013448282759006,-0.0460066729355677)); -#4924=CARTESIAN_POINT('',(0.0487210898258785,-0.013448282759006,-0.0460066729355677)); -#4925=CARTESIAN_POINT('',(0.0487210898258785,-0.0114342804262124,0.000121564308730155)); -#4926=CARTESIAN_POINT('',(0.0487210898258785,-0.0094308933181052,0.0460066729355677)); -#4927=CARTESIAN_POINT('',(0.0387210898258785,-0.0094308933181052,0.0460066729355677)); -#4928=CARTESIAN_POINT('',(0.0387210898258785,-0.00899428388902008,0.0560066729355677)); -#4929=CARTESIAN_POINT('',(0.,-0.00899428388902008,0.0560066729355677)); -#4930=CARTESIAN_POINT('',(-0.0387210898258785,-0.00899428388902008,0.0560066729355677)); -#4931=CARTESIAN_POINT('',(-0.0387210898258785,-0.0094308933181052,0.0460066729355677)); -#4932=CARTESIAN_POINT('',(-1.77876408120671E-10,-0.00924126748691088,0.0503498185151687)); -#4933=CARTESIAN_POINT('',(0.0373142355962296,-0.00924126748119597,0.0503498186460617)); -#4934=CARTESIAN_POINT('',(-0.0373142359494694,-0.00924126749262579,0.0503498183842758)); -#4935=CARTESIAN_POINT('',(0.0373142356163998,-0.00949231790291992,0.0445998186460617)); -#4936=CARTESIAN_POINT('',(0.0430642356163998,-0.00949231790203927,0.0445998186662319)); -#4937=CARTESIAN_POINT('',(0.0430642357737675,-0.0114510148134614,-0.000261716173416297)); -#4938=CARTESIAN_POINT('',(0.0430642359292992,-0.0133868581618808,-0.0445998183641056)); -#4939=CARTESIAN_POINT('',(0.0373142359292992,-0.0133868581627615,-0.0445998183842758)); -#4940=CARTESIAN_POINT('',(0.0373142359494694,-0.0136379085844854,-0.0503498183842757)); -#4941=CARTESIAN_POINT('',(1.76036782645462E-10,-0.0136379085902003,-0.0503498185151687)); -#4942=CARTESIAN_POINT('',(-0.0373142355962296,-0.0136379085959152,-0.0503498186460617)); -#4943=CARTESIAN_POINT('',(-0.0373142356163998,-0.0133868581741913,-0.0445998186460616)); -#4944=CARTESIAN_POINT('',(-0.0430642356163998,-0.0133868581750719,-0.0445998186662319)); -#4945=CARTESIAN_POINT('',(-0.0430642357719314,-0.0114510148266274,-0.000261716474967732)); -#4946=CARTESIAN_POINT('',(-0.0430642359292992,-0.00949231791523039,0.0445998183641056)); -#4947=CARTESIAN_POINT('',(-0.0373142359292992,-0.00949231791434974,0.0445998183842758)); -#4948=CARTESIAN_POINT('',(-0.0487210898258785,-0.00865,6.93889390390723E-18)); -#4949=CARTESIAN_POINT('',(-0.0487210898258785,0.003693,6.93889390390723E-18)); -#4950=CARTESIAN_POINT('',(-0.0487210898258785,0.003693,-0.0460066729355677)); -#4951=CARTESIAN_POINT('',(-0.0487210898258785,0.003693,0.0460066729355677)); -#4952=CARTESIAN_POINT('',(-0.0487210898258785,-0.0138848921880911,-0.0460066729355677)); -#4953=CARTESIAN_POINT('',(-0.0487210898258785,-0.00865,0.0460066729355677)); -#4954=CARTESIAN_POINT('',(0.,-0.00865,-0.0560066729355677)); -#4955=CARTESIAN_POINT('',(0.,-0.01085,-0.0560066729355677)); -#4956=CARTESIAN_POINT('',(0.0065,-0.01085,-0.0560066729355677)); -#4957=CARTESIAN_POINT('',(-0.0065,-0.01085,-0.0560066729355677)); -#4958=CARTESIAN_POINT('',(0.0065,-0.00885,-0.0560066729355677)); -#4959=CARTESIAN_POINT('',(0.0085,-0.00885,-0.0560066729355677)); -#4960=CARTESIAN_POINT('',(0.0085,-0.00585,-0.0560066729355677)); -#4961=CARTESIAN_POINT('',(0.0085,-0.00285,-0.0560066729355677)); -#4962=CARTESIAN_POINT('',(0.0065,-0.00285,-0.0560066729355677)); -#4963=CARTESIAN_POINT('',(0.0065,-0.00085,-0.0560066729355677)); -#4964=CARTESIAN_POINT('',(-1.7347234759768E-18,-0.00085,-0.0560066729355677)); -#4965=CARTESIAN_POINT('',(-0.0065,-0.00085,-0.0560066729355677)); -#4966=CARTESIAN_POINT('',(-0.0065,-0.00285,-0.0560066729355677)); -#4967=CARTESIAN_POINT('',(-0.0085,-0.00285,-0.0560066729355677)); -#4968=CARTESIAN_POINT('',(-0.0085,-0.00585,-0.0560066729355677)); -#4969=CARTESIAN_POINT('',(-0.0085,-0.00885,-0.0560066729355677)); -#4970=CARTESIAN_POINT('',(-0.0065,-0.00885,-0.0560066729355677)); -#4971=CARTESIAN_POINT('',(-0.0387210898258785,0.003693,-0.0560066729355677)); -#4972=CARTESIAN_POINT('',(-0.0387210898258785,0.003693,-0.0560066729355677)); -#4973=CARTESIAN_POINT('',(0.,0.003693,-0.0560066729355677)); -#4974=CARTESIAN_POINT('',(0.0387210898258785,0.003693,-0.0560066729355677)); -#4975=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,-0.0560066729355677)); -#4976=CARTESIAN_POINT('',(0.0487210898258785,-0.00865,6.93889390390723E-18)); -#4977=CARTESIAN_POINT('',(0.0487210898258785,0.003693,6.93889390390723E-18)); -#4978=CARTESIAN_POINT('',(0.0487210898258785,0.003693,-0.0460066729355677)); -#4979=CARTESIAN_POINT('',(0.0487210898258785,0.003693,0.0460066729355677)); -#4980=CARTESIAN_POINT('',(0.0487210898258785,-0.00899428388902008,0.0460066729355677)); -#4981=CARTESIAN_POINT('',(0.0487210898258785,-0.00865,-0.0460066729355677)); -#4982=CARTESIAN_POINT('',(0.,-0.00865,0.0560066729355677)); -#4983=CARTESIAN_POINT('',(0.,0.003693,0.0560066729355677)); -#4984=CARTESIAN_POINT('',(-0.0387210898258785,0.003693,0.0560066729355677)); -#4985=CARTESIAN_POINT('',(0.0387210898258785,0.003693,0.0560066729355677)); -#4986=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,0.0560066729355677)); -#4987=CARTESIAN_POINT('',(0.0387210898258785,0.003693,0.0560066729355677)); -#4988=CARTESIAN_POINT('',(1.7661991313922E-10,0.003693,-0.0503498185151687)); -#4989=CARTESIAN_POINT('',(0.0065,-0.00885,-0.0503498184923676)); -#4990=CARTESIAN_POINT('',(0.0085,-0.00885,-0.0503498184923676)); -#4991=CARTESIAN_POINT('',(0.0065,-0.01085,-0.0503498184923676)); -#4992=CARTESIAN_POINT('',(1.7661991313922E-10,-0.01085,-0.0503498185151687)); -#4993=CARTESIAN_POINT('',(-0.0065,-0.01085,-0.0503498185379698)); -#4994=CARTESIAN_POINT('',(-0.0065,-0.00885,-0.0503498185379698)); -#4995=CARTESIAN_POINT('',(-0.0085,-0.00885,-0.0503498185449855)); -#4996=CARTESIAN_POINT('',(-0.0085,0.003693,-0.0503498185449855)); -#4997=CARTESIAN_POINT('',(-0.0085,-0.00285,-0.0503498185379698)); -#4998=CARTESIAN_POINT('',(-0.0065,-0.00285,-0.0503498185379698)); -#4999=CARTESIAN_POINT('',(-0.0065,-0.00085,-0.0503498185151687)); -#5000=CARTESIAN_POINT('',(1.7661991313922E-10,-0.00085,-0.0503498185151687)); -#5001=CARTESIAN_POINT('',(0.0065,-0.00085,-0.0503498184923676)); -#5002=CARTESIAN_POINT('',(0.0065,-0.00285,-0.0503498184923676)); -#5003=CARTESIAN_POINT('',(0.0085,-0.00285,-0.0503498184853519)); -#5004=CARTESIAN_POINT('',(0.0085,0.003693,-0.0503498184853519)); -#5005=CARTESIAN_POINT('',(0.0373142359494694,0.003693,-0.0503498183842757)); -#5006=CARTESIAN_POINT('',(0.0373142359494694,0.003693,-0.0503498183842757)); -#5007=CARTESIAN_POINT('',(1.7661991313922E-10,0.003693,-0.0503498185151687)); -#5008=CARTESIAN_POINT('',(-0.0373142355962296,0.003693,-0.0503498186460617)); -#5009=CARTESIAN_POINT('',(-0.0373142355962296,0.003693,-0.0503498186460617)); -#5010=CARTESIAN_POINT('',(-0.0430642357728495,0.003693,-1.51063134223861E-10)); -#5011=CARTESIAN_POINT('',(-0.0430642357728495,0.003693,-1.51063134223861E-10)); -#5012=CARTESIAN_POINT('',(-0.0430642356163998,0.003693,-0.0445998186662319)); -#5013=CARTESIAN_POINT('',(-0.0430642359292992,0.003693,0.0445998183641056)); -#5014=CARTESIAN_POINT('',(-0.0430642359292992,-0.00924126748691088,0.0445998183641056)); -#5015=CARTESIAN_POINT('',(-0.0430642356163998,0.003693,-0.0445998186662319)); -#5016=CARTESIAN_POINT('',(-1.7661991313922E-10,0.003693,0.0503498185151687)); -#5017=CARTESIAN_POINT('',(-1.7661991313922E-10,0.003693,0.0503498185151687)); -#5018=CARTESIAN_POINT('',(-0.0373142359494694,0.003693,0.0503498183842758)); -#5019=CARTESIAN_POINT('',(0.0373142355962296,0.003693,0.0503498186460617)); -#5020=CARTESIAN_POINT('',(0.0373142355962296,0.003693,0.0503498186460617)); -#5021=CARTESIAN_POINT('',(-0.0373142359494694,0.003693,0.0503498183842758)); -#5022=CARTESIAN_POINT('',(0.0430642357728495,0.003693,1.51063141162755E-10)); -#5023=CARTESIAN_POINT('',(0.0430642356163998,0.003693,0.0445998186662319)); -#5024=CARTESIAN_POINT('',(0.0430642356163998,0.003693,0.0445998186662319)); -#5025=CARTESIAN_POINT('',(0.0430642357728495,0.003693,1.51063141162755E-10)); -#5026=CARTESIAN_POINT('',(0.0430642359292992,0.003693,-0.0445998183641056)); -#5027=CARTESIAN_POINT('',(0.0430642359292992,-0.0136379085836048,-0.0445998183641056)); -#5028=CARTESIAN_POINT('',(1.0496886189883E-18,0.003693,-3.17218277343494E-18)); -#5029=CARTESIAN_POINT('',(-0.0432210898258786,0.003693,0.0505066729355677)); -#5030=CARTESIAN_POINT('',(-0.0446710898258786,0.003693,0.0505066729355677)); -#5031=CARTESIAN_POINT('',(0.0432210898258786,0.003693,0.0505066729355677)); -#5032=CARTESIAN_POINT('',(0.0417710898258786,0.003693,0.0505066729355677)); -#5033=CARTESIAN_POINT('',(0.0432210898258786,0.003693,-0.0505066729355677)); -#5034=CARTESIAN_POINT('',(0.0417710898258786,0.003693,-0.0505066729355677)); -#5035=CARTESIAN_POINT('',(-0.0432210898258786,0.003693,-0.0505066729355677)); -#5036=CARTESIAN_POINT('',(-0.0446710898258786,0.003693,-0.0505066729355677)); -#5037=CARTESIAN_POINT('',(-0.0387210898258785,0.003693,-0.0460066729355677)); -#5038=CARTESIAN_POINT('',(-0.0387210898258785,0.003693,0.0460066729355677)); -#5039=CARTESIAN_POINT('',(0.0387210898258785,0.003693,0.0460066729355677)); -#5040=CARTESIAN_POINT('',(0.0387210898258785,0.003693,-0.0460066729355677)); -#5041=CARTESIAN_POINT('',(-0.0373142356163998,0.003693,-0.0445998186460616)); -#5042=CARTESIAN_POINT('',(0.0373142359292992,0.003693,-0.0445998183842758)); -#5043=CARTESIAN_POINT('',(0.0373142356163998,0.003693,0.0445998186460617)); -#5044=CARTESIAN_POINT('',(-0.0373142359292992,0.003693,0.0445998183842758)); -#5045=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,-0.0460066729355677)); -#5046=CARTESIAN_POINT('',(-0.0387210898258785,-0.00865,0.0460066729355677)); -#5047=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,0.0460066729355677)); -#5048=CARTESIAN_POINT('',(0.0387210898258785,-0.00865,-0.0460066729355677)); -#5049=CARTESIAN_POINT('',(0.0373142356163998,0.003693,0.0445998186460617)); -#5050=CARTESIAN_POINT('',(-0.0373142359292992,0.003693,0.0445998183842758)); -#5051=CARTESIAN_POINT('',(0.0373142359292992,0.003693,-0.0445998183842758)); -#5052=CARTESIAN_POINT('',(-0.0373142356163998,0.003693,-0.0445998186460616)); -#5053=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#5054=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#5055=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#5056=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#5057=CARTESIAN_POINT('',(0.,-0.01085,-0.0306066729355676)); -#5058=CARTESIAN_POINT('',(0.0065,-0.01085,-0.0306066729355676)); -#5059=CARTESIAN_POINT('',(-0.0065,-0.01085,-0.0306066729355676)); -#5060=CARTESIAN_POINT('',(-0.0065,-0.00885,-0.0306066729355676)); -#5061=CARTESIAN_POINT('',(-0.0085,-0.00885,-0.0306066729355676)); -#5062=CARTESIAN_POINT('',(-0.0085,-0.00585,-0.0306066729355676)); -#5063=CARTESIAN_POINT('',(-0.0085,-0.00285,-0.0306066729355676)); -#5064=CARTESIAN_POINT('',(-0.0065,-0.00285,-0.0306066729355676)); -#5065=CARTESIAN_POINT('',(-0.0065,-0.00085,-0.0306066729355676)); -#5066=CARTESIAN_POINT('',(-1.7347234759768E-18,-0.00085,-0.0306066729355676)); -#5067=CARTESIAN_POINT('',(0.0065,-0.00085,-0.0306066729355676)); -#5068=CARTESIAN_POINT('',(0.0065,-0.00285,-0.0306066729355676)); -#5069=CARTESIAN_POINT('',(0.0085,-0.00285,-0.0306066729355676)); -#5070=CARTESIAN_POINT('',(0.0085,-0.00585,-0.0306066729355676)); -#5071=CARTESIAN_POINT('',(0.0085,-0.00885,-0.0306066729355676)); -#5072=CARTESIAN_POINT('',(0.0065,-0.00885,-0.0306066729355676)); -#5073=CARTESIAN_POINT('',(0.,0.,0.)); -#5074=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,-4.52203240872422E-19)); -#5075=CARTESIAN_POINT('',(-0.0432210898258786,0.003692519685039,0.0505066729355677)); -#5076=CARTESIAN_POINT('',(-0.0432210898258786,0.003692519685039,0.0490566729355677)); -#5077=CARTESIAN_POINT('',(0.0432210898258786,0.003692519685039,0.0505066729355677)); -#5078=CARTESIAN_POINT('',(0.0432210898258786,0.003692519685039,0.0490566729355677)); -#5079=CARTESIAN_POINT('',(0.0432210898258786,0.003692519685039,-0.0505066729355677)); -#5080=CARTESIAN_POINT('',(0.0432210898258786,0.003692519685039,-0.0519566729355677)); -#5081=CARTESIAN_POINT('',(-0.0432210898258786,0.003692519685039,-0.0505066729355677)); -#5082=CARTESIAN_POINT('',(-0.0432210898258786,0.003692519685039,-0.0519566729355677)); -#5083=CARTESIAN_POINT('',(1.61075359369314E-23,0.00369251968503899,-0.0560066729355677)); -#5084=CARTESIAN_POINT('',(-0.0387210898258785,0.00369251968503899,-0.0560066729355677)); -#5085=CARTESIAN_POINT('',(0.0387210898258785,0.00369251968503899,-0.0560066729355677)); -#5086=CARTESIAN_POINT('',(0.0387210898258785,0.00369251968503899,-0.0460066729355677)); -#5087=CARTESIAN_POINT('',(0.0487210898258785,0.00369251968503899,-0.0460066729355677)); -#5088=CARTESIAN_POINT('',(0.0487210898258785,0.003692519685039,3.67394039391001E-19)); -#5089=CARTESIAN_POINT('',(0.0487210898258785,0.003692519685039,0.0460066729355677)); -#5090=CARTESIAN_POINT('',(0.0387210898258785,0.003692519685039,0.0460066729355677)); -#5091=CARTESIAN_POINT('',(0.0387210898258785,0.00369251968503901,0.0560066729355677)); -#5092=CARTESIAN_POINT('',(1.61075359369314E-23,0.00369251968503901,0.0560066729355677)); -#5093=CARTESIAN_POINT('',(-0.0387210898258785,0.00369251968503901,0.0560066729355677)); -#5094=CARTESIAN_POINT('',(-0.0387210898258785,0.003692519685039,0.0460066729355677)); -#5095=CARTESIAN_POINT('',(-0.0487210898258785,0.003692519685039,0.0460066729355677)); -#5096=CARTESIAN_POINT('',(-0.0487210898258785,0.003692519685039,3.67394039391001E-19)); -#5097=CARTESIAN_POINT('',(-0.0487210898258785,0.00369251968503899,-0.0460066729355677)); -#5098=CARTESIAN_POINT('',(-0.0387210898258785,0.00369251968503899,-0.0460066729355677)); -#5099=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,-4.52203240872422E-19)); -#5100=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,0.0431132821598536)); -#5101=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,0.0291132821598536)); -#5102=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0291132821598536)); -#5103=CARTESIAN_POINT('',(0.0215363118804153,0.00369251968503899,0.0291132821598536)); -#5104=CARTESIAN_POINT('',(0.0215363118804153,0.003692519685039,-4.52203240872422E-19)); -#5105=CARTESIAN_POINT('',(0.0215363118804153,0.003692519685039,0.0431132821598536)); -#5106=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0431132821598536)); -#5107=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,4.90404992819683E-18)); -#5108=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,0.0431132821598536)); -#5109=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,0.0291132821598536)); -#5110=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0291132821598536)); -#5111=CARTESIAN_POINT('',(-0.0356136881195847,0.00369251968503899,0.0291132821598536)); -#5112=CARTESIAN_POINT('',(-0.0356136881195847,0.003692519685039,-4.52203240872422E-19)); -#5113=CARTESIAN_POINT('',(-0.0356136881195847,0.003692519685039,0.0431132821598536)); -#5114=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0431132821598536)); -#5115=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,-1.34539671863385E-19)); -#5116=CARTESIAN_POINT('',(-0.00256368811958476,0.00369251968503899,-0.0140367178401464)); -#5117=CARTESIAN_POINT('',(-0.00256368811958476,0.00369251968503899,-0.0280367178401464)); -#5118=CARTESIAN_POINT('',(-1.98257978415308E-23,0.00369251968503899,-0.0280367178401464)); -#5119=CARTESIAN_POINT('',(-0.0165636881195847,0.00369251968503899,-0.0280367178401464)); -#5120=CARTESIAN_POINT('',(-0.0165636881195847,0.003692519685039,-4.52203240872422E-19)); -#5121=CARTESIAN_POINT('',(-0.0165636881195847,0.00369251968503899,-0.0140367178401464)); -#5122=CARTESIAN_POINT('',(-1.73929296600958E-18,0.003692519685039,-0.0140367178401464)); -#5123=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,-1.34539671863385E-19)); -#5124=CARTESIAN_POINT('',(-0.00256368811958476,0.00369251968503899,0.00501328215985361)); -#5125=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,-0.00898671784014639)); -#5126=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,-0.00898671784014639)); -#5127=CARTESIAN_POINT('',(-0.0165636881195847,0.00369251968503899,-0.00898671784014639)); -#5128=CARTESIAN_POINT('',(-0.0165636881195847,0.003692519685039,-4.52203240872422E-19)); -#5129=CARTESIAN_POINT('',(-0.0165636881195847,0.00369251968503899,0.00501328215985361)); -#5130=CARTESIAN_POINT('',(6.21170049516E-19,0.003692519685039,0.00501328215985361)); -#5131=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,-1.34539671863385E-19)); -#5132=CARTESIAN_POINT('',(-0.00256368811958476,0.00369251968503899,0.0240632821598536)); -#5133=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,0.0100632821598536)); -#5134=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0100632821598536)); -#5135=CARTESIAN_POINT('',(-0.0165636881195847,0.00369251968503899,0.0100632821598536)); -#5136=CARTESIAN_POINT('',(-0.0165636881195847,0.003692519685039,-4.52203240872422E-19)); -#5137=CARTESIAN_POINT('',(-0.0165636881195847,0.00369251968503899,0.0240632821598536)); -#5138=CARTESIAN_POINT('',(5.96328595588101E-18,0.003692519685039,0.0240632821598536)); -#5139=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,4.90404992819683E-18)); -#5140=CARTESIAN_POINT('',(-0.0216136881195848,0.00369251968503899,0.0240632821598536)); -#5141=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,0.0100632821598536)); -#5142=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0100632821598536)); -#5143=CARTESIAN_POINT('',(-0.0356136881195847,0.00369251968503899,0.0100632821598536)); -#5144=CARTESIAN_POINT('',(-0.0356136881195847,0.003692519685039,-4.52203240872422E-19)); -#5145=CARTESIAN_POINT('',(-0.0356136881195847,0.00369251968503899,0.0240632821598536)); -#5146=CARTESIAN_POINT('',(5.96328595588101E-18,0.003692519685039,0.0240632821598536)); -#5147=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,4.90404992819682E-18)); -#5148=CARTESIAN_POINT('',(-0.0216136881195848,0.00369251968503899,0.00501328215985361)); -#5149=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,-0.00898671784014639)); -#5150=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,-0.00898671784014639)); -#5151=CARTESIAN_POINT('',(-0.0356136881195847,0.00369251968503899,-0.00898671784014639)); -#5152=CARTESIAN_POINT('',(-0.0356136881195847,0.003692519685039,-4.52203240872422E-19)); -#5153=CARTESIAN_POINT('',(-0.0356136881195847,0.00369251968503899,0.00501328215985361)); -#5154=CARTESIAN_POINT('',(6.21170049515999E-19,0.003692519685039,0.00501328215985361)); -#5155=CARTESIAN_POINT('',(-0.0216136881195848,0.003692519685039,4.90404992819682E-18)); -#5156=CARTESIAN_POINT('',(-0.0216136881195848,0.00369251968503899,-0.0140367178401464)); -#5157=CARTESIAN_POINT('',(-0.0216136881195848,0.00369251968503899,-0.0280367178401464)); -#5158=CARTESIAN_POINT('',(-1.98257978415308E-23,0.00369251968503899,-0.0280367178401464)); -#5159=CARTESIAN_POINT('',(-0.0356136881195847,0.00369251968503899,-0.0280367178401464)); -#5160=CARTESIAN_POINT('',(-0.0356136881195847,0.003692519685039,-4.52203240872422E-19)); -#5161=CARTESIAN_POINT('',(-0.0356136881195847,0.00369251968503899,-0.0140367178401464)); -#5162=CARTESIAN_POINT('',(-1.73929296600958E-18,0.003692519685039,-0.0140367178401464)); -#5163=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,-4.53780213390552E-18)); -#5164=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,0.0431132821598536)); -#5165=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,0.0291132821598536)); -#5166=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0291132821598536)); -#5167=CARTESIAN_POINT('',(0.00248631188041525,0.00369251968503899,0.0291132821598536)); -#5168=CARTESIAN_POINT('',(0.00248631188041525,0.003692519685039,-4.52203240872422E-19)); -#5169=CARTESIAN_POINT('',(0.00248631188041525,0.003692519685039,0.0431132821598536)); -#5170=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0431132821598536)); -#5171=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,-4.52203240872422E-19)); -#5172=CARTESIAN_POINT('',(0.0355363118804152,0.00369251968503899,-0.0140367178401464)); -#5173=CARTESIAN_POINT('',(0.0355363118804152,0.00369251968503899,-0.0280367178401464)); -#5174=CARTESIAN_POINT('',(-1.98257978415308E-23,0.00369251968503899,-0.0280367178401464)); -#5175=CARTESIAN_POINT('',(0.0215363118804153,0.00369251968503899,-0.0280367178401464)); -#5176=CARTESIAN_POINT('',(0.0215363118804153,0.003692519685039,-4.52203240872422E-19)); -#5177=CARTESIAN_POINT('',(0.0215363118804153,0.00369251968503899,-0.0140367178401464)); -#5178=CARTESIAN_POINT('',(-1.73929296600958E-18,0.003692519685039,-0.0140367178401464)); -#5179=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,-4.52203240872422E-19)); -#5180=CARTESIAN_POINT('',(0.0355363118804152,0.00369251968503899,0.00501328215985361)); -#5181=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,-0.00898671784014639)); -#5182=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,-0.00898671784014639)); -#5183=CARTESIAN_POINT('',(0.0215363118804153,0.00369251968503899,-0.00898671784014639)); -#5184=CARTESIAN_POINT('',(0.0215363118804153,0.003692519685039,-4.52203240872422E-19)); -#5185=CARTESIAN_POINT('',(0.0215363118804153,0.00369251968503899,0.00501328215985361)); -#5186=CARTESIAN_POINT('',(6.21170049516E-19,0.003692519685039,0.00501328215985362)); -#5187=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,-4.52203240872422E-19)); -#5188=CARTESIAN_POINT('',(0.0355363118804152,0.00369251968503899,0.0240632821598536)); -#5189=CARTESIAN_POINT('',(0.0355363118804152,0.003692519685039,0.0100632821598536)); -#5190=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0100632821598536)); -#5191=CARTESIAN_POINT('',(0.0215363118804153,0.00369251968503899,0.0100632821598536)); -#5192=CARTESIAN_POINT('',(0.0215363118804153,0.003692519685039,-4.52203240872422E-19)); -#5193=CARTESIAN_POINT('',(0.0215363118804153,0.00369251968503899,0.0240632821598536)); -#5194=CARTESIAN_POINT('',(5.96328595588101E-18,0.003692519685039,0.0240632821598536)); -#5195=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,-1.34539671863384E-19)); -#5196=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,0.0431132821598536)); -#5197=CARTESIAN_POINT('',(-0.00256368811958476,0.003692519685039,0.0291132821598536)); -#5198=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0291132821598536)); -#5199=CARTESIAN_POINT('',(-0.0165636881195847,0.00369251968503899,0.0291132821598536)); -#5200=CARTESIAN_POINT('',(-0.0165636881195847,0.003692519685039,-4.52203240872422E-19)); -#5201=CARTESIAN_POINT('',(-0.0165636881195847,0.003692519685039,0.0431132821598536)); -#5202=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0431132821598536)); -#5203=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,-4.53780213390552E-18)); -#5204=CARTESIAN_POINT('',(0.0164863118804153,0.00369251968503899,-0.0140367178401464)); -#5205=CARTESIAN_POINT('',(0.0164863118804153,0.00369251968503899,-0.0280367178401464)); -#5206=CARTESIAN_POINT('',(-1.98257978415308E-23,0.00369251968503899,-0.0280367178401464)); -#5207=CARTESIAN_POINT('',(0.00248631188041525,0.00369251968503899,-0.0280367178401464)); -#5208=CARTESIAN_POINT('',(0.00248631188041525,0.003692519685039,-4.52203240872422E-19)); -#5209=CARTESIAN_POINT('',(0.00248631188041525,0.00369251968503899,-0.0140367178401464)); -#5210=CARTESIAN_POINT('',(-1.73929296600958E-18,0.003692519685039,-0.0140367178401464)); -#5211=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,-4.53780213390552E-18)); -#5212=CARTESIAN_POINT('',(0.0164863118804153,0.00369251968503899,0.00501328215985361)); -#5213=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,-0.00898671784014639)); -#5214=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,-0.00898671784014639)); -#5215=CARTESIAN_POINT('',(0.00248631188041525,0.00369251968503899,-0.00898671784014639)); -#5216=CARTESIAN_POINT('',(0.00248631188041525,0.003692519685039,-4.52203240872422E-19)); -#5217=CARTESIAN_POINT('',(0.00248631188041525,0.00369251968503899,0.00501328215985361)); -#5218=CARTESIAN_POINT('',(6.21170049516E-19,0.003692519685039,0.00501328215985361)); -#5219=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,-4.53780213390552E-18)); -#5220=CARTESIAN_POINT('',(0.0164863118804153,0.00369251968503899,0.0240632821598536)); -#5221=CARTESIAN_POINT('',(0.0164863118804153,0.003692519685039,0.0100632821598536)); -#5222=CARTESIAN_POINT('',(-1.98257978415308E-23,0.003692519685039,0.0100632821598536)); -#5223=CARTESIAN_POINT('',(0.00248631188041525,0.00369251968503899,0.0100632821598536)); -#5224=CARTESIAN_POINT('',(0.00248631188041525,0.003692519685039,-4.52203240872422E-19)); -#5225=CARTESIAN_POINT('',(0.00248631188041525,0.00369251968503899,0.0240632821598536)); -#5226=CARTESIAN_POINT('',(5.96328595588101E-18,0.003692519685039,0.0240632821598536)); -#5227=CARTESIAN_POINT('',(-3.59333337784623E-23,0.006692519685039,-8.19597280263423E-19)); -#5228=CARTESIAN_POINT('',(0.00948631188041524,0.006692519685039,-0.00898671784014639)); -#5229=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,-0.00898671784014639)); -#5230=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,-0.00898671784014639)); -#5231=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,-0.00198671784014639)); -#5232=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,0.00501328215985361)); -#5233=CARTESIAN_POINT('',(0.00948631188041524,0.006692519685039,0.00501328215985361)); -#5234=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,0.00501328215985361)); -#5235=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,-0.00198671784014639)); -#5236=CARTESIAN_POINT('',(-0.00956368811958476,0.006692519685039,0.0291132821598536)); -#5237=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,0.0291132821598536)); -#5238=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,0.0291132821598536)); -#5239=CARTESIAN_POINT('',(-0.00256368811958476,0.00669251968503901,0.0361132821598536)); -#5240=CARTESIAN_POINT('',(-0.00256368811958476,0.00669251968503901,0.0431132821598536)); -#5241=CARTESIAN_POINT('',(-0.00956368811958476,0.00669251968503901,0.0431132821598536)); -#5242=CARTESIAN_POINT('',(-0.0165636881195847,0.00669251968503901,0.0431132821598536)); -#5243=CARTESIAN_POINT('',(-0.0165636881195847,0.00669251968503901,0.0361132821598536)); -#5244=CARTESIAN_POINT('',(0.0285363118804152,0.006692519685039,-0.00898671784014639)); -#5245=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,-0.00898671784014639)); -#5246=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,-0.00898671784014639)); -#5247=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,-0.00198671784014639)); -#5248=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,0.00501328215985361)); -#5249=CARTESIAN_POINT('',(0.0285363118804152,0.006692519685039,0.00501328215985361)); -#5250=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,0.00501328215985361)); -#5251=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,-0.00198671784014639)); -#5252=CARTESIAN_POINT('',(0.00948631188041524,0.006692519685039,0.0291132821598536)); -#5253=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,0.0291132821598536)); -#5254=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,0.0291132821598536)); -#5255=CARTESIAN_POINT('',(0.0164863118804153,0.00669251968503901,0.0361132821598536)); -#5256=CARTESIAN_POINT('',(0.0164863118804153,0.00669251968503901,0.0431132821598536)); -#5257=CARTESIAN_POINT('',(0.00948631188041524,0.00669251968503901,0.0431132821598536)); -#5258=CARTESIAN_POINT('',(0.00248631188041525,0.00669251968503901,0.0431132821598536)); -#5259=CARTESIAN_POINT('',(0.00248631188041525,0.00669251968503901,0.0361132821598536)); -#5260=CARTESIAN_POINT('',(-0.0286136881195848,0.006692519685039,-0.00898671784014639)); -#5261=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,-0.00898671784014639)); -#5262=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,-0.00898671784014639)); -#5263=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,-0.00198671784014639)); -#5264=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,0.00501328215985361)); -#5265=CARTESIAN_POINT('',(-0.0286136881195848,0.006692519685039,0.00501328215985361)); -#5266=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,0.00501328215985361)); -#5267=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,-0.00198671784014639)); -#5268=CARTESIAN_POINT('',(-0.00956368811958476,0.006692519685039,0.0100632821598536)); -#5269=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,0.0100632821598536)); -#5270=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,0.0100632821598536)); -#5271=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,0.0170632821598536)); -#5272=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,0.0240632821598536)); -#5273=CARTESIAN_POINT('',(-0.00956368811958476,0.006692519685039,0.0240632821598536)); -#5274=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,0.0240632821598536)); -#5275=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,0.0170632821598536)); -#5276=CARTESIAN_POINT('',(-0.00956368811958476,0.006692519685039,-0.0280367178401464)); -#5277=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,-0.0280367178401464)); -#5278=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,-0.0280367178401464)); -#5279=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,-0.0210367178401464)); -#5280=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,-0.0140367178401464)); -#5281=CARTESIAN_POINT('',(-0.00956368811958476,0.006692519685039,-0.0140367178401464)); -#5282=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,-0.0140367178401464)); -#5283=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,-0.0210367178401464)); -#5284=CARTESIAN_POINT('',(0.0285363118804152,0.006692519685039,0.0291132821598536)); -#5285=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,0.0291132821598536)); -#5286=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,0.0291132821598536)); -#5287=CARTESIAN_POINT('',(0.0355363118804152,0.00669251968503901,0.0361132821598536)); -#5288=CARTESIAN_POINT('',(0.0355363118804152,0.00669251968503901,0.0431132821598536)); -#5289=CARTESIAN_POINT('',(0.0285363118804152,0.00669251968503901,0.0431132821598536)); -#5290=CARTESIAN_POINT('',(0.0215363118804153,0.00669251968503901,0.0431132821598536)); -#5291=CARTESIAN_POINT('',(0.0215363118804153,0.00669251968503901,0.0361132821598536)); -#5292=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,0.0505066729355677)); -#5293=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,0.0490566729355677)); -#5294=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,0.0505066729355677)); -#5295=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,0.0490566729355677)); -#5296=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,-0.0505066729355677)); -#5297=CARTESIAN_POINT('',(0.0432210898258786,0.00669251968503901,-0.0519566729355677)); -#5298=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,-0.0505066729355677)); -#5299=CARTESIAN_POINT('',(-0.0432210898258786,0.00669251968503901,-0.0519566729355677)); -#5300=CARTESIAN_POINT('',(0.0487210898258785,0.006692519685039,-3.20358093071521E-38)); -#5301=CARTESIAN_POINT('',(0.0487210898258785,0.00669251968503901,0.0460066729355677)); -#5302=CARTESIAN_POINT('',(0.0487210898258785,0.006692519685039,-0.0460066729355677)); -#5303=CARTESIAN_POINT('',(0.0387210898258785,0.006692519685039,-0.0460066729355677)); -#5304=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503899,-0.0560066729355677)); -#5305=CARTESIAN_POINT('',(-4.29827644016041E-40,0.00669251968503899,-0.0560066729355677)); -#5306=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503899,-0.0560066729355677)); -#5307=CARTESIAN_POINT('',(-0.0387210898258785,0.006692519685039,-0.0460066729355677)); -#5308=CARTESIAN_POINT('',(-0.0487210898258785,0.006692519685039,-0.0460066729355677)); -#5309=CARTESIAN_POINT('',(-0.0487210898258785,0.006692519685039,3.20358093071275E-38)); -#5310=CARTESIAN_POINT('',(-0.0487210898258785,0.00669251968503901,0.0460066729355677)); -#5311=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503901,0.0460066729355677)); -#5312=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503901,0.0560066729355677)); -#5313=CARTESIAN_POINT('',(4.29827644016037E-40,0.00669251968503901,0.0560066729355677)); -#5314=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503901,0.0560066729355677)); -#5315=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503901,0.0460066729355677)); -#5316=CARTESIAN_POINT('',(-0.0286136881195848,0.006692519685039,0.0291132821598536)); -#5317=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,0.0291132821598536)); -#5318=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,0.0291132821598536)); -#5319=CARTESIAN_POINT('',(-0.0216136881195848,0.00669251968503901,0.0361132821598536)); -#5320=CARTESIAN_POINT('',(-0.0216136881195848,0.00669251968503901,0.0431132821598536)); -#5321=CARTESIAN_POINT('',(-0.0286136881195848,0.00669251968503901,0.0431132821598536)); -#5322=CARTESIAN_POINT('',(-0.0356136881195847,0.00669251968503901,0.0431132821598536)); -#5323=CARTESIAN_POINT('',(-0.0356136881195847,0.00669251968503901,0.0361132821598536)); -#5324=CARTESIAN_POINT('',(-0.00956368811958476,0.006692519685039,-0.00898671784014639)); -#5325=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,-0.00898671784014639)); -#5326=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,-0.00898671784014639)); -#5327=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,-0.00198671784014639)); -#5328=CARTESIAN_POINT('',(-0.00256368811958476,0.006692519685039,0.00501328215985361)); -#5329=CARTESIAN_POINT('',(-0.00956368811958476,0.006692519685039,0.00501328215985361)); -#5330=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,0.00501328215985361)); -#5331=CARTESIAN_POINT('',(-0.0165636881195847,0.006692519685039,-0.00198671784014639)); -#5332=CARTESIAN_POINT('',(-0.0286136881195848,0.006692519685039,0.0100632821598536)); -#5333=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,0.0100632821598536)); -#5334=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,0.0100632821598536)); -#5335=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,0.0170632821598536)); -#5336=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,0.0240632821598536)); -#5337=CARTESIAN_POINT('',(-0.0286136881195848,0.006692519685039,0.0240632821598536)); -#5338=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,0.0240632821598536)); -#5339=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,0.0170632821598536)); -#5340=CARTESIAN_POINT('',(-0.0286136881195848,0.006692519685039,-0.0280367178401464)); -#5341=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,-0.0280367178401464)); -#5342=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,-0.0280367178401464)); -#5343=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,-0.0210367178401464)); -#5344=CARTESIAN_POINT('',(-0.0216136881195848,0.006692519685039,-0.0140367178401464)); -#5345=CARTESIAN_POINT('',(-0.0286136881195848,0.006692519685039,-0.0140367178401464)); -#5346=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,-0.0140367178401464)); -#5347=CARTESIAN_POINT('',(-0.0356136881195847,0.006692519685039,-0.0210367178401464)); -#5348=CARTESIAN_POINT('',(0.0285363118804152,0.006692519685039,-0.0280367178401464)); -#5349=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,-0.0280367178401464)); -#5350=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,-0.0280367178401464)); -#5351=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,-0.0210367178401464)); -#5352=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,-0.0140367178401464)); -#5353=CARTESIAN_POINT('',(0.0285363118804152,0.006692519685039,-0.0140367178401464)); -#5354=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,-0.0140367178401464)); -#5355=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,-0.0210367178401464)); -#5356=CARTESIAN_POINT('',(0.0285363118804152,0.006692519685039,0.0100632821598536)); -#5357=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,0.0100632821598536)); -#5358=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,0.0100632821598536)); -#5359=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,0.0170632821598536)); -#5360=CARTESIAN_POINT('',(0.0355363118804152,0.006692519685039,0.0240632821598536)); -#5361=CARTESIAN_POINT('',(0.0285363118804152,0.006692519685039,0.0240632821598536)); -#5362=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,0.0240632821598536)); -#5363=CARTESIAN_POINT('',(0.0215363118804153,0.006692519685039,0.0170632821598536)); -#5364=CARTESIAN_POINT('',(0.00948631188041524,0.006692519685039,-0.0280367178401464)); -#5365=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,-0.0280367178401464)); -#5366=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,-0.0280367178401464)); -#5367=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,-0.0210367178401464)); -#5368=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,-0.0140367178401464)); -#5369=CARTESIAN_POINT('',(0.00948631188041524,0.006692519685039,-0.0140367178401464)); -#5370=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,-0.0140367178401464)); -#5371=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,-0.0210367178401464)); -#5372=CARTESIAN_POINT('',(0.00948631188041524,0.006692519685039,0.0100632821598536)); -#5373=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,0.0100632821598536)); -#5374=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,0.0100632821598536)); -#5375=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,0.0170632821598536)); -#5376=CARTESIAN_POINT('',(0.0164863118804153,0.006692519685039,0.0240632821598536)); -#5377=CARTESIAN_POINT('',(0.00948631188041524,0.006692519685039,0.0240632821598536)); -#5378=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,0.0240632821598536)); -#5379=CARTESIAN_POINT('',(0.00248631188041525,0.006692519685039,0.0170632821598536)); -#5380=CARTESIAN_POINT('',(-0.0487210898258785,0.003692519685039,3.67394039391001E-19)); -#5381=CARTESIAN_POINT('',(-0.0487210898258785,0.00369251968503899,-0.0460066729355677)); -#5382=CARTESIAN_POINT('',(-0.0487210898258785,0.00669251968503901,0.0460066729355677)); -#5383=CARTESIAN_POINT('',(1.61075359369314E-23,0.00369251968503899,-0.0560066729355677)); -#5384=CARTESIAN_POINT('',(0.0387210898258785,0.00369251968503899,-0.0560066729355677)); -#5385=CARTESIAN_POINT('',(-0.0387210898258785,0.00669251968503899,-0.0560066729355677)); -#5386=CARTESIAN_POINT('',(0.0487210898258785,0.003692519685039,3.67394039391001E-19)); -#5387=CARTESIAN_POINT('',(0.0487210898258785,0.006692519685039,-0.0460066729355677)); -#5388=CARTESIAN_POINT('',(0.0487210898258785,0.003692519685039,0.0460066729355677)); -#5389=CARTESIAN_POINT('',(1.61075359369314E-23,0.00369251968503901,0.0560066729355677)); -#5390=CARTESIAN_POINT('',(-0.0387210898258785,0.00369251968503901,0.0560066729355677)); -#5391=CARTESIAN_POINT('',(0.0387210898258785,0.00669251968503901,0.0560066729355677)); -#5392=CARTESIAN_POINT('',(0.0387210898258785,0.00369251968503899,-0.0460066729355677)); -#5393=CARTESIAN_POINT('',(-0.0387210898258785,0.00369251968503899,-0.0460066729355677)); -#5394=CARTESIAN_POINT('',(-0.0387210898258785,0.003692519685039,0.0460066729355677)); -#5395=CARTESIAN_POINT('',(0.0387210898258785,0.003692519685039,0.0460066729355677)); -#5396=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#5397=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,-0.0505066729355676)); -#5398=CARTESIAN_POINT('',(0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#5399=CARTESIAN_POINT('',(-0.0432210898258786,-0.14475784071431,0.0505066729355677)); -#5400=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,0.0291132821598536)); -#5401=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,0.0291132821598536)); -#5402=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,0.0291132821598536)); -#5403=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,0.0361132821598536)); -#5404=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,0.0431132821598536)); -#5405=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,0.0431132821598536)); -#5406=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,0.0431132821598536)); -#5407=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,0.0361132821598536)); -#5408=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,0.0291132821598536)); -#5409=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,0.0291132821598536)); -#5410=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,0.0291132821598536)); -#5411=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,0.0361132821598536)); -#5412=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,0.0431132821598536)); -#5413=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,0.0431132821598536)); -#5414=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,0.0431132821598536)); -#5415=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,0.0361132821598536)); -#5416=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,-0.0280367178401464)); -#5417=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,-0.0280367178401464)); -#5418=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,-0.0280367178401464)); -#5419=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,-0.0210367178401464)); -#5420=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,-0.0140367178401464)); -#5421=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,-0.0140367178401464)); -#5422=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,-0.0140367178401464)); -#5423=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,-0.0210367178401464)); -#5424=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,-0.00898671784014638)); -#5425=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,-0.00898671784014639)); -#5426=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,-0.00898671784014638)); -#5427=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,-0.00198671784014639)); -#5428=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,0.00501328215985362)); -#5429=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,0.00501328215985361)); -#5430=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,0.00501328215985361)); -#5431=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,-0.00198671784014639)); -#5432=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,0.0100632821598536)); -#5433=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,0.0100632821598536)); -#5434=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,0.0100632821598536)); -#5435=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,0.0170632821598536)); -#5436=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,0.0240632821598536)); -#5437=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,0.0240632821598536)); -#5438=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,0.0240632821598536)); -#5439=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,0.0170632821598536)); -#5440=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,0.0100632821598536)); -#5441=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,0.0100632821598536)); -#5442=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,0.0100632821598536)); -#5443=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,0.0170632821598536)); -#5444=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,0.0240632821598536)); -#5445=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,0.0240632821598536)); -#5446=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,0.0240632821598536)); -#5447=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,0.0170632821598536)); -#5448=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,-0.00898671784014638)); -#5449=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,-0.00898671784014639)); -#5450=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,-0.00898671784014638)); -#5451=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,-0.00198671784014639)); -#5452=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,0.00501328215985362)); -#5453=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,0.00501328215985361)); -#5454=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,0.00501328215985361)); -#5455=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,-0.00198671784014639)); -#5456=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,-0.0280367178401464)); -#5457=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,-0.0280367178401464)); -#5458=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,-0.0280367178401464)); -#5459=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,-0.0210367178401464)); -#5460=CARTESIAN_POINT('',(-0.0356136881195847,-0.018707480314961,-0.0140367178401464)); -#5461=CARTESIAN_POINT('',(-0.0286136881195848,-0.018707480314961,-0.0140367178401464)); -#5462=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,-0.0140367178401464)); -#5463=CARTESIAN_POINT('',(-0.0216136881195848,-0.018707480314961,-0.0210367178401464)); -#5464=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,0.0291132821598536)); -#5465=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,0.0291132821598536)); -#5466=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,0.0291132821598536)); -#5467=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,0.0361132821598536)); -#5468=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,0.0431132821598536)); -#5469=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,0.0431132821598536)); -#5470=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,0.0431132821598536)); -#5471=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,0.0361132821598536)); -#5472=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,-0.0280367178401464)); -#5473=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,-0.0280367178401464)); -#5474=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,-0.0280367178401464)); -#5475=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,-0.0210367178401464)); -#5476=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,-0.0140367178401464)); -#5477=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,-0.0140367178401464)); -#5478=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,-0.0140367178401464)); -#5479=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,-0.0210367178401464)); -#5480=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,-0.00898671784014638)); -#5481=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,-0.00898671784014639)); -#5482=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,-0.00898671784014638)); -#5483=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,-0.00198671784014639)); -#5484=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,0.00501328215985362)); -#5485=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,0.00501328215985361)); -#5486=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,0.00501328215985361)); -#5487=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,-0.00198671784014639)); -#5488=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,0.0100632821598536)); -#5489=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,0.0100632821598536)); -#5490=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,0.0100632821598536)); -#5491=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,0.0170632821598536)); -#5492=CARTESIAN_POINT('',(0.0215363118804153,-0.018707480314961,0.0240632821598536)); -#5493=CARTESIAN_POINT('',(0.0285363118804152,-0.018707480314961,0.0240632821598536)); -#5494=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,0.0240632821598536)); -#5495=CARTESIAN_POINT('',(0.0355363118804152,-0.018707480314961,0.0170632821598536)); -#5496=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,0.0291132821598536)); -#5497=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,0.0291132821598536)); -#5498=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,0.0291132821598536)); -#5499=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,0.0361132821598536)); -#5500=CARTESIAN_POINT('',(-0.0165636881195847,-0.018707480314961,0.0431132821598536)); -#5501=CARTESIAN_POINT('',(-0.00956368811958476,-0.018707480314961,0.0431132821598536)); -#5502=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,0.0431132821598536)); -#5503=CARTESIAN_POINT('',(-0.00256368811958476,-0.018707480314961,0.0361132821598536)); -#5504=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,-0.0280367178401464)); -#5505=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,-0.0280367178401464)); -#5506=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,-0.0280367178401464)); -#5507=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,-0.0210367178401464)); -#5508=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,-0.0140367178401464)); -#5509=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,-0.0140367178401464)); -#5510=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,-0.0140367178401464)); -#5511=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,-0.0210367178401464)); -#5512=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,-0.00898671784014638)); -#5513=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,-0.00898671784014639)); -#5514=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,-0.00898671784014638)); -#5515=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,-0.00198671784014639)); -#5516=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,0.00501328215985362)); -#5517=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,0.00501328215985361)); -#5518=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,0.00501328215985361)); -#5519=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,-0.00198671784014639)); -#5520=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,0.0100632821598536)); -#5521=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,0.0100632821598536)); -#5522=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,0.0100632821598536)); -#5523=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,0.0170632821598536)); -#5524=CARTESIAN_POINT('',(0.00248631188041525,-0.018707480314961,0.0240632821598536)); -#5525=CARTESIAN_POINT('',(0.00948631188041524,-0.018707480314961,0.0240632821598536)); -#5526=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,0.0240632821598536)); -#5527=CARTESIAN_POINT('',(0.0164863118804153,-0.018707480314961,0.0170632821598536)); -#5528=CARTESIAN_POINT('',(0.,0.,0.)); -#5529=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#3349, -#3350,#3351,#3352,#3353),#5530); -#5530=( -GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#5536)) -GLOBAL_UNIT_ASSIGNED_CONTEXT((#5544,#5543,#5542)) -REPRESENTATION_CONTEXT('Assembly 1','TOP_LEVEL_ASSEMBLY_PART') -); -#5531=( -GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#5537)) -GLOBAL_UNIT_ASSIGNED_CONTEXT((#5544,#5543,#5542)) -REPRESENTATION_CONTEXT('Part 232','COMPONENT_PART') -); -#5532=( -GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#5538)) -GLOBAL_UNIT_ASSIGNED_CONTEXT((#5544,#5543,#5542)) -REPRESENTATION_CONTEXT('Part 234','COMPONENT_PART') -); -#5533=( -GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#5539)) -GLOBAL_UNIT_ASSIGNED_CONTEXT((#5544,#5543,#5542)) -REPRESENTATION_CONTEXT('Part 236','COMPONENT_PART') -); -#5534=( -GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#5540)) -GLOBAL_UNIT_ASSIGNED_CONTEXT((#5544,#5543,#5542)) -REPRESENTATION_CONTEXT('Part 233','COMPONENT_PART') -); -#5535=( -GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#5541)) -GLOBAL_UNIT_ASSIGNED_CONTEXT((#5544,#5543,#5542)) -REPRESENTATION_CONTEXT('Part 235','COMPONENT_PART') -); -#5536=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#5544, -'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); -#5537=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#5544, -'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); -#5538=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#5544, -'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); -#5539=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#5544, -'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); -#5540=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#5544, -'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); -#5541=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#5544, -'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); -#5542=( -NAMED_UNIT(*) -SI_UNIT($,.STERADIAN.) -SOLID_ANGLE_UNIT() -); -#5543=( -NAMED_UNIT(*) -PLANE_ANGLE_UNIT() -SI_UNIT($,.RADIAN.) -); -#5544=( -LENGTH_UNIT() -NAMED_UNIT(*) -SI_UNIT($,.METRE.) -); -#5545=PRODUCT_DEFINITION_SHAPE('','',#5556); -#5546=PRODUCT_DEFINITION_SHAPE('','',#5557); -#5547=PRODUCT_DEFINITION_SHAPE(' ','NAUO PRDDFN',#75); -#5548=PRODUCT_DEFINITION_SHAPE('','',#5558); -#5549=PRODUCT_DEFINITION_SHAPE(' ','NAUO PRDDFN',#76); -#5550=PRODUCT_DEFINITION_SHAPE('','',#5559); -#5551=PRODUCT_DEFINITION_SHAPE(' ','NAUO PRDDFN',#77); -#5552=PRODUCT_DEFINITION_SHAPE('','',#5560); -#5553=PRODUCT_DEFINITION_SHAPE(' ','NAUO PRDDFN',#78); -#5554=PRODUCT_DEFINITION_SHAPE('','',#5561); -#5555=PRODUCT_DEFINITION_SHAPE(' ','NAUO PRDDFN',#79); -#5556=PRODUCT_DEFINITION('','',#5568,#5562); -#5557=PRODUCT_DEFINITION('','',#5569,#5563); -#5558=PRODUCT_DEFINITION('','',#5570,#5564); -#5559=PRODUCT_DEFINITION('','',#5571,#5565); -#5560=PRODUCT_DEFINITION('','',#5572,#5566); -#5561=PRODUCT_DEFINITION('','',#5573,#5567); -#5562=PRODUCT_DEFINITION_CONTEXT('',#5599,'design'); -#5563=PRODUCT_DEFINITION_CONTEXT('',#5599,'design'); -#5564=PRODUCT_DEFINITION_CONTEXT('',#5599,'design'); -#5565=PRODUCT_DEFINITION_CONTEXT('',#5599,'design'); -#5566=PRODUCT_DEFINITION_CONTEXT('',#5599,'design'); -#5567=PRODUCT_DEFINITION_CONTEXT('',#5599,'design'); -#5568=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#5580, - .NOT_KNOWN.); -#5569=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#5581, - .NOT_KNOWN.); -#5570=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#5582, - .NOT_KNOWN.); -#5571=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#5583, - .NOT_KNOWN.); -#5572=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#5584, - .NOT_KNOWN.); -#5573=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#5585, - .NOT_KNOWN.); -#5574=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#5580)); -#5575=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#5581)); -#5576=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#5582)); -#5577=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#5583)); -#5578=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#5584)); -#5579=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#5585)); -#5580=PRODUCT('Assembly 1','Assembly 1','Assembly 1',(#5592)); -#5581=PRODUCT('Part 232','Part 232','Part 232',(#5593)); -#5582=PRODUCT('Part 234','Part 234','Part 234',(#5594)); -#5583=PRODUCT('Part 236','Part 236','Part 236',(#5595)); -#5584=PRODUCT('Part 233','Part 233','Part 233',(#5596)); -#5585=PRODUCT('Part 235','Part 235','Part 235',(#5597)); -#5586=PRODUCT_CATEGORY('',''); -#5587=PRODUCT_CATEGORY('',''); -#5588=PRODUCT_CATEGORY('',''); -#5589=PRODUCT_CATEGORY('',''); -#5590=PRODUCT_CATEGORY('',''); -#5591=PRODUCT_CATEGORY('',''); -#5592=PRODUCT_CONTEXT('',#5599,'mechanical'); -#5593=PRODUCT_CONTEXT('',#5599,'mechanical'); -#5594=PRODUCT_CONTEXT('',#5599,'mechanical'); -#5595=PRODUCT_CONTEXT('',#5599,'mechanical'); -#5596=PRODUCT_CONTEXT('',#5599,'mechanical'); -#5597=PRODUCT_CONTEXT('',#5599,'mechanical'); -#5598=APPLICATION_PROTOCOL_DEFINITION('international standard', -'ap242_managed_model_based_3d_engineering',2011,#5599); -#5599=APPLICATION_CONTEXT('managed model based 3d engineering'); -ENDSEC; -END-ISO-10303-21; diff --git a/hackpads/NumMarcroPad/3dModels/Body.step b/hackpads/NumMarcroPad/3dModels/Body.step new file mode 100644 index 000000000..6678d2d6f --- /dev/null +++ b/hackpads/NumMarcroPad/3dModels/Body.step @@ -0,0 +1,1319 @@ +ISO-10303-21; +HEADER; +/* Generated by software containing ST-Developer + * from STEP Tools, Inc. (www.steptools.com) + */ +/* OPTION: using custom renumber hook */ + +FILE_DESCRIPTION( +/* description */ ('STEP AP214'), +/* implementation_level */ '2;1'); + +FILE_NAME( +/* name */ '678848127568ee5283e2cd30', +/* time_stamp */ '2025-01-15T23:43:15Z', +/* author */ (''), +/* organization */ (''), +/* preprocessor_version */ 'ST-DEVELOPER v20', +/* originating_system */ 'ONSHAPE BY PTC INC, 1.192', +/* authorisation */ ' '); + +FILE_SCHEMA (('AUTOMOTIVE_DESIGN {1 0 10303 214 3 1 1}')); +ENDSEC; + +DATA; +#10=PROPERTY_DEFINITION_REPRESENTATION(#14,#12); +#11=PROPERTY_DEFINITION_REPRESENTATION(#15,#13); +#12=REPRESENTATION('',(#16),#1248); +#13=REPRESENTATION('',(#17),#1248); +#14=PROPERTY_DEFINITION('pmi validation property','',#1253); +#15=PROPERTY_DEFINITION('pmi validation property','',#1253); +#16=VALUE_REPRESENTATION_ITEM('number of annotations',COUNT_MEASURE(0.)); +#17=VALUE_REPRESENTATION_ITEM('number of views',COUNT_MEASURE(0.)); +#18=SHAPE_REPRESENTATION_RELATIONSHIP('','',#734,#19); +#19=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#732),#1248); +#20=TOROIDAL_SURFACE('',#797,0.00635,0.00508); +#21=TOROIDAL_SURFACE('',#800,0.00635,0.00508); +#22=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1069,#1070,#1071,#1072), + .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.00209568099045335),.UNSPECIFIED.); +#23=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1078,#1079,#1080,#1081), + .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.0020956809758958),.UNSPECIFIED.); +#24=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1170,#1171,#1172,#1173), + .UNSPECIFIED.,.F.,.F.,(4,4),(-1.42548237450156E-5,0.00250100998548361), + .UNSPECIFIED.); +#25=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1177,#1178,#1179,#1180), + .UNSPECIFIED.,.F.,.F.,(4,4),(-1.42548237449941E-5,0.00250100998548374), + .UNSPECIFIED.); +#26=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1212,#1213,#1214,#1215,#1216), + .UNSPECIFIED.,.F.,.F.,(4,1,4),(0.,0.00197676703890276,0.00395353407780551), + .UNSPECIFIED.); +#27=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1217,#1218,#1219,#1220,#1221), + .UNSPECIFIED.,.F.,.F.,(4,1,4),(0.,0.00197676705478352,0.00395353410956704), + .UNSPECIFIED.); +#28=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1225,#1226,#1227,#1228,#1229,#1230, +#1231),.UNSPECIFIED.,.F.,.F.,(4,1,1,1,4),(0.,0.000485260078227523,0.000970520156455046, +0.00145578023468257,0.00194104031291009),.UNSPECIFIED.); +#29=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1235,#1236,#1237,#1238,#1239,#1240, +#1241),.UNSPECIFIED.,.F.,.F.,(4,1,1,1,4),(0.,0.000488133844077013,0.000976267688154026, +0.00146440153223104,0.00195253537630805),.UNSPECIFIED.); +#30=CYLINDRICAL_SURFACE('',#742,0.00127); +#31=CYLINDRICAL_SURFACE('',#745,0.00127); +#32=CYLINDRICAL_SURFACE('',#748,0.00127); +#33=CYLINDRICAL_SURFACE('',#751,0.00127); +#34=CYLINDRICAL_SURFACE('',#783,0.00127); +#35=CYLINDRICAL_SURFACE('',#784,0.00127); +#36=CYLINDRICAL_SURFACE('',#785,0.00127); +#37=CYLINDRICAL_SURFACE('',#786,0.00127); +#38=CYLINDRICAL_SURFACE('',#795,0.00508); +#39=CYLINDRICAL_SURFACE('',#798,0.00508); +#40=CYLINDRICAL_SURFACE('',#801,0.000981136391748426); +#41=CYLINDRICAL_SURFACE('',#802,0.0011); +#42=CYLINDRICAL_SURFACE('',#803,0.0011); +#43=CYLINDRICAL_SURFACE('',#804,0.0011); +#44=CYLINDRICAL_SURFACE('',#805,0.0011); +#45=CIRCLE('',#740,0.00238442627101702); +#46=CIRCLE('',#741,0.00238442627101702); +#47=CIRCLE('',#743,0.00127); +#48=CIRCLE('',#744,0.00127); +#49=CIRCLE('',#746,0.00127); +#50=CIRCLE('',#747,0.00127); +#51=CIRCLE('',#749,0.00127); +#52=CIRCLE('',#750,0.00127); +#53=CIRCLE('',#752,0.00127); +#54=CIRCLE('',#753,0.00127); +#55=CIRCLE('',#760,0.00127); +#56=CIRCLE('',#761,0.00127); +#57=CIRCLE('',#763,0.0011); +#58=CIRCLE('',#764,0.0011); +#59=CIRCLE('',#765,0.0011); +#60=CIRCLE('',#766,0.0011); +#61=CIRCLE('',#767,0.00508); +#62=CIRCLE('',#768,0.00127); +#63=CIRCLE('',#769,0.00127); +#64=CIRCLE('',#770,0.00127); +#65=CIRCLE('',#771,0.00127); +#66=CIRCLE('',#772,0.00508); +#67=CIRCLE('',#774,0.0011); +#68=CIRCLE('',#775,0.0011); +#69=CIRCLE('',#776,0.0011); +#70=CIRCLE('',#777,0.0011); +#71=CIRCLE('',#778,0.00127); +#72=CIRCLE('',#779,0.00127); +#73=CIRCLE('',#780,0.00127); +#74=CIRCLE('',#781,0.00127); +#75=CIRCLE('',#788,0.00635); +#76=CIRCLE('',#793,0.00635); +#77=CIRCLE('',#796,0.00508); +#78=CIRCLE('',#799,0.00508); +#79=ORIENTED_EDGE('',*,*,#281,.T.); +#80=ORIENTED_EDGE('',*,*,#282,.T.); +#81=ORIENTED_EDGE('',*,*,#283,.T.); +#82=ORIENTED_EDGE('',*,*,#284,.F.); +#83=ORIENTED_EDGE('',*,*,#285,.F.); +#84=ORIENTED_EDGE('',*,*,#286,.T.); +#85=ORIENTED_EDGE('',*,*,#287,.T.); +#86=ORIENTED_EDGE('',*,*,#288,.T.); +#87=ORIENTED_EDGE('',*,*,#289,.F.); +#88=ORIENTED_EDGE('',*,*,#290,.T.); +#89=ORIENTED_EDGE('',*,*,#291,.T.); +#90=ORIENTED_EDGE('',*,*,#292,.T.); +#91=ORIENTED_EDGE('',*,*,#293,.T.); +#92=ORIENTED_EDGE('',*,*,#294,.T.); +#93=ORIENTED_EDGE('',*,*,#295,.T.); +#94=ORIENTED_EDGE('',*,*,#296,.F.); +#95=ORIENTED_EDGE('',*,*,#297,.T.); +#96=ORIENTED_EDGE('',*,*,#298,.T.); +#97=ORIENTED_EDGE('',*,*,#299,.F.); +#98=ORIENTED_EDGE('',*,*,#300,.T.); +#99=ORIENTED_EDGE('',*,*,#301,.T.); +#100=ORIENTED_EDGE('',*,*,#302,.T.); +#101=ORIENTED_EDGE('',*,*,#303,.F.); +#102=ORIENTED_EDGE('',*,*,#300,.F.); +#103=ORIENTED_EDGE('',*,*,#304,.F.); +#104=ORIENTED_EDGE('',*,*,#290,.F.); +#105=ORIENTED_EDGE('',*,*,#305,.F.); +#106=ORIENTED_EDGE('',*,*,#281,.F.); +#107=ORIENTED_EDGE('',*,*,#306,.F.); +#108=ORIENTED_EDGE('',*,*,#298,.F.); +#109=ORIENTED_EDGE('',*,*,#307,.F.); +#110=ORIENTED_EDGE('',*,*,#288,.F.); +#111=ORIENTED_EDGE('',*,*,#308,.F.); +#112=ORIENTED_EDGE('',*,*,#283,.F.); +#113=ORIENTED_EDGE('',*,*,#309,.F.); +#114=ORIENTED_EDGE('',*,*,#292,.F.); +#115=ORIENTED_EDGE('',*,*,#310,.F.); +#116=ORIENTED_EDGE('',*,*,#286,.F.); +#117=ORIENTED_EDGE('',*,*,#296,.T.); +#118=ORIENTED_EDGE('',*,*,#311,.T.); +#119=ORIENTED_EDGE('',*,*,#312,.T.); +#120=ORIENTED_EDGE('',*,*,#313,.F.); +#121=ORIENTED_EDGE('',*,*,#314,.T.); +#122=ORIENTED_EDGE('',*,*,#302,.F.); +#123=ORIENTED_EDGE('',*,*,#315,.T.); +#124=ORIENTED_EDGE('',*,*,#316,.T.); +#125=ORIENTED_EDGE('',*,*,#317,.F.); +#126=ORIENTED_EDGE('',*,*,#318,.T.); +#127=ORIENTED_EDGE('',*,*,#319,.F.); +#128=ORIENTED_EDGE('',*,*,#320,.T.); +#129=ORIENTED_EDGE('',*,*,#321,.T.); +#130=ORIENTED_EDGE('',*,*,#322,.T.); +#131=ORIENTED_EDGE('',*,*,#323,.F.); +#132=ORIENTED_EDGE('',*,*,#324,.T.); +#133=ORIENTED_EDGE('',*,*,#325,.T.); +#134=ORIENTED_EDGE('',*,*,#326,.T.); +#135=ORIENTED_EDGE('',*,*,#327,.F.); +#136=ORIENTED_EDGE('',*,*,#328,.T.); +#137=ORIENTED_EDGE('',*,*,#329,.T.); +#138=ORIENTED_EDGE('',*,*,#330,.T.); +#139=ORIENTED_EDGE('',*,*,#331,.F.); +#140=ORIENTED_EDGE('',*,*,#332,.T.); +#141=ORIENTED_EDGE('',*,*,#333,.T.); +#142=ORIENTED_EDGE('',*,*,#334,.F.); +#143=ORIENTED_EDGE('',*,*,#335,.T.); +#144=ORIENTED_EDGE('',*,*,#336,.F.); +#145=ORIENTED_EDGE('',*,*,#337,.T.); +#146=ORIENTED_EDGE('',*,*,#338,.T.); +#147=ORIENTED_EDGE('',*,*,#339,.T.); +#148=ORIENTED_EDGE('',*,*,#340,.T.); +#149=ORIENTED_EDGE('',*,*,#341,.F.); +#150=ORIENTED_EDGE('',*,*,#342,.T.); +#151=ORIENTED_EDGE('',*,*,#331,.T.); +#152=ORIENTED_EDGE('',*,*,#343,.T.); +#153=ORIENTED_EDGE('',*,*,#323,.T.); +#154=ORIENTED_EDGE('',*,*,#344,.T.); +#155=ORIENTED_EDGE('',*,*,#321,.F.); +#156=ORIENTED_EDGE('',*,*,#345,.T.); +#157=ORIENTED_EDGE('',*,*,#315,.F.); +#158=ORIENTED_EDGE('',*,*,#346,.T.); +#159=ORIENTED_EDGE('',*,*,#327,.T.); +#160=ORIENTED_EDGE('',*,*,#347,.T.); +#161=ORIENTED_EDGE('',*,*,#348,.F.); +#162=ORIENTED_EDGE('',*,*,#349,.T.); +#163=ORIENTED_EDGE('',*,*,#350,.T.); +#164=ORIENTED_EDGE('',*,*,#351,.F.); +#165=ORIENTED_EDGE('',*,*,#352,.F.); +#166=ORIENTED_EDGE('',*,*,#353,.F.); +#167=ORIENTED_EDGE('',*,*,#354,.F.); +#168=ORIENTED_EDGE('',*,*,#355,.F.); +#169=ORIENTED_EDGE('',*,*,#317,.T.); +#170=ORIENTED_EDGE('',*,*,#356,.T.); +#171=ORIENTED_EDGE('',*,*,#319,.T.); +#172=ORIENTED_EDGE('',*,*,#357,.T.); +#173=ORIENTED_EDGE('',*,*,#325,.F.); +#174=ORIENTED_EDGE('',*,*,#358,.T.); +#175=ORIENTED_EDGE('',*,*,#329,.F.); +#176=ORIENTED_EDGE('',*,*,#359,.T.); +#177=ORIENTED_EDGE('',*,*,#291,.F.); +#178=ORIENTED_EDGE('',*,*,#304,.T.); +#179=ORIENTED_EDGE('',*,*,#299,.T.); +#180=ORIENTED_EDGE('',*,*,#306,.T.); +#181=ORIENTED_EDGE('',*,*,#284,.T.); +#182=ORIENTED_EDGE('',*,*,#308,.T.); +#183=ORIENTED_EDGE('',*,*,#287,.F.); +#184=ORIENTED_EDGE('',*,*,#310,.T.); +#185=ORIENTED_EDGE('',*,*,#360,.T.); +#186=ORIENTED_EDGE('',*,*,#361,.T.); +#187=ORIENTED_EDGE('',*,*,#362,.T.); +#188=ORIENTED_EDGE('',*,*,#334,.T.); +#189=ORIENTED_EDGE('',*,*,#345,.F.); +#190=ORIENTED_EDGE('',*,*,#320,.F.); +#191=ORIENTED_EDGE('',*,*,#356,.F.); +#192=ORIENTED_EDGE('',*,*,#316,.F.); +#193=ORIENTED_EDGE('',*,*,#346,.F.); +#194=ORIENTED_EDGE('',*,*,#318,.F.); +#195=ORIENTED_EDGE('',*,*,#359,.F.); +#196=ORIENTED_EDGE('',*,*,#328,.F.); +#197=ORIENTED_EDGE('',*,*,#343,.F.); +#198=ORIENTED_EDGE('',*,*,#330,.F.); +#199=ORIENTED_EDGE('',*,*,#358,.F.); +#200=ORIENTED_EDGE('',*,*,#324,.F.); +#201=ORIENTED_EDGE('',*,*,#344,.F.); +#202=ORIENTED_EDGE('',*,*,#326,.F.); +#203=ORIENTED_EDGE('',*,*,#357,.F.); +#204=ORIENTED_EDGE('',*,*,#322,.F.); +#205=ORIENTED_EDGE('',*,*,#348,.T.); +#206=ORIENTED_EDGE('',*,*,#363,.T.); +#207=ORIENTED_EDGE('',*,*,#364,.T.); +#208=ORIENTED_EDGE('',*,*,#365,.F.); +#209=ORIENTED_EDGE('',*,*,#366,.T.); +#210=ORIENTED_EDGE('',*,*,#366,.F.); +#211=ORIENTED_EDGE('',*,*,#367,.T.); +#212=ORIENTED_EDGE('',*,*,#368,.T.); +#213=ORIENTED_EDGE('',*,*,#349,.F.); +#214=ORIENTED_EDGE('',*,*,#368,.F.); +#215=ORIENTED_EDGE('',*,*,#369,.T.); +#216=ORIENTED_EDGE('',*,*,#370,.T.); +#217=ORIENTED_EDGE('',*,*,#350,.F.); +#218=ORIENTED_EDGE('',*,*,#371,.F.); +#219=ORIENTED_EDGE('',*,*,#372,.T.); +#220=ORIENTED_EDGE('',*,*,#351,.T.); +#221=ORIENTED_EDGE('',*,*,#370,.F.); +#222=ORIENTED_EDGE('',*,*,#373,.F.); +#223=ORIENTED_EDGE('',*,*,#374,.T.); +#224=ORIENTED_EDGE('',*,*,#375,.T.); +#225=ORIENTED_EDGE('',*,*,#341,.T.); +#226=ORIENTED_EDGE('',*,*,#372,.F.); +#227=ORIENTED_EDGE('',*,*,#312,.F.); +#228=ORIENTED_EDGE('',*,*,#376,.T.); +#229=ORIENTED_EDGE('',*,*,#373,.T.); +#230=ORIENTED_EDGE('',*,*,#371,.T.); +#231=ORIENTED_EDGE('',*,*,#369,.F.); +#232=ORIENTED_EDGE('',*,*,#367,.F.); +#233=ORIENTED_EDGE('',*,*,#365,.T.); +#234=ORIENTED_EDGE('',*,*,#377,.T.); +#235=ORIENTED_EDGE('',*,*,#313,.T.); +#236=ORIENTED_EDGE('',*,*,#301,.F.); +#237=ORIENTED_EDGE('',*,*,#303,.T.); +#238=ORIENTED_EDGE('',*,*,#289,.T.); +#239=ORIENTED_EDGE('',*,*,#309,.T.); +#240=ORIENTED_EDGE('',*,*,#285,.T.); +#241=ORIENTED_EDGE('',*,*,#307,.T.); +#242=ORIENTED_EDGE('',*,*,#282,.F.); +#243=ORIENTED_EDGE('',*,*,#305,.T.); +#244=ORIENTED_EDGE('',*,*,#297,.F.); +#245=ORIENTED_EDGE('',*,*,#342,.F.); +#246=ORIENTED_EDGE('',*,*,#375,.F.); +#247=ORIENTED_EDGE('',*,*,#378,.F.); +#248=ORIENTED_EDGE('',*,*,#332,.F.); +#249=ORIENTED_EDGE('',*,*,#295,.F.); +#250=ORIENTED_EDGE('',*,*,#379,.T.); +#251=ORIENTED_EDGE('',*,*,#360,.F.); +#252=ORIENTED_EDGE('',*,*,#333,.F.); +#253=ORIENTED_EDGE('',*,*,#378,.T.); +#254=ORIENTED_EDGE('',*,*,#374,.F.); +#255=ORIENTED_EDGE('',*,*,#376,.F.); +#256=ORIENTED_EDGE('',*,*,#311,.F.); +#257=ORIENTED_EDGE('',*,*,#347,.F.); +#258=ORIENTED_EDGE('',*,*,#336,.T.); +#259=ORIENTED_EDGE('',*,*,#380,.F.); +#260=ORIENTED_EDGE('',*,*,#363,.F.); +#261=ORIENTED_EDGE('',*,*,#362,.F.); +#262=ORIENTED_EDGE('',*,*,#381,.T.); +#263=ORIENTED_EDGE('',*,*,#293,.F.); +#264=ORIENTED_EDGE('',*,*,#314,.F.); +#265=ORIENTED_EDGE('',*,*,#377,.F.); +#266=ORIENTED_EDGE('',*,*,#364,.F.); +#267=ORIENTED_EDGE('',*,*,#380,.T.); +#268=ORIENTED_EDGE('',*,*,#335,.F.); +#269=ORIENTED_EDGE('',*,*,#381,.F.); +#270=ORIENTED_EDGE('',*,*,#361,.F.); +#271=ORIENTED_EDGE('',*,*,#379,.F.); +#272=ORIENTED_EDGE('',*,*,#294,.F.); +#273=ORIENTED_EDGE('',*,*,#355,.T.); +#274=ORIENTED_EDGE('',*,*,#340,.F.); +#275=ORIENTED_EDGE('',*,*,#354,.T.); +#276=ORIENTED_EDGE('',*,*,#339,.F.); +#277=ORIENTED_EDGE('',*,*,#353,.T.); +#278=ORIENTED_EDGE('',*,*,#338,.F.); +#279=ORIENTED_EDGE('',*,*,#352,.T.); +#280=ORIENTED_EDGE('',*,*,#337,.F.); +#281=EDGE_CURVE('',#382,#383,#452,.F.); +#282=EDGE_CURVE('',#383,#384,#453,.T.); +#283=EDGE_CURVE('',#384,#385,#454,.T.); +#284=EDGE_CURVE('',#382,#385,#455,.T.); +#285=EDGE_CURVE('',#386,#387,#456,.T.); +#286=EDGE_CURVE('',#386,#388,#457,.T.); +#287=EDGE_CURVE('',#388,#389,#458,.T.); +#288=EDGE_CURVE('',#389,#387,#459,.F.); +#289=EDGE_CURVE('',#390,#391,#460,.T.); +#290=EDGE_CURVE('',#390,#392,#461,.T.); +#291=EDGE_CURVE('',#392,#393,#462,.T.); +#292=EDGE_CURVE('',#393,#391,#463,.F.); +#293=EDGE_CURVE('',#394,#395,#45,.T.); +#294=EDGE_CURVE('',#395,#396,#464,.T.); +#295=EDGE_CURVE('',#396,#397,#46,.T.); +#296=EDGE_CURVE('',#398,#397,#465,.T.); +#297=EDGE_CURVE('',#398,#399,#466,.T.); +#298=EDGE_CURVE('',#399,#400,#467,.T.); +#299=EDGE_CURVE('',#401,#400,#468,.T.); +#300=EDGE_CURVE('',#401,#402,#469,.F.); +#301=EDGE_CURVE('',#402,#403,#470,.T.); +#302=EDGE_CURVE('',#403,#394,#471,.T.); +#303=EDGE_CURVE('',#402,#390,#47,.T.); +#304=EDGE_CURVE('',#392,#401,#48,.F.); +#305=EDGE_CURVE('',#383,#399,#49,.T.); +#306=EDGE_CURVE('',#400,#382,#50,.F.); +#307=EDGE_CURVE('',#387,#384,#51,.T.); +#308=EDGE_CURVE('',#385,#389,#52,.F.); +#309=EDGE_CURVE('',#391,#386,#53,.T.); +#310=EDGE_CURVE('',#388,#393,#54,.F.); +#311=EDGE_CURVE('',#397,#404,#22,.T.); +#312=EDGE_CURVE('',#404,#398,#472,.T.); +#313=EDGE_CURVE('',#405,#403,#473,.T.); +#314=EDGE_CURVE('',#405,#394,#23,.F.); +#315=EDGE_CURVE('',#406,#407,#474,.T.); +#316=EDGE_CURVE('',#407,#408,#475,.T.); +#317=EDGE_CURVE('',#409,#408,#476,.T.); +#318=EDGE_CURVE('',#409,#406,#477,.F.); +#319=EDGE_CURVE('',#410,#411,#478,.T.); +#320=EDGE_CURVE('',#410,#412,#479,.F.); +#321=EDGE_CURVE('',#412,#413,#480,.T.); +#322=EDGE_CURVE('',#413,#411,#481,.T.); +#323=EDGE_CURVE('',#414,#415,#482,.T.); +#324=EDGE_CURVE('',#414,#416,#483,.T.); +#325=EDGE_CURVE('',#416,#417,#484,.T.); +#326=EDGE_CURVE('',#417,#415,#485,.F.); +#327=EDGE_CURVE('',#418,#419,#486,.T.); +#328=EDGE_CURVE('',#418,#420,#487,.T.); +#329=EDGE_CURVE('',#420,#421,#488,.T.); +#330=EDGE_CURVE('',#421,#422,#489,.F.); +#331=EDGE_CURVE('',#423,#422,#490,.T.); +#332=EDGE_CURVE('',#423,#424,#491,.T.); +#333=EDGE_CURVE('',#424,#425,#55,.T.); +#334=EDGE_CURVE('',#426,#425,#492,.T.); +#335=EDGE_CURVE('',#426,#427,#56,.T.); +#336=EDGE_CURVE('',#419,#427,#493,.T.); +#337=EDGE_CURVE('',#428,#428,#57,.T.); +#338=EDGE_CURVE('',#429,#429,#58,.T.); +#339=EDGE_CURVE('',#430,#430,#59,.T.); +#340=EDGE_CURVE('',#431,#431,#60,.T.); +#341=EDGE_CURVE('',#432,#433,#494,.T.); +#342=EDGE_CURVE('',#432,#423,#61,.F.); +#343=EDGE_CURVE('',#422,#414,#62,.F.); +#344=EDGE_CURVE('',#415,#413,#63,.F.); +#345=EDGE_CURVE('',#412,#407,#64,.F.); +#346=EDGE_CURVE('',#406,#418,#65,.F.); +#347=EDGE_CURVE('',#419,#434,#66,.F.); +#348=EDGE_CURVE('',#435,#434,#495,.T.); +#349=EDGE_CURVE('',#435,#436,#496,.T.); +#350=EDGE_CURVE('',#436,#437,#497,.T.); +#351=EDGE_CURVE('',#433,#437,#498,.T.); +#352=EDGE_CURVE('',#438,#438,#67,.T.); +#353=EDGE_CURVE('',#439,#439,#68,.T.); +#354=EDGE_CURVE('',#440,#440,#69,.T.); +#355=EDGE_CURVE('',#441,#441,#70,.T.); +#356=EDGE_CURVE('',#408,#410,#71,.T.); +#357=EDGE_CURVE('',#411,#417,#72,.T.); +#358=EDGE_CURVE('',#416,#421,#73,.T.); +#359=EDGE_CURVE('',#420,#409,#74,.T.); +#360=EDGE_CURVE('',#425,#442,#24,.T.); +#361=EDGE_CURVE('',#442,#443,#499,.F.); +#362=EDGE_CURVE('',#443,#426,#25,.F.); +#363=EDGE_CURVE('',#434,#444,#500,.F.); +#364=EDGE_CURVE('',#444,#445,#75,.T.); +#365=EDGE_CURVE('',#446,#445,#501,.T.); +#366=EDGE_CURVE('',#446,#435,#502,.T.); +#367=EDGE_CURVE('',#446,#447,#503,.T.); +#368=EDGE_CURVE('',#447,#436,#504,.T.); +#369=EDGE_CURVE('',#447,#448,#505,.T.); +#370=EDGE_CURVE('',#448,#437,#506,.T.); +#371=EDGE_CURVE('',#449,#448,#507,.T.); +#372=EDGE_CURVE('',#449,#433,#508,.T.); +#373=EDGE_CURVE('',#450,#449,#509,.T.); +#374=EDGE_CURVE('',#450,#451,#76,.T.); +#375=EDGE_CURVE('',#451,#432,#510,.T.); +#376=EDGE_CURVE('',#404,#450,#26,.T.); +#377=EDGE_CURVE('',#445,#405,#27,.F.); +#378=EDGE_CURVE('',#424,#451,#77,.T.); +#379=EDGE_CURVE('',#396,#442,#28,.T.); +#380=EDGE_CURVE('',#444,#427,#78,.T.); +#381=EDGE_CURVE('',#443,#395,#29,.T.); +#382=VERTEX_POINT('',#1010); +#383=VERTEX_POINT('',#1011); +#384=VERTEX_POINT('',#1013); +#385=VERTEX_POINT('',#1015); +#386=VERTEX_POINT('',#1019); +#387=VERTEX_POINT('',#1020); +#388=VERTEX_POINT('',#1022); +#389=VERTEX_POINT('',#1024); +#390=VERTEX_POINT('',#1028); +#391=VERTEX_POINT('',#1029); +#392=VERTEX_POINT('',#1031); +#393=VERTEX_POINT('',#1033); +#394=VERTEX_POINT('',#1037); +#395=VERTEX_POINT('',#1038); +#396=VERTEX_POINT('',#1040); +#397=VERTEX_POINT('',#1042); +#398=VERTEX_POINT('',#1044); +#399=VERTEX_POINT('',#1046); +#400=VERTEX_POINT('',#1048); +#401=VERTEX_POINT('',#1050); +#402=VERTEX_POINT('',#1052); +#403=VERTEX_POINT('',#1054); +#404=VERTEX_POINT('',#1073); +#405=VERTEX_POINT('',#1077); +#406=VERTEX_POINT('',#1084); +#407=VERTEX_POINT('',#1085); +#408=VERTEX_POINT('',#1087); +#409=VERTEX_POINT('',#1089); +#410=VERTEX_POINT('',#1093); +#411=VERTEX_POINT('',#1094); +#412=VERTEX_POINT('',#1096); +#413=VERTEX_POINT('',#1098); +#414=VERTEX_POINT('',#1102); +#415=VERTEX_POINT('',#1103); +#416=VERTEX_POINT('',#1105); +#417=VERTEX_POINT('',#1107); +#418=VERTEX_POINT('',#1111); +#419=VERTEX_POINT('',#1112); +#420=VERTEX_POINT('',#1114); +#421=VERTEX_POINT('',#1116); +#422=VERTEX_POINT('',#1118); +#423=VERTEX_POINT('',#1120); +#424=VERTEX_POINT('',#1122); +#425=VERTEX_POINT('',#1124); +#426=VERTEX_POINT('',#1126); +#427=VERTEX_POINT('',#1128); +#428=VERTEX_POINT('',#1132); +#429=VERTEX_POINT('',#1134); +#430=VERTEX_POINT('',#1136); +#431=VERTEX_POINT('',#1138); +#432=VERTEX_POINT('',#1140); +#433=VERTEX_POINT('',#1141); +#434=VERTEX_POINT('',#1148); +#435=VERTEX_POINT('',#1150); +#436=VERTEX_POINT('',#1152); +#437=VERTEX_POINT('',#1154); +#438=VERTEX_POINT('',#1158); +#439=VERTEX_POINT('',#1160); +#440=VERTEX_POINT('',#1162); +#441=VERTEX_POINT('',#1164); +#442=VERTEX_POINT('',#1174); +#443=VERTEX_POINT('',#1176); +#444=VERTEX_POINT('',#1187); +#445=VERTEX_POINT('',#1189); +#446=VERTEX_POINT('',#1191); +#447=VERTEX_POINT('',#1195); +#448=VERTEX_POINT('',#1199); +#449=VERTEX_POINT('',#1203); +#450=VERTEX_POINT('',#1207); +#451=VERTEX_POINT('',#1209); +#452=LINE('',#1009,#511); +#453=LINE('',#1012,#512); +#454=LINE('',#1014,#513); +#455=LINE('',#1016,#514); +#456=LINE('',#1018,#515); +#457=LINE('',#1021,#516); +#458=LINE('',#1023,#517); +#459=LINE('',#1025,#518); +#460=LINE('',#1027,#519); +#461=LINE('',#1030,#520); +#462=LINE('',#1032,#521); +#463=LINE('',#1034,#522); +#464=LINE('',#1039,#523); +#465=LINE('',#1043,#524); +#466=LINE('',#1045,#525); +#467=LINE('',#1047,#526); +#468=LINE('',#1049,#527); +#469=LINE('',#1051,#528); +#470=LINE('',#1053,#529); +#471=LINE('',#1055,#530); +#472=LINE('',#1074,#531); +#473=LINE('',#1076,#532); +#474=LINE('',#1083,#533); +#475=LINE('',#1086,#534); +#476=LINE('',#1088,#535); +#477=LINE('',#1090,#536); +#478=LINE('',#1092,#537); +#479=LINE('',#1095,#538); +#480=LINE('',#1097,#539); +#481=LINE('',#1099,#540); +#482=LINE('',#1101,#541); +#483=LINE('',#1104,#542); +#484=LINE('',#1106,#543); +#485=LINE('',#1108,#544); +#486=LINE('',#1110,#545); +#487=LINE('',#1113,#546); +#488=LINE('',#1115,#547); +#489=LINE('',#1117,#548); +#490=LINE('',#1119,#549); +#491=LINE('',#1121,#550); +#492=LINE('',#1125,#551); +#493=LINE('',#1129,#552); +#494=LINE('',#1139,#553); +#495=LINE('',#1149,#554); +#496=LINE('',#1151,#555); +#497=LINE('',#1153,#556); +#498=LINE('',#1155,#557); +#499=LINE('',#1175,#558); +#500=LINE('',#1186,#559); +#501=LINE('',#1190,#560); +#502=LINE('',#1192,#561); +#503=LINE('',#1194,#562); +#504=LINE('',#1196,#563); +#505=LINE('',#1198,#564); +#506=LINE('',#1200,#565); +#507=LINE('',#1202,#566); +#508=LINE('',#1204,#567); +#509=LINE('',#1206,#568); +#510=LINE('',#1210,#569); +#511=VECTOR('',#810,1.); +#512=VECTOR('',#811,1.); +#513=VECTOR('',#812,1.); +#514=VECTOR('',#813,1.); +#515=VECTOR('',#816,1.); +#516=VECTOR('',#817,1.); +#517=VECTOR('',#818,1.); +#518=VECTOR('',#819,1.); +#519=VECTOR('',#822,1.); +#520=VECTOR('',#823,1.); +#521=VECTOR('',#824,1.); +#522=VECTOR('',#825,1.); +#523=VECTOR('',#830,1.); +#524=VECTOR('',#833,1.); +#525=VECTOR('',#834,1.); +#526=VECTOR('',#835,1.); +#527=VECTOR('',#836,1.); +#528=VECTOR('',#837,1.); +#529=VECTOR('',#838,1.); +#530=VECTOR('',#839,1.); +#531=VECTOR('',#866,1.); +#532=VECTOR('',#869,1.); +#533=VECTOR('',#872,1.); +#534=VECTOR('',#873,1.); +#535=VECTOR('',#874,1.); +#536=VECTOR('',#875,1.); +#537=VECTOR('',#878,1.); +#538=VECTOR('',#879,1.); +#539=VECTOR('',#880,1.); +#540=VECTOR('',#881,1.); +#541=VECTOR('',#884,1.); +#542=VECTOR('',#885,1.); +#543=VECTOR('',#886,1.); +#544=VECTOR('',#887,1.); +#545=VECTOR('',#890,1.); +#546=VECTOR('',#891,1.); +#547=VECTOR('',#892,1.); +#548=VECTOR('',#893,1.); +#549=VECTOR('',#894,1.); +#550=VECTOR('',#895,1.); +#551=VECTOR('',#898,1.); +#552=VECTOR('',#901,1.); +#553=VECTOR('',#912,1.); +#554=VECTOR('',#925,1.); +#555=VECTOR('',#926,1.); +#556=VECTOR('',#927,1.); +#557=VECTOR('',#928,1.); +#558=VECTOR('',#949,1.); +#559=VECTOR('',#960,1.); +#560=VECTOR('',#963,1.); +#561=VECTOR('',#964,1.); +#562=VECTOR('',#967,1.); +#563=VECTOR('',#968,1.); +#564=VECTOR('',#971,1.); +#565=VECTOR('',#972,1.); +#566=VECTOR('',#975,1.); +#567=VECTOR('',#976,1.); +#568=VECTOR('',#979,1.); +#569=VECTOR('',#982,1.); +#570=EDGE_LOOP('',(#79,#80,#81,#82)); +#571=EDGE_LOOP('',(#83,#84,#85,#86)); +#572=EDGE_LOOP('',(#87,#88,#89,#90)); +#573=EDGE_LOOP('',(#91,#92,#93,#94,#95,#96,#97,#98,#99,#100)); +#574=EDGE_LOOP('',(#101,#102,#103,#104)); +#575=EDGE_LOOP('',(#105,#106,#107,#108)); +#576=EDGE_LOOP('',(#109,#110,#111,#112)); +#577=EDGE_LOOP('',(#113,#114,#115,#116)); +#578=EDGE_LOOP('',(#117,#118,#119)); +#579=EDGE_LOOP('',(#120,#121,#122)); +#580=EDGE_LOOP('',(#123,#124,#125,#126)); +#581=EDGE_LOOP('',(#127,#128,#129,#130)); +#582=EDGE_LOOP('',(#131,#132,#133,#134)); +#583=EDGE_LOOP('',(#135,#136,#137,#138,#139,#140,#141,#142,#143,#144)); +#584=EDGE_LOOP('',(#145)); +#585=EDGE_LOOP('',(#146)); +#586=EDGE_LOOP('',(#147)); +#587=EDGE_LOOP('',(#148)); +#588=EDGE_LOOP('',(#149,#150,#151,#152,#153,#154,#155,#156,#157,#158,#159, +#160,#161,#162,#163,#164)); +#589=EDGE_LOOP('',(#165)); +#590=EDGE_LOOP('',(#166)); +#591=EDGE_LOOP('',(#167)); +#592=EDGE_LOOP('',(#168)); +#593=EDGE_LOOP('',(#169,#170,#171,#172,#173,#174,#175,#176)); +#594=EDGE_LOOP('',(#177,#178,#179,#180,#181,#182,#183,#184)); +#595=EDGE_LOOP('',(#185,#186,#187,#188)); +#596=EDGE_LOOP('',(#189,#190,#191,#192)); +#597=EDGE_LOOP('',(#193,#194,#195,#196)); +#598=EDGE_LOOP('',(#197,#198,#199,#200)); +#599=EDGE_LOOP('',(#201,#202,#203,#204)); +#600=EDGE_LOOP('',(#205,#206,#207,#208,#209)); +#601=EDGE_LOOP('',(#210,#211,#212,#213)); +#602=EDGE_LOOP('',(#214,#215,#216,#217)); +#603=EDGE_LOOP('',(#218,#219,#220,#221)); +#604=EDGE_LOOP('',(#222,#223,#224,#225,#226)); +#605=EDGE_LOOP('',(#227,#228,#229,#230,#231,#232,#233,#234,#235,#236,#237, +#238,#239,#240,#241,#242,#243,#244)); +#606=EDGE_LOOP('',(#245,#246,#247,#248)); +#607=EDGE_LOOP('',(#249,#250,#251,#252,#253,#254,#255,#256)); +#608=EDGE_LOOP('',(#257,#258,#259,#260)); +#609=EDGE_LOOP('',(#261,#262,#263,#264,#265,#266,#267,#268)); +#610=EDGE_LOOP('',(#269,#270,#271,#272)); +#611=EDGE_LOOP('',(#273)); +#612=EDGE_LOOP('',(#274)); +#613=EDGE_LOOP('',(#275)); +#614=EDGE_LOOP('',(#276)); +#615=EDGE_LOOP('',(#277)); +#616=EDGE_LOOP('',(#278)); +#617=EDGE_LOOP('',(#279)); +#618=EDGE_LOOP('',(#280)); +#619=FACE_BOUND('',#570,.T.); +#620=FACE_BOUND('',#571,.T.); +#621=FACE_BOUND('',#572,.T.); +#622=FACE_BOUND('',#573,.T.); +#623=FACE_BOUND('',#574,.T.); +#624=FACE_BOUND('',#575,.T.); +#625=FACE_BOUND('',#576,.T.); +#626=FACE_BOUND('',#577,.T.); +#627=FACE_BOUND('',#578,.T.); +#628=FACE_BOUND('',#579,.T.); +#629=FACE_BOUND('',#580,.T.); +#630=FACE_BOUND('',#581,.T.); +#631=FACE_BOUND('',#582,.T.); +#632=FACE_BOUND('',#583,.T.); +#633=FACE_BOUND('',#584,.T.); +#634=FACE_BOUND('',#585,.T.); +#635=FACE_BOUND('',#586,.T.); +#636=FACE_BOUND('',#587,.T.); +#637=FACE_BOUND('',#588,.T.); +#638=FACE_BOUND('',#589,.T.); +#639=FACE_BOUND('',#590,.T.); +#640=FACE_BOUND('',#591,.T.); +#641=FACE_BOUND('',#592,.T.); +#642=FACE_BOUND('',#593,.T.); +#643=FACE_BOUND('',#594,.T.); +#644=FACE_BOUND('',#595,.T.); +#645=FACE_BOUND('',#596,.T.); +#646=FACE_BOUND('',#597,.T.); +#647=FACE_BOUND('',#598,.T.); +#648=FACE_BOUND('',#599,.T.); +#649=FACE_BOUND('',#600,.T.); +#650=FACE_BOUND('',#601,.T.); +#651=FACE_BOUND('',#602,.T.); +#652=FACE_BOUND('',#603,.T.); +#653=FACE_BOUND('',#604,.T.); +#654=FACE_BOUND('',#605,.T.); +#655=FACE_BOUND('',#606,.T.); +#656=FACE_BOUND('',#607,.T.); +#657=FACE_BOUND('',#608,.T.); +#658=FACE_BOUND('',#609,.T.); +#659=FACE_BOUND('',#610,.T.); +#660=FACE_BOUND('',#611,.T.); +#661=FACE_BOUND('',#612,.T.); +#662=FACE_BOUND('',#613,.T.); +#663=FACE_BOUND('',#614,.T.); +#664=FACE_BOUND('',#615,.T.); +#665=FACE_BOUND('',#616,.T.); +#666=FACE_BOUND('',#617,.T.); +#667=FACE_BOUND('',#618,.T.); +#668=PLANE('',#736); +#669=PLANE('',#737); +#670=PLANE('',#738); +#671=PLANE('',#739); +#672=PLANE('',#754); +#673=PLANE('',#755); +#674=PLANE('',#756); +#675=PLANE('',#757); +#676=PLANE('',#758); +#677=PLANE('',#759); +#678=PLANE('',#762); +#679=PLANE('',#773); +#680=PLANE('',#782); +#681=PLANE('',#787); +#682=PLANE('',#789); +#683=PLANE('',#790); +#684=PLANE('',#791); +#685=PLANE('',#792); +#686=PLANE('',#794); +#687=ADVANCED_FACE('',(#619),#668,.T.); +#688=ADVANCED_FACE('',(#620),#669,.F.); +#689=ADVANCED_FACE('',(#621),#670,.F.); +#690=ADVANCED_FACE('',(#622),#671,.T.); +#691=ADVANCED_FACE('',(#623),#30,.F.); +#692=ADVANCED_FACE('',(#624),#31,.F.); +#693=ADVANCED_FACE('',(#625),#32,.F.); +#694=ADVANCED_FACE('',(#626),#33,.F.); +#695=ADVANCED_FACE('',(#627),#672,.F.); +#696=ADVANCED_FACE('',(#628),#673,.T.); +#697=ADVANCED_FACE('',(#629),#674,.T.); +#698=ADVANCED_FACE('',(#630),#675,.T.); +#699=ADVANCED_FACE('',(#631),#676,.F.); +#700=ADVANCED_FACE('',(#632),#677,.F.); +#701=ADVANCED_FACE('',(#633,#634,#635,#636,#637),#678,.F.); +#702=ADVANCED_FACE('',(#638,#639,#640,#641,#642,#643),#679,.T.); +#703=ADVANCED_FACE('',(#644),#680,.F.); +#704=ADVANCED_FACE('',(#645),#34,.T.); +#705=ADVANCED_FACE('',(#646),#35,.T.); +#706=ADVANCED_FACE('',(#647),#36,.T.); +#707=ADVANCED_FACE('',(#648),#37,.T.); +#708=ADVANCED_FACE('',(#649),#681,.F.); +#709=ADVANCED_FACE('',(#650),#682,.T.); +#710=ADVANCED_FACE('',(#651),#683,.T.); +#711=ADVANCED_FACE('',(#652),#684,.F.); +#712=ADVANCED_FACE('',(#653),#685,.F.); +#713=ADVANCED_FACE('',(#654),#686,.T.); +#714=ADVANCED_FACE('',(#655),#38,.T.); +#715=ADVANCED_FACE('',(#656),#20,.T.); +#716=ADVANCED_FACE('',(#657),#39,.T.); +#717=ADVANCED_FACE('',(#658),#21,.T.); +#718=ADVANCED_FACE('',(#659),#40,.T.); +#719=ADVANCED_FACE('',(#660,#661),#41,.F.); +#720=ADVANCED_FACE('',(#662,#663),#42,.F.); +#721=ADVANCED_FACE('',(#664,#665),#43,.F.); +#722=ADVANCED_FACE('',(#666,#667),#44,.F.); +#723=CLOSED_SHELL('',(#687,#688,#689,#690,#691,#692,#693,#694,#695,#696, +#697,#698,#699,#700,#701,#702,#703,#704,#705,#706,#707,#708,#709,#710,#711, +#712,#713,#714,#715,#716,#717,#718,#719,#720,#721,#722)); +#724=STYLED_ITEM('',(#725),#732); +#725=PRESENTATION_STYLE_ASSIGNMENT((#726)); +#726=SURFACE_STYLE_USAGE(.BOTH.,#727); +#727=SURFACE_SIDE_STYLE('',(#728)); +#728=SURFACE_STYLE_FILL_AREA(#729); +#729=FILL_AREA_STYLE('',(#730)); +#730=FILL_AREA_STYLE_COLOUR('',#731); +#731=COLOUR_RGB('',0.262745098039216,0.282352941176471,0.301960784313725); +#732=MANIFOLD_SOLID_BREP('Part 14',#723); +#733=SHAPE_DEFINITION_REPRESENTATION(#1253,#734); +#734=SHAPE_REPRESENTATION('Part 14',(#735),#1248); +#735=AXIS2_PLACEMENT_3D('',#1007,#806,#807); +#736=AXIS2_PLACEMENT_3D('',#1008,#808,#809); +#737=AXIS2_PLACEMENT_3D('',#1017,#814,#815); +#738=AXIS2_PLACEMENT_3D('',#1026,#820,#821); +#739=AXIS2_PLACEMENT_3D('',#1035,#826,#827); +#740=AXIS2_PLACEMENT_3D('',#1036,#828,#829); +#741=AXIS2_PLACEMENT_3D('',#1041,#831,#832); +#742=AXIS2_PLACEMENT_3D('',#1056,#840,#841); +#743=AXIS2_PLACEMENT_3D('',#1057,#842,#843); +#744=AXIS2_PLACEMENT_3D('',#1058,#844,#845); +#745=AXIS2_PLACEMENT_3D('',#1059,#846,#847); +#746=AXIS2_PLACEMENT_3D('',#1060,#848,#849); +#747=AXIS2_PLACEMENT_3D('',#1061,#850,#851); +#748=AXIS2_PLACEMENT_3D('',#1062,#852,#853); +#749=AXIS2_PLACEMENT_3D('',#1063,#854,#855); +#750=AXIS2_PLACEMENT_3D('',#1064,#856,#857); +#751=AXIS2_PLACEMENT_3D('',#1065,#858,#859); +#752=AXIS2_PLACEMENT_3D('',#1066,#860,#861); +#753=AXIS2_PLACEMENT_3D('',#1067,#862,#863); +#754=AXIS2_PLACEMENT_3D('',#1068,#864,#865); +#755=AXIS2_PLACEMENT_3D('',#1075,#867,#868); +#756=AXIS2_PLACEMENT_3D('',#1082,#870,#871); +#757=AXIS2_PLACEMENT_3D('',#1091,#876,#877); +#758=AXIS2_PLACEMENT_3D('',#1100,#882,#883); +#759=AXIS2_PLACEMENT_3D('',#1109,#888,#889); +#760=AXIS2_PLACEMENT_3D('',#1123,#896,#897); +#761=AXIS2_PLACEMENT_3D('',#1127,#899,#900); +#762=AXIS2_PLACEMENT_3D('',#1130,#902,#903); +#763=AXIS2_PLACEMENT_3D('',#1131,#904,#905); +#764=AXIS2_PLACEMENT_3D('',#1133,#906,#907); +#765=AXIS2_PLACEMENT_3D('',#1135,#908,#909); +#766=AXIS2_PLACEMENT_3D('',#1137,#910,#911); +#767=AXIS2_PLACEMENT_3D('',#1142,#913,#914); +#768=AXIS2_PLACEMENT_3D('',#1143,#915,#916); +#769=AXIS2_PLACEMENT_3D('',#1144,#917,#918); +#770=AXIS2_PLACEMENT_3D('',#1145,#919,#920); +#771=AXIS2_PLACEMENT_3D('',#1146,#921,#922); +#772=AXIS2_PLACEMENT_3D('',#1147,#923,#924); +#773=AXIS2_PLACEMENT_3D('',#1156,#929,#930); +#774=AXIS2_PLACEMENT_3D('',#1157,#931,#932); +#775=AXIS2_PLACEMENT_3D('',#1159,#933,#934); +#776=AXIS2_PLACEMENT_3D('',#1161,#935,#936); +#777=AXIS2_PLACEMENT_3D('',#1163,#937,#938); +#778=AXIS2_PLACEMENT_3D('',#1165,#939,#940); +#779=AXIS2_PLACEMENT_3D('',#1166,#941,#942); +#780=AXIS2_PLACEMENT_3D('',#1167,#943,#944); +#781=AXIS2_PLACEMENT_3D('',#1168,#945,#946); +#782=AXIS2_PLACEMENT_3D('',#1169,#947,#948); +#783=AXIS2_PLACEMENT_3D('',#1181,#950,#951); +#784=AXIS2_PLACEMENT_3D('',#1182,#952,#953); +#785=AXIS2_PLACEMENT_3D('',#1183,#954,#955); +#786=AXIS2_PLACEMENT_3D('',#1184,#956,#957); +#787=AXIS2_PLACEMENT_3D('',#1185,#958,#959); +#788=AXIS2_PLACEMENT_3D('',#1188,#961,#962); +#789=AXIS2_PLACEMENT_3D('',#1193,#965,#966); +#790=AXIS2_PLACEMENT_3D('',#1197,#969,#970); +#791=AXIS2_PLACEMENT_3D('',#1201,#973,#974); +#792=AXIS2_PLACEMENT_3D('',#1205,#977,#978); +#793=AXIS2_PLACEMENT_3D('',#1208,#980,#981); +#794=AXIS2_PLACEMENT_3D('',#1211,#983,#984); +#795=AXIS2_PLACEMENT_3D('',#1222,#985,#986); +#796=AXIS2_PLACEMENT_3D('',#1223,#987,#988); +#797=AXIS2_PLACEMENT_3D('',#1224,#989,#990); +#798=AXIS2_PLACEMENT_3D('',#1232,#991,#992); +#799=AXIS2_PLACEMENT_3D('',#1233,#993,#994); +#800=AXIS2_PLACEMENT_3D('',#1234,#995,#996); +#801=AXIS2_PLACEMENT_3D('',#1242,#997,#998); +#802=AXIS2_PLACEMENT_3D('',#1243,#999,#1000); +#803=AXIS2_PLACEMENT_3D('',#1244,#1001,#1002); +#804=AXIS2_PLACEMENT_3D('',#1245,#1003,#1004); +#805=AXIS2_PLACEMENT_3D('',#1246,#1005,#1006); +#806=DIRECTION('',(0.,0.,1.)); +#807=DIRECTION('',(1.,0.,0.)); +#808=DIRECTION('',(-0.99999999903891,-4.3842670795917E-5,0.)); +#809=DIRECTION('',(4.3842670795917E-5,-0.99999999903891,0.)); +#810=DIRECTION('',(0.,0.,1.)); +#811=DIRECTION('',(4.3842670795917E-5,-0.99999999903891,0.)); +#812=DIRECTION('',(0.,0.,1.)); +#813=DIRECTION('',(4.3842670795917E-5,-0.99999999903891,0.)); +#814=DIRECTION('',(0.,-1.,0.)); +#815=DIRECTION('',(0.,0.,-1.)); +#816=DIRECTION('',(1.,0.,0.)); +#817=DIRECTION('',(0.,0.,1.)); +#818=DIRECTION('',(1.,0.,0.)); +#819=DIRECTION('',(0.,0.,1.)); +#820=DIRECTION('',(-0.99999999903891,-4.38426707959227E-5,0.)); +#821=DIRECTION('',(4.38426707959227E-5,-0.99999999903891,0.)); +#822=DIRECTION('',(4.38426707959227E-5,-0.99999999903891,0.)); +#823=DIRECTION('',(0.,0.,1.)); +#824=DIRECTION('',(4.38426707959227E-5,-0.99999999903891,0.)); +#825=DIRECTION('',(0.,0.,1.)); +#826=DIRECTION('',(-3.50785590138154E-9,-1.,0.)); +#827=DIRECTION('',(1.,-3.50785590138154E-9,0.)); +#828=DIRECTION('',(3.50785590138154E-9,1.,0.)); +#829=DIRECTION('',(-1.,3.50785590138154E-9,0.)); +#830=DIRECTION('',(1.,-3.50785590138154E-9,0.)); +#831=DIRECTION('',(3.50785590138154E-9,1.,0.)); +#832=DIRECTION('',(-1.,3.50785590138154E-9,0.)); +#833=DIRECTION('',(0.,0.,-1.)); +#834=DIRECTION('',(1.,-3.5078558098691E-9,0.)); +#835=DIRECTION('',(0.,0.,1.)); +#836=DIRECTION('',(1.,-3.50785590138154E-9,0.)); +#837=DIRECTION('',(0.,0.,1.)); +#838=DIRECTION('',(1.,-3.50785590138154E-9,0.)); +#839=DIRECTION('',(0.,0.,-1.)); +#840=DIRECTION('',(0.,0.,1.)); +#841=DIRECTION('',(1.,0.,0.)); +#842=DIRECTION('',(0.,0.,1.)); +#843=DIRECTION('',(1.,0.,0.)); +#844=DIRECTION('',(0.,0.,1.)); +#845=DIRECTION('',(1.,0.,0.)); +#846=DIRECTION('',(0.,0.,-1.)); +#847=DIRECTION('',(-1.,0.,0.)); +#848=DIRECTION('',(0.,0.,1.)); +#849=DIRECTION('',(1.,0.,0.)); +#850=DIRECTION('',(0.,0.,1.)); +#851=DIRECTION('',(1.,0.,0.)); +#852=DIRECTION('',(0.,0.,1.)); +#853=DIRECTION('',(1.,0.,0.)); +#854=DIRECTION('',(0.,0.,1.)); +#855=DIRECTION('',(1.,0.,0.)); +#856=DIRECTION('',(0.,0.,1.)); +#857=DIRECTION('',(1.,0.,0.)); +#858=DIRECTION('',(0.,0.,-1.)); +#859=DIRECTION('',(-1.,0.,0.)); +#860=DIRECTION('',(0.,0.,1.)); +#861=DIRECTION('',(1.,0.,0.)); +#862=DIRECTION('',(0.,0.,1.)); +#863=DIRECTION('',(1.,0.,0.)); +#864=DIRECTION('',(1.,0.,0.)); +#865=DIRECTION('',(0.,0.,-1.)); +#866=DIRECTION('',(0.,1.,0.)); +#867=DIRECTION('',(1.,0.,0.)); +#868=DIRECTION('',(0.,0.,-1.)); +#869=DIRECTION('',(0.,1.,0.)); +#870=DIRECTION('',(-0.99999999903891,-4.38426707958848E-5,0.)); +#871=DIRECTION('',(4.38426707958848E-5,-0.99999999903891,0.)); +#872=DIRECTION('',(4.38426707958848E-5,-0.99999999903891,0.)); +#873=DIRECTION('',(0.,0.,1.)); +#874=DIRECTION('',(4.38426707958848E-5,-0.99999999903891,0.)); +#875=DIRECTION('',(0.,0.,1.)); +#876=DIRECTION('',(0.,-1.,0.)); +#877=DIRECTION('',(0.,0.,-1.)); +#878=DIRECTION('',(1.,0.,0.)); +#879=DIRECTION('',(0.,0.,1.)); +#880=DIRECTION('',(1.,0.,0.)); +#881=DIRECTION('',(0.,0.,1.)); +#882=DIRECTION('',(-0.99999999903891,-4.38426707959284E-5,0.)); +#883=DIRECTION('',(4.38426707959284E-5,-0.99999999903891,0.)); +#884=DIRECTION('',(4.38426707959284E-5,-0.99999999903891,0.)); +#885=DIRECTION('',(0.,0.,1.)); +#886=DIRECTION('',(4.38426707959284E-5,-0.99999999903891,0.)); +#887=DIRECTION('',(0.,0.,1.)); +#888=DIRECTION('',(-3.50785595859603E-9,-1.,0.)); +#889=DIRECTION('',(1.,-3.50785595859603E-9,0.)); +#890=DIRECTION('',(1.,-3.50785590307399E-9,0.)); +#891=DIRECTION('',(0.,0.,1.)); +#892=DIRECTION('',(1.,-3.50785595859603E-9,0.)); +#893=DIRECTION('',(0.,0.,1.)); +#894=DIRECTION('',(1.,-3.50785595859603E-9,0.)); +#895=DIRECTION('',(0.,0.,1.)); +#896=DIRECTION('',(-3.50785595859603E-9,-1.,0.)); +#897=DIRECTION('',(1.,-3.50785595859603E-9,0.)); +#898=DIRECTION('',(1.,-3.50785629764886E-9,0.)); +#899=DIRECTION('',(-3.50785595859603E-9,-1.,0.)); +#900=DIRECTION('',(1.,-3.50785595859603E-9,0.)); +#901=DIRECTION('',(0.,0.,1.)); +#902=DIRECTION('',(0.,0.,1.)); +#903=DIRECTION('',(1.,0.,0.)); +#904=DIRECTION('',(0.,0.,1.)); +#905=DIRECTION('',(1.,0.,0.)); +#906=DIRECTION('',(0.,0.,1.)); +#907=DIRECTION('',(1.,0.,0.)); +#908=DIRECTION('',(0.,0.,1.)); +#909=DIRECTION('',(1.,0.,0.)); +#910=DIRECTION('',(0.,0.,1.)); +#911=DIRECTION('',(1.,0.,0.)); +#912=DIRECTION('',(1.,-3.50785570641851E-9,0.)); +#913=DIRECTION('',(0.,0.,1.)); +#914=DIRECTION('',(1.,0.,0.)); +#915=DIRECTION('',(0.,0.,1.)); +#916=DIRECTION('',(1.,0.,0.)); +#917=DIRECTION('',(0.,0.,1.)); +#918=DIRECTION('',(1.,0.,0.)); +#919=DIRECTION('',(0.,0.,1.)); +#920=DIRECTION('',(1.,0.,0.)); +#921=DIRECTION('',(0.,0.,1.)); +#922=DIRECTION('',(1.,0.,0.)); +#923=DIRECTION('',(0.,0.,1.)); +#924=DIRECTION('',(1.,0.,0.)); +#925=DIRECTION('',(1.,-3.5078561177937E-9,0.)); +#926=DIRECTION('',(4.38426707959479E-5,-0.99999999903891,0.)); +#927=DIRECTION('',(1.,0.,0.)); +#928=DIRECTION('',(4.38426707959093E-5,-0.99999999903891,0.)); +#929=DIRECTION('',(0.,0.,1.)); +#930=DIRECTION('',(1.,0.,0.)); +#931=DIRECTION('',(0.,0.,1.)); +#932=DIRECTION('',(1.,0.,0.)); +#933=DIRECTION('',(0.,0.,1.)); +#934=DIRECTION('',(1.,0.,0.)); +#935=DIRECTION('',(0.,0.,1.)); +#936=DIRECTION('',(1.,0.,0.)); +#937=DIRECTION('',(0.,0.,1.)); +#938=DIRECTION('',(1.,0.,0.)); +#939=DIRECTION('',(0.,0.,1.)); +#940=DIRECTION('',(1.,0.,0.)); +#941=DIRECTION('',(0.,0.,1.)); +#942=DIRECTION('',(1.,0.,0.)); +#943=DIRECTION('',(0.,0.,1.)); +#944=DIRECTION('',(1.,0.,0.)); +#945=DIRECTION('',(0.,0.,1.)); +#946=DIRECTION('',(1.,0.,0.)); +#947=DIRECTION('',(0.,0.,1.)); +#948=DIRECTION('',(1.,0.,0.)); +#949=DIRECTION('',(1.,-3.50785590138154E-9,0.)); +#950=DIRECTION('',(0.,0.,1.)); +#951=DIRECTION('',(1.,0.,0.)); +#952=DIRECTION('',(0.,0.,-1.)); +#953=DIRECTION('',(-1.,0.,0.)); +#954=DIRECTION('',(0.,0.,1.)); +#955=DIRECTION('',(1.,0.,0.)); +#956=DIRECTION('',(0.,0.,-1.)); +#957=DIRECTION('',(-1.,0.,0.)); +#958=DIRECTION('',(3.5078561177937E-9,1.,0.)); +#959=DIRECTION('',(-1.,3.5078561177937E-9,0.)); +#960=DIRECTION('',(0.,0.,-1.)); +#961=DIRECTION('',(3.5078561177937E-9,1.,0.)); +#962=DIRECTION('',(-1.,3.5078561177937E-9,0.)); +#963=DIRECTION('',(1.,-3.5078561177937E-9,0.)); +#964=DIRECTION('',(0.,0.,-1.)); +#965=DIRECTION('',(0.99999999903891,4.38426707959479E-5,0.)); +#966=DIRECTION('',(-4.38426707959479E-5,0.99999999903891,0.)); +#967=DIRECTION('',(4.38426707959479E-5,-0.99999999903891,0.)); +#968=DIRECTION('',(0.,0.,-1.)); +#969=DIRECTION('',(0.,1.,0.)); +#970=DIRECTION('',(0.,0.,1.)); +#971=DIRECTION('',(1.,0.,0.)); +#972=DIRECTION('',(0.,0.,-1.)); +#973=DIRECTION('',(0.99999999903891,4.38426707959093E-5,0.)); +#974=DIRECTION('',(-4.38426707959093E-5,0.99999999903891,0.)); +#975=DIRECTION('',(4.38426707959093E-5,-0.99999999903891,0.)); +#976=DIRECTION('',(0.,0.,-1.)); +#977=DIRECTION('',(3.50785570641851E-9,1.,0.)); +#978=DIRECTION('',(-1.,3.50785570641851E-9,0.)); +#979=DIRECTION('',(1.,-3.50785570641851E-9,0.)); +#980=DIRECTION('',(3.50785570641851E-9,1.,0.)); +#981=DIRECTION('',(-1.,3.50785570641851E-9,0.)); +#982=DIRECTION('',(0.,0.,-1.)); +#983=DIRECTION('',(0.,0.,1.)); +#984=DIRECTION('',(0.99999999903891,4.3842670796052E-5,0.)); +#985=DIRECTION('',(0.,0.,-1.)); +#986=DIRECTION('',(-1.,0.,0.)); +#987=DIRECTION('',(0.,0.,1.)); +#988=DIRECTION('',(1.,0.,0.)); +#989=DIRECTION('',(3.50785570641851E-9,1.,0.)); +#990=DIRECTION('',(-1.,3.50785570641851E-9,0.)); +#991=DIRECTION('',(0.,0.,1.)); +#992=DIRECTION('',(1.,0.,0.)); +#993=DIRECTION('',(0.,0.,1.)); +#994=DIRECTION('',(1.,0.,0.)); +#995=DIRECTION('',(3.5078561177937E-9,1.,0.)); +#996=DIRECTION('',(-1.,3.5078561177937E-9,0.)); +#997=DIRECTION('',(-1.,3.50785590138154E-9,0.)); +#998=DIRECTION('',(-3.50785590138154E-9,-1.,0.)); +#999=DIRECTION('',(0.,0.,1.)); +#1000=DIRECTION('',(1.,0.,0.)); +#1001=DIRECTION('',(0.,0.,1.)); +#1002=DIRECTION('',(1.,0.,0.)); +#1003=DIRECTION('',(0.,0.,1.)); +#1004=DIRECTION('',(1.,0.,0.)); +#1005=DIRECTION('',(0.,0.,1.)); +#1006=DIRECTION('',(1.,0.,0.)); +#1007=CARTESIAN_POINT('',(0.,0.,0.)); +#1008=CARTESIAN_POINT('',(0.0417092907868521,-0.000264179715182302,-0.009525)); +#1009=CARTESIAN_POINT('',(0.041707184693697,0.0477733397798376,-0.009525)); +#1010=CARTESIAN_POINT('',(0.041707184693697,0.0477733397798376,0.004445)); +#1011=CARTESIAN_POINT('',(0.041707184693697,0.0477733397798376,-0.000127)); +#1012=CARTESIAN_POINT('',(0.0417092907868521,-0.000264179715182302,-0.000127)); +#1013=CARTESIAN_POINT('',(0.0417113968751246,-0.0483015878453636,-0.000127)); +#1014=CARTESIAN_POINT('',(0.0417113968751246,-0.0483015878453636,-0.009525)); +#1015=CARTESIAN_POINT('',(0.0417113968751246,-0.0483015878453637,0.004445)); +#1016=CARTESIAN_POINT('',(0.0417092907868521,-0.000264179715182302,0.004445)); +#1017=CARTESIAN_POINT('',(-2.10114823509105E-5,-0.0495716435255556,-0.009525)); +#1018=CARTESIAN_POINT('',(-2.10114823509105E-5,-0.0495716435255556,-0.000127)); +#1019=CARTESIAN_POINT('',(-0.040483531201431,-0.0495716435255556,-0.000127)); +#1020=CARTESIAN_POINT('',(0.0404413968763452,-0.0495716435255556,-0.000127)); +#1021=CARTESIAN_POINT('',(-0.040483531201431,-0.0495716435255556,0.004445)); +#1022=CARTESIAN_POINT('',(-0.040483531201431,-0.0495716435255556,0.004445)); +#1023=CARTESIAN_POINT('',(-2.10114823509105E-5,-0.0495716435255556,0.004445)); +#1024=CARTESIAN_POINT('',(0.0404413968763452,-0.0495716435255556,0.004445)); +#1025=CARTESIAN_POINT('',(0.0404413968763452,-0.0495716435255556,-0.009525)); +#1026=CARTESIAN_POINT('',(-0.0417556372933717,-0.000264179568790803,-0.009525)); +#1027=CARTESIAN_POINT('',(-0.0417556372933717,-0.000264179568790803,-0.000127)); +#1028=CARTESIAN_POINT('',(-0.0417577433816504,0.0477732287033268,-0.000127)); +#1029=CARTESIAN_POINT('',(-0.0417535312002104,-0.0483016992057475,-0.000127)); +#1030=CARTESIAN_POINT('',(-0.0417577433816504,0.0477732287033268,-0.009525)); +#1031=CARTESIAN_POINT('',(-0.0417577433816504,0.0477732287033268,0.004445)); +#1032=CARTESIAN_POINT('',(-0.0417556372933717,-0.000264179568790803,0.004445)); +#1033=CARTESIAN_POINT('',(-0.0417535312002104,-0.0483016992057475,0.004445)); +#1034=CARTESIAN_POINT('',(-0.0417535312002104,-0.0483016992057475,-0.009525)); +#1035=CARTESIAN_POINT('',(-0.0248603316058696,0.0490432843287,-0.009525)); +#1036=CARTESIAN_POINT('',(-0.00669286415859272,0.0490432842649712,-0.00381)); +#1037=CARTESIAN_POINT('',(-0.00796286414745528,0.0490432842694261,-0.00179193442371036)); +#1038=CARTESIAN_POINT('',(-0.00590681480412316,0.0490432842622138,-0.00155886360825157)); +#1039=CARTESIAN_POINT('',(0.0046240702721266,0.049043284225273,-0.00155886360825157)); +#1040=CARTESIAN_POINT('',(0.00585608648693772,0.0490432842209512,-0.00155886360825157)); +#1041=CARTESIAN_POINT('',(0.00664213584140728,0.0490432842181939,-0.00381)); +#1042=CARTESIAN_POINT('',(0.00791213585254472,0.0490432842694261,-0.0017919344377283)); +#1043=CARTESIAN_POINT('',(0.00791213585254472,0.0490432842694261,0.254322543073497)); +#1044=CARTESIAN_POINT('',(0.00791213585254472,0.0490432842137389,-0.000127)); +#1045=CARTESIAN_POINT('',(0.0248096324342456,0.0490432841544649,-0.000127)); +#1046=CARTESIAN_POINT('',(0.0404371846993725,0.0490432840996457,-0.000127)); +#1047=CARTESIAN_POINT('',(0.0404371846993725,0.0490432840996457,0.004445)); +#1048=CARTESIAN_POINT('',(0.0404371846993725,0.0490432840996457,0.004445)); +#1049=CARTESIAN_POINT('',(-0.0248603316058696,0.0490432843287,0.004445)); +#1050=CARTESIAN_POINT('',(-0.040487743378416,0.0490432843835187,0.004445)); +#1051=CARTESIAN_POINT('',(-0.040487743378416,0.0490432843835187,-0.009525)); +#1052=CARTESIAN_POINT('',(-0.040487743378416,0.0490432843835187,-0.000127)); +#1053=CARTESIAN_POINT('',(-0.0248603316058696,0.0490432843287,-0.000127)); +#1054=CARTESIAN_POINT('',(-0.00796286414745528,0.0490432842694261,-0.000127)); +#1055=CARTESIAN_POINT('',(-0.00796286414745528,0.0490432842694261,0.254322543073497)); +#1056=CARTESIAN_POINT('',(-0.040487743382871,0.0477732843835187,-0.009525)); +#1057=CARTESIAN_POINT('',(-0.040487743382871,0.0477732843835187,-0.000127)); +#1058=CARTESIAN_POINT('',(-0.040487743382871,0.0477732843835187,0.004445)); +#1059=CARTESIAN_POINT('',(0.0404371846949176,0.0477732840996457,-0.009525)); +#1060=CARTESIAN_POINT('',(0.0404371846949176,0.0477732840996457,-0.000127)); +#1061=CARTESIAN_POINT('',(0.0404371846949176,0.0477732840996457,0.004445)); +#1062=CARTESIAN_POINT('',(0.0404413968763452,-0.0483016435255556,-0.009525)); +#1063=CARTESIAN_POINT('',(0.0404413968763452,-0.0483016435255556,-0.000127)); +#1064=CARTESIAN_POINT('',(0.0404413968763452,-0.0483016435255556,0.004445)); +#1065=CARTESIAN_POINT('',(-0.040483531201431,-0.0483016435255556,-0.009525)); +#1066=CARTESIAN_POINT('',(-0.040483531201431,-0.0483016435255556,-0.000127)); +#1067=CARTESIAN_POINT('',(-0.040483531201431,-0.0483016435255556,0.004445)); +#1068=CARTESIAN_POINT('',(0.00791213585254472,0.0506307842415825,-0.009525)); +#1069=CARTESIAN_POINT('',(0.00791213585254472,0.0490432842137389,-0.00179193443772829)); +#1070=CARTESIAN_POINT('',(0.00791213585254472,0.0485285314853846,-0.0013049837497132)); +#1071=CARTESIAN_POINT('',(0.00791213585254472,0.0480978989856503,-0.00075477938260047)); +#1072=CARTESIAN_POINT('',(0.00791213585254472,0.0477704324697945,-0.000126999999999985)); +#1073=CARTESIAN_POINT('',(0.00791213585254472,0.0477704324697945,-0.000127)); +#1074=CARTESIAN_POINT('',(0.00791213585254472,0.0480907842415825,-0.000127)); +#1075=CARTESIAN_POINT('',(-0.00796286414745528,0.0506307842415825,-0.009525)); +#1076=CARTESIAN_POINT('',(-0.00796286414745528,0.0480907842694261,-0.000127)); +#1077=CARTESIAN_POINT('',(-0.00796286414745528,0.0477704325310946,-0.000127)); +#1078=CARTESIAN_POINT('',(-0.00796286414745528,0.0490432842694261,-0.00179193442371036)); +#1079=CARTESIAN_POINT('',(-0.00796286414745528,0.0485285315440967,-0.00130498373966663)); +#1080=CARTESIAN_POINT('',(-0.00796286414745528,0.0480978990463285,-0.000754779377166772)); +#1081=CARTESIAN_POINT('',(-0.00796286414745528,0.0477704325310946,-0.000126999999999979)); +#1082=CARTESIAN_POINT('',(-0.0449306372964233,-0.000264179563221844,-0.009525)); +#1083=CARTESIAN_POINT('',(-0.0449306372964233,-0.000264179563221844,-0.009525)); +#1084=CARTESIAN_POINT('',(-0.0449328825851823,0.0509482287144647,-0.009525)); +#1085=CARTESIAN_POINT('',(-0.0449283920027819,-0.0514766992057475,-0.009525)); +#1086=CARTESIAN_POINT('',(-0.0449283920027819,-0.0514766992057475,-0.009525)); +#1087=CARTESIAN_POINT('',(-0.0449283920027819,-0.0514766992057475,0.004445)); +#1088=CARTESIAN_POINT('',(-0.0449306372964233,-0.000264179563221844,0.004445)); +#1089=CARTESIAN_POINT('',(-0.0449328825851823,0.0509482287144647,0.004445)); +#1090=CARTESIAN_POINT('',(-0.0449328825851823,0.0509482287144647,-0.009525)); +#1091=CARTESIAN_POINT('',(-2.08722818710038E-5,-0.0527466435255556,-0.009525)); +#1092=CARTESIAN_POINT('',(-2.08722818710038E-5,-0.0527466435255556,0.004445)); +#1093=CARTESIAN_POINT('',(-0.0436583920040025,-0.0527466435255556,0.004445)); +#1094=CARTESIAN_POINT('',(0.0436165360798765,-0.0527466435255556,0.004445)); +#1095=CARTESIAN_POINT('',(-0.0436583920040025,-0.0527466435255556,-0.009525)); +#1096=CARTESIAN_POINT('',(-0.0436583920040025,-0.0527466435255556,-0.009525)); +#1097=CARTESIAN_POINT('',(-2.08722818710038E-5,-0.0527466435255556,-0.009525)); +#1098=CARTESIAN_POINT('',(0.0436165360798765,-0.0527466435255556,-0.009525)); +#1099=CARTESIAN_POINT('',(0.0436165360798765,-0.0527466435255556,0.004445)); +#1100=CARTESIAN_POINT('',(0.0448842907899038,-0.000264179720750761,-0.009525)); +#1101=CARTESIAN_POINT('',(0.0448842907899038,-0.000264179720750761,-0.009525)); +#1102=CARTESIAN_POINT('',(0.044882045496269,0.0509483397687007,-0.009525)); +#1103=CARTESIAN_POINT('',(0.0448865360786559,-0.0514765878453636,-0.009525)); +#1104=CARTESIAN_POINT('',(0.044882045496269,0.0509483397687007,-0.009525)); +#1105=CARTESIAN_POINT('',(0.044882045496269,0.0509483397687007,0.004445)); +#1106=CARTESIAN_POINT('',(0.0448842907899038,-0.000264179720750761,0.004445)); +#1107=CARTESIAN_POINT('',(0.0448865360786559,-0.0514765878453636,0.004445)); +#1108=CARTESIAN_POINT('',(0.0448865360786559,-0.0514765878453636,-0.009525)); +#1109=CARTESIAN_POINT('',(0.0263970628355315,0.0522182841488964,-0.009525)); +#1110=CARTESIAN_POINT('',(-0.0264479012076354,0.052218284334269,-0.009525)); +#1111=CARTESIAN_POINT('',(-0.0436628825819479,0.0522182843946566,-0.009525)); +#1112=CARTESIAN_POINT('',(-0.00796286414745528,0.0522182842694261,-0.009525)); +#1113=CARTESIAN_POINT('',(-0.0436628825819479,0.0522182843946566,0.004445)); +#1114=CARTESIAN_POINT('',(-0.0436628825819479,0.0522182843946566,0.004445)); +#1115=CARTESIAN_POINT('',(0.0263970628355315,0.0522182841488964,0.004445)); +#1116=CARTESIAN_POINT('',(0.0436120455019446,0.0522182840885088,0.004445)); +#1117=CARTESIAN_POINT('',(0.0436120455019446,0.0522182840885088,-0.009525)); +#1118=CARTESIAN_POINT('',(0.0436120455019446,0.0522182840885088,-0.009525)); +#1119=CARTESIAN_POINT('',(0.0263970628355315,0.0522182841488964,-0.009525)); +#1120=CARTESIAN_POINT('',(0.00791213585254472,0.0522182842137389,-0.009525)); +#1121=CARTESIAN_POINT('',(0.00791213585254472,0.0522182842137389,-0.009525)); +#1122=CARTESIAN_POINT('',(0.00791213585254472,0.0522182842137389,-0.00381)); +#1123=CARTESIAN_POINT('',(0.00664213585254472,0.0522182842181939,-0.00381)); +#1124=CARTESIAN_POINT('',(0.00664213585254472,0.0522182842181939,-0.00254)); +#1125=CARTESIAN_POINT('',(-2.53641474552806E-5,0.0522182842415825,-0.00254)); +#1126=CARTESIAN_POINT('',(-0.00669286414745528,0.0522182842649712,-0.00254)); +#1127=CARTESIAN_POINT('',(-0.00669286414745528,0.0522182842649711,-0.00381)); +#1128=CARTESIAN_POINT('',(-0.00796286414745528,0.0522182842694261,-0.00381)); +#1129=CARTESIAN_POINT('',(-0.00796286414745528,0.0522182842694261,-0.009525)); +#1130=CARTESIAN_POINT('',(-2.31732532632728E-5,-0.000264179563221861,-0.009525)); +#1131=CARTESIAN_POINT('',(-0.0429733582808737,0.0502587903166333,-0.009525)); +#1132=CARTESIAN_POINT('',(-0.0418733582808737,0.0502587903166333,-0.009525)); +#1133=CARTESIAN_POINT('',(-0.0429733582808737,-0.0507871494515261,-0.009525)); +#1134=CARTESIAN_POINT('',(-0.0418733582808737,-0.0507871494515261,-0.009525)); +#1135=CARTESIAN_POINT('',(0.0429270117759227,-0.0507871494515261,-0.009525)); +#1136=CARTESIAN_POINT('',(0.0440270117759227,-0.0507871494515261,-0.009525)); +#1137=CARTESIAN_POINT('',(0.0429270117759227,0.0502587903166333,-0.009525)); +#1138=CARTESIAN_POINT('',(0.0440270117759227,0.0502587903166333,-0.009525)); +#1139=CARTESIAN_POINT('',(0.0238571741934739,0.047138284157806,-0.009525)); +#1140=CARTESIAN_POINT('',(0.0129921358347248,0.047138284195919,-0.009525)); +#1141=CARTESIAN_POINT('',(0.0398022125344031,0.0471382841018731,-0.009525)); +#1142=CARTESIAN_POINT('',(0.0129921358525447,0.052218284195919,-0.009525)); +#1143=CARTESIAN_POINT('',(0.0436120454974896,0.0509482840885088,-0.009525)); +#1144=CARTESIAN_POINT('',(0.0436165360798765,-0.0514766435255556,-0.009525)); +#1145=CARTESIAN_POINT('',(-0.0436583920040025,-0.0514766435255556,-0.009525)); +#1146=CARTESIAN_POINT('',(-0.0436628825864029,0.0509482843946566,-0.009525)); +#1147=CARTESIAN_POINT('',(-0.0130428641474553,0.052218284287246,-0.009525)); +#1148=CARTESIAN_POINT('',(-0.0130428641652752,0.047138284287246,-0.009525)); +#1149=CARTESIAN_POINT('',(-0.02390778984481,0.0471382843253586,-0.009525)); +#1150=CARTESIAN_POINT('',(-0.0398527155421647,0.0471382843812912,-0.009525)); +#1151=CARTESIAN_POINT('',(-0.0398506372915406,-0.00026417957213221,-0.009525)); +#1152=CARTESIAN_POINT('',(-0.0398485590409167,-0.0476666435255556,-0.009525)); +#1153=CARTESIAN_POINT('',(-2.10950026388601E-5,-0.0476666435255556,-0.009525)); +#1154=CARTESIAN_POINT('',(0.0398063690356389,-0.0476666435255556,-0.009525)); +#1155=CARTESIAN_POINT('',(0.039804290785021,-0.000264179711841218,-0.009525)); +#1156=CARTESIAN_POINT('',(-2.31732532632728E-5,-0.000264179563221861,0.004445)); +#1157=CARTESIAN_POINT('',(-0.0429733582808737,0.0502587903166333,0.004445)); +#1158=CARTESIAN_POINT('',(-0.0418733582808737,0.0502587903166333,0.004445)); +#1159=CARTESIAN_POINT('',(-0.0429733582808737,-0.0507871494515261,0.004445)); +#1160=CARTESIAN_POINT('',(-0.0418733582808737,-0.0507871494515261,0.004445)); +#1161=CARTESIAN_POINT('',(0.0429270117759227,-0.0507871494515261,0.004445)); +#1162=CARTESIAN_POINT('',(0.0440270117759227,-0.0507871494515261,0.004445)); +#1163=CARTESIAN_POINT('',(0.0429270117759227,0.0502587903166333,0.004445)); +#1164=CARTESIAN_POINT('',(0.0440270117759227,0.0502587903166333,0.004445)); +#1165=CARTESIAN_POINT('',(-0.0436583920040025,-0.0514766435255556,0.004445)); +#1166=CARTESIAN_POINT('',(0.0436165360798765,-0.0514766435255556,0.004445)); +#1167=CARTESIAN_POINT('',(0.0436120454974896,0.0509482840885088,0.004445)); +#1168=CARTESIAN_POINT('',(-0.0436628825864029,0.0509482843946566,0.004445)); +#1169=CARTESIAN_POINT('',(-2.31732532632728E-5,-0.000264179563221861,-0.00254)); +#1170=CARTESIAN_POINT('',(0.00664213585254472,0.0522182842181939,-0.00254)); +#1171=CARTESIAN_POINT('',(0.00626718112930383,0.0514683777306741,-0.00254)); +#1172=CARTESIAN_POINT('',(0.0058891582392464,0.0507179080490519,-0.00254)); +#1173=CARTESIAN_POINT('',(0.00541191253664271,0.0500244206142578,-0.00254)); +#1174=CARTESIAN_POINT('',(0.00541191253664269,0.0500244206142578,-0.00254)); +#1175=CARTESIAN_POINT('',(-0.00467479858587036,0.0500244206496405,-0.00254)); +#1176=CARTESIAN_POINT('',(-0.00546264084694476,0.0500244206524041,-0.00254)); +#1177=CARTESIAN_POINT('',(-0.00669286414745528,0.0522182842649712,-0.00254)); +#1178=CARTESIAN_POINT('',(-0.00631790942947487,0.0514683777748211,-0.00254)); +#1179=CARTESIAN_POINT('',(-0.00593988654468314,0.0507179080905464,-0.00254)); +#1180=CARTESIAN_POINT('',(-0.00546264084694472,0.0500244206524041,-0.00254)); +#1181=CARTESIAN_POINT('',(-0.0436583920040025,-0.0514766435255556,-0.009525)); +#1182=CARTESIAN_POINT('',(-0.0436628825864029,0.0509482843946566,-0.009525)); +#1183=CARTESIAN_POINT('',(0.0436120454974896,0.0509482840885088,-0.009525)); +#1184=CARTESIAN_POINT('',(0.0436165360798765,-0.0514766435255556,-0.009525)); +#1185=CARTESIAN_POINT('',(-0.02390778984481,0.0471382843253586,0.254322543073497)); +#1186=CARTESIAN_POINT('',(-0.0130428641652752,0.047138284287246,-0.000127)); +#1187=CARTESIAN_POINT('',(-0.0130428641652752,0.047138284287246,-0.00381)); +#1188=CARTESIAN_POINT('',(-0.00669286416527519,0.0471382842649712,-0.00381)); +#1189=CARTESIAN_POINT('',(-0.0118656787762969,0.0471382842831166,-0.000127)); +#1190=CARTESIAN_POINT('',(-0.02390778984481,0.0471382843253586,-0.000127)); +#1191=CARTESIAN_POINT('',(-0.0398527155421647,0.0471382843812912,-0.000127)); +#1192=CARTESIAN_POINT('',(-0.0398527155421647,0.0471382843812912,0.254322543073497)); +#1193=CARTESIAN_POINT('',(-0.0398506372915406,-0.00026417957213221,0.254322543073497)); +#1194=CARTESIAN_POINT('',(-0.0398506372915406,-0.00026417957213221,-0.000127)); +#1195=CARTESIAN_POINT('',(-0.0398485590409167,-0.0476666435255556,-0.000127)); +#1196=CARTESIAN_POINT('',(-0.0398485590409167,-0.0476666435255556,0.254322543073497)); +#1197=CARTESIAN_POINT('',(-2.10950026388601E-5,-0.0476666435255556,0.254322543073497)); +#1198=CARTESIAN_POINT('',(-2.10950026388601E-5,-0.0476666435255556,-0.000127)); +#1199=CARTESIAN_POINT('',(0.0398063690356389,-0.0476666435255556,-0.000127)); +#1200=CARTESIAN_POINT('',(0.0398063690356389,-0.0476666435255556,0.254322543073497)); +#1201=CARTESIAN_POINT('',(0.039804290785021,-0.000264179711841218,0.254322543073497)); +#1202=CARTESIAN_POINT('',(0.039804290785021,-0.000264179711841218,-0.000127)); +#1203=CARTESIAN_POINT('',(0.0398022125344031,0.0471382841018731,-0.000127)); +#1204=CARTESIAN_POINT('',(0.0398022125344031,0.0471382841018731,0.254322543073497)); +#1205=CARTESIAN_POINT('',(0.0238571741934739,0.047138284157806,0.254322543073497)); +#1206=CARTESIAN_POINT('',(0.0238571741934739,0.047138284157806,-0.000127)); +#1207=CARTESIAN_POINT('',(0.0118149504457465,0.0471382842000484,-0.000127)); +#1208=CARTESIAN_POINT('',(0.00664213583472481,0.0471382842181939,-0.00381)); +#1209=CARTESIAN_POINT('',(0.0129921358347248,0.047138284195919,-0.00381)); +#1210=CARTESIAN_POINT('',(0.0129921358347248,0.047138284195919,0.254322543073497)); +#1211=CARTESIAN_POINT('',(-0.133377448957504,0.0972567058507861,-0.000127)); +#1212=CARTESIAN_POINT('',(0.00791213585254472,0.0477704324697945,-0.000127)); +#1213=CARTESIAN_POINT('',(0.00856086896527474,0.0476537440033623,-0.000127)); +#1214=CARTESIAN_POINT('',(0.00984194728038687,0.0473134065784887,-0.000127)); +#1215=CARTESIAN_POINT('',(0.0111483389551941,0.0471382842023868,-0.000127)); +#1216=CARTESIAN_POINT('',(0.0118149504457465,0.0471382842000484,-0.000127)); +#1217=CARTESIAN_POINT('',(-0.00796286414745528,0.0477704325310946,-0.000127)); +#1218=CARTESIAN_POINT('',(-0.00861159726647054,0.047653744070162,-0.000127)); +#1219=CARTESIAN_POINT('',(-0.00989267559384558,0.0473134066506749,-0.000127)); +#1220=CARTESIAN_POINT('',(-0.011199067280188,0.0471382842807783,-0.000127)); +#1221=CARTESIAN_POINT('',(-0.0118656787762969,0.0471382842831167,-0.000127)); +#1222=CARTESIAN_POINT('',(0.0129921358525447,0.052218284195919,0.254322543073497)); +#1223=CARTESIAN_POINT('',(0.0129921358525447,0.0522182842137389,-0.00381)); +#1224=CARTESIAN_POINT('',(0.00664213585254472,0.0522182842181939,-0.00381)); +#1225=CARTESIAN_POINT('',(0.00585608648693772,0.0490432842209512,-0.00155886360825157)); +#1226=CARTESIAN_POINT('',(0.00570143524204814,0.0490432842214937,-0.00161286456157407)); +#1227=CARTESIAN_POINT('',(0.00540629198437036,0.0490457977624717,-0.00175049136232175)); +#1228=CARTESIAN_POINT('',(0.00508395939046818,0.0491898595704019,-0.00215072801336175)); +#1229=CARTESIAN_POINT('',(0.00516125752878738,0.049599779432339,-0.0024887222204335)); +#1230=CARTESIAN_POINT('',(0.00531849452825172,0.0498886745726504,-0.00254000000000001)); +#1231=CARTESIAN_POINT('',(0.00541191253664267,0.0500244206142578,-0.00254)); +#1232=CARTESIAN_POINT('',(-0.0130428641474553,0.052218284287246,-0.009525)); +#1233=CARTESIAN_POINT('',(-0.0130428641474553,0.0522182842694261,-0.00381)); +#1234=CARTESIAN_POINT('',(-0.00669286414745528,0.0522182842649712,-0.00381)); +#1235=CARTESIAN_POINT('',(-0.00546264084694476,0.0500244206524041,-0.00254)); +#1236=CARTESIAN_POINT('',(-0.00536930714761547,0.0498887971185578,-0.00254)); +#1237=CARTESIAN_POINT('',(-0.00521219851939869,0.0495999312099488,-0.00248856484651119)); +#1238=CARTESIAN_POINT('',(-0.00513452897584588,0.0491910290454334,-0.00215217286524593)); +#1239=CARTESIAN_POINT('',(-0.00545537737992936,0.0490457781542388,-0.00175139654196293)); +#1240=CARTESIAN_POINT('',(-0.00575202280333412,0.0490432842616708,-0.00161291371056579)); +#1241=CARTESIAN_POINT('',(-0.00590681480412315,0.0490432842622138,-0.00155886360825157)); +#1242=CARTESIAN_POINT('',(-0.0248603316024279,0.0500244207204484,-0.00155886360825157)); +#1243=CARTESIAN_POINT('',(0.0429270117759227,0.0502587903166333,-0.0192405)); +#1244=CARTESIAN_POINT('',(0.0429270117759227,-0.0507871494515261,-0.0192405)); +#1245=CARTESIAN_POINT('',(-0.0429733582808737,-0.0507871494515261,-0.0192405)); +#1246=CARTESIAN_POINT('',(-0.0429733582808737,0.0502587903166333,-0.0192405)); +#1247=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#724), +#1248); +#1248=( +GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#1249)) +GLOBAL_UNIT_ASSIGNED_CONTEXT((#1252,#1251,#1250)) +REPRESENTATION_CONTEXT('Part 14','TOP_LEVEL_ASSEMBLY_PART') +); +#1249=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(2.E-5),#1252, +'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); +#1250=( +NAMED_UNIT(*) +SI_UNIT($,.STERADIAN.) +SOLID_ANGLE_UNIT() +); +#1251=( +NAMED_UNIT(*) +PLANE_ANGLE_UNIT() +SI_UNIT($,.RADIAN.) +); +#1252=( +LENGTH_UNIT() +NAMED_UNIT(*) +SI_UNIT($,.METRE.) +); +#1253=PRODUCT_DEFINITION_SHAPE('','',#1254); +#1254=PRODUCT_DEFINITION('','',#1256,#1255); +#1255=PRODUCT_DEFINITION_CONTEXT('',#1262,'design'); +#1256=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#1258, + .NOT_KNOWN.); +#1257=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#1258)); +#1258=PRODUCT('Part 14','Part 14','Part 14',(#1260)); +#1259=PRODUCT_CATEGORY('',''); +#1260=PRODUCT_CONTEXT('',#1262,'mechanical'); +#1261=APPLICATION_PROTOCOL_DEFINITION('international standard', +'automotive_design',2010,#1262); +#1262=APPLICATION_CONTEXT( +'core data for automotive mechanical design processes'); +ENDSEC; +END-ISO-10303-21; diff --git a/hackpads/NumMarcroPad/3dModels/Bottom.dxf b/hackpads/NumMarcroPad/3dModels/Bottom.dxf new file mode 100644 index 000000000..96276ead4 --- /dev/null +++ b/hackpads/NumMarcroPad/3dModels/Bottom.dxf @@ -0,0 +1,6740 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1014 + 9 +$ACADMAINTVER + 70 + 9 + 9 +$DWGCODEPAGE + 3 +ANSI_1252 + 9 +$INSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$EXTMIN + 10 +1.000000000000000E+20 + 20 +1.000000000000000E+20 + 30 +1.000000000000000E+20 + 9 +$EXTMAX + 10 +-1.000000000000000E+20 + 20 +-1.000000000000000E+20 + 30 +-1.000000000000000E+20 + 9 +$LIMMIN + 10 +0.0 + 20 +0.0 + 9 +$LIMMAX + 10 +12.0 + 20 +9.0 + 9 +$ORTHOMODE + 70 + 0 + 9 +$REGENMODE + 70 + 1 + 9 +$FILLMODE + 70 + 1 + 9 +$QTEXTMODE + 70 + 0 + 9 +$MIRRTEXT + 70 + 1 + 9 +$DRAGMODE + 70 + 2 + 9 +$LTSCALE + 40 +1.0 + 9 +$OSMODE + 70 + 37 + 9 +$ATTMODE + 70 + 1 + 9 +$TEXTSIZE + 40 +0.2 + 9 +$TRACEWID + 40 +0.05 + 9 +$TEXTSTYLE + 7 +STANDARD + 9 +$CLAYER + 8 +0 + 9 +$CELTYPE + 6 +BYLAYER + 9 +$CECOLOR + 62 + 256 + 9 +$CELTSCALE + 40 +1.0 + 9 +$DELOBJ + 70 + 1 + 9 +$DISPSILH + 70 + 0 + 9 +$DIMSCALE + 40 +1.0 + 9 +$DIMASZ + 40 +0.18 + 9 +$DIMEXO + 40 +0.0625 + 9 +$DIMDLI + 40 +0.38 + 9 +$DIMRND + 40 +0.0 + 9 +$DIMDLE + 40 +0.0 + 9 +$DIMEXE + 40 +0.18 + 9 +$DIMTP + 40 +0.0 + 9 +$DIMTM + 40 +0.0 + 9 +$DIMTXT + 40 +0.18 + 9 +$DIMCEN + 40 +0.09 + 9 +$DIMTSZ + 40 +0.0 + 9 +$DIMTOL + 70 + 0 + 9 +$DIMLIM + 70 + 0 + 9 +$DIMTIH + 70 + 1 + 9 +$DIMTOH + 70 + 1 + 9 +$DIMSE1 + 70 + 0 + 9 +$DIMSE2 + 70 + 0 + 9 +$DIMTAD + 70 + 0 + 9 +$DIMZIN + 70 + 0 + 9 +$DIMBLK + 1 + + 9 +$DIMASO + 70 + 1 + 9 +$DIMSHO + 70 + 1 + 9 +$DIMPOST + 1 + + 9 +$DIMAPOST + 1 + + 9 +$DIMALT + 70 + 0 + 9 +$DIMALTD + 70 + 2 + 9 +$DIMALTF + 40 +25.4 + 9 +$DIMLFAC + 40 +1.0 + 9 +$DIMTOFL + 70 + 0 + 9 +$DIMTVP + 40 +0.0 + 9 +$DIMTIX + 70 + 0 + 9 +$DIMSOXD + 70 + 0 + 9 +$DIMSAH + 70 + 0 + 9 +$DIMBLK1 + 1 + + 9 +$DIMBLK2 + 1 + + 9 +$DIMSTYLE + 2 +STANDARD + 9 +$DIMCLRD + 70 + 0 + 9 +$DIMCLRE + 70 + 0 + 9 +$DIMCLRT + 70 + 0 + 9 +$DIMTFAC + 40 +1.0 + 9 +$DIMGAP + 40 +0.09 + 9 +$DIMJUST + 70 + 0 + 9 +$DIMSD1 + 70 + 0 + 9 +$DIMSD2 + 70 + 0 + 9 +$DIMTOLJ + 70 + 1 + 9 +$DIMTZIN + 70 + 0 + 9 +$DIMALTZ + 70 + 0 + 9 +$DIMALTTZ + 70 + 0 + 9 +$DIMFIT + 70 + 3 + 9 +$DIMUPT + 70 + 0 + 9 +$DIMUNIT + 70 + 2 + 9 +$DIMDEC + 70 + 4 + 9 +$DIMTDEC + 70 + 4 + 9 +$DIMALTU + 70 + 2 + 9 +$DIMALTTD + 70 + 2 + 9 +$DIMTXSTY + 7 +STANDARD + 9 +$DIMAUNIT + 70 + 0 + 9 +$LUNITS + 70 + 2 + 9 +$LUPREC + 70 + 4 + 9 +$SKETCHINC + 40 +0.1 + 9 +$FILLETRAD + 40 +0.5 + 9 +$AUNITS + 70 + 0 + 9 +$AUPREC + 70 + 0 + 9 +$MENU + 1 +. + 9 +$ELEVATION + 40 +0.0 + 9 +$PELEVATION + 40 +0.0 + 9 +$THICKNESS + 40 +0.0 + 9 +$LIMCHECK + 70 + 0 + 9 +$CHAMFERA + 40 +0.0 + 9 +$CHAMFERB + 40 +0.0 + 9 +$CHAMFERC + 40 +0.0 + 9 +$CHAMFERD + 40 +0.0 + 9 +$SKPOLY + 70 + 0 + 9 +$TDCREATE + 40 +2460691.98825507 + 9 +$TDUPDATE + 40 +2460691.988255081 + 9 +$TDINDWG + 40 +0.0000000116 + 9 +$TDUSRTIMER + 40 +0.0000000116 + 9 +$USRTIMER + 70 + 1 + 9 +$ANGBASE + 50 +0.0 + 9 +$ANGDIR + 70 + 0 + 9 +$PDMODE + 70 + 0 + 9 +$PDSIZE + 40 +0.0 + 9 +$PLINEWID + 40 +0.0 + 9 +$COORDS + 70 + 1 + 9 +$SPLFRAME + 70 + 0 + 9 +$SPLINETYPE + 70 + 6 + 9 +$SPLINESEGS + 70 + 8 + 9 +$ATTDIA + 70 + 0 + 9 +$ATTREQ + 70 + 1 + 9 +$HANDLING + 70 + 1 + 9 +$HANDSEED + 5 +100000C1 + 9 +$SURFTAB1 + 70 + 6 + 9 +$SURFTAB2 + 70 + 6 + 9 +$SURFTYPE + 70 + 6 + 9 +$SURFU + 70 + 6 + 9 +$SURFV + 70 + 6 + 9 +$UCSNAME + 2 + + 9 +$UCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$PUCSNAME + 2 + + 9 +$PUCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$USERI1 + 70 + 0 + 9 +$USERI2 + 70 + 0 + 9 +$USERI3 + 70 + 0 + 9 +$USERI4 + 70 + 0 + 9 +$USERI5 + 70 + 0 + 9 +$USERR1 + 40 +0.0 + 9 +$USERR2 + 40 +0.0 + 9 +$USERR3 + 40 +0.0 + 9 +$USERR4 + 40 +0.0 + 9 +$USERR5 + 40 +0.0 + 9 +$WORLDVIEW + 70 + 1 + 9 +$SHADEDGE + 70 + 3 + 9 +$SHADEDIF + 70 + 70 + 9 +$TILEMODE + 70 + 1 + 9 +$MAXACTVP + 70 + 64 + 9 +$PINSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PLIMCHECK + 70 + 0 + 9 +$PEXTMIN + 10 +1.000000000000000E+20 + 20 +1.000000000000000E+20 + 30 +1.000000000000000E+20 + 9 +$PEXTMAX + 10 +-1.000000000000000E+20 + 20 +-1.000000000000000E+20 + 30 +-1.000000000000000E+20 + 9 +$PLIMMIN + 10 +0.0 + 20 +0.0 + 9 +$PLIMMAX + 10 +12.0 + 20 +9.0 + 9 +$UNITMODE + 70 + 0 + 9 +$VISRETAIN + 70 + 1 + 9 +$PLINEGEN + 70 + 0 + 9 +$PSLTSCALE + 70 + 1 + 9 +$TREEDEPTH + 70 + 3020 + 9 +$PICKSTYLE + 70 + 1 + 9 +$CMLSTYLE + 2 +STANDARD + 9 +$CMLJUST + 70 + 0 + 9 +$CMLSCALE + 40 +1.0 + 9 +$PROXYGRAPHICS + 70 + 1 + 9 +$MEASUREMENT + 70 + 0 + 0 +ENDSEC + 0 +SECTION + 2 +CLASSES + 0 +CLASS + 1 +ACDBDICTIONARYWDFLT + 2 +AcDbDictionaryWithDefault + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +VISUALSTYLE + 2 +AcDbVisualStyle + 3 +ObjectDBX Classes + 90 + 4095 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MATERIAL + 2 +AcDbMaterial + 3 +ObjectDBX Classes + 90 + 1153 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SCALE + 2 +AcDbScale + 3 +ObjectDBX Classes + 90 + 1153 +280 + 0 +281 + 0 + 0 +CLASS + 1 +TABLESTYLE + 2 +AcDbTableStyle + 3 +ObjectDBX Classes + 90 + 4095 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MLEADERSTYLE + 2 +AcDbMLeaderStyle + 3 +ACDB_MLEADERSTYLE_CLASS + 90 + 4095 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SUN + 2 +AcDbSun + 3 +SCENEOE + 90 + 1153 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SORTENTSTABLE + 2 +AcDbSortentsTable + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +DICTIONARYVAR + 2 +AcDbDictionaryVar + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +XRECORD + 2 +AcDbXrecord + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +LWPOLYLINE + 2 +AcDbPolyline + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +HATCH + 2 +AcDbHatch + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +ACDBPLACEHOLDER + 2 +AcDbPlaceHolder + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +LAYOUT + 2 +AcDbLayout + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +102 +{ACAD_XDICTIONARY +360 +100000B6 +102 +} +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +VPORT + 5 +29 +330 +8 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*ACTIVE + 70 + 0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +10.42990654205607 + 22 +4.5 + 13 +0.0 + 23 +0.0 + 14 +0.5 + 24 +0.5 + 15 +0.5 + 25 +0.5 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 40 +9.0 + 41 +1.972972972850329 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 50 +0.0 + 51 +0.0 + 71 + 0 + 72 + 100 + 73 + 1 + 74 + 3 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +5 +330 +0 +100 +AcDbSymbolTable + 70 + 7 + 0 +LTYPE + 5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYBLOCK + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYLAYER + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CONTINUOUS + 70 + 0 + 3 +Solid line + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +10000024 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ONS_PHANTOM + 70 + 0 + 3 +Onshape Phantom line ______ __ __ ______ + 72 + 65 + 73 + 6 + 40 +0.4999999999999999 + 49 +0.25 + 74 + 0 + 49 +-0.05 + 74 + 0 + 49 +0.05 + 74 + 0 + 49 +-0.05 + 74 + 0 + 49 +0.05 + 74 + 0 + 49 +-0.05 + 74 + 0 + 0 +LTYPE + 5 +10000025 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER + 70 + 0 + 3 +Center line ____ _ ____ _ ____ _ + 72 + 65 + 73 + 4 + 40 +0.7199999999999999 + 49 +0.45 + 74 + 0 + 49 +-0.09 + 74 + 0 + 49 +0.09 + 74 + 0 + 49 +-0.09 + 74 + 0 + 0 +LTYPE + 5 +10000026 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED + 70 + 0 + 3 +Dashed line __ __ __ __ __ + 72 + 65 + 73 + 2 + 40 +0.75 + 49 +0.5 + 74 + 0 + 49 +-0.25 + 74 + 0 + 0 +LTYPE + 5 +10000027 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ONS_DASHDOT + 70 + 0 + 3 +Onshape Dashed with Dot _ . ____ . ____ + 72 + 65 + 73 + 4 + 40 +0.71 + 49 +0.5 + 74 + 0 + 49 +-0.1 + 74 + 0 + 49 +0.01 + 74 + 0 + 49 +-0.1 + 74 + 0 + 0 +LTYPE + 5 +10000028 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ONS_DOTTED + 70 + 0 + 3 +Onshape Dotted line . . . . . . . + 72 + 65 + 73 + 2 + 40 +0.11 + 49 +0.01 + 74 + 0 + 49 +-0.1 + 74 + 0 + 0 +LTYPE + 5 +10000029 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +HIDDEN + 70 + 0 + 3 +Hidden line ____ ____ ____ ____ + 72 + 65 + 73 + 2 + 40 +0.15 + 49 +0.1 + 74 + 0 + 49 +-0.05 + 74 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +2 +330 +0 +100 +AcDbSymbolTable + 70 + 46 + 0 +LAYER + 5 +10 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002A +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SECTION_CUTTING_LINE + 70 + 0 + 62 + 7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000002B +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +DETAIL_VIEW_BORDER + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002C +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +DETAIL_VIEW_PARENT_BORDER + 70 + 0 + 62 + 7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000002D +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TEXT + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002E +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SKETCHED_GEOMETRY + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002F +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +VIRTUAL_SHARPS + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000030 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +CENTERLINES + 70 + 0 + 62 + -7 + 6 +CENTER + 0 +LAYER + 5 +10000031 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +CENTERMARKS + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000032 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TABLES + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000033 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +IMAGES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000034 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +ANNOTATION_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000035 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +ANNOTATION_TEXT + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000036 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SIDE_THREAD_SYMBOLS + 70 + 0 + 62 + 7 + 6 +HIDDEN + 0 +LAYER + 5 +10000037 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SIDE_THREAD_SYMBOLS_HIDDEN + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +10000038 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SURFACE_THREAD_SYMBOLS + 70 + 0 + 62 + 7 + 6 +HIDDEN + 0 +LAYER + 5 +10000039 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SURFACE_THREAD_SYMBOLS_ON_ + 70 + 0 + 62 + 7 + 6 +HIDDEN + 0 +LAYER + 5 +1000003A +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SURFACE_THREAD_SYMBOLS_HID + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +1000003B +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BLIND_THREAD_SYMBOLS + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000003C +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BLIND_THREAD_SYMBOLS_HIDDE + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +1000003D +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +EXPLODE_LINES + 70 + 0 + 62 + 7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000003E +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +HIDDEN_EXPLODE_LINES + 70 + 0 + 62 + -7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000003F +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BREAK_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000040 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_BEND_LINES_UP + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000041 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_BEND_LINES_DOWN + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000042 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_BEND_TANGENT_LI + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000043 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_CUT_LINES + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000044 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_CBORE_CSINK_UP + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000045 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_CBORE_CSINK_DOW + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000046 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_TEAR + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000047 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_UP + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000048 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_DOWN + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000049 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_CENTERMA + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004A +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +REGION_ASSOC_POINTS + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004B +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +PATTERN_CENTERLINES + 70 + 1 + 62 + -7 + 6 +CENTER + 0 +LAYER + 5 +1000004C +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +HIDDEN + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +1000004D +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +VISIBLE + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004E +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +MODELSKETCH_VISIBLE + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004F +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +MODELSKETCH_POINT + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000050 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +MODELSKETCH_CONSTRUCTION + 70 + 0 + 62 + -7 + 6 +CENTER + 0 +LAYER + 5 +10000051 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +HIDDEN_BASE_VIEW + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000052 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TANGENT_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000053 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TANGENT_HIDDEN + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +10000054 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +INVISIBLE_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000055 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +VIEW_HATCHES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000056 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SECTION_JOG_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +3 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +STYLE + 5 +11 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +STANDARD + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +txt + 4 + + 0 +STYLE + 5 +10000004 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +TTFSTYLE + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +Verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 34 + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +6 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +7 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +9 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +APPID + 5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 + 0 + 0 +APPID + 5 +100000C0 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_MLEADERVER + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +A +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +DIMSTYLE +105 +27 +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +STANDARD + 70 + 0 + 3 + + 4 + + 5 + + 6 + + 7 + + 40 +1.0 + 41 +0.18 + 42 +0.0625 + 43 +0.38 + 44 +0.18 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 +140 +0.18 +141 +0.09 +142 +0.0 +143 +25.4 +144 +1.0 +145 +0.0 +146 +1.0 +147 +0.09 + 71 + 0 + 72 + 0 + 73 + 1 + 74 + 1 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 +170 + 0 +171 + 2 +172 + 0 +173 + 0 +174 + 0 +175 + 0 +176 + 0 +177 + 0 +178 + 0 +270 + 2 +271 + 4 +272 + 4 +273 + 2 +274 + 2 +340 +11 +275 + 0 +280 + 0 +281 + 0 +282 + 0 +283 + 1 +284 + 0 +285 + 0 +286 + 0 +287 + 3 +288 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +BLOCK_RECORD + 5 +1F +102 +{ACAD_XDICTIONARY +360 +1000008B +102 +} +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*MODEL_SPACE + 0 +BLOCK_RECORD + 5 +1B +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*PAPER_SPACE + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +20 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*MODEL_SPACE + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*MODEL_SPACE + 1 + + 0 +ENDBLK + 5 +21 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockBegin + 2 +*PAPER_SPACE + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*PAPER_SPACE + 1 + + 0 +ENDBLK + 5 +1D +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +ARC + 5 +10000057 +102 +{ACAD_XDICTIONARY +360 +10000058 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.719011125448933 + 20 +-2.005837968293569 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +179.9974880000003 + 51 +270.0000002009854 + 0 +LINE + 5 +1000005C +102 +{ACAD_XDICTIONARY +360 +1000005D +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.71901112527354 + 20 +-2.055837968293569 + 30 +0.0 + 11 +1.717009665430887 + 21 +-2.055837956240502 + 31 +0.0 + 0 +ARC + 5 +1000005F +102 +{ACAD_XDICTIONARY +360 +10000060 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.717009665255494 + 20 +-2.005837956240502 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +270.0000002009854 + 51 +359.9974880000002 + 0 +LINE + 5 +10000064 +102 +{ACAD_XDICTIONARY +360 +10000065 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +1.76700966520744 + 20 +-2.005840148374042 + 30 +0.0 + 11 +1.767186459789605 + 21 +2.0266373167466 + 31 +0.0 + 0 +ARC + 5 +10000067 +102 +{ACAD_XDICTIONARY +360 +10000068 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.71718645983766 + 20 +2.02663950888014 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +359.9974880000002 + 51 +90.0 + 0 +LINE + 5 +1000006C +102 +{ACAD_XDICTIONARY +360 +1000006D +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.718834330866239 + 20 +2.076639508880139 + 30 +0.0 + 11 +1.71718645983766 + 21 +2.076639508880139 + 31 +0.0 + 0 +ARC + 5 +1000006F +102 +{ACAD_XDICTIONARY +360 +10000070 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.718834330866239 + 20 +2.02663950888014 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +90.0 + 51 +179.9974879999998 + 0 +LINE + 5 +10000074 +102 +{ACAD_XDICTIONARY +360 +10000075 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.769011125400878 + 20 +-2.005835776160029 + 30 +0.0 + 11 +-1.768834330818185 + 21 +2.02664170101368 + 31 +0.0 + 0 +CIRCLE + 5 +10000077 +102 +{ACAD_XDICTIONARY +360 +10000078 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.691864499246996 + 20 +-1.978692532150917 + 30 +0.0 + 40 +0.0393700787401575 + 0 +CIRCLE + 5 +1000007C +102 +{ACAD_XDICTIONARY +360 +1000007D +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.690039833697742 + 20 +-1.978692532150917 + 30 +0.0 + 40 +0.0393700787401575 + 0 +CIRCLE + 5 +10000081 +102 +{ACAD_XDICTIONARY +360 +10000082 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.690039833697742 + 20 +1.999494072894726 + 30 +0.0 + 40 +0.0393700787401575 + 0 +CIRCLE + 5 +10000086 +102 +{ACAD_XDICTIONARY +360 +10000087 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.691864499246996 + 20 +1.999494072894727 + 30 +0.0 + 40 +0.0393700787401576 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +C +330 +0 +100 +AcDbDictionary + 3 +ACAD_GROUP +350 +D + 3 +ACAD_LAYOUT +350 +1A + 3 +ACAD_MATERIAL +350 +43 + 3 +ACAD_MLEADERSTYLE +350 +6B + 3 +ACAD_MLINESTYLE +350 +17 + 3 +ACAD_PLOTSETTINGS +350 +19 + 3 +ACAD_SCALELIST +350 +47 + 3 +ACAD_VISUALSTYLE +350 +2A + 3 +ACDBHEADERROUNDTRIPXREC +350 +1000008D + 3 +ACDBVARIABLEDICTIONARY +350 +100000AE + 3 +DWGPROPS +350 +100000B5 + 3 +ONSHAPE_DATA +350 +10000001 + 0 +DICTIONARY + 5 +100000B6 +330 +8 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000B7 + 0 +DICTIONARY + 5 +1000008B +330 +1F +100 +AcDbDictionary +280 + 1 + 3 +ACAD_SORTENTS +360 +1000008C + 0 +DICTIONARY + 5 +10000058 +330 +10000057 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000005B + 3 +BTDETID +360 +10000059 + 3 +BTOWNERFACEID_ +360 +1000005A + 0 +DICTIONARY + 5 +1000005D +330 +1000005C +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +1000005E + 0 +DICTIONARY + 5 +10000060 +330 +1000005F +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000063 + 3 +BTDETID +360 +10000061 + 3 +BTOWNERFACEID_ +360 +10000062 + 0 +DICTIONARY + 5 +10000065 +330 +10000064 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +10000066 + 0 +DICTIONARY + 5 +10000068 +330 +10000067 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000006B + 3 +BTDETID +360 +10000069 + 3 +BTOWNERFACEID_ +360 +1000006A + 0 +DICTIONARY + 5 +1000006D +330 +1000006C +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +1000006E + 0 +DICTIONARY + 5 +10000070 +330 +1000006F +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000073 + 3 +BTDETID +360 +10000071 + 3 +BTOWNERFACEID_ +360 +10000072 + 0 +DICTIONARY + 5 +10000075 +330 +10000074 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +10000076 + 0 +DICTIONARY + 5 +10000078 +330 +10000077 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000007B + 3 +BTDETID +360 +10000079 + 3 +BTOWNERFACEID_ +360 +1000007A + 0 +DICTIONARY + 5 +1000007D +330 +1000007C +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000080 + 3 +BTDETID +360 +1000007E + 3 +BTOWNERFACEID_ +360 +1000007F + 0 +DICTIONARY + 5 +10000082 +330 +10000081 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000085 + 3 +BTDETID +360 +10000083 + 3 +BTOWNERFACEID_ +360 +10000084 + 0 +DICTIONARY + 5 +10000087 +330 +10000086 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000008A + 3 +BTDETID +360 +10000088 + 3 +BTOWNERFACEID_ +360 +10000089 + 0 +DICTIONARY + 5 +D +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +1A +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +43 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +BYBLOCK +350 +45 + 3 +BYLAYER +350 +44 + 3 +GLOBAL +350 +46 + 0 +DICTIONARY + 5 +6B +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +STANDARD +350 +6C + 0 +DICTIONARY + 5 +17 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +STANDARD +350 +18 + 0 +DICTIONARY + 5 +19 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +47 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +SCALE100_1 +350 +10000023 + 3 +SCALE10_1 +350 +1000001D + 3 +SCALE12_1 +350 +1000001E + 3 +SCALE16_1 +350 +1000001F + 3 +SCALE1_1 +350 +10000006 + 3 +SCALE1_10 +350 +1000000D + 3 +SCALE1_100 +350 +10000016 + 3 +SCALE1_12 +350 +1000000E + 3 +SCALE1_16 +350 +1000000F + 3 +SCALE1_2 +350 +10000007 + 3 +SCALE1_20 +350 +10000010 + 3 +SCALE1_25 +350 +10000011 + 3 +SCALE1_3 +350 +10000008 + 3 +SCALE1_32 +350 +10000012 + 3 +SCALE1_4 +350 +10000009 + 3 +SCALE1_40 +350 +10000013 + 3 +SCALE1_5 +350 +1000000A + 3 +SCALE1_50 +350 +10000014 + 3 +SCALE1_6 +350 +1000000B + 3 +SCALE1_8 +350 +1000000C + 3 +SCALE1_80 +350 +10000015 + 3 +SCALE20_1 +350 +10000020 + 3 +SCALE2_1 +350 +10000017 + 3 +SCALE32_1 +350 +10000021 + 3 +SCALE3_1 +350 +10000018 + 3 +SCALE4_1 +350 +10000019 + 3 +SCALE50_1 +350 +10000022 + 3 +SCALE5_1 +350 +1000001A + 3 +SCALE6_1 +350 +1000001B + 3 +SCALE8_1 +350 +1000001C + 0 +DICTIONARY + 5 +2A +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +2DWIREFRAME +350 +2F + 3 +BASIC +350 +32 + 3 +BRIGHTEN +350 +36 + 3 +COLORCHANGE +350 +3A + 3 +CONCEPTUAL +350 +34 + 3 +DIM +350 +35 + 3 +EDGECOLOROFF +350 +3D + 3 +FACEPATTERN +350 +39 + 3 +FLAT +350 +2B + 3 +FLATWITHEDGES +350 +2C + 3 +GOURAUD +350 +2D + 3 +GOURAUDWITHEDGES +350 +2E + 3 +HIDDEN +350 +31 + 3 +JITTEROFF +350 +3B + 3 +LINEPATTERN +350 +38 + 3 +OVERHANGOFF +350 +3C + 3 +REALISTIC +350 +33 + 3 +SHADED +350 +42 + 3 +SHADED_WITH_EDGES +350 +41 + 3 +SHADES_OF_GRAY +350 +3E + 3 +SKETCHY +350 +3F + 3 +THICKEN +350 +37 + 3 +WIREFRAME +350 +30 + 3 +X-RAY +350 +40 + 0 +DICTIONARY + 5 +1000008D +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +CEPSNID +350 +10000097 + 3 +CEPSNTYPE +350 +10000096 + 3 +DIMSTYLEDATA +350 +100000AD + 3 +FINGERPRINTGUID +350 +10000098 + 3 +HYPERLINKBASE +350 +10000090 + 3 +INSUNITS +350 +10000095 + 3 +LAYOUTDICT +350 +10000092 + 3 +LWETCUNION +350 +10000094 + 3 +PLOTSETDICT +350 +10000093 + 3 +PSVPSCALE +350 +1000009A + 3 +PUCSBASE +350 +1000009D + 3 +PUCSORGBACK +350 +100000A3 + 3 +PUCSORGBOTTOM +350 +1000009F + 3 +PUCSORGFRONT +350 +100000A2 + 3 +PUCSORGLEFT +350 +100000A0 + 3 +PUCSORGRIGHT +350 +100000A1 + 3 +PUCSORGTOP +350 +1000009E + 3 +PUCSORTHOREF +350 +1000009B + 3 +PUCSORTHOVIEW +350 +1000009C + 3 +STYLESHEET +350 +10000091 + 3 +TSTACKALIGN +350 +1000008E + 3 +TSTACKSIZE +350 +1000008F + 3 +UCSBASE +350 +100000A6 + 3 +UCSORGBACK +350 +100000AC + 3 +UCSORGBOTTOM +350 +100000A8 + 3 +UCSORGFRONT +350 +100000AB + 3 +UCSORGLEFT +350 +100000A9 + 3 +UCSORGRIGHT +350 +100000AA + 3 +UCSORGTOP +350 +100000A7 + 3 +UCSORTHOREF +350 +100000A4 + 3 +UCSORTHOVIEW +350 +100000A5 + 3 +VERSIONGUID +350 +10000099 + 0 +DICTIONARY + 5 +100000AE +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +CANNOSCALE +350 +100000B8 + 3 +CMLEADERSTYLE +350 +100000B0 + 3 +CTABLESTYLE +350 +100000AF + 3 +DIMASSOC +350 +100000B3 + 3 +HIDETEXT +350 +100000B4 + 3 +MSLTSCALE +350 +100000B9 + 0 +XRECORD + 5 +100000B5 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbXrecord + 1 +DWGPROPS COOKIE + 2 + + 3 + + 4 + + 6 +File was created by BTDwgCreate + 7 + + 8 + + 9 + +300 += +301 += +302 += +303 += +304 += +305 += +306 += +307 += +308 += +309 += + 40 +0.0 + 41 +2460691.98825507 + 42 +2460691.988255081 + 1 + + 90 + 0 + 0 +DICTIONARY + 5 +10000001 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +280 + 1 + 3 +DIM_UNITS +360 +10000003 + 3 +DWGGEN_VERSION +360 +10000002 + 3 +FIRST_ANGLE +360 +10000005 + 0 +XRECORD + 5 +100000B7 +102 +{ACAD_REACTORS +330 +100000B6 +102 +} +330 +100000B6 +100 +AcDbXrecord +102 +VTR_0.000_0.000_1.000_1.000_VISUALSTYLE +340 +2F +102 +VTR_0.000_0.000_1.000_1.000_GRIDDISPLAY + 70 + 3 +102 +VTR_0.000_0.000_1.000_1.000_GRIDMAJOR + 70 + 5 +102 +VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTING +280 + 1 +102 +VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGTYPE + 70 + 1 +102 +VTR_0.000_0.000_1.000_1.000_BRIGHTNESS +141 +0.0 +102 +VTR_0.000_0.000_1.000_1.000_CONTRAST +142 +0.0 + 0 +SORTENTSTABLE + 5 +1000008C +102 +{ACAD_REACTORS +330 +1000008B +102 +} +330 +1000008B +100 +AcDbSortentsTable +330 +1F + 0 +XRECORD + 5 +1000005B +102 +{ACAD_REACTORS +330 +10000058 +102 +} +330 +10000058 +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +10000059 +102 +{ACAD_REACTORS +330 +10000058 +102 +} +330 +10000058 +100 +AcDbXrecord +1000 +RPB9 + 0 +XRECORD + 5 +1000005A +102 +{ACAD_REACTORS +330 +10000058 +102 +} +330 +10000058 +100 +AcDbXrecord +1000 +RZBG + 0 +XRECORD + 5 +1000005E +102 +{ACAD_REACTORS +330 +1000005D +102 +} +330 +1000005D +100 +AcDbXrecord +1000 +SPBFB + 0 +XRECORD + 5 +10000063 +102 +{ACAD_REACTORS +330 +10000060 +102 +} +330 +10000060 +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +10000061 +102 +{ACAD_REACTORS +330 +10000060 +102 +} +330 +10000060 +100 +AcDbXrecord +1000 +SPBNB + 0 +XRECORD + 5 +10000062 +102 +{ACAD_REACTORS +330 +10000060 +102 +} +330 +10000060 +100 +AcDbXrecord +1000 +RZBG + 0 +XRECORD + 5 +10000066 +102 +{ACAD_REACTORS +330 +10000065 +102 +} +330 +10000065 +100 +AcDbXrecord +1000 +SPBVB + 0 +XRECORD + 5 +1000006B +102 +{ACAD_REACTORS +330 +10000068 +102 +} +330 +10000068 +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +10000069 +102 +{ACAD_REACTORS +330 +10000068 +102 +} +330 +10000068 +100 +AcDbXrecord +1000 +SPBdB + 0 +XRECORD + 5 +1000006A +102 +{ACAD_REACTORS +330 +10000068 +102 +} +330 +10000068 +100 +AcDbXrecord +1000 +RZBG + 0 +XRECORD + 5 +1000006E +102 +{ACAD_REACTORS +330 +1000006D +102 +} +330 +1000006D +100 +AcDbXrecord +1000 +RPBl + 0 +XRECORD + 5 +10000073 +102 +{ACAD_REACTORS +330 +10000070 +102 +} +330 +10000070 +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +10000071 +102 +{ACAD_REACTORS +330 +10000070 +102 +} +330 +10000070 +100 +AcDbXrecord +1000 +RPBt + 0 +XRECORD + 5 +10000072 +102 +{ACAD_REACTORS +330 +10000070 +102 +} +330 +10000070 +100 +AcDbXrecord +1000 +RZBG + 0 +XRECORD + 5 +10000076 +102 +{ACAD_REACTORS +330 +10000075 +102 +} +330 +10000075 +100 +AcDbXrecord +1000 +RPB1 + 0 +XRECORD + 5 +1000007B +102 +{ACAD_REACTORS +330 +10000078 +102 +} +330 +10000078 +100 +AcDbXrecord + 40 +0.0393700787401575 + 0 +XRECORD + 5 +10000079 +102 +{ACAD_REACTORS +330 +10000078 +102 +} +330 +10000078 +100 +AcDbXrecord +1000 +RYBh + 0 +XRECORD + 5 +1000007A +102 +{ACAD_REACTORS +330 +10000078 +102 +} +330 +10000078 +100 +AcDbXrecord +1000 +RZBG + 0 +XRECORD + 5 +10000080 +102 +{ACAD_REACTORS +330 +1000007D +102 +} +330 +1000007D +100 +AcDbXrecord + 40 +0.0393700787401575 + 0 +XRECORD + 5 +1000007E +102 +{ACAD_REACTORS +330 +1000007D +102 +} +330 +1000007D +100 +AcDbXrecord +1000 +RYBp + 0 +XRECORD + 5 +1000007F +102 +{ACAD_REACTORS +330 +1000007D +102 +} +330 +1000007D +100 +AcDbXrecord +1000 +RZBG + 0 +XRECORD + 5 +10000085 +102 +{ACAD_REACTORS +330 +10000082 +102 +} +330 +10000082 +100 +AcDbXrecord + 40 +0.0393700787401575 + 0 +XRECORD + 5 +10000083 +102 +{ACAD_REACTORS +330 +10000082 +102 +} +330 +10000082 +100 +AcDbXrecord +1000 +RYBx + 0 +XRECORD + 5 +10000084 +102 +{ACAD_REACTORS +330 +10000082 +102 +} +330 +10000082 +100 +AcDbXrecord +1000 +RZBG + 0 +XRECORD + 5 +1000008A +102 +{ACAD_REACTORS +330 +10000087 +102 +} +330 +10000087 +100 +AcDbXrecord + 40 +0.0393700787401576 + 0 +XRECORD + 5 +10000088 +102 +{ACAD_REACTORS +330 +10000087 +102 +} +330 +10000087 +100 +AcDbXrecord +1000 +RYB5 + 0 +XRECORD + 5 +10000089 +102 +{ACAD_REACTORS +330 +10000087 +102 +} +330 +10000087 +100 +AcDbXrecord +1000 +RZBG + 0 +MATERIAL + 5 +45 +102 +{ACAD_REACTORS +330 +43 +102 +} +102 +{ACAD_XDICTIONARY +360 +100000BC +102 +} +330 +43 +100 +AcDbMaterial + 1 +BYBLOCK + 0 +MATERIAL + 5 +44 +102 +{ACAD_REACTORS +330 +43 +102 +} +102 +{ACAD_XDICTIONARY +360 +100000BA +102 +} +330 +43 +100 +AcDbMaterial + 1 +BYLAYER + 0 +MATERIAL + 5 +46 +102 +{ACAD_REACTORS +330 +43 +102 +} +102 +{ACAD_XDICTIONARY +360 +100000BE +102 +} +330 +43 +100 +AcDbMaterial + 1 +GLOBAL + 0 +ACAD_PROXY_OBJECT + 5 +6C +102 +{ACAD_REACTORS +330 +6B +102 +} +330 +6B +100 +AcDbProxyObject + 90 + 499 + 91 + 505 + 93 + 610 +310 +40901902A4063FBFFFFFE056BD1B81E855B9FC0AD7A3703D0AD73F4214DD185B99185C9900AD7A3703D0AC73F90141901A02B5E8DC0F42B1CFC02B5E8DC0F42B1CFE5764000000000000300FC0 +340 +14 +340 +0 +340 +11 +340 +0 + 94 + 0 +1001 +ACAD_MLEADERVER +1070 + 2 + 0 +MLINESTYLE + 5 +18 +102 +{ACAD_REACTORS +330 +17 +102 +} +330 +17 +100 +AcDbMlineStyle + 2 +Standard + 70 + 0 + 3 + + 62 + 256 + 51 +90.0 + 52 +90.0 + 71 + 2 + 49 +0.5 + 62 + 256 + 6 +BYLAYER + 49 +-0.5 + 62 + 256 + 6 +BYLAYER + 0 +ACAD_PROXY_OBJECT + 5 +10000023 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 121 +310 +9053130303A310000000000001650100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001D +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90431303A310000000000000910100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001E +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90431323A310000000000000A10100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001F +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90431363A310000000000000C10100 + 0 +ACAD_PROXY_OBJECT + 5 +10000006 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 41 +310 +903313A31500 + 0 +ACAD_PROXY_OBJECT + 5 +1000000D +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A31304000000000000244000 + 0 +ACAD_PROXY_OBJECT + 5 +10000016 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 121 +310 +905313A3130304000000000000594000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000E +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A31324000000000000284000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000F +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A31364000000000000304000 + 0 +ACAD_PROXY_OBJECT + 5 +10000007 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A324000000000000004000 + 0 +ACAD_PROXY_OBJECT + 5 +10000010 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A32304000000000000344000 + 0 +ACAD_PROXY_OBJECT + 5 +10000011 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A32354000000000000394000 + 0 +ACAD_PROXY_OBJECT + 5 +10000008 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A334000000000000084000 + 0 +ACAD_PROXY_OBJECT + 5 +10000012 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A33324000000000000404000 + 0 +ACAD_PROXY_OBJECT + 5 +10000009 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A344000000000000104000 + 0 +ACAD_PROXY_OBJECT + 5 +10000013 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A34304000000000000444000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000A +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A354000000000000144000 + 0 +ACAD_PROXY_OBJECT + 5 +10000014 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A35304000000000000494000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000B +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A364000000000000184000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000C +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A384000000000000204000 + 0 +ACAD_PROXY_OBJECT + 5 +10000015 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A38304000000000000544000 + 0 +ACAD_PROXY_OBJECT + 5 +10000020 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90432303A310000000000000D10100 + 0 +ACAD_PROXY_OBJECT + 5 +10000017 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903323A310000000000000010100 + 0 +ACAD_PROXY_OBJECT + 5 +10000021 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90433323A310000000000001010100 + 0 +ACAD_PROXY_OBJECT + 5 +10000018 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903333A310000000000000210100 + 0 +ACAD_PROXY_OBJECT + 5 +10000019 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903343A310000000000000410100 + 0 +ACAD_PROXY_OBJECT + 5 +10000022 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90435303A310000000000001250100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001A +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903353A310000000000000510100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001B +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903363A310000000000000610100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001C +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903383A310000000000000810100 + 0 +ACAD_PROXY_OBJECT + 5 +2F +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 436 +310 +42CC9915DA5C99599C985B595049028333333333333E33F0000000000000F90107901411070040501600405405064090741402480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +32 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 388 +310 +4150985CDA58D07406404333333333333E33F0000000000000F90107A41107004050150841D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +36 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 428 +310 +42109C9A59DA1D195B90C409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A029950 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3A +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 452 +310 +42D0DBDB1BDC90DA185B99D95104090240C333333333333E33F0000000000000F90108901411070040501508421405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +34 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 500 +310 +4290DBDB98D95C1D1D585B10940D028333333333333E33F0000000000000F90107902409070040501000000000018199010841D405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +35 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 412 +310 +40D11A5B50B409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A02677FFFFFD0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3D +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 452 +310 +43115919D950DBDB1BDC93D999916409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +39 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 444 +310 +42D19858D95C185D1D195C9B90F409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2B +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 380 +310 +41119B185D240901404333333333333E33F0000000000000F9010740A907004050150841D405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2C +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 468 +310 +43519B185D15DA5D1A115919D95CD0140901404333333333333E33F0000000000000F90107409019070040501600405405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2D +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 404 +310 +41D1DBDD5C985D5910240902404333333333333E33F0000000000000F9010740A9070040501641D405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2E +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 492 +310 +4411DBDD5C985D5915DA5D1A115919D95CD0340902404333333333333E33F0000000000000F90107409019070040501600405405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +31 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 476 +310 +41921A5919195B90640502408333333333333E33F0000000000000F901079024090700405020000000000001110200405405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3B +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 428 +310 +42529A5D1D195C93D999914409028333333333333E33F0000000000000F9010790141107004050150A41D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +38 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 444 +310 +42D31A5B995C185D1D195C9B90E409028333333333333E33F0000000000000F9010790141107004050750841D405064090741402483A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3C +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 444 +310 +42D3DD995C9A185B99D3D999915409028333333333333E33F0000000000000F9010790141107004050150941D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +33 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 428 +310 +425499585B1A5CDD1A58D08409038333333333333E33F0000000000000F9010740A907004050150800405405064090740C02480A1B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +42 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 420 +310 +4194DA1859195911B40902404333333333333E33F0000000000000F9010740A41107004050150800405405064090840C02480A0B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +41 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 516 +310 +4454DA18591959081DDA5D1A08195919D95CD1A40902404333333333333E33F0000000000000F901074090142907004050250800405405064090740C02480A0B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3E +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 532 +310 +4394DA1859195CC81BD98811DC985E5174090240C333333333333E33F0000000000000F901079024090741D01000000000000111010841D405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3F +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 476 +310 +41D4DAD95D18DA1E51840502408333333333333E33F0000000000000F901079024090741D01000000000000111010B41D405064090741802480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +37 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 412 +310 +41D51A1A58DAD95B90D409028333333333333E33F0000000000000F9010790141107004050150C41D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +30 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 420 +310 +4255DA5C99599C985B595059028333333333333E33F0000000000000F90107901411070040501600405405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +40 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 404 +310 +41560B54985E51940902404000000000000E03F0000000000000F9010740501907004050150841D405064090740C02480A1B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +XRECORD + 5 +10000097 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +10000096 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 90 + 0 + 0 +XRECORD + 5 +100000AD +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +1000 +DSTYLE +1002 +{ +1070 + 340 +340 +11 +1002 +} + 0 +XRECORD + 5 +10000098 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 1 +{7374f6b8-e665-3773-7631-36367172b770} + 0 +XRECORD + 5 +10000090 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 1 + + 0 +XRECORD + 5 +10000095 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 90 + 1 + 0 +XRECORD + 5 +10000092 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +340 +1A + 0 +XRECORD + 5 +10000094 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 90 + 10781 + 0 +XRECORD + 5 +10000093 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +340 +19 + 0 +XRECORD + 5 +1000009A +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 40 +0.0 + 0 +XRECORD + 5 +1000009D +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000A3 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +1000009F +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000A2 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000A0 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000A1 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +1000009E +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +1000009B +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +1000009C +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 70 + 0 + 0 +XRECORD + 5 +10000091 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 1 + + 0 +XRECORD + 5 +1000008E +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 90 + 1 + 0 +XRECORD + 5 +1000008F +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 90 + 70 + 0 +XRECORD + 5 +100000A6 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000AC +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000A8 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000AB +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000A9 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000AA +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000A7 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000A4 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000A5 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 70 + 0 + 0 +XRECORD + 5 +10000099 +102 +{ACAD_REACTORS +330 +1000008D +102 +} +330 +1000008D +100 +AcDbXrecord + 1 +{FAEB1C32-E019-11D5-929B-00C0DF256EC4} + 0 +DICTIONARYVAR + 5 +100000B8 +102 +{ACAD_REACTORS +330 +100000AE +102 +} +330 +100000AE +100 +DictionaryVariables +280 + 0 + 1 +1:1 + 0 +DICTIONARYVAR + 5 +100000B0 +102 +{ACAD_REACTORS +330 +100000AE +102 +} +330 +100000AE +100 +DictionaryVariables +280 + 0 + 1 +Standard + 0 +DICTIONARYVAR + 5 +100000AF +102 +{ACAD_REACTORS +330 +100000AE +102 +} +330 +100000AE +100 +DictionaryVariables +280 + 0 + 1 +Standard + 0 +DICTIONARYVAR + 5 +100000B3 +102 +{ACAD_REACTORS +330 +100000AE +102 +} +330 +100000AE +100 +DictionaryVariables +280 + 0 + 1 +2 + 0 +DICTIONARYVAR + 5 +100000B4 +102 +{ACAD_REACTORS +330 +100000AE +102 +} +330 +100000AE +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +DICTIONARYVAR + 5 +100000B9 +102 +{ACAD_REACTORS +330 +100000AE +102 +} +330 +100000AE +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +XRECORD + 5 +10000003 +102 +{ACAD_REACTORS +330 +10000001 +102 +} +330 +10000001 +100 +AcDbXrecord + 70 + 1 + 0 +XRECORD + 5 +10000002 +102 +{ACAD_REACTORS +330 +10000001 +102 +} +330 +10000001 +100 +AcDbXrecord +1040 +89.0 + 0 +ACAD_PROXY_OBJECT + 5 +10000005 +102 +{ACAD_REACTORS +330 +10000001 +102 +} +330 +10000001 +100 +AcDbProxyObject + 90 + 499 + 91 + 509 + 93 + 34 +310 +40C8804000 + 0 +DICTIONARY + 5 +100000BC +330 +45 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000BD + 0 +DICTIONARY + 5 +100000BA +330 +44 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000BB + 0 +DICTIONARY + 5 +100000BE +330 +46 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000BF + 0 +XRECORD + 5 +100000BD +102 +{ACAD_REACTORS +330 +100000BC +102 +} +330 +100000BC +100 +AcDbXrecord +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +XRECORD + 5 +100000BB +102 +{ACAD_REACTORS +330 +100000BA +102 +} +330 +100000BA +100 +AcDbXrecord +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +XRECORD + 5 +100000BF +102 +{ACAD_REACTORS +330 +100000BE +102 +} +330 +100000BE +100 +AcDbXrecord +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +ENDSEC + 0 +EOF diff --git a/hackpads/NumMarcroPad/3dModels/Top.dxf b/hackpads/NumMarcroPad/3dModels/Top.dxf new file mode 100644 index 000000000..15436c4f2 --- /dev/null +++ b/hackpads/NumMarcroPad/3dModels/Top.dxf @@ -0,0 +1,7388 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1014 + 9 +$ACADMAINTVER + 70 + 9 + 9 +$DWGCODEPAGE + 3 +ANSI_1252 + 9 +$INSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$EXTMIN + 10 +1.000000000000000E+20 + 20 +1.000000000000000E+20 + 30 +1.000000000000000E+20 + 9 +$EXTMAX + 10 +-1.000000000000000E+20 + 20 +-1.000000000000000E+20 + 30 +-1.000000000000000E+20 + 9 +$LIMMIN + 10 +0.0 + 20 +0.0 + 9 +$LIMMAX + 10 +12.0 + 20 +9.0 + 9 +$ORTHOMODE + 70 + 0 + 9 +$REGENMODE + 70 + 1 + 9 +$FILLMODE + 70 + 1 + 9 +$QTEXTMODE + 70 + 0 + 9 +$MIRRTEXT + 70 + 1 + 9 +$DRAGMODE + 70 + 2 + 9 +$LTSCALE + 40 +1.0 + 9 +$OSMODE + 70 + 37 + 9 +$ATTMODE + 70 + 1 + 9 +$TEXTSIZE + 40 +0.2 + 9 +$TRACEWID + 40 +0.05 + 9 +$TEXTSTYLE + 7 +STANDARD + 9 +$CLAYER + 8 +0 + 9 +$CELTYPE + 6 +BYLAYER + 9 +$CECOLOR + 62 + 256 + 9 +$CELTSCALE + 40 +1.0 + 9 +$DELOBJ + 70 + 1 + 9 +$DISPSILH + 70 + 0 + 9 +$DIMSCALE + 40 +1.0 + 9 +$DIMASZ + 40 +0.18 + 9 +$DIMEXO + 40 +0.0625 + 9 +$DIMDLI + 40 +0.38 + 9 +$DIMRND + 40 +0.0 + 9 +$DIMDLE + 40 +0.0 + 9 +$DIMEXE + 40 +0.18 + 9 +$DIMTP + 40 +0.0 + 9 +$DIMTM + 40 +0.0 + 9 +$DIMTXT + 40 +0.18 + 9 +$DIMCEN + 40 +0.09 + 9 +$DIMTSZ + 40 +0.0 + 9 +$DIMTOL + 70 + 0 + 9 +$DIMLIM + 70 + 0 + 9 +$DIMTIH + 70 + 1 + 9 +$DIMTOH + 70 + 1 + 9 +$DIMSE1 + 70 + 0 + 9 +$DIMSE2 + 70 + 0 + 9 +$DIMTAD + 70 + 0 + 9 +$DIMZIN + 70 + 0 + 9 +$DIMBLK + 1 + + 9 +$DIMASO + 70 + 1 + 9 +$DIMSHO + 70 + 1 + 9 +$DIMPOST + 1 + + 9 +$DIMAPOST + 1 + + 9 +$DIMALT + 70 + 0 + 9 +$DIMALTD + 70 + 2 + 9 +$DIMALTF + 40 +25.4 + 9 +$DIMLFAC + 40 +1.0 + 9 +$DIMTOFL + 70 + 0 + 9 +$DIMTVP + 40 +0.0 + 9 +$DIMTIX + 70 + 0 + 9 +$DIMSOXD + 70 + 0 + 9 +$DIMSAH + 70 + 0 + 9 +$DIMBLK1 + 1 + + 9 +$DIMBLK2 + 1 + + 9 +$DIMSTYLE + 2 +STANDARD + 9 +$DIMCLRD + 70 + 0 + 9 +$DIMCLRE + 70 + 0 + 9 +$DIMCLRT + 70 + 0 + 9 +$DIMTFAC + 40 +1.0 + 9 +$DIMGAP + 40 +0.09 + 9 +$DIMJUST + 70 + 0 + 9 +$DIMSD1 + 70 + 0 + 9 +$DIMSD2 + 70 + 0 + 9 +$DIMTOLJ + 70 + 1 + 9 +$DIMTZIN + 70 + 0 + 9 +$DIMALTZ + 70 + 0 + 9 +$DIMALTTZ + 70 + 0 + 9 +$DIMFIT + 70 + 3 + 9 +$DIMUPT + 70 + 0 + 9 +$DIMUNIT + 70 + 2 + 9 +$DIMDEC + 70 + 4 + 9 +$DIMTDEC + 70 + 4 + 9 +$DIMALTU + 70 + 2 + 9 +$DIMALTTD + 70 + 2 + 9 +$DIMTXSTY + 7 +STANDARD + 9 +$DIMAUNIT + 70 + 0 + 9 +$LUNITS + 70 + 2 + 9 +$LUPREC + 70 + 4 + 9 +$SKETCHINC + 40 +0.1 + 9 +$FILLETRAD + 40 +0.5 + 9 +$AUNITS + 70 + 0 + 9 +$AUPREC + 70 + 0 + 9 +$MENU + 1 +. + 9 +$ELEVATION + 40 +0.0 + 9 +$PELEVATION + 40 +0.0 + 9 +$THICKNESS + 40 +0.0 + 9 +$LIMCHECK + 70 + 0 + 9 +$CHAMFERA + 40 +0.0 + 9 +$CHAMFERB + 40 +0.0 + 9 +$CHAMFERC + 40 +0.0 + 9 +$CHAMFERD + 40 +0.0 + 9 +$SKPOLY + 70 + 0 + 9 +$TDCREATE + 40 +2460691.988142037 + 9 +$TDUPDATE + 40 +2460691.988142048 + 9 +$TDINDWG + 40 +0.0000000116 + 9 +$TDUSRTIMER + 40 +0.0000000116 + 9 +$USRTIMER + 70 + 1 + 9 +$ANGBASE + 50 +0.0 + 9 +$ANGDIR + 70 + 0 + 9 +$PDMODE + 70 + 0 + 9 +$PDSIZE + 40 +0.0 + 9 +$PLINEWID + 40 +0.0 + 9 +$COORDS + 70 + 1 + 9 +$SPLFRAME + 70 + 0 + 9 +$SPLINETYPE + 70 + 6 + 9 +$SPLINESEGS + 70 + 8 + 9 +$ATTDIA + 70 + 0 + 9 +$ATTREQ + 70 + 1 + 9 +$HANDLING + 70 + 1 + 9 +$HANDSEED + 5 +100000E1 + 9 +$SURFTAB1 + 70 + 6 + 9 +$SURFTAB2 + 70 + 6 + 9 +$SURFTYPE + 70 + 6 + 9 +$SURFU + 70 + 6 + 9 +$SURFV + 70 + 6 + 9 +$UCSNAME + 2 + + 9 +$UCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$PUCSNAME + 2 + + 9 +$PUCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$USERI1 + 70 + 0 + 9 +$USERI2 + 70 + 0 + 9 +$USERI3 + 70 + 0 + 9 +$USERI4 + 70 + 0 + 9 +$USERI5 + 70 + 0 + 9 +$USERR1 + 40 +0.0 + 9 +$USERR2 + 40 +0.0 + 9 +$USERR3 + 40 +0.0 + 9 +$USERR4 + 40 +0.0 + 9 +$USERR5 + 40 +0.0 + 9 +$WORLDVIEW + 70 + 1 + 9 +$SHADEDGE + 70 + 3 + 9 +$SHADEDIF + 70 + 70 + 9 +$TILEMODE + 70 + 1 + 9 +$MAXACTVP + 70 + 64 + 9 +$PINSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PLIMCHECK + 70 + 0 + 9 +$PEXTMIN + 10 +1.000000000000000E+20 + 20 +1.000000000000000E+20 + 30 +1.000000000000000E+20 + 9 +$PEXTMAX + 10 +-1.000000000000000E+20 + 20 +-1.000000000000000E+20 + 30 +-1.000000000000000E+20 + 9 +$PLIMMIN + 10 +0.0 + 20 +0.0 + 9 +$PLIMMAX + 10 +12.0 + 20 +9.0 + 9 +$UNITMODE + 70 + 0 + 9 +$VISRETAIN + 70 + 1 + 9 +$PLINEGEN + 70 + 0 + 9 +$PSLTSCALE + 70 + 1 + 9 +$TREEDEPTH + 70 + 3020 + 9 +$PICKSTYLE + 70 + 1 + 9 +$CMLSTYLE + 2 +STANDARD + 9 +$CMLJUST + 70 + 0 + 9 +$CMLSCALE + 40 +1.0 + 9 +$PROXYGRAPHICS + 70 + 1 + 9 +$MEASUREMENT + 70 + 0 + 0 +ENDSEC + 0 +SECTION + 2 +CLASSES + 0 +CLASS + 1 +ACDBDICTIONARYWDFLT + 2 +AcDbDictionaryWithDefault + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +VISUALSTYLE + 2 +AcDbVisualStyle + 3 +ObjectDBX Classes + 90 + 4095 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MATERIAL + 2 +AcDbMaterial + 3 +ObjectDBX Classes + 90 + 1153 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SCALE + 2 +AcDbScale + 3 +ObjectDBX Classes + 90 + 1153 +280 + 0 +281 + 0 + 0 +CLASS + 1 +TABLESTYLE + 2 +AcDbTableStyle + 3 +ObjectDBX Classes + 90 + 4095 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MLEADERSTYLE + 2 +AcDbMLeaderStyle + 3 +ACDB_MLEADERSTYLE_CLASS + 90 + 4095 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SUN + 2 +AcDbSun + 3 +SCENEOE + 90 + 1153 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SORTENTSTABLE + 2 +AcDbSortentsTable + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +DICTIONARYVAR + 2 +AcDbDictionaryVar + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +XRECORD + 2 +AcDbXrecord + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +LWPOLYLINE + 2 +AcDbPolyline + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +HATCH + 2 +AcDbHatch + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 1 + 0 +CLASS + 1 +ACDBPLACEHOLDER + 2 +AcDbPlaceHolder + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +CLASS + 1 +LAYOUT + 2 +AcDbLayout + 3 +ObjectDBX Classes + 90 + 0 +280 + 0 +281 + 0 + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +102 +{ACAD_XDICTIONARY +360 +100000D6 +102 +} +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +VPORT + 5 +29 +330 +8 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*ACTIVE + 70 + 0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +10.42990654205607 + 22 +4.5 + 13 +0.0 + 23 +0.0 + 14 +0.5 + 24 +0.5 + 15 +0.5 + 25 +0.5 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 40 +9.0 + 41 +1.972972972850329 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 50 +0.0 + 51 +0.0 + 71 + 0 + 72 + 100 + 73 + 1 + 74 + 3 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +5 +330 +0 +100 +AcDbSymbolTable + 70 + 7 + 0 +LTYPE + 5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYBLOCK + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BYLAYER + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CONTINUOUS + 70 + 0 + 3 +Solid line + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +10000024 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ONS_PHANTOM + 70 + 0 + 3 +Onshape Phantom line ______ __ __ ______ + 72 + 65 + 73 + 6 + 40 +0.4999999999999999 + 49 +0.25 + 74 + 0 + 49 +-0.05 + 74 + 0 + 49 +0.05 + 74 + 0 + 49 +-0.05 + 74 + 0 + 49 +0.05 + 74 + 0 + 49 +-0.05 + 74 + 0 + 0 +LTYPE + 5 +10000025 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER + 70 + 0 + 3 +Center line ____ _ ____ _ ____ _ + 72 + 65 + 73 + 4 + 40 +0.7199999999999999 + 49 +0.45 + 74 + 0 + 49 +-0.09 + 74 + 0 + 49 +0.09 + 74 + 0 + 49 +-0.09 + 74 + 0 + 0 +LTYPE + 5 +10000026 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED + 70 + 0 + 3 +Dashed line __ __ __ __ __ + 72 + 65 + 73 + 2 + 40 +0.75 + 49 +0.5 + 74 + 0 + 49 +-0.25 + 74 + 0 + 0 +LTYPE + 5 +10000027 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ONS_DASHDOT + 70 + 0 + 3 +Onshape Dashed with Dot _ . ____ . ____ + 72 + 65 + 73 + 4 + 40 +0.71 + 49 +0.5 + 74 + 0 + 49 +-0.1 + 74 + 0 + 49 +0.01 + 74 + 0 + 49 +-0.1 + 74 + 0 + 0 +LTYPE + 5 +10000028 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ONS_DOTTED + 70 + 0 + 3 +Onshape Dotted line . . . . . . . + 72 + 65 + 73 + 2 + 40 +0.11 + 49 +0.01 + 74 + 0 + 49 +-0.1 + 74 + 0 + 0 +LTYPE + 5 +10000029 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +HIDDEN + 70 + 0 + 3 +Hidden line ____ ____ ____ ____ + 72 + 65 + 73 + 2 + 40 +0.15 + 49 +0.1 + 74 + 0 + 49 +-0.05 + 74 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +2 +330 +0 +100 +AcDbSymbolTable + 70 + 46 + 0 +LAYER + 5 +10 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002A +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SECTION_CUTTING_LINE + 70 + 0 + 62 + 7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000002B +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +DETAIL_VIEW_BORDER + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002C +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +DETAIL_VIEW_PARENT_BORDER + 70 + 0 + 62 + 7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000002D +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TEXT + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002E +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SKETCHED_GEOMETRY + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000002F +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +VIRTUAL_SHARPS + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000030 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +CENTERLINES + 70 + 0 + 62 + -7 + 6 +CENTER + 0 +LAYER + 5 +10000031 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +CENTERMARKS + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000032 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TABLES + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000033 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +IMAGES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000034 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +ANNOTATION_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000035 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +ANNOTATION_TEXT + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000036 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SIDE_THREAD_SYMBOLS + 70 + 0 + 62 + 7 + 6 +HIDDEN + 0 +LAYER + 5 +10000037 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SIDE_THREAD_SYMBOLS_HIDDEN + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +10000038 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SURFACE_THREAD_SYMBOLS + 70 + 0 + 62 + 7 + 6 +HIDDEN + 0 +LAYER + 5 +10000039 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SURFACE_THREAD_SYMBOLS_ON_ + 70 + 0 + 62 + 7 + 6 +HIDDEN + 0 +LAYER + 5 +1000003A +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SURFACE_THREAD_SYMBOLS_HID + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +1000003B +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BLIND_THREAD_SYMBOLS + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000003C +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BLIND_THREAD_SYMBOLS_HIDDE + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +1000003D +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +EXPLODE_LINES + 70 + 0 + 62 + 7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000003E +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +HIDDEN_EXPLODE_LINES + 70 + 0 + 62 + -7 + 6 +ONS_PHANTOM + 0 +LAYER + 5 +1000003F +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BREAK_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000040 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_BEND_LINES_UP + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000041 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_BEND_LINES_DOWN + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000042 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_BEND_TANGENT_LI + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000043 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_CUT_LINES + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000044 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_CBORE_CSINK_UP + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000045 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_CBORE_CSINK_DOW + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000046 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_TEAR + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000047 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_UP + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000048 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_DOWN + 70 + 0 + 62 + 7 + 6 +CENTER + 0 +LAYER + 5 +10000049 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SHEETMETAL_FORMED_CENTERMA + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004A +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +REGION_ASSOC_POINTS + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004B +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +PATTERN_CENTERLINES + 70 + 1 + 62 + -7 + 6 +CENTER + 0 +LAYER + 5 +1000004C +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +HIDDEN + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +1000004D +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +VISIBLE + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004E +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +MODELSKETCH_VISIBLE + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +1000004F +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +MODELSKETCH_POINT + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000050 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +MODELSKETCH_CONSTRUCTION + 70 + 0 + 62 + -7 + 6 +CENTER + 0 +LAYER + 5 +10000051 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +HIDDEN_BASE_VIEW + 70 + 0 + 62 + 7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000052 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TANGENT_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000053 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +TANGENT_HIDDEN + 70 + 0 + 62 + -7 + 6 +HIDDEN + 0 +LAYER + 5 +10000054 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +INVISIBLE_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000055 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +VIEW_HATCHES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +LAYER + 5 +10000056 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SECTION_JOG_LINES + 70 + 0 + 62 + -7 + 6 +CONTINUOUS + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +3 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +STYLE + 5 +11 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +STANDARD + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +txt + 4 + + 0 +STYLE + 5 +10000004 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +TTFSTYLE + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +Verdana.ttf + 4 + +1001 +ACAD +1000 +Verdana +1071 + 34 + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +6 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +7 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +9 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +APPID + 5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 + 0 + 0 +APPID + 5 +100000E0 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_MLEADERVER + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +A +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +DIMSTYLE +105 +27 +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +STANDARD + 70 + 0 + 3 + + 4 + + 5 + + 6 + + 7 + + 40 +1.0 + 41 +0.18 + 42 +0.0625 + 43 +0.38 + 44 +0.18 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 +140 +0.18 +141 +0.09 +142 +0.0 +143 +25.4 +144 +1.0 +145 +0.0 +146 +1.0 +147 +0.09 + 71 + 0 + 72 + 0 + 73 + 1 + 74 + 1 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 +170 + 0 +171 + 2 +172 + 0 +173 + 0 +174 + 0 +175 + 0 +176 + 0 +177 + 0 +178 + 0 +270 + 2 +271 + 4 +272 + 4 +273 + 2 +274 + 2 +340 +11 +275 + 0 +280 + 0 +281 + 0 +282 + 0 +283 + 1 +284 + 0 +285 + 0 +286 + 0 +287 + 3 +288 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +BLOCK_RECORD + 5 +1F +102 +{ACAD_XDICTIONARY +360 +100000AB +102 +} +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*MODEL_SPACE + 0 +BLOCK_RECORD + 5 +1B +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*PAPER_SPACE + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +20 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*MODEL_SPACE + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*MODEL_SPACE + 1 + + 0 +ENDBLK + 5 +21 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockBegin + 2 +*PAPER_SPACE + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*PAPER_SPACE + 1 + + 0 +ENDBLK + 5 +1D +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +CIRCLE + 5 +10000057 +102 +{ACAD_XDICTIONARY +360 +10000058 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.691864499246996 + 20 +1.978692532150917 + 30 +0.0 + 40 +0.0433070866141732 + 0 +CIRCLE + 5 +1000005C +102 +{ACAD_XDICTIONARY +360 +1000005D +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.691864499246996 + 20 +-1.999494072894727 + 30 +0.0 + 40 +0.0433070866141734 + 0 +CIRCLE + 5 +10000061 +102 +{ACAD_XDICTIONARY +360 +10000062 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.690039833697742 + 20 +-1.999494072894726 + 30 +0.0 + 40 +0.0433070866141732 + 0 +CIRCLE + 5 +10000066 +102 +{ACAD_XDICTIONARY +360 +10000067 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.690039833697742 + 20 +1.978692532150917 + 30 +0.0 + 40 +0.0433070866141732 + 0 +ARC + 5 +1000006B +102 +{ACAD_XDICTIONARY +360 +1000006C +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.719011125448933 + 20 +2.005837968293569 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +89.99999979901465 + 51 +180.0025119999997 + 0 +LINE + 5 +10000070 +102 +{ACAD_XDICTIONARY +360 +10000071 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.769011125400878 + 20 +2.005835776160029 + 30 +0.0 + 11 +-1.768834330818185 + 21 +-2.02664170101368 + 31 +0.0 + 0 +ARC + 5 +10000073 +102 +{ACAD_XDICTIONARY +360 +10000074 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.718834330866239 + 20 +-2.02663950888014 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +180.0025120000003 + 51 +270.0 + 0 +LINE + 5 +10000078 +102 +{ACAD_XDICTIONARY +360 +10000079 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.718834330866239 + 20 +-2.076639508880139 + 30 +0.0 + 11 +1.71718645983766 + 21 +-2.076639508880139 + 31 +0.0 + 0 +ARC + 5 +1000007B +102 +{ACAD_XDICTIONARY +360 +1000007C +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.71718645983766 + 20 +-2.02663950888014 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +270.0 + 51 +0.0025119999997547 + 0 +LINE + 5 +10000080 +102 +{ACAD_XDICTIONARY +360 +10000081 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +1.76700966520744 + 20 +2.005840148374042 + 30 +0.0 + 11 +1.767186459789605 + 21 +-2.0266373167466 + 31 +0.0 + 0 +ARC + 5 +10000083 +102 +{ACAD_XDICTIONARY +360 +10000084 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.717009665255494 + 20 +2.005837956240502 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +0.0025119999997547 + 51 +89.99999979901465 + 0 +LINE + 5 +10000088 +102 +{ACAD_XDICTIONARY +360 +10000089 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.71901112527354 + 20 +2.055837968293568 + 30 +0.0 + 11 +1.717009665430887 + 21 +2.055837956240502 + 31 +0.0 + 0 +LINE + 5 +1000008B +102 +{ACAD_XDICTIONARY +360 +1000008C +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +1.572048466055199 + 20 +1.170837956749006 + 30 +0.0 + 11 +-1.573972324370468 + 21 +1.170837967784794 + 31 +0.0 + 0 +ARC + 5 +1000008E +102 +{ACAD_XDICTIONARY +360 +1000008F +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.572048465879806 + 20 +1.120837956749006 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +0.002512000000518 + 51 +89.99999979901439 + 0 +LINE + 5 +10000093 +102 +{ACAD_XDICTIONARY +360 +10000094 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +1.622048465831752 + 20 +1.120840148882546 + 30 +0.0 + 11 +1.622180979354836 + 21 +-1.901638193600017 + 31 +0.0 + 0 +ARC + 5 +10000096 +102 +{ACAD_XDICTIONARY +360 +10000097 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +1.592180979383669 + 20 +-1.90163950888014 + 30 +0.0 + 40 +0.0299999999999999 +100 +AcDbArc + 50 +270.0 + 51 +0.0025119999975156 + 0 +LINE + 5 +1000009B +102 +{ACAD_XDICTIONARY +360 +1000009C +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.593839811079958 + 20 +-1.93163950888014 + 30 +0.0 + 11 +1.592180979383669 + 21 +-1.93163950888014 + 31 +0.0 + 0 +ARC + 5 +1000009E +102 +{ACAD_XDICTIONARY +360 +1000009F +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.593839811079959 + 20 +-1.90163950888014 + 30 +0.0 + 40 +0.0299999999999995 +100 +AcDbArc + 50 +180.0025119999997 + 51 +270.0000000000008 + 0 +LINE + 5 +100000A3 +102 +{ACAD_XDICTIONARY +360 +100000A4 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbLine + 10 +-1.623972324497807 + 20 +1.120835775651253 + 30 +0.0 + 11 +-1.623839811051125 + 21 +-1.901640824160264 + 31 +0.0 + 0 +ARC + 5 +100000A6 +102 +{ACAD_XDICTIONARY +360 +100000A7 +102 +} +330 +1F +100 +AcDbEntity + 8 +VISIBLE +100 +AcDbCircle + 10 +-1.573972324545861 + 20 +1.120837967784793 + 30 +0.0 + 40 +0.05 +100 +AcDbArc + 50 +89.99999979901439 + 51 +180.0025120000003 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +C +330 +0 +100 +AcDbDictionary + 3 +ACAD_GROUP +350 +D + 3 +ACAD_LAYOUT +350 +1A + 3 +ACAD_MATERIAL +350 +43 + 3 +ACAD_MLEADERSTYLE +350 +6B + 3 +ACAD_MLINESTYLE +350 +17 + 3 +ACAD_PLOTSETTINGS +350 +19 + 3 +ACAD_SCALELIST +350 +47 + 3 +ACAD_VISUALSTYLE +350 +2A + 3 +ACDBHEADERROUNDTRIPXREC +350 +100000AD + 3 +ACDBVARIABLEDICTIONARY +350 +100000CE + 3 +DWGPROPS +350 +100000D5 + 3 +ONSHAPE_DATA +350 +10000001 + 0 +DICTIONARY + 5 +100000D6 +330 +8 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000D7 + 0 +DICTIONARY + 5 +100000AB +330 +1F +100 +AcDbDictionary +280 + 1 + 3 +ACAD_SORTENTS +360 +100000AC + 0 +DICTIONARY + 5 +10000058 +330 +10000057 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000005B + 3 +BTDETID +360 +10000059 + 3 +BTOWNERFACEID_ +360 +1000005A + 0 +DICTIONARY + 5 +1000005D +330 +1000005C +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000060 + 3 +BTDETID +360 +1000005E + 3 +BTOWNERFACEID_ +360 +1000005F + 0 +DICTIONARY + 5 +10000062 +330 +10000061 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000065 + 3 +BTDETID +360 +10000063 + 3 +BTOWNERFACEID_ +360 +10000064 + 0 +DICTIONARY + 5 +10000067 +330 +10000066 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000006A + 3 +BTDETID +360 +10000068 + 3 +BTOWNERFACEID_ +360 +10000069 + 0 +DICTIONARY + 5 +1000006C +330 +1000006B +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000006F + 3 +BTDETID +360 +1000006D + 3 +BTOWNERFACEID_ +360 +1000006E + 0 +DICTIONARY + 5 +10000071 +330 +10000070 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +10000072 + 0 +DICTIONARY + 5 +10000074 +330 +10000073 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000077 + 3 +BTDETID +360 +10000075 + 3 +BTOWNERFACEID_ +360 +10000076 + 0 +DICTIONARY + 5 +10000079 +330 +10000078 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +1000007A + 0 +DICTIONARY + 5 +1000007C +330 +1000007B +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000007F + 3 +BTDETID +360 +1000007D + 3 +BTOWNERFACEID_ +360 +1000007E + 0 +DICTIONARY + 5 +10000081 +330 +10000080 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +10000082 + 0 +DICTIONARY + 5 +10000084 +330 +10000083 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000087 + 3 +BTDETID +360 +10000085 + 3 +BTOWNERFACEID_ +360 +10000086 + 0 +DICTIONARY + 5 +10000089 +330 +10000088 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +1000008A + 0 +DICTIONARY + 5 +1000008C +330 +1000008B +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +1000008D + 0 +DICTIONARY + 5 +1000008F +330 +1000008E +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +10000092 + 3 +BTDETID +360 +10000090 + 3 +BTOWNERFACEID_ +360 +10000091 + 0 +DICTIONARY + 5 +10000094 +330 +10000093 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +10000095 + 0 +DICTIONARY + 5 +10000097 +330 +10000096 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +1000009A + 3 +BTDETID +360 +10000098 + 3 +BTOWNERFACEID_ +360 +10000099 + 0 +DICTIONARY + 5 +1000009C +330 +1000009B +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +1000009D + 0 +DICTIONARY + 5 +1000009F +330 +1000009E +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +100000A2 + 3 +BTDETID +360 +100000A0 + 3 +BTOWNERFACEID_ +360 +100000A1 + 0 +DICTIONARY + 5 +100000A4 +330 +100000A3 +100 +AcDbDictionary +280 + 1 + 3 +BTDETID +360 +100000A5 + 0 +DICTIONARY + 5 +100000A7 +330 +100000A6 +100 +AcDbDictionary +280 + 1 + 3 +BTARCONSURFACERADIUS +360 +100000AA + 3 +BTDETID +360 +100000A8 + 3 +BTOWNERFACEID_ +360 +100000A9 + 0 +DICTIONARY + 5 +D +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +1A +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +43 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +BYBLOCK +350 +45 + 3 +BYLAYER +350 +44 + 3 +GLOBAL +350 +46 + 0 +DICTIONARY + 5 +6B +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +STANDARD +350 +6C + 0 +DICTIONARY + 5 +17 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +STANDARD +350 +18 + 0 +DICTIONARY + 5 +19 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 0 +DICTIONARY + 5 +47 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +SCALE100_1 +350 +10000023 + 3 +SCALE10_1 +350 +1000001D + 3 +SCALE12_1 +350 +1000001E + 3 +SCALE16_1 +350 +1000001F + 3 +SCALE1_1 +350 +10000006 + 3 +SCALE1_10 +350 +1000000D + 3 +SCALE1_100 +350 +10000016 + 3 +SCALE1_12 +350 +1000000E + 3 +SCALE1_16 +350 +1000000F + 3 +SCALE1_2 +350 +10000007 + 3 +SCALE1_20 +350 +10000010 + 3 +SCALE1_25 +350 +10000011 + 3 +SCALE1_3 +350 +10000008 + 3 +SCALE1_32 +350 +10000012 + 3 +SCALE1_4 +350 +10000009 + 3 +SCALE1_40 +350 +10000013 + 3 +SCALE1_5 +350 +1000000A + 3 +SCALE1_50 +350 +10000014 + 3 +SCALE1_6 +350 +1000000B + 3 +SCALE1_8 +350 +1000000C + 3 +SCALE1_80 +350 +10000015 + 3 +SCALE20_1 +350 +10000020 + 3 +SCALE2_1 +350 +10000017 + 3 +SCALE32_1 +350 +10000021 + 3 +SCALE3_1 +350 +10000018 + 3 +SCALE4_1 +350 +10000019 + 3 +SCALE50_1 +350 +10000022 + 3 +SCALE5_1 +350 +1000001A + 3 +SCALE6_1 +350 +1000001B + 3 +SCALE8_1 +350 +1000001C + 0 +DICTIONARY + 5 +2A +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +2DWIREFRAME +350 +2F + 3 +BASIC +350 +32 + 3 +BRIGHTEN +350 +36 + 3 +COLORCHANGE +350 +3A + 3 +CONCEPTUAL +350 +34 + 3 +DIM +350 +35 + 3 +EDGECOLOROFF +350 +3D + 3 +FACEPATTERN +350 +39 + 3 +FLAT +350 +2B + 3 +FLATWITHEDGES +350 +2C + 3 +GOURAUD +350 +2D + 3 +GOURAUDWITHEDGES +350 +2E + 3 +HIDDEN +350 +31 + 3 +JITTEROFF +350 +3B + 3 +LINEPATTERN +350 +38 + 3 +OVERHANGOFF +350 +3C + 3 +REALISTIC +350 +33 + 3 +SHADED +350 +42 + 3 +SHADED_WITH_EDGES +350 +41 + 3 +SHADES_OF_GRAY +350 +3E + 3 +SKETCHY +350 +3F + 3 +THICKEN +350 +37 + 3 +WIREFRAME +350 +30 + 3 +X-RAY +350 +40 + 0 +DICTIONARY + 5 +100000AD +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +CEPSNID +350 +100000B7 + 3 +CEPSNTYPE +350 +100000B6 + 3 +DIMSTYLEDATA +350 +100000CD + 3 +FINGERPRINTGUID +350 +100000B8 + 3 +HYPERLINKBASE +350 +100000B0 + 3 +INSUNITS +350 +100000B5 + 3 +LAYOUTDICT +350 +100000B2 + 3 +LWETCUNION +350 +100000B4 + 3 +PLOTSETDICT +350 +100000B3 + 3 +PSVPSCALE +350 +100000BA + 3 +PUCSBASE +350 +100000BD + 3 +PUCSORGBACK +350 +100000C3 + 3 +PUCSORGBOTTOM +350 +100000BF + 3 +PUCSORGFRONT +350 +100000C2 + 3 +PUCSORGLEFT +350 +100000C0 + 3 +PUCSORGRIGHT +350 +100000C1 + 3 +PUCSORGTOP +350 +100000BE + 3 +PUCSORTHOREF +350 +100000BB + 3 +PUCSORTHOVIEW +350 +100000BC + 3 +STYLESHEET +350 +100000B1 + 3 +TSTACKALIGN +350 +100000AE + 3 +TSTACKSIZE +350 +100000AF + 3 +UCSBASE +350 +100000C6 + 3 +UCSORGBACK +350 +100000CC + 3 +UCSORGBOTTOM +350 +100000C8 + 3 +UCSORGFRONT +350 +100000CB + 3 +UCSORGLEFT +350 +100000C9 + 3 +UCSORGRIGHT +350 +100000CA + 3 +UCSORGTOP +350 +100000C7 + 3 +UCSORTHOREF +350 +100000C4 + 3 +UCSORTHOVIEW +350 +100000C5 + 3 +VERSIONGUID +350 +100000B9 + 0 +DICTIONARY + 5 +100000CE +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary + 3 +CANNOSCALE +350 +100000D8 + 3 +CMLEADERSTYLE +350 +100000D0 + 3 +CTABLESTYLE +350 +100000CF + 3 +DIMASSOC +350 +100000D3 + 3 +HIDETEXT +350 +100000D4 + 3 +MSLTSCALE +350 +100000D9 + 0 +XRECORD + 5 +100000D5 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbXrecord + 1 +DWGPROPS COOKIE + 2 + + 3 + + 4 + + 6 +File was created by BTDwgCreate + 7 + + 8 + + 9 + +300 += +301 += +302 += +303 += +304 += +305 += +306 += +307 += +308 += +309 += + 40 +0.0 + 41 +2460691.988142037 + 42 +2460691.988142048 + 1 + + 90 + 0 + 0 +DICTIONARY + 5 +10000001 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +280 + 1 + 3 +DIM_UNITS +360 +10000003 + 3 +DWGGEN_VERSION +360 +10000002 + 3 +FIRST_ANGLE +360 +10000005 + 0 +XRECORD + 5 +100000D7 +102 +{ACAD_REACTORS +330 +100000D6 +102 +} +330 +100000D6 +100 +AcDbXrecord +102 +VTR_0.000_0.000_1.000_1.000_VISUALSTYLE +340 +2F +102 +VTR_0.000_0.000_1.000_1.000_GRIDDISPLAY + 70 + 3 +102 +VTR_0.000_0.000_1.000_1.000_GRIDMAJOR + 70 + 5 +102 +VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTING +280 + 1 +102 +VTR_0.000_0.000_1.000_1.000_DEFAULTLIGHTINGTYPE + 70 + 1 +102 +VTR_0.000_0.000_1.000_1.000_BRIGHTNESS +141 +0.0 +102 +VTR_0.000_0.000_1.000_1.000_CONTRAST +142 +0.0 + 0 +SORTENTSTABLE + 5 +100000AC +102 +{ACAD_REACTORS +330 +100000AB +102 +} +330 +100000AB +100 +AcDbSortentsTable +330 +1F + 0 +XRECORD + 5 +1000005B +102 +{ACAD_REACTORS +330 +10000058 +102 +} +330 +10000058 +100 +AcDbXrecord + 40 +0.0433070866141732 + 0 +XRECORD + 5 +10000059 +102 +{ACAD_REACTORS +330 +10000058 +102 +} +330 +10000058 +100 +AcDbXrecord +1000 +RXBh + 0 +XRECORD + 5 +1000005A +102 +{ACAD_REACTORS +330 +10000058 +102 +} +330 +10000058 +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +10000060 +102 +{ACAD_REACTORS +330 +1000005D +102 +} +330 +1000005D +100 +AcDbXrecord + 40 +0.0433070866141734 + 0 +XRECORD + 5 +1000005E +102 +{ACAD_REACTORS +330 +1000005D +102 +} +330 +1000005D +100 +AcDbXrecord +1000 +RXBt + 0 +XRECORD + 5 +1000005F +102 +{ACAD_REACTORS +330 +1000005D +102 +} +330 +1000005D +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +10000065 +102 +{ACAD_REACTORS +330 +10000062 +102 +} +330 +10000062 +100 +AcDbXrecord + 40 +0.0433070866141732 + 0 +XRECORD + 5 +10000063 +102 +{ACAD_REACTORS +330 +10000062 +102 +} +330 +10000062 +100 +AcDbXrecord +1000 +RXBp + 0 +XRECORD + 5 +10000064 +102 +{ACAD_REACTORS +330 +10000062 +102 +} +330 +10000062 +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +1000006A +102 +{ACAD_REACTORS +330 +10000067 +102 +} +330 +10000067 +100 +AcDbXrecord + 40 +0.0433070866141732 + 0 +XRECORD + 5 +10000068 +102 +{ACAD_REACTORS +330 +10000067 +102 +} +330 +10000067 +100 +AcDbXrecord +1000 +RXBl + 0 +XRECORD + 5 +10000069 +102 +{ACAD_REACTORS +330 +10000067 +102 +} +330 +10000067 +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +1000006F +102 +{ACAD_REACTORS +330 +1000006C +102 +} +330 +1000006C +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +1000006D +102 +{ACAD_REACTORS +330 +1000006C +102 +} +330 +1000006C +100 +AcDbXrecord +1000 +SLBFB + 0 +XRECORD + 5 +1000006E +102 +{ACAD_REACTORS +330 +1000006C +102 +} +330 +1000006C +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +10000072 +102 +{ACAD_REACTORS +330 +10000071 +102 +} +330 +10000071 +100 +AcDbXrecord +1000 +SLBlB + 0 +XRECORD + 5 +10000077 +102 +{ACAD_REACTORS +330 +10000074 +102 +} +330 +10000074 +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +10000075 +102 +{ACAD_REACTORS +330 +10000074 +102 +} +330 +10000074 +100 +AcDbXrecord +1000 +SLBtB + 0 +XRECORD + 5 +10000076 +102 +{ACAD_REACTORS +330 +10000074 +102 +} +330 +10000074 +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +1000007A +102 +{ACAD_REACTORS +330 +10000079 +102 +} +330 +10000079 +100 +AcDbXrecord +1000 +SLB1B + 0 +XRECORD + 5 +1000007F +102 +{ACAD_REACTORS +330 +1000007C +102 +} +330 +1000007C +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +1000007D +102 +{ACAD_REACTORS +330 +1000007C +102 +} +330 +1000007C +100 +AcDbXrecord +1000 +SLB9B + 0 +XRECORD + 5 +1000007E +102 +{ACAD_REACTORS +330 +1000007C +102 +} +330 +1000007C +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +10000082 +102 +{ACAD_REACTORS +330 +10000081 +102 +} +330 +10000081 +100 +AcDbXrecord +1000 +SLBVB + 0 +XRECORD + 5 +10000087 +102 +{ACAD_REACTORS +330 +10000084 +102 +} +330 +10000084 +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +10000085 +102 +{ACAD_REACTORS +330 +10000084 +102 +} +330 +10000084 +100 +AcDbXrecord +1000 +SLBNB + 0 +XRECORD + 5 +10000086 +102 +{ACAD_REACTORS +330 +10000084 +102 +} +330 +10000084 +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +1000008A +102 +{ACAD_REACTORS +330 +10000089 +102 +} +330 +10000089 +100 +AcDbXrecord +1000 +RLB9 + 0 +XRECORD + 5 +1000008D +102 +{ACAD_REACTORS +330 +1000008C +102 +} +330 +1000008C +100 +AcDbXrecord +1000 +RMBl + 0 +XRECORD + 5 +10000092 +102 +{ACAD_REACTORS +330 +1000008F +102 +} +330 +1000008F +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +10000090 +102 +{ACAD_REACTORS +330 +1000008F +102 +} +330 +1000008F +100 +AcDbXrecord +1000 +RMBF + 0 +XRECORD + 5 +10000091 +102 +{ACAD_REACTORS +330 +1000008F +102 +} +330 +1000008F +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +10000095 +102 +{ACAD_REACTORS +330 +10000094 +102 +} +330 +10000094 +100 +AcDbXrecord +1000 +RMB1 + 0 +XRECORD + 5 +1000009A +102 +{ACAD_REACTORS +330 +10000097 +102 +} +330 +10000097 +100 +AcDbXrecord + 40 +0.0299999999999999 + 0 +XRECORD + 5 +10000098 +102 +{ACAD_REACTORS +330 +10000097 +102 +} +330 +10000097 +100 +AcDbXrecord +1000 +SLBdC + 0 +XRECORD + 5 +10000099 +102 +{ACAD_REACTORS +330 +10000097 +102 +} +330 +10000097 +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +1000009D +102 +{ACAD_REACTORS +330 +1000009C +102 +} +330 +1000009C +100 +AcDbXrecord +1000 +SLBVC + 0 +XRECORD + 5 +100000A2 +102 +{ACAD_REACTORS +330 +1000009F +102 +} +330 +1000009F +100 +AcDbXrecord + 40 +0.0299999999999995 + 0 +XRECORD + 5 +100000A0 +102 +{ACAD_REACTORS +330 +1000009F +102 +} +330 +1000009F +100 +AcDbXrecord +1000 +SLBNC + 0 +XRECORD + 5 +100000A1 +102 +{ACAD_REACTORS +330 +1000009F +102 +} +330 +1000009F +100 +AcDbXrecord +1000 +RXBK + 0 +XRECORD + 5 +100000A5 +102 +{ACAD_REACTORS +330 +100000A4 +102 +} +330 +100000A4 +100 +AcDbXrecord +1000 +RMBt + 0 +XRECORD + 5 +100000AA +102 +{ACAD_REACTORS +330 +100000A7 +102 +} +330 +100000A7 +100 +AcDbXrecord + 40 +0.05 + 0 +XRECORD + 5 +100000A8 +102 +{ACAD_REACTORS +330 +100000A7 +102 +} +330 +100000A7 +100 +AcDbXrecord +1000 +RMBV + 0 +XRECORD + 5 +100000A9 +102 +{ACAD_REACTORS +330 +100000A7 +102 +} +330 +100000A7 +100 +AcDbXrecord +1000 +RXBK + 0 +MATERIAL + 5 +45 +102 +{ACAD_REACTORS +330 +43 +102 +} +102 +{ACAD_XDICTIONARY +360 +100000DC +102 +} +330 +43 +100 +AcDbMaterial + 1 +BYBLOCK + 0 +MATERIAL + 5 +44 +102 +{ACAD_REACTORS +330 +43 +102 +} +102 +{ACAD_XDICTIONARY +360 +100000DA +102 +} +330 +43 +100 +AcDbMaterial + 1 +BYLAYER + 0 +MATERIAL + 5 +46 +102 +{ACAD_REACTORS +330 +43 +102 +} +102 +{ACAD_XDICTIONARY +360 +100000DE +102 +} +330 +43 +100 +AcDbMaterial + 1 +GLOBAL + 0 +ACAD_PROXY_OBJECT + 5 +6C +102 +{ACAD_REACTORS +330 +6B +102 +} +330 +6B +100 +AcDbProxyObject + 90 + 499 + 91 + 505 + 93 + 610 +310 +40901902A4063FBFFFFFE056BD1B81E855B9FC0AD7A3703D0AD73F4214DD185B99185C9900AD7A3703D0AC73F90141901A02B5E8DC0F42B1CFC02B5E8DC0F42B1CFE5764000000000000300FC0 +340 +14 +340 +0 +340 +11 +340 +0 + 94 + 0 +1001 +ACAD_MLEADERVER +1070 + 2 + 0 +MLINESTYLE + 5 +18 +102 +{ACAD_REACTORS +330 +17 +102 +} +330 +17 +100 +AcDbMlineStyle + 2 +Standard + 70 + 0 + 3 + + 62 + 256 + 51 +90.0 + 52 +90.0 + 71 + 2 + 49 +0.5 + 62 + 256 + 6 +BYLAYER + 49 +-0.5 + 62 + 256 + 6 +BYLAYER + 0 +ACAD_PROXY_OBJECT + 5 +10000023 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 121 +310 +9053130303A310000000000001650100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001D +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90431303A310000000000000910100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001E +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90431323A310000000000000A10100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001F +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90431363A310000000000000C10100 + 0 +ACAD_PROXY_OBJECT + 5 +10000006 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 41 +310 +903313A31500 + 0 +ACAD_PROXY_OBJECT + 5 +1000000D +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A31304000000000000244000 + 0 +ACAD_PROXY_OBJECT + 5 +10000016 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 121 +310 +905313A3130304000000000000594000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000E +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A31324000000000000284000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000F +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A31364000000000000304000 + 0 +ACAD_PROXY_OBJECT + 5 +10000007 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A324000000000000004000 + 0 +ACAD_PROXY_OBJECT + 5 +10000010 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A32304000000000000344000 + 0 +ACAD_PROXY_OBJECT + 5 +10000011 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A32354000000000000394000 + 0 +ACAD_PROXY_OBJECT + 5 +10000008 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A334000000000000084000 + 0 +ACAD_PROXY_OBJECT + 5 +10000012 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A33324000000000000404000 + 0 +ACAD_PROXY_OBJECT + 5 +10000009 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A344000000000000104000 + 0 +ACAD_PROXY_OBJECT + 5 +10000013 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A34304000000000000444000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000A +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A354000000000000144000 + 0 +ACAD_PROXY_OBJECT + 5 +10000014 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A35304000000000000494000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000B +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A364000000000000184000 + 0 +ACAD_PROXY_OBJECT + 5 +1000000C +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903313A384000000000000204000 + 0 +ACAD_PROXY_OBJECT + 5 +10000015 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +904313A38304000000000000544000 + 0 +ACAD_PROXY_OBJECT + 5 +10000020 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90432303A310000000000000D10100 + 0 +ACAD_PROXY_OBJECT + 5 +10000017 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903323A310000000000000010100 + 0 +ACAD_PROXY_OBJECT + 5 +10000021 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90433323A310000000000001010100 + 0 +ACAD_PROXY_OBJECT + 5 +10000018 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903333A310000000000000210100 + 0 +ACAD_PROXY_OBJECT + 5 +10000019 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903343A310000000000000410100 + 0 +ACAD_PROXY_OBJECT + 5 +10000022 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 113 +310 +90435303A310000000000001250100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001A +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903353A310000000000000510100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001B +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903363A310000000000000610100 + 0 +ACAD_PROXY_OBJECT + 5 +1000001C +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbProxyObject + 90 + 499 + 91 + 503 + 93 + 105 +310 +903383A310000000000000810100 + 0 +ACAD_PROXY_OBJECT + 5 +2F +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 436 +310 +42CC9915DA5C99599C985B595049028333333333333E33F0000000000000F90107901411070040501600405405064090741402480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +32 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 388 +310 +4150985CDA58D07406404333333333333E33F0000000000000F90107A41107004050150841D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +36 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 428 +310 +42109C9A59DA1D195B90C409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A029950 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3A +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 452 +310 +42D0DBDB1BDC90DA185B99D95104090240C333333333333E33F0000000000000F90108901411070040501508421405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +34 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 500 +310 +4290DBDB98D95C1D1D585B10940D028333333333333E33F0000000000000F90107902409070040501000000000018199010841D405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +35 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 412 +310 +40D11A5B50B409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A02677FFFFFD0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3D +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 452 +310 +43115919D950DBDB1BDC93D999916409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +39 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 444 +310 +42D19858D95C185D1D195C9B90F409028333333333333E33F0000000000000F9010790141107004050150841D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2B +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 380 +310 +41119B185D240901404333333333333E33F0000000000000F9010740A907004050150841D405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2C +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 468 +310 +43519B185D15DA5D1A115919D95CD0140901404333333333333E33F0000000000000F90107409019070040501600405405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2D +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 404 +310 +41D1DBDD5C985D5910240902404333333333333E33F0000000000000F9010740A9070040501641D405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +2E +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 492 +310 +4411DBDD5C985D5915DA5D1A115919D95CD0340902404333333333333E33F0000000000000F90107409019070040501600405405064090741402480A1B50 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +31 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 476 +310 +41921A5919195B90640502408333333333333E33F0000000000000F901079024090700405020000000000001110200405405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3B +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 428 +310 +42529A5D1D195C93D999914409028333333333333E33F0000000000000F9010790141107004050150A41D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +38 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 444 +310 +42D31A5B995C185D1D195C9B90E409028333333333333E33F0000000000000F9010790141107004050750841D405064090741402483A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3C +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 444 +310 +42D3DD995C9A185B99D3D999915409028333333333333E33F0000000000000F9010790141107004050150941D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +33 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 428 +310 +425499585B1A5CDD1A58D08409038333333333333E33F0000000000000F9010740A907004050150800405405064090740C02480A1B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +42 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 420 +310 +4194DA1859195911B40902404333333333333E33F0000000000000F9010740A41107004050150800405405064090840C02480A0B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +41 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 516 +310 +4454DA18591959081DDA5D1A08195919D95CD1A40902404333333333333E33F0000000000000F901074090142907004050250800405405064090740C02480A0B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3E +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 532 +310 +4394DA1859195CC81BD98811DC985E5174090240C333333333333E33F0000000000000F901079024090741D01000000000000111010841D405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +3F +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 476 +310 +41D4DAD95D18DA1E51840502408333333333333E33F0000000000000F901079024090741D01000000000000111010B41D405064090741802480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +37 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 412 +310 +41D51A1A58DAD95B90D409028333333333333E33F0000000000000F9010790141107004050150C41D405064090741402480A0350 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +30 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 420 +310 +4255DA5C99599C985B595059028333333333333E33F0000000000000F90107901411070040501600405405064090740C02480A0340 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +ACAD_PROXY_OBJECT + 5 +40 +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbProxyObject + 90 + 499 + 91 + 501 + 93 + 404 +310 +41560B54985E51940902404000000000000E03F0000000000000F9010740501907004050150841D405064090740C02480A1B40 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +XRECORD + 5 +100000B7 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000B6 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 90 + 0 + 0 +XRECORD + 5 +100000CD +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +1000 +DSTYLE +1002 +{ +1070 + 340 +340 +11 +1002 +} + 0 +XRECORD + 5 +100000B8 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 1 +{38703976-3171-3276-b572-357334377473} + 0 +XRECORD + 5 +100000B0 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 1 + + 0 +XRECORD + 5 +100000B5 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 90 + 1 + 0 +XRECORD + 5 +100000B2 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +340 +1A + 0 +XRECORD + 5 +100000B4 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 90 + 10781 + 0 +XRECORD + 5 +100000B3 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +340 +19 + 0 +XRECORD + 5 +100000BA +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 40 +0.0 + 0 +XRECORD + 5 +100000BD +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000C3 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000BF +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000C2 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000C0 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000C1 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000BE +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000BB +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000BC +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 70 + 0 + 0 +XRECORD + 5 +100000B1 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 1 + + 0 +XRECORD + 5 +100000AE +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 90 + 1 + 0 +XRECORD + 5 +100000AF +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 90 + 70 + 0 +XRECORD + 5 +100000C6 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000CC +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000C8 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000CB +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000C9 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000CA +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000C7 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +XRECORD + 5 +100000C4 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord +340 +0 + 0 +XRECORD + 5 +100000C5 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 70 + 0 + 0 +XRECORD + 5 +100000B9 +102 +{ACAD_REACTORS +330 +100000AD +102 +} +330 +100000AD +100 +AcDbXrecord + 1 +{FAEB1C32-E019-11D5-929B-00C0DF256EC4} + 0 +DICTIONARYVAR + 5 +100000D8 +102 +{ACAD_REACTORS +330 +100000CE +102 +} +330 +100000CE +100 +DictionaryVariables +280 + 0 + 1 +1:1 + 0 +DICTIONARYVAR + 5 +100000D0 +102 +{ACAD_REACTORS +330 +100000CE +102 +} +330 +100000CE +100 +DictionaryVariables +280 + 0 + 1 +Standard + 0 +DICTIONARYVAR + 5 +100000CF +102 +{ACAD_REACTORS +330 +100000CE +102 +} +330 +100000CE +100 +DictionaryVariables +280 + 0 + 1 +Standard + 0 +DICTIONARYVAR + 5 +100000D3 +102 +{ACAD_REACTORS +330 +100000CE +102 +} +330 +100000CE +100 +DictionaryVariables +280 + 0 + 1 +2 + 0 +DICTIONARYVAR + 5 +100000D4 +102 +{ACAD_REACTORS +330 +100000CE +102 +} +330 +100000CE +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +DICTIONARYVAR + 5 +100000D9 +102 +{ACAD_REACTORS +330 +100000CE +102 +} +330 +100000CE +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +XRECORD + 5 +10000003 +102 +{ACAD_REACTORS +330 +10000001 +102 +} +330 +10000001 +100 +AcDbXrecord + 70 + 1 + 0 +XRECORD + 5 +10000002 +102 +{ACAD_REACTORS +330 +10000001 +102 +} +330 +10000001 +100 +AcDbXrecord +1040 +89.0 + 0 +ACAD_PROXY_OBJECT + 5 +10000005 +102 +{ACAD_REACTORS +330 +10000001 +102 +} +330 +10000001 +100 +AcDbProxyObject + 90 + 499 + 91 + 509 + 93 + 34 +310 +40C8804000 + 0 +DICTIONARY + 5 +100000DC +330 +45 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000DD + 0 +DICTIONARY + 5 +100000DA +330 +44 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000DB + 0 +DICTIONARY + 5 +100000DE +330 +46 +100 +AcDbDictionary +280 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +100000DF + 0 +XRECORD + 5 +100000DD +102 +{ACAD_REACTORS +330 +100000DC +102 +} +330 +100000DC +100 +AcDbXrecord +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +XRECORD + 5 +100000DB +102 +{ACAD_REACTORS +330 +100000DA +102 +} +330 +100000DA +100 +AcDbXrecord +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +XRECORD + 5 +100000DF +102 +{ACAD_REACTORS +330 +100000DE +102 +} +330 +100000DE +100 +AcDbXrecord +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +ENDSEC + 0 +EOF diff --git a/hackpads/NumMarcroPad/3dModels/cut-bottom.stl b/hackpads/NumMarcroPad/3dModels/cut-bottom.stl deleted file mode 100644 index 50f2996ca..000000000 Binary files a/hackpads/NumMarcroPad/3dModels/cut-bottom.stl and /dev/null differ diff --git a/hackpads/NumMarcroPad/3dModels/cut-middle.stl b/hackpads/NumMarcroPad/3dModels/cut-middle.stl deleted file mode 100644 index c05c00dce..000000000 Binary files a/hackpads/NumMarcroPad/3dModels/cut-middle.stl and /dev/null differ diff --git a/hackpads/NumMarcroPad/3dModels/cut-top.stl b/hackpads/NumMarcroPad/3dModels/cut-top.stl deleted file mode 100644 index fd66449d4..000000000 Binary files a/hackpads/NumMarcroPad/3dModels/cut-top.stl and /dev/null differ diff --git a/hackpads/NumMarcroPad/Firmware/boot.py b/hackpads/NumMarcroPad/Firmware/boot.py new file mode 100644 index 000000000..d67c6e930 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/boot.py @@ -0,0 +1,17 @@ +# boot.py - v1.0.5 +import usb_cdc +import supervisor +import storage +import microcontroller + +# optional +# supervisor.set_next_stack_limit(4096 + 4096) +usb_cdc.enable(console=True, data=True) +# used to identify pog compatible keyboards while scanning com ports +supervisor.set_usb_identification("Pog", "Pog Keyboard") + +# index configs +# 0 - show usb drive | 0 false, 1 true +if microcontroller.nvm[0] == 0: + storage.disable_usb_drive() + storage.remount("/", False) diff --git a/hackpads/NumMarcroPad/Firmware/boot_out.txt b/hackpads/NumMarcroPad/Firmware/boot_out.txt new file mode 100644 index 000000000..f6874f2e4 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/boot_out.txt @@ -0,0 +1,4 @@ +Adafruit CircuitPython 9.2.1 on 2024-11-20; Seeeduino XIAO RP2040 with rp2040 +Board ID:seeeduino_xiao_rp2040 +UID:425030503137330F +boot.py output: diff --git a/hackpads/NumMarcroPad/Firmware/code.py b/hackpads/NumMarcroPad/Firmware/code.py new file mode 100644 index 000000000..eaba8c6ab --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/code.py @@ -0,0 +1,30 @@ +# Main Keyboard Configuration - v1.0.0 +import board +import pog +# check if we just want to run the coord_mappping Assistant +if pog.coordMappingAssistant: + from coordmaphelper import CoordMapKeyboard + if __name__ == '__main__': + CoordMapKeyboard().go() + print("Exiting Coord Mapping Assistant Because of an error") +else: + from kb import POGKeyboard + # set the required features for you keyboard and keymap + # add custom ones in the kb.py + + keyboard = POGKeyboard(features=pog.kbFeatures) + + # manage settings for our modules and extensions here + keyboard.tapdance.tap_time = 200 + + # Keymap + import keymap + keyboard.keymap = keymap.keymap + + # Encoder Keymap if available + if pog.hasEncoders: + keyboard.encoder_handler.map = keymap.encoderKeymap + + # Execute the keyboard loop + if __name__ == '__main__': + keyboard.go() diff --git a/hackpads/NumMarcroPad/Firmware/coordmaphelper.py b/hackpads/NumMarcroPad/Firmware/coordmaphelper.py new file mode 100644 index 000000000..efe29bde5 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/coordmaphelper.py @@ -0,0 +1,45 @@ +# coordmaphelper.py v1.0.1 +import board +import pog +from kb import POGKeyboard +from kmk.keys import KC +from kmk.modules.macros import Press, Release, Tap, Macros + +class CoordMapKeyboard(POGKeyboard): + def __init__(self): + super().__init__(features=['basic', 'macros']) + print("Running coord_mapping assistant") + print("Press each key to get its coord_mapping value") + + if not hasattr(pog, 'keyCount') or pog.keyCount == 0: + raise ValueError("pog.keyCount is not set or is zero") + + N = pog.keyCount * 2 + coord_mapping = list(range(N)) + layer = [] + print(f"coord_mapping = {coord_mapping}") + print(f"Total keys: {N}") + + for i in range(N): + c, r = divmod(i, 100) + d, u = divmod(r, 10) + print(f"Adding key {i} ({c}{d}{u})") + try: + layer.append( + KC.MACRO( + Tap(getattr(KC, f"N{c}")), + Tap(getattr(KC, f"N{d}")), + Tap(getattr(KC, f"N{u}")), + Tap(KC.SPC), + ) + ) + except AttributeError as e: + print(f"Error creating macro for key {i}: {e}") + + if not layer: + raise ValueError("No keys were added to the layer") + + print(f"Layer created with {len(layer)} keys") + self.keymap = [layer] + self.coord_mapping = coord_mapping + print(f"Keymap initialized with {len(self.keymap[0])} keys") diff --git a/hackpads/NumMarcroPad/Firmware/customkeys.py b/hackpads/NumMarcroPad/Firmware/customkeys.py new file mode 100644 index 000000000..860a7101e --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/customkeys.py @@ -0,0 +1,30 @@ +# These are yous custom keycodes do any needed imports at the top - v1.0.0 +# then you can reference them in your keymap with for example customkeys.MyKey + +from kmk.keys import KC +from kmk.modules.macros import Tap, Release, Press +import microcontroller + +# Here you can define your custom keys +# MyKey = KC.X + +# Builtin macros for use in pog +def next_boot_dfu(keyboard): + print('setting next boot to dfu') #serial feedback + microcontroller.on_next_reset(microcontroller.RunMode.UF2) + +DFUMODE = KC.MACRO(next_boot_dfu) + +def next_boot_safe(keyboard): + print('setting next boot to safe') #serial feedback + microcontroller.on_next_reset(microcontroller.RunMode.SAFE_MODE) +SAFEMODE = KC.MACRO(next_boot_safe) + +def toggle_drive(keyboard): + print('toggling usb drive') #serial feedback + if microcontroller.nvm[0] == 0: + microcontroller.nvm[0] = 1 + else: + microcontroller.nvm[0] = 0 + +ToggleDrive = KC.MACRO(toggle_drive) \ No newline at end of file diff --git a/hackpads/NumMarcroPad/Firmware/kb.py b/hackpads/NumMarcroPad/Firmware/kb.py new file mode 100644 index 000000000..8d75900b1 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kb.py @@ -0,0 +1,154 @@ +# kb.py KB base config - v1.0.0 +import board +import pog +import microcontroller + +from kmk.kmk_keyboard import KMKKeyboard +from kmk.scanners import DiodeOrientation +from kmk.scanners.keypad import KeysScanner + +class POGKeyboard(KMKKeyboard): + def __init__(self, features=['basic']): + if "basic" in features: + from kmk.modules.layers import Layers; + combo_layers = { + # combolayers can be added here + # (1, 2): 3, + } + self.modules.append(Layers(combo_layers)) + from kmk.extensions.media_keys import MediaKeys; self.extensions.append(MediaKeys()) + if "international" in features: + from kmk.extensions.international import International + self.extensions.append(International()) + if "serial" in features: + from pog_serial import pogSerial; self.modules.append(pogSerial()) + + if "oneshot" in features: + from kmk.modules.sticky_keys import StickyKeys + sticky_keys = StickyKeys() + # optional: set a custom release timeout in ms (default: 1000ms) + # sticky_keys = StickyKeys(release_after=5000) + self.modules.append(sticky_keys) + + + if "tapdance" in features: + from kmk.modules.tapdance import TapDance + self.tapdance = TapDance() + self.modules.append(self.tapdance) + + if "holdtap" in features: + from kmk.modules.holdtap import HoldTap; self.modules.append(HoldTap()) + + if "mousekeys" in features: + from kmk.modules.mouse_keys import MouseKeys; self.modules.append(MouseKeys()) + + if "combos" in features: + from kmk.modules.combos import Combos, Chord, Sequence + self.combos = Combos() + self.modules.append(self.combos) + + # if "macros" in features: + from kmk.modules.macros import Macros + self.macros = Macros() + self.modules.append(self.macros) + + # TODO: not tested yet + if "capsword" in features: + from kmk.modules.capsword import CapsWord + self.capsword = CapsWord() + self.modules.append(self.capsword) + + if pog.config['split']: + from kmk.modules.split import Split, SplitSide, SplitType + + # Split Side Detection + if pog.splitSide == "label": + from storage import getmount + side = SplitSide.RIGHT if str(getmount('/').label)[-1] == 'R' else SplitSide.LEFT + if pog.splitSide == "vbus": + import digitalio + + vbus = digitalio.DigitalInOut(pog.vbusPin) + vbus.direction = digitalio.Direction.INPUT + side = SplitSide.RIGHT if vbus.value == False else SplitSide.LEFT + if pog.splitSide == "left" or pog.splitSide == "right": + side = SplitSide.RIGHT if pog.splitSide == "right" else SplitSide.LEFT + + # Split Type Configuration + if pog.keyboardType == "splitBLE": + print("split with 2 pins") + self.split = Split( + split_type=SplitType.BLE, + split_side=side, + split_flip=pog.splitFlip) + elif pog.keyboardType == "splitSerial": + print("split with 2 pins (UART)") + self.split = Split( + split_side=side, + split_type=SplitType.UART, + data_pin=pog.splitPinA, + data_pin2=pog.splitPinB, + use_pio=pog.splitUsePio, + split_flip=pog.splitFlip, + uart_flip=pog.splitUartFlip) + else: + # Nested under pog.split == True => splitOnewire + print('split with 1 pin') + self.split = Split( + split_side=side, + data_pin=pog.splitPinA, + use_pio=pog.splitUsePio, + split_flip=pog.splitFlip) + + self.modules.append(self.split) + + # Add your own modules and extensions here + # or sort them into the correct spot to have the correct import order + + + # Encoders + if pog.hasEncoders: + from kmk.modules.encoder import EncoderHandler + self.encoder_handler = EncoderHandler() + self.encoder_handler.pins = pog.encoders + self.modules.append(self.encoder_handler) + + if "rgb" in features: + from kmk.extensions.RGB import RGB + rgb = RGB( + pixel_pin=eval(pog.rgbPin), + num_pixels=pog.rgbNumLeds, + rgb_order=(1, 0, 2), + val_limit=40, # Maximum brightness level. Only change if you know what you are doing! + hue_default=pog.rgbOptions["hueDefault"], + sat_default=pog.rgbOptions["satDefault"], + val_default=pog.rgbOptions["valDefault"], + animation_speed=pog.rgbOptions["animationSpeed"], + animation_mode=pog.rgbOptions["animationMode"], + breathe_center=pog.rgbOptions["breatheCenter"], + knight_effect_length=pog.rgbOptions["knightEffectLength"], + ) + self.extensions.append(rgb) + + # direct pin wiring + # Must be set during init to override defaulting to matrix wiring + if pog.directWiring: + self.matrix = KeysScanner( + pins=eval(pog.pins), + value_when_pressed=False, + pull=True, + interval=0.02, + max_events=64 + ) + + # matrix wiring + if pog.matrixWiring: + exec("col_pins = (" + pog.colPins + ")") + exec("row_pins = (" + pog.rowPins + ")") + exec("diode_orientation = DiodeOrientation." + pog.config["diodeDirection"]) + + # coord_mapping + if len(pog.config["coordMap"]) != 0: + exec("coord_mapping = [ " + pog.coordMapping + " ]") + + diff --git a/hackpads/NumMarcroPad/Firmware/keymap.py b/hackpads/NumMarcroPad/Firmware/keymap.py new file mode 100644 index 000000000..c53ca968d --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/keymap.py @@ -0,0 +1,20 @@ +#keymap.py KB base config - v1.0.0 +from kmk.keys import KC +from kmk.modules.macros import Macros, Press, Release, Tap, Delay +from kmk.modules.combos import Chord, Sequence +import pog +import customkeys + +keymap = [] +for l, layer in enumerate(pog.config['keymap']): + layerKeymap = [] + for k, key in enumerate(layer): + layerKeymap.append(eval(key)) + keymap.append(tuple(layerKeymap)) + +encoderKeymap = [] +for l, layer in enumerate(pog.config['encoderKeymap']): + layerEncoders = [] + for e, encoder in enumerate(layer): + layerEncoders.append(tuple(map(eval, encoder))) + encoderKeymap.append(tuple(layerEncoders)) \ No newline at end of file diff --git a/hackpads/NumMarcroPad/Firmware/kmk/__init__.py b/hackpads/NumMarcroPad/Firmware/kmk/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/hackpads/NumMarcroPad/Firmware/kmk/bootcfg.py b/hackpads/NumMarcroPad/Firmware/kmk/bootcfg.py new file mode 100644 index 000000000..196f02110 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/bootcfg.py @@ -0,0 +1,107 @@ +try: + from typing import Optional +except ImportError: + pass + +import digitalio +import microcontroller +import usb_hid + + +def bootcfg( + sense: Optional[microcontroller.Pin, digitalio.DigitalInOut] = None, + source: Optional[microcontroller.Pin, digitalio.DigitalInOut] = None, + autoreload: bool = True, + boot_device: int = 0, + cdc_console: bool = True, + cdc_data: bool = False, + consumer_control: bool = True, + keyboard: bool = True, + midi: bool = True, + mouse: bool = True, + nkro: bool = False, + pan: bool = False, + storage: bool = True, + usb_id: Optional[tuple[str, str]] = None, + **kwargs, +) -> bool: + + if len(kwargs): + print('unknown option', kwargs) + + if isinstance(sense, microcontroller.Pin): + sense = digitalio.DigitalInOut(sense) + sense.direction = digitalio.Direction.INPUT + sense.pull = digitalio.Pull.UP + + if isinstance(source, microcontroller.Pin): + source = digitalio.DigitalInOut(source) + source.direction = digitalio.Direction.OUTPUT + source.value = False + + if not autoreload: + import supervisor + + supervisor.runtime.autoreload = False + + # configure HID devices + devices = [] + if keyboard: + if nkro: + from kmk.hid_reports import nkro_keyboard + + devices.append(nkro_keyboard.NKRO_KEYBOARD) + else: + devices.append(usb_hid.Device.KEYBOARD) + if mouse: + if pan: + from kmk.hid_reports import pointer + + devices.append(pointer.POINTER) + else: + devices.append(usb_hid.Device.MOUSE) + if consumer_control: + devices.append(usb_hid.Device.CONSUMER_CONTROL) + if devices: + usb_hid.enable(devices, boot_device) + else: + usb_hid.disable() + + # configure midi over usb + if not midi: + import usb_midi + + usb_midi.disable() + + # configure usb vendor and product id + if usb_id is not None: + import supervisor + + if hasattr(supervisor, 'set_usb_identification'): + supervisor.set_usb_identification(*usb_id) + + # configure data serial + if cdc_data: + import usb_cdc + + usb_cdc.enable(data=True) + + # sense not provided or pulled low -> Skip boot configuration that may + # disable debug or rescue facilities. + if sense is None or not sense.value: + return False + + # Entries for serial console (REPL) and storage are intentionally evaluated + # last to ensure the board is debuggable, mountable and rescueable, in case + # any of the previous code throws an exception. + if not cdc_console: + import usb_cdc + + usb_cdc.enable(console=False) + + if not storage: + import storage + + storage.disable_usb_drive() + + return True diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/__init__.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/__init__.py new file mode 100644 index 000000000..33eea6861 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/__init__.py @@ -0,0 +1,54 @@ +class InvalidExtensionEnvironment(Exception): + pass + + +class Extension: + _enabled = True + + def enable(self, keyboard): + self._enabled = True + + self.on_runtime_enable(keyboard) + + def disable(self, keyboard): + self._enabled = False + + self.on_runtime_disable(keyboard) + + # The below methods should be implemented by subclasses + + def on_runtime_enable(self, keyboard): + raise NotImplementedError + + def on_runtime_disable(self, keyboard): + raise NotImplementedError + + def during_bootup(self, keyboard): + raise NotImplementedError + + def before_matrix_scan(self, keyboard): + ''' + Return value will be injected as an extra matrix update + ''' + raise NotImplementedError + + def after_matrix_scan(self, keyboard): + ''' + Return value will be replace matrix update if supplied + ''' + raise NotImplementedError + + def before_hid_send(self, keyboard): + raise NotImplementedError + + def after_hid_send(self, keyboard): + raise NotImplementedError + + def on_powersave_enable(self, keyboard): + raise NotImplementedError + + def on_powersave_disable(self, keyboard): + raise NotImplementedError + + def deinit(self, keyboard): + pass diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/__init__.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/__init__.py new file mode 100644 index 000000000..518baa5be --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/__init__.py @@ -0,0 +1,279 @@ +from supervisor import ticks_ms + +import displayio +import terminalio +from adafruit_display_text import label + +from kmk.extensions import Extension +from kmk.keys import make_key +from kmk.kmktime import PeriodicTimer, ticks_diff +from kmk.modules.split import Split, SplitSide +from kmk.utils import clamp + + +class TextEntry: + def __init__( + self, + text='', + x=0, + y=0, + x_anchor='L', + y_anchor='T', + direction='LTR', + line_spacing=0.75, + inverted=False, + layer=None, + side=None, + ): + self.text = text + self.direction = direction + self.line_spacing = line_spacing + self.inverted = inverted + self.layer = layer + self.color = 0xFFFFFF + self.background_color = 0x000000 + self.x_anchor = 0.0 + self.y_anchor = 0.0 + if x_anchor == 'L': + self.x_anchor = 0.0 + x = x + 1 + if x_anchor == 'M': + self.x_anchor = 0.5 + if x_anchor == 'R': + self.x_anchor = 1.0 + if y_anchor == 'T': + self.y_anchor = 0.0 + if y_anchor == 'M': + self.y_anchor = 0.5 + if y_anchor == 'B': + self.y_anchor = 1.0 + self.anchor_point = (self.x_anchor, self.y_anchor) + self.anchored_position = (x, y) + if inverted: + self.color = 0x000000 + self.background_color = 0xFFFFFF + self.side = side + if side == 'L': + self.side = SplitSide.LEFT + if side == 'R': + self.side = SplitSide.RIGHT + + +class ImageEntry: + def __init__(self, x=0, y=0, image='', layer=None, side=None): + self.x = x + self.y = y + self.image = displayio.OnDiskBitmap(image) + self.layer = layer + self.side = side + if side == 'L': + self.side = SplitSide.LEFT + if side == 'R': + self.side = SplitSide.RIGHT + + +class DisplayBase: + def __init__(self): + raise NotImplementedError + + def during_bootup(self, width, height, rotation): + raise NotImplementedError + + def deinit(self): + raise NotImplementedError + + def sleep(self): + self.display.sleep() + + def wake(self): + self.display.wake() + + @property + def brightness(self): + return self.display.brightness + + @brightness.setter + def brightness(self, new_brightness): + self.display.brightness = new_brightness + + # display.show() is deprecated, so use root_group instead + @property + def root_group(self): + return self.display.root_group + + @root_group.setter + def root_group(self, group): + self.display.root_group = group + + +class Display(Extension): + def __init__( + self, + display=None, + entries=[], + width=128, + height=32, + flip: bool = False, + flip_left: bool = False, + flip_right: bool = False, + brightness=0.8, + brightness_step=0.1, + dim_time=20, + dim_target=0.1, + off_time=60, + powersave_dim_time=10, + powersave_dim_target=0.1, + powersave_off_time=30, + ): + self.display = display + self.flip = flip + self.flip_left = flip_left + self.flip_right = flip_right + self.entries = entries + self.width = width + self.height = height + self.prev_layer = None + self.brightness = brightness + self.brightness_step = brightness_step + self.timer_start = ticks_ms() + self.powersave = False + self.dim_time_ms = dim_time * 1000 + self.dim_target = dim_target + self.off_time_ms = off_time * 1000 + self.powersavedim_time_ms = powersave_dim_time * 1000 + self.powersave_dim_target = powersave_dim_target + self.powersave_off_time_ms = powersave_off_time * 1000 + self.dim_period = PeriodicTimer(50) + self.split_side = None + + make_key(names=('DIS_BRI',), on_press=self.display_brightness_increase) + make_key(names=('DIS_BRD',), on_press=self.display_brightness_decrease) + + def render(self, layer): + splash = displayio.Group() + + for entry in self.entries: + if entry.layer != layer and entry.layer is not None: + continue + if isinstance(entry, TextEntry): + splash.append( + label.Label( + terminalio.FONT, + text=entry.text, + color=entry.color, + background_color=entry.background_color, + anchor_point=entry.anchor_point, + anchored_position=entry.anchored_position, + label_direction=entry.direction, + line_spacing=entry.line_spacing, + padding_left=1, + ) + ) + elif isinstance(entry, ImageEntry): + splash.append( + displayio.TileGrid( + entry.image, + pixel_shader=entry.image.pixel_shader, + x=entry.x, + y=entry.y, + ) + ) + self.display.root_group = splash + + def on_runtime_enable(self, sandbox): + return + + def on_runtime_disable(self, sandbox): + return + + def during_bootup(self, keyboard): + for module in keyboard.modules: + if isinstance(module, Split): + self.split_side = module.split_side + + if self.split_side == SplitSide.LEFT: + self.flip = self.flip_left + elif self.split_side == SplitSide.RIGHT: + self.flip = self.flip_right + + for idx, entry in enumerate(self.entries): + if entry.side != self.split_side and entry.side is not None: + del self.entries[idx] + + self.display.during_bootup(self.width, self.height, 180 if self.flip else 0) + self.display.brightness = self.brightness + + def before_matrix_scan(self, sandbox): + if self.dim_period.tick(): + self.dim() + if sandbox.active_layers[0] != self.prev_layer: + self.prev_layer = sandbox.active_layers[0] + self.render(sandbox.active_layers[0]) + + def after_matrix_scan(self, sandbox): + if sandbox.matrix_update or sandbox.secondary_matrix_update: + self.timer_start = ticks_ms() + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + return + + def on_powersave_enable(self, sandbox): + self.powersave = True + + def on_powersave_disable(self, sandbox): + self.powersave = False + + def deinit(self, sandbox): + displayio.release_displays() + self.display.deinit() + + def display_brightness_increase(self, *args): + self.display.brightness = clamp( + self.display.brightness + self.brightness_step, 0, 1 + ) + self.brightness = self.display.brightness # Save current brightness + + def display_brightness_decrease(self, *args): + self.display.brightness = clamp( + self.display.brightness - self.brightness_step, 0, 1 + ) + self.brightness = self.display.brightness # Save current brightness + + def dim(self): + if self.powersave: + if ( + self.powersave_off_time_ms + and ticks_diff(ticks_ms(), self.timer_start) + > self.powersave_off_time_ms + ): + self.display.sleep() + + elif ( + self.powersave_dim_time_ms + and ticks_diff(ticks_ms(), self.timer_start) + > self.powersave_dim_time_ms + ): + self.display.brightness = self.powersave_dim_target + + else: + self.display.brightness = self.brightness + self.display.wake() + + elif ( + self.off_time_ms + and ticks_diff(ticks_ms(), self.timer_start) > self.off_time_ms + ): + self.display.sleep() + + elif ( + self.dim_time_ms + and ticks_diff(ticks_ms(), self.timer_start) > self.dim_time_ms + ): + self.display.brightness = self.dim_target + + else: + self.display.brightness = self.brightness + self.display.wake() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/builtin.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/builtin.py new file mode 100644 index 000000000..9820f561d --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/builtin.py @@ -0,0 +1,24 @@ +from . import DisplayBase + + +# Intended for displays with drivers built into CircuitPython +# that can be used directly without manual initialization +class BuiltInDisplay(DisplayBase): + def __init__(self, display=None, sleep_command=None, wake_command=None): + self.display = display + self.sleep_command = sleep_command + self.wake_command = wake_command + self.is_awake = True + + def during_bootup(self, width, height, rotation): + self.display.rotation = rotation + return self.display + + def deinit(self): + return + + def sleep(self): + self.display.bus.send(self.sleep_command, b'') + + def wake(self): + self.display.bus.send(self.wake_command, b'') diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/sh1106.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/sh1106.py new file mode 100644 index 000000000..cf93a457c --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/sh1106.py @@ -0,0 +1,49 @@ +import busio + +import adafruit_displayio_sh1106 # Display-specific library +import displayio + +from . import DisplayBase + +# Required to initialize this display +displayio.release_displays() + + +class SH1106(DisplayBase): + def __init__( + self, + spi=None, + sck=None, + mosi=None, + command=None, + chip_select=None, + reset=None, + baudrate=1000000, + ): + self.command = command + self.chip_select = chip_select + self.reset = reset + self.baudrate = baudrate + # spi initialization + self.spi = spi + if self.spi is None: + self.spi = busio.SPI(sck, mosi) + + def during_bootup(self, width, height, rotation): + self.display = adafruit_displayio_sh1106.SH1106( + displayio.FourWire( + self.spi, + command=self.command, + chip_select=self.chip_select, + reset=self.reset, + baudrate=self.baudrate, + ), + width=width, + height=height, + rotation=rotation, + ) + + return self.display + + def deinit(self): + self.spi.deinit() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/ssd1306.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/ssd1306.py new file mode 100644 index 000000000..a6b2a0152 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/display/ssd1306.py @@ -0,0 +1,31 @@ +import busio + +import adafruit_displayio_ssd1306 # Display-specific library +import displayio + +from . import DisplayBase + +# Required to initialize this display +displayio.release_displays() + + +class SSD1306(DisplayBase): + def __init__(self, i2c=None, sda=None, scl=None, device_address=0x3C): + self.device_address = device_address + # i2c initialization + self.i2c = i2c + if self.i2c is None: + self.i2c = busio.I2C(scl, sda) + + def during_bootup(self, width, height, rotation): + self.display = adafruit_displayio_ssd1306.SSD1306( + displayio.I2CDisplay(self.i2c, device_address=self.device_address), + width=width, + height=height, + rotation=rotation, + ) + + return self.display + + def deinit(self): + self.i2c.deinit() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/international.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/international.py new file mode 100644 index 000000000..8d53e01ea --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/international.py @@ -0,0 +1,63 @@ +'''Adds international keys''' + +from kmk.extensions import Extension +from kmk.keys import KeyboardKey, make_key + + +class International(Extension): + '''Adds international keys''' + + def __init__(self): + # International + codes = ( + (50, ('NONUS_HASH', 'NUHS')), + (100, ('NONUS_BSLASH', 'NUBS')), + (101, ('APP', 'APPLICATION', 'SEL', 'WINMENU')), + (135, ('INT1', 'RO')), + (136, ('INT2', 'KANA')), + (137, ('INT3', 'JYEN')), + (138, ('INT4', 'HENK')), + (139, ('INT5', 'MHEN')), + (140, ('INT6',)), + (141, ('INT7',)), + (142, ('INT8',)), + (143, ('INT9',)), + (144, ('LANG1', 'HAEN')), + (145, ('LANG2', 'HAEJ')), + (146, ('LANG3',)), + (147, ('LANG4',)), + (148, ('LANG5',)), + (149, ('LANG6',)), + (150, ('LANG7',)), + (151, ('LANG8',)), + (152, ('LANG9',)), + ) + for code, names in codes: + make_key(names=names, constructor=KeyboardKey, code=code) + + def on_runtime_enable(self, sandbox): + return + + def on_runtime_disable(self, sandbox): + return + + def during_bootup(self, sandbox): + return + + def before_matrix_scan(self, sandbox): + return + + def after_matrix_scan(self, sandbox): + return + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + return + + def on_powersave_enable(self, sandbox): + return + + def on_powersave_disable(self, sandbox): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/keymap_extras/keymap_jp.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/keymap_extras/keymap_jp.py new file mode 100644 index 000000000..f4355dbf8 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/keymap_extras/keymap_jp.py @@ -0,0 +1,34 @@ +# What's this? +# This is a keycode conversion script. With this, KMK will work as a JIS keyboard. + +# Usage +# ```python +# import kmk.extensions.keymap_extras.keymap_jp +# ``` + +from kmk.keys import KC + +KC.CIRC = KC.EQL # ^ +KC.AT = KC.LBRC # @ +KC.LBRC = KC.RBRC # [ +KC.EISU = KC.CAPS # Eisū (英数) +KC.COLN = KC.QUOT # : +KC.LCBR = KC.LSFT(KC.RBRC) # { +KC.RBRC = KC.NUHS # ] +KC.BSLS = KC.INT1 # (backslash) +KC.PLUS = KC.LSFT(KC.SCLN) +KC.TILD = KC.LSFT(KC.EQL) # ~ +KC.GRV = KC.LSFT(KC.AT) # ` +KC.DQUO = KC.LSFT(KC.N2) # " +KC.AMPR = KC.LSFT(KC.N6) # & +KC.ASTR = KC.LSFT(KC.QUOT) # * +KC.QUOT = KC.LSFT(KC.N7) # ' +KC.LPRN = KC.LSFT(KC.N8) # ( +KC.RPRN = KC.LSFT(KC.N9) # ) +KC.EQL = KC.LSFT(KC.MINS) # = +KC.PIPE = KC.LSFT(KC.INT3) # | +KC.RCBR = KC.LSFT(KC.NUHS) # } +KC.LABK = KC.LSFT(KC.COMM) # < +KC.RABK = KC.LSFT(KC.DOT) # > +KC.QUES = KC.LSFT(KC.SLSH) # ? +KC.UNDS = KC.LSFT(KC.INT1) # _ diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/led.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/led.py new file mode 100644 index 000000000..cd155efb7 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/led.py @@ -0,0 +1,256 @@ +import pwmio +from math import e, exp, pi, sin + +from kmk.extensions import Extension, InvalidExtensionEnvironment +from kmk.keys import Key, make_argumented_key, make_key +from kmk.utils import Debug, clamp + +debug = Debug(__name__) + + +class LEDKey(Key): + def __init__(self, *leds, brightness=None, **kwargs): + super().__init__(**kwargs) + self.leds = leds + self.brightness = None + + +def led_set_key(brightness, *leds): + return LEDKey(*leds, brightness=brightness) + + +class AnimationModes: + OFF = 0 + STATIC = 1 + STATIC_STANDBY = 2 + BREATHING = 3 + USER = 4 + + +class LED(Extension): + def __init__( + self, + led_pin, + brightness=50, + brightness_step=5, + brightness_limit=100, + breathe_center=1.5, + animation_mode=AnimationModes.STATIC, + animation_speed=1, + user_animation=None, + val=100, + ): + try: + pins_iter = iter(led_pin) + except TypeError: + pins_iter = [led_pin] + + try: + self._leds = [pwmio.PWMOut(pin) for pin in pins_iter] + except Exception as e: + if debug.enabled: + debug(e) + raise InvalidExtensionEnvironment( + 'Unable to create pwmio.PWMOut() instance with provided led_pin' + ) + + self._brightness = brightness + self._pos = 0 + self._effect_init = False + self._enabled = True + + self.brightness_step = brightness_step + self.brightness_limit = brightness_limit + self.animation_mode = animation_mode + self.animation_speed = animation_speed + self.breathe_center = breathe_center + self.val = val + + if user_animation is not None: + self.user_animation = user_animation + + make_argumented_key( + names=('LED_TOG',), + constructor=LEDKey, + on_press=self._key_led_tog, + ) + make_argumented_key( + names=('LED_INC',), + constructor=LEDKey, + on_press=self._key_led_inc, + ) + make_argumented_key( + names=('LED_DEC',), + constructor=LEDKey, + on_press=self._key_led_dec, + ) + make_argumented_key( + names=('LED_SET',), + constructor=led_set_key, + on_press=self._key_led_set, + ) + make_key(names=('LED_ANI',), on_press=self._key_led_ani) + make_key(names=('LED_AND',), on_press=self._key_led_and) + make_key( + names=('LED_MODE_PLAIN', 'LED_M_P'), on_press=self._key_led_mode_static + ) + make_key( + names=('LED_MODE_BREATHE', 'LED_M_B'), on_press=self._key_led_mode_breathe + ) + + def __repr__(self): + return f'LED({self._to_dict()})' + + def _to_dict(self): + return { + '_brightness': self._brightness, + '_pos': self._pos, + 'brightness_step': self.brightness_step, + 'brightness_limit': self.brightness_limit, + 'animation_mode': self.animation_mode, + 'animation_speed': self.animation_speed, + 'breathe_center': self.breathe_center, + 'val': self.val, + } + + def on_runtime_enable(self, sandbox): + return + + def on_runtime_disable(self, sandbox): + return + + def during_bootup(self, sandbox): + return + + def before_matrix_scan(self, sandbox): + return + + def after_matrix_scan(self, sandbox): + return + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + self.animate() + + def on_powersave_enable(self, sandbox): + return + + def on_powersave_disable(self, sandbox): + return + + def _init_effect(self): + self._pos = 0 + self._effect_init = False + return self + + def set_brightness(self, percent, leds=None): + leds = leds or range(0, len(self._leds)) + for i in leds: + self._leds[i].duty_cycle = int(percent / 100 * 65535) + + def step_brightness(self, step, leds=None): + leds = leds or range(0, len(self._leds)) + for i in leds: + brightness = int(self._leds[i].duty_cycle / 65535 * 100) + step + self.set_brightness(clamp(brightness), [i]) + + def increase_brightness(self, step=None, leds=None): + if step is None: + step = self.brightness_step + self.step_brightness(step, leds) + + def decrease_brightness(self, step=None, leds=None): + if step is None: + step = self.brightness_step + self.step_brightness(-step, leds) + + def off(self): + self.set_brightness(0) + + def increase_ani(self): + ''' + Increases animation speed by 1 amount stopping at 10 + :param step: + ''' + if (self.animation_speed + 1) >= 10: + self.animation_speed = 10 + else: + self.val += 1 + + def decrease_ani(self): + ''' + Decreases animation speed by 1 amount stopping at 0 + :param step: + ''' + if (self.val - 1) <= 0: + self.val = 0 + else: + self.val -= 1 + + def effect_breathing(self): + # http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ + # https://github.com/qmk/qmk_firmware/blob/9f1d781fcb7129a07e671a46461e501e3f1ae59d/quantum/rgblight.c#L806 + sined = sin((self._pos / 255.0) * pi) + multip_1 = exp(sined) - self.breathe_center / e + multip_2 = self.brightness_limit / (e - 1 / e) + + self._brightness = int(multip_1 * multip_2) + self._pos = (self._pos + self.animation_speed) % 256 + self.set_brightness(self._brightness) + + def effect_static(self): + self.set_brightness(self._brightness) + # Set animation mode to standby to prevent cycles from being wasted + self.animation_mode = AnimationModes.STATIC_STANDBY + + def animate(self): + ''' + Activates a "step" in the animation based on the active mode + :return: Returns the new state in animation + ''' + if self._effect_init: + self._init_effect() + if self._enabled: + if self.animation_mode == AnimationModes.BREATHING: + return self.effect_breathing() + elif self.animation_mode == AnimationModes.STATIC: + return self.effect_static() + elif self.animation_mode == AnimationModes.STATIC_STANDBY: + pass + elif self.animation_mode == AnimationModes.USER: + return self.user_animation(self) + else: + self.off() + + def _key_led_tog(self, *args, **kwargs): + if self.animation_mode == AnimationModes.STATIC_STANDBY: + self.animation_mode = AnimationModes.STATIC + + if self._enabled: + self.off() + self._enabled = not self._enabled + + def _key_led_inc(self, key, *args, **kwargs): + self.increase_brightness(leds=key.leds) + + def _key_led_dec(self, key, *args, **kwargs): + self.decrease_brightness(leds=key.leds) + + def _key_led_set(self, key, *args, **kwargs): + self.set_brightness(percent=key.brightness, leds=key.leds) + + def _key_led_ani(self, *args, **kwargs): + self.increase_ani() + + def _key_led_and(self, *args, **kwargs): + self.decrease_ani() + + def _key_led_mode_static(self, *args, **kwargs): + self._effect_init = True + self.animation_mode = AnimationModes.STATIC + + def _key_led_mode_breathe(self, *args, **kwargs): + self._effect_init = True + self.animation_mode = AnimationModes.BREATHING diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/lock_status.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/lock_status.py new file mode 100644 index 000000000..85b890d3b --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/lock_status.py @@ -0,0 +1,69 @@ +import usb_hid +from micropython import const + +from kmk.extensions import Extension + +_NUMLOCK = const(0x01) +_CAPSLOCK = const(0x02) +_SCROLLLOCK = const(0x04) +_COMPOSE = const(0x08) +_KANA = const(0x10) + + +class LockStatus(Extension): + def __init__(self): + self.report = 0 + self.hid = None + self._report_updated = False + + def __repr__(self): + return f'LockStatus(report={self.report})' + + def during_bootup(self, sandbox): + for device in usb_hid.devices: + if device.usage == usb_hid.Device.KEYBOARD.usage: + self.hid = device + if self.hid is None: + raise RuntimeError + + def before_matrix_scan(self, sandbox): + return + + def after_matrix_scan(self, sandbox): + return + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + report = self.hid.get_last_received_report() + if report is None: + self._report_updated = False + else: + self.report = report[0] + self._report_updated = True + + def on_powersave_enable(self, sandbox): + return + + def on_powersave_disable(self, sandbox): + return + + @property + def report_updated(self): + return self._report_updated + + def get_num_lock(self): + return bool(self.report & _NUMLOCK) + + def get_caps_lock(self): + return bool(self.report & _CAPSLOCK) + + def get_scroll_lock(self): + return bool(self.report & _SCROLLLOCK) + + def get_compose(self): + return bool(self.report & _COMPOSE) + + def get_kana(self): + return bool(self.report & _KANA) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/media_keys.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/media_keys.py new file mode 100644 index 000000000..19edda23c --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/media_keys.py @@ -0,0 +1,61 @@ +from kmk.extensions import Extension +from kmk.keys import ConsumerKey, make_key + + +class MediaKeys(Extension): + def __init__(self): + # Consumer ("media") keys. Most known keys aren't supported here. A much + # longer list used to exist in this file, but the codes were almost certainly + # incorrect, conflicting with each other, or otherwise 'weird'. We'll add them + # back in piecemeal as needed. PRs welcome. + # + # A super useful reference for these is http://www.freebsddiary.org/APC/usb_hid_usages.php + # Note that currently we only have the PC codes. Recent MacOS versions seem to + # support PC media keys, so I don't know how much value we would get out of + # adding the old Apple-specific consumer codes, but again, PRs welcome if the + # lack of them impacts you. + + codes = ( + (0xE2, ('AUDIO_MUTE', 'MUTE')), + (0xE9, ('AUDIO_VOL_UP', 'VOLU')), + (0xEA, ('AUDIO_VOL_DOWN', 'VOLD')), + (0x6F, ('BRIGHTNESS_UP', 'BRIU')), + (0x70, ('BRIGHTNESS_DOWN', 'BRID')), + (0xB5, ('MEDIA_NEXT_TRACK', 'MNXT')), + (0xB6, ('MEDIA_PREV_TRACK', 'MPRV')), + (0xB7, ('MEDIA_STOP', 'MSTP')), + (0xCD, ('MEDIA_PLAY_PAUSE', 'MPLY')), + (0xB8, ('MEDIA_EJECT', 'EJCT')), + (0xB3, ('MEDIA_FAST_FORWARD', 'MFFD')), + (0xB4, ('MEDIA_REWIND', 'MRWD')), + ) + + for code, names in codes: + make_key(names=names, constructor=ConsumerKey, code=code) + + def on_runtime_enable(self, sandbox): + return + + def on_runtime_disable(self, sandbox): + return + + def during_bootup(self, sandbox): + return + + def before_matrix_scan(self, sandbox): + return + + def after_matrix_scan(self, sandbox): + return + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + return + + def on_powersave_enable(self, sandbox): + return + + def on_powersave_disable(self, sandbox): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/peg_rgb_matrix.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/peg_rgb_matrix.py new file mode 100644 index 000000000..816dc5783 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/peg_rgb_matrix.py @@ -0,0 +1,200 @@ +import neopixel + +from storage import getmount + +from kmk.extensions import Extension +from kmk.keys import make_key +from kmk.utils import Debug + +debug = Debug(__name__) + + +class Color: + OFF = [0, 0, 0] + BLACK = OFF + WHITE = [249, 249, 249] + RED = [255, 0, 0] + AZURE = [153, 245, 255] + BLUE = [0, 0, 255] + CYAN = [0, 255, 255] + GREEN = [0, 255, 0] + YELLOW = [255, 247, 0] + MAGENTA = [255, 0, 255] + ORANGE = [255, 77, 0] + PURPLE = [255, 0, 242] + TEAL = [0, 128, 128] + PINK = [255, 0, 255] + + +class Rgb_matrix_data: + def __init__(self, keys=[], underglow=[]): + if len(keys) == 0: + if debug.enabled: + debug('No colors passed for your keys') + return + if len(underglow) == 0: + if debug.enabled: + debug('No colors passed for your underglow') + return + self.data = keys + underglow + + @staticmethod + def generate_led_map( + number_of_keys, number_of_underglow, key_color, underglow_color + ): + keys = [key_color] * number_of_keys + underglow = [underglow_color] * number_of_underglow + if debug.enabled: + debug('Rgb_matrix_data(keys=', keys, ', nunderglow=', underglow, ')') + + +class Rgb_matrix(Extension): + def __init__( + self, + rgb_order=(1, 0, 2), # GRB WS2812 + disable_auto_write=False, + ledDisplay=[], + split=False, + rightSide=False, + ): + name = str(getmount('/').label) + self.rgb_order = rgb_order + self.disable_auto_write = disable_auto_write + self.split = split + self.rightSide = rightSide + self.brightness_step = 0.1 + self.brightness = 0 + + if name.endswith('L'): + self.rightSide = False + elif name.endswith('R'): + self.rightSide = True + if type(ledDisplay) is Rgb_matrix_data: + self.ledDisplay = ledDisplay.data + else: + self.ledDisplay = ledDisplay + + make_key(names=('RGB_TOG',), on_press=self._rgb_tog) + make_key(names=('RGB_BRI',), on_press=self._rgb_bri) + make_key(names=('RGB_BRD',), on_press=self._rgb_brd) + + def _rgb_tog(self, *args, **kwargs): + if self.enable: + self.off() + else: + self.on() + self.enable = not self.enable + + def _rgb_bri(self, *args, **kwargs): + self.increase_brightness() + + def _rgb_brd(self, *args, **kwargs): + self.decrease_brightness() + + def on(self): + if self.neopixel: + self.setBasedOffDisplay() + self.neopixel.show() + + def off(self): + if self.neopixel: + self.set_rgb_fill((0, 0, 0)) + + def set_rgb_fill(self, rgb): + if self.neopixel: + self.neopixel.fill(rgb) + if self.disable_auto_write: + self.neopixel.show() + + def set_brightness(self, brightness=None): + if brightness is None: + brightness = self.brightness + + if self.neopixel: + self.neopixel.brightness = brightness + if self.disable_auto_write: + self.neopixel.show() + + def increase_brightness(self, step=None): + if step is None: + step = self.brightness_step + + self.brightness = ( + self.brightness + step if self.brightness + step <= 1.0 else 1.0 + ) + + self.set_brightness(self.brightness) + + def decrease_brightness(self, step=None): + if step is None: + step = self.brightness_step + + self.brightness = ( + self.brightness - step if self.brightness - step >= 0.0 else 0.0 + ) + self.set_brightness(self.brightness) + + def setBasedOffDisplay(self): + if self.split: + for i, val in enumerate(self.ledDisplay): + if self.rightSide: + if self.keyPos[i] >= (self.num_pixels / 2): + self.neopixel[int(self.keyPos[i] - (self.num_pixels / 2))] = ( + val[0], + val[1], + val[2], + ) + else: + if self.keyPos[i] <= (self.num_pixels / 2): + self.neopixel[self.keyPos[i]] = (val[0], val[1], val[2]) + else: + for i, val in enumerate(self.ledDisplay): + self.neopixel[self.keyPos[i]] = (val[0], val[1], val[2]) + + def on_runtime_enable(self, sandbox): + return + + def on_runtime_disable(self, sandbox): + return + + def during_bootup(self, board): + self.neopixel = neopixel.NeoPixel( + board.rgb_pixel_pin, + board.num_pixels, + brightness=board.brightness_limit, + pixel_order=self.rgb_order, + auto_write=not self.disable_auto_write, + ) + self.num_pixels = board.num_pixels + self.keyPos = board.led_key_pos + self.brightness = board.brightness_limit + self.on() + return + + def before_matrix_scan(self, sandbox): + return + + def after_matrix_scan(self, sandbox): + return + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + return + + def on_powersave_enable(self, sandbox): + if self.neopixel: + self.neopixel.brightness = ( + self.neopixel.brightness / 2 + if self.neopixel.brightness / 2 > 0 + else 0.1 + ) + if self.disable_auto_write: + self.neopixel.show() + + def on_powersave_disable(self, sandbox): + if self.neopixel: + self.neopixel.brightness = self.brightness + if self.disable_auto_write: + self.neopixel.show() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/rgb.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/rgb.py new file mode 100644 index 000000000..e54e939b9 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/rgb.py @@ -0,0 +1,551 @@ +from adafruit_pixelbuf import PixelBuf +from math import e, exp, pi, sin + +from kmk.extensions import Extension +from kmk.keys import make_key +from kmk.scheduler import create_task +from kmk.utils import Debug, clamp + +debug = Debug(__name__) + +rgb_config = {} + + +def hsv_to_rgb(hue, sat, val): + ''' + Converts HSV values, and returns a tuple of RGB values + :param hue: + :param sat: + :param val: + :return: (r, g, b) + ''' + if sat == 0: + return (val, val, val) + + hue = 6 * (hue & 0xFF) + frac = hue & 0xFF + sxt = hue >> 8 + + base = (0xFF - sat) * val + color = (val * sat * frac) >> 8 + val <<= 8 + + if sxt == 0: + r = val + g = base + color + b = base + elif sxt == 1: + r = val - color + g = val + b = base + elif sxt == 2: + r = base + g = val + b = base + color + elif sxt == 3: + r = base + g = val - color + b = val + elif sxt == 4: + r = base + color + g = base + b = val + elif sxt == 5: + r = val + g = base + b = val - color + + return (r >> 8), (g >> 8), (b >> 8) + + +def hsv_to_rgbw(hue, sat, val): + ''' + Converts HSV values, and returns a tuple of RGBW values + :param hue: + :param sat: + :param val: + :return: (r, g, b, w) + ''' + rgb = hsv_to_rgb(hue, sat, val) + return rgb[0], rgb[1], rgb[2], min(rgb) + + +class AnimationModes: + OFF = 0 + STATIC = 1 + STATIC_STANDBY = 2 + BREATHING = 3 + RAINBOW = 4 + BREATHING_RAINBOW = 5 + KNIGHT = 6 + SWIRL = 7 + USER = 8 + + +class RGB(Extension): + pos = 0 + + def __init__( + self, + pixel_pin, + num_pixels=0, + rgb_order=(1, 0, 2), # GRB WS2812 + val_limit=255, + hue_default=0, + sat_default=255, + val_default=255, + hue_step=4, + sat_step=13, + val_step=13, + animation_speed=1, + breathe_center=1, # 1.0-2.7 + knight_effect_length=3, + animation_mode=AnimationModes.STATIC, + effect_init=False, + reverse_animation=False, + user_animation=None, + pixels=None, + refresh_rate=60, + ): + self.pixel_pin = pixel_pin + self.num_pixels = num_pixels + self.rgb_order = rgb_order + self.hue_step = hue_step + self.sat_step = sat_step + self.val_step = val_step + self.hue = hue_default + self.hue_default = hue_default + self.sat = sat_default + self.sat_default = sat_default + self.val = val_default + self.val_default = val_default + self.breathe_center = breathe_center + self.knight_effect_length = knight_effect_length + self.val_limit = val_limit + self.animation_mode = animation_mode + self.animation_speed = animation_speed + self.effect_init = effect_init + self.reverse_animation = reverse_animation + self.user_animation = user_animation + self.pixels = pixels + self.refresh_rate = refresh_rate + + self.rgbw = bool(len(rgb_order) == 4) + + self._substep = 0 + + make_key(names=('RGB_TOG',), on_press=self._rgb_tog) + make_key(names=('RGB_HUI',), on_press=self._rgb_hui) + make_key(names=('RGB_HUD',), on_press=self._rgb_hud) + make_key(names=('RGB_SAI',), on_press=self._rgb_sai) + make_key(names=('RGB_SAD',), on_press=self._rgb_sad) + make_key(names=('RGB_VAI',), on_press=self._rgb_vai) + make_key(names=('RGB_VAD',), on_press=self._rgb_vad) + make_key(names=('RGB_ANI',), on_press=self._rgb_ani) + make_key(names=('RGB_AND',), on_press=self._rgb_and) + make_key(names=('RGB_MODE_PLAIN', 'RGB_M_P'), on_press=self._rgb_mode_static) + make_key(names=('RGB_MODE_BREATHE', 'RGB_M_B'), on_press=self._rgb_mode_breathe) + make_key(names=('RGB_MODE_RAINBOW', 'RGB_M_R'), on_press=self._rgb_mode_rainbow) + make_key( + names=('RGB_MODE_BREATHE_RAINBOW', 'RGB_M_BR'), + on_press=self._rgb_mode_breathe_rainbow, + ) + make_key(names=('RGB_MODE_SWIRL', 'RGB_M_S'), on_press=self._rgb_mode_swirl) + make_key(names=('RGB_MODE_KNIGHT', 'RGB_M_K'), on_press=self._rgb_mode_knight) + make_key(names=('RGB_RESET', 'RGB_RST'), on_press=self._rgb_reset) + + def on_runtime_enable(self, sandbox): + return + + def on_runtime_disable(self, sandbox): + return + + def during_bootup(self, sandbox): + if self.pixels is None: + import neopixel + + self.pixels = neopixel.NeoPixel( + self.pixel_pin, + self.num_pixels, + pixel_order=self.rgb_order, + ) + + # PixelBuffer are already iterable, can't do the usual `try: iter(...)` + if issubclass(self.pixels.__class__, PixelBuf): + self.pixels = (self.pixels,) + + # Turn off auto_write on the backend. We handle the propagation of auto_write + # behaviour. + for pixel in self.pixels: + pixel.auto_write = False + + if self.num_pixels == 0: + for pixels in self.pixels: + self.num_pixels += len(pixels) + + if debug.enabled: + for n, pixels in enumerate(self.pixels): + debug(f'pixels[{n}] = {pixels.__class__}[{len(pixels)}]') + + self._task = create_task(self.animate, period_ms=(1000 // self.refresh_rate)) + + def before_matrix_scan(self, sandbox): + return + + def after_matrix_scan(self, sandbox): + return + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + pass + + def on_powersave_enable(self, sandbox): + return + + def on_powersave_disable(self, sandbox): + self._do_update() + + def deinit(self, sandbox): + for pixel in self.pixels: + pixel.deinit() + + def set_hsv(self, hue, sat, val, index): + ''' + Takes HSV values and displays it on a single LED/Neopixel + :param hue: + :param sat: + :param val: + :param index: Index of LED/Pixel + ''' + + val = clamp(val, 0, self.val_limit) + + if self.rgbw: + self.set_rgb(hsv_to_rgbw(hue, sat, val), index) + else: + self.set_rgb(hsv_to_rgb(hue, sat, val), index) + + def set_hsv_fill(self, hue, sat, val): + ''' + Takes HSV values and displays it on all LEDs/Neopixels + :param hue: + :param sat: + :param val: + ''' + + val = clamp(val, 0, self.val_limit) + + if self.rgbw: + self.set_rgb_fill(hsv_to_rgbw(hue, sat, val)) + else: + self.set_rgb_fill(hsv_to_rgb(hue, sat, val)) + + def set_rgb(self, rgb, index): + ''' + Takes an RGB or RGBW and displays it on a single LED/Neopixel + :param rgb: RGB or RGBW + :param index: Index of LED/Pixel + ''' + if 0 <= index <= self.num_pixels - 1: + for pixels in self.pixels: + if index <= (len(pixels) - 1): + pixels[index] = rgb + break + index -= len(pixels) + + def set_rgb_fill(self, rgb): + ''' + Takes an RGB or RGBW and displays it on all LEDs/Neopixels + :param rgb: RGB or RGBW + ''' + for pixels in self.pixels: + pixels.fill(rgb) + + def increase_hue(self, step=None): + ''' + Increases hue by step amount rolling at 256 and returning to 0 + :param step: + ''' + if step is None: + step = self.hue_step + + self.hue = (self.hue + step) % 256 + + if self._check_update(): + self._do_update() + + def decrease_hue(self, step=None): + ''' + Decreases hue by step amount rolling at 0 and returning to 256 + :param step: + ''' + if step is None: + step = self.hue_step + + if (self.hue - step) <= 0: + self.hue = (self.hue + 256 - step) % 256 + else: + self.hue = (self.hue - step) % 256 + + if self._check_update(): + self._do_update() + + def increase_sat(self, step=None): + ''' + Increases saturation by step amount stopping at 255 + :param step: + ''' + if step is None: + step = self.sat_step + + self.sat = clamp(self.sat + step, 0, 255) + + if self._check_update(): + self._do_update() + + def decrease_sat(self, step=None): + ''' + Decreases saturation by step amount stopping at 0 + :param step: + ''' + if step is None: + step = self.sat_step + + self.sat = clamp(self.sat - step, 0, 255) + + if self._check_update(): + self._do_update() + + def increase_val(self, step=None): + ''' + Increases value by step amount stopping at 100 + :param step: + ''' + if step is None: + step = self.val_step + + self.val = clamp(self.val + step, 0, 255) + + if self._check_update(): + self._do_update() + + def decrease_val(self, step=None): + ''' + Decreases value by step amount stopping at 0 + :param step: + ''' + if step is None: + step = self.val_step + + self.val = clamp(self.val - step, 0, 255) + + if self._check_update(): + self._do_update() + + def increase_ani(self): + ''' + Increases animation speed by 1 amount stopping at 10 + :param step: + ''' + self.animation_speed = clamp(self.animation_speed + 1, 0, 10) + + if self._check_update(): + self._do_update() + + def decrease_ani(self): + ''' + Decreases animation speed by 1 amount stopping at 0 + :param step: + ''' + self.animation_speed = clamp(self.animation_speed - 1, 0, 10) + + if self._check_update(): + self._do_update() + + def off(self): + ''' + Turns off all LEDs/Neopixels without changing stored values + ''' + self.set_hsv_fill(0, 0, 0) + + self.show() + + def show(self): + ''' + Turns on all LEDs/Neopixels without changing stored values + ''' + for pixels in self.pixels: + pixels.show() + + def animate(self): + ''' + Activates a "step" in the animation based on the active mode + :return: Returns the new state in animation + ''' + if self.effect_init: + self._init_effect() + + if self.animation_mode is AnimationModes.STATIC_STANDBY: + return + + if not self.enable: + return + + self._animation_step() + + if self.animation_mode == AnimationModes.STATIC_STANDBY: + return + elif self.animation_mode == AnimationModes.BREATHING: + self.effect_breathing() + elif self.animation_mode == AnimationModes.BREATHING_RAINBOW: + self.effect_breathing_rainbow() + elif self.animation_mode == AnimationModes.KNIGHT: + self.effect_knight() + elif self.animation_mode == AnimationModes.RAINBOW: + self.effect_rainbow() + elif self.animation_mode == AnimationModes.STATIC: + self.effect_static() + elif self.animation_mode == AnimationModes.SWIRL: + self.effect_swirl() + elif self.animation_mode == AnimationModes.USER: + self.user_animation(self) + else: + self.off() + + self.show() + + def _animation_step(self): + self._substep += self.animation_speed / 4 + self._step = int(self._substep) + self._substep -= self._step + + def _init_effect(self): + self.pos = 0 + self.reverse_animation = False + self.effect_init = False + + def _check_update(self): + return bool(self.animation_mode == AnimationModes.STATIC_STANDBY) + + def _do_update(self): + if self.animation_mode == AnimationModes.STATIC_STANDBY: + self.animation_mode = AnimationModes.STATIC + + def effect_static(self): + self.set_hsv_fill(self.hue, self.sat, self.val) + self.animation_mode = AnimationModes.STATIC_STANDBY + + def effect_breathing(self): + # http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ + # https://github.com/qmk/qmk_firmware/blob/9f1d781fcb7129a07e671a46461e501e3f1ae59d/quantum/rgblight.c#L806 + sined = sin((self.pos / 255.0) * pi) + multip_1 = exp(sined) - self.breathe_center / e + multip_2 = clamp(self.val, 0, self.val_limit) / (e - 1 / e) + + val = int(multip_1 * multip_2) + self.pos = (self.pos + self._step) % 256 + self.set_hsv_fill(self.hue, self.sat, val) + + def effect_breathing_rainbow(self): + self.increase_hue(self._step) + self.effect_breathing() + + def effect_rainbow(self): + self.increase_hue(self._step) + self.set_hsv_fill(self.hue, self.sat, self.val) + + def effect_swirl(self): + self.increase_hue(self._step) + for i in range(0, self.num_pixels): + self.set_hsv( + (self.hue - (i * self.num_pixels)) % 256, self.sat, self.val, i + ) + + def effect_knight(self): + # Determine which LEDs should be lit up + self.off() # Fill all off + pos = int(self.pos) + + # Set all pixels on in range of animation length offset by position + for i in range(pos, (pos + self.knight_effect_length)): + self.set_hsv(self.hue, self.sat, self.val, i) + + # Reverse animation when a boundary is hit + if pos >= self.num_pixels: + self.reverse_animation = True + elif 1 - pos > self.knight_effect_length: + self.reverse_animation = False + + if self.reverse_animation: + self.pos -= self._step / 2 + else: + self.pos += self._step / 2 + + def _rgb_tog(self, *args, **kwargs): + if self.animation_mode == AnimationModes.STATIC: + self.animation_mode = AnimationModes.STATIC_STANDBY + self._do_update() + if self.animation_mode == AnimationModes.STATIC_STANDBY: + self.animation_mode = AnimationModes.STATIC + self._do_update() + if self.enable: + self.off() + self.enable = not self.enable + + def _rgb_hui(self, *args, **kwargs): + self.increase_hue() + + def _rgb_hud(self, *args, **kwargs): + self.decrease_hue() + + def _rgb_sai(self, *args, **kwargs): + self.increase_sat() + + def _rgb_sad(self, *args, **kwargs): + self.decrease_sat() + + def _rgb_vai(self, *args, **kwargs): + self.increase_val() + + def _rgb_vad(self, *args, **kwargs): + self.decrease_val() + + def _rgb_ani(self, *args, **kwargs): + self.increase_ani() + + def _rgb_and(self, *args, **kwargs): + self.decrease_ani() + + def _rgb_mode_static(self, *args, **kwargs): + self.effect_init = True + self.animation_mode = AnimationModes.STATIC + + def _rgb_mode_breathe(self, *args, **kwargs): + self.effect_init = True + self.animation_mode = AnimationModes.BREATHING + + def _rgb_mode_breathe_rainbow(self, *args, **kwargs): + self.effect_init = True + self.animation_mode = AnimationModes.BREATHING_RAINBOW + + def _rgb_mode_rainbow(self, *args, **kwargs): + self.effect_init = True + self.animation_mode = AnimationModes.RAINBOW + + def _rgb_mode_swirl(self, *args, **kwargs): + self.effect_init = True + self.animation_mode = AnimationModes.SWIRL + + def _rgb_mode_knight(self, *args, **kwargs): + self.effect_init = True + self.animation_mode = AnimationModes.KNIGHT + + def _rgb_reset(self, *args, **kwargs): + self.hue = self.hue_default + self.sat = self.sat_default + self.val = self.val_default + if self.animation_mode == AnimationModes.STATIC_STANDBY: + self.animation_mode = AnimationModes.STATIC + self._do_update() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/statusled.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/statusled.py new file mode 100644 index 000000000..7610ca121 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/statusled.py @@ -0,0 +1,149 @@ +# Use this extension for showing layer status with three leds + +import pwmio +import time + +from kmk.extensions import Extension, InvalidExtensionEnvironment +from kmk.keys import make_key +from kmk.utils import Debug + +debug = Debug(__name__) + + +class statusLED(Extension): + def __init__( + self, + led_pins, + brightness=30, + brightness_step=5, + brightness_limit=100, + ): + self._leds = [] + for led in led_pins: + try: + self._leds.append(pwmio.PWMOut(led)) + except Exception as e: + if debug.enabled: + debug(e) + raise InvalidExtensionEnvironment( + 'Unable to create pulseio.PWMOut() instance with provided led_pin' + ) + self._led_count = len(self._leds) + + self.brightness = brightness + self._layer_last = -1 + + self.brightness_step = brightness_step + self.brightness_limit = brightness_limit + + make_key(names=('SLED_INC',), on_press=self._key_led_inc) + make_key(names=('SLED_DEC',), on_press=self._key_led_dec) + + def _layer_indicator(self, layer_active, *args, **kwargs): + ''' + Indicates layer with leds + + For the time being just a simple consecutive single led + indicator. And when there are more layers than leds it + wraps around to the first led again. + (Also works for a single led, which just lights when any + layer is active) + ''' + + if self._layer_last != layer_active: + led_last = 0 if self._layer_last == 0 else 1 + (self._layer_last - 1) % 3 + if layer_active > 0: + led_active = 0 if layer_active == 0 else 1 + (layer_active - 1) % 3 + self.set_brightness(self.brightness, led_active) + self.set_brightness(0, led_last) + else: + self.set_brightness(0, led_last) + self._layer_last = layer_active + + def __repr__(self): + return f'SLED({self._to_dict()})' + + def _to_dict(self): + return { + 'brightness': self.brightness, + 'brightness_step': self.brightness_step, + 'brightness_limit': self.brightness_limit, + } + + def on_runtime_enable(self, sandbox): + return + + def on_runtime_disable(self, sandbox): + return + + def during_bootup(self, sandbox): + '''Light up every single led once for 200 ms''' + for i in range(self._led_count + 2): + if i < self._led_count: + self._leds[i].duty_cycle = int(self.brightness / 100 * 65535) + i_off = i - 2 + if i_off >= 0 and i_off < self._led_count: + self._leds[i_off].duty_cycle = int(0) + time.sleep(0.1) + for led in self._leds: + led.duty_cycle = int(0) + return + + def before_matrix_scan(self, sandbox): + return + + def after_matrix_scan(self, sandbox): + self._layer_indicator(sandbox.active_layers[0]) + return + + def before_hid_send(self, sandbox): + return + + def after_hid_send(self, sandbox): + return + + def on_powersave_enable(self, sandbox): + self.set_brightness(0) + return + + def on_powersave_disable(self, sandbox): + self.set_brightness(self.brightness) + self._leds[2].duty_cycle = int(50 / 100 * 65535) + time.sleep(0.2) + self._leds[2].duty_cycle = int(0) + return + + def set_brightness(self, percent, layer_id=-1): + if layer_id < 0: + for led in self._leds: + led.duty_cycle = int(percent / 100 * 65535) + else: + self._leds[layer_id - 1].duty_cycle = int(percent / 100 * 65535) + + def increase_brightness(self, step=None): + if not step: + self.brightness += self.brightness_step + else: + self.brightness += step + + if self.brightness > 100: + self.brightness = 100 + + self.set_brightness(self.brightness, self._layer_last) + + def decrease_brightness(self, step=None): + if not step: + self.brightness -= self.brightness_step + else: + self.brightness -= step + + if self.brightness < 0: + self.brightness = 0 + + self.set_brightness(self.brightness, self._layer_last) + + def _key_led_inc(self, *args, **kwargs): + self.increase_brightness() + + def _key_led_dec(self, *args, **kwargs): + self.decrease_brightness() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/extensions/stringy_keymaps.py b/hackpads/NumMarcroPad/Firmware/kmk/extensions/stringy_keymaps.py new file mode 100644 index 000000000..a2b1ef75a --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/extensions/stringy_keymaps.py @@ -0,0 +1,45 @@ +from kmk.extensions import Extension +from kmk.keys import KC + + +class StringyKeymaps(Extension): + ##### + # User-configurable + debug_enabled = False + + def on_runtime_enable(self, keyboard): + return + + def on_runtime_disable(self, keyboard): + return + + def during_bootup(self, keyboard): + for _, layer in enumerate(keyboard.keymap): + for key_idx, key in enumerate(layer): + if isinstance(key, str): + replacement = KC.get(key) + if replacement is None: + replacement = KC.NO + if self.debug_enabled: + print(f"Failed replacing '{key}'. Using KC.NO") + elif self.debug_enabled: + print(f"Replacing '{key}' with {replacement}") + layer[key_idx] = replacement + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/handlers/__init__.py b/hackpads/NumMarcroPad/Firmware/kmk/handlers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/hackpads/NumMarcroPad/Firmware/kmk/handlers/stock.py b/hackpads/NumMarcroPad/Firmware/kmk/handlers/stock.py new file mode 100644 index 000000000..437f70480 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/handlers/stock.py @@ -0,0 +1,121 @@ +from time import sleep + + +def passthrough(key, keyboard, *args, **kwargs): + return keyboard + + +def reset(*args, **kwargs): + import microcontroller + + microcontroller.reset() + + +def reload(*args, **kwargs): + import supervisor + + supervisor.reload() + + +def bootloader(*args, **kwargs): + import microcontroller + + microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER) + microcontroller.reset() + + +def gesc_pressed(key, keyboard, KC, *args, **kwargs): + GESC_TRIGGERS = {KC.LSHIFT, KC.RSHIFT, KC.LGUI, KC.RGUI} + + if GESC_TRIGGERS.intersection(keyboard.keys_pressed): + # First, release GUI if already pressed + keyboard._send_hid() + # if Shift is held, KC_GRAVE will become KC_TILDE on OS level + keyboard.keys_pressed.add(KC.GRAVE) + keyboard.hid_pending = True + return keyboard + + # else return KC_ESC + keyboard.keys_pressed.add(KC.ESCAPE) + keyboard.hid_pending = True + + return keyboard + + +def gesc_released(key, keyboard, KC, *args, **kwargs): + keyboard.keys_pressed.discard(KC.ESCAPE) + keyboard.keys_pressed.discard(KC.GRAVE) + keyboard.hid_pending = True + return keyboard + + +def bkdl_pressed(key, keyboard, KC, *args, **kwargs): + BKDL_TRIGGERS = {KC.LGUI, KC.RGUI} + + if BKDL_TRIGGERS.intersection(keyboard.keys_pressed): + keyboard._send_hid() + keyboard.keys_pressed.add(KC.DEL) + keyboard.hid_pending = True + return keyboard + + # else return KC_ESC + keyboard.keys_pressed.add(KC.BKSP) + keyboard.hid_pending = True + + return keyboard + + +def bkdl_released(key, keyboard, KC, *args, **kwargs): + keyboard.keys_pressed.discard(KC.BKSP) + keyboard.keys_pressed.discard(KC.DEL) + keyboard.hid_pending = True + return keyboard + + +def sleep_pressed(key, keyboard, KC, *args, **kwargs): + sleep(key.meta.ms / 1000) + return keyboard + + +def uc_mode_pressed(key, keyboard, *args, **kwargs): + keyboard.unicode_mode = key.meta.mode + + return keyboard + + +def hid_switch(key, keyboard, *args, **kwargs): + keyboard.hid_type, keyboard.secondary_hid_type = ( + keyboard.secondary_hid_type, + keyboard.hid_type, + ) + keyboard._init_hid() + return keyboard + + +def ble_refresh(key, keyboard, *args, **kwargs): + from kmk.hid import HIDModes + + if keyboard.hid_type != HIDModes.BLE: + return keyboard + + keyboard._hid_helper.stop_advertising() + keyboard._hid_helper.start_advertising() + return keyboard + + +def ble_disconnect(key, keyboard, *args, **kwargs): + from kmk.hid import HIDModes + + if keyboard.hid_type != HIDModes.BLE: + return keyboard + + keyboard._hid_helper.clear_bonds() + return keyboard + + +def any_pressed(key, keyboard, *args, **kwargs): + from random import randint + + key.code = randint(4, 56) + keyboard.keys_pressed.add(key) + keyboard.hid_pending = True diff --git a/hackpads/NumMarcroPad/Firmware/kmk/hid.py b/hackpads/NumMarcroPad/Firmware/kmk/hid.py new file mode 100644 index 000000000..a87c3d234 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/hid.py @@ -0,0 +1,404 @@ +import supervisor +import usb_hid +from micropython import const + +from storage import getmount + +from kmk.keys import ConsumerKey, KeyboardKey, ModifierKey, MouseKey +from kmk.scheduler import cancel_task, create_task +from kmk.utils import Debug, clamp + +try: + from adafruit_ble import BLERadio + from adafruit_ble.advertising.standard import ProvideServicesAdvertisement + from adafruit_ble.services.standard.hid import HIDService +except ImportError: + # BLE not supported on this platform + pass + + +debug = Debug(__name__) + + +class HIDModes: + NOOP = 0 # currently unused; for testing? + USB = 1 + BLE = 2 + + ALL_MODES = (NOOP, USB, BLE) + + +class HIDReportTypes: + KEYBOARD = 1 + MOUSE = 2 + CONSUMER = 3 + SYSCONTROL = 4 + + +class HIDUsage: + KEYBOARD = 0x06 + MOUSE = 0x02 + CONSUMER = 0x01 + SYSCONTROL = 0x80 + + +class HIDUsagePage: + CONSUMER = 0x0C + KEYBOARD = MOUSE = SYSCONTROL = 0x01 + + +HID_REPORT_SIZES = { + HIDReportTypes.KEYBOARD: 8, + HIDReportTypes.MOUSE: 4, + HIDReportTypes.CONSUMER: 2, + HIDReportTypes.SYSCONTROL: 8, # TODO find the correct value for this +} + + +class AbstractHID: + report_bytes_default = 8 + report_bytes_nkro = 17 + REPORT_BYTES = report_bytes_default + hid_devices = {} + hid_ready = False + + def __init__(self, **kwargs): + self._nkro = False + self._mouse = True + self._pan = False + self.find_devices() + self.setup_keyboard_hid() + self.setup_consumer_control() + self.setup_mouse_hid() + + def show_debug(self): + if self._nkro: + debug('use NKRO') + else: + debug('use 6KRO') + if self._mouse and self._pan: + debug('enable horizontal scrolling mouse') + elif self._mouse: + debug('enable mouse') + else: + debug('disable mouse') + + def find_devices(self): + self.devices = {} + + for device in self.hid_devices: + if not hasattr(device, 'send_report'): + continue + us = device.usage + up = device.usage_page + + if up == HIDUsagePage.CONSUMER and us == HIDUsage.CONSUMER: + self.devices[HIDReportTypes.CONSUMER] = device + elif up == HIDUsagePage.KEYBOARD and us == HIDUsage.KEYBOARD: + self.devices[HIDReportTypes.KEYBOARD] = device + elif up == HIDUsagePage.MOUSE and us == HIDUsage.MOUSE: + self.devices[HIDReportTypes.MOUSE] = device + elif up == HIDUsagePage.SYSCONTROL and us == HIDUsage.SYSCONTROL: + self.devices[HIDReportTypes.SYSCONTROL] = device + + def setup_keyboard_hid(self): + self.REPORT_BYTES = self.report_bytes_default + self._evt = bytearray(self.REPORT_BYTES) + self._evt[0] = HIDReportTypes.KEYBOARD + + # bodgy NKRO autodetect + try: + self.hid_send(self._evt) + except ValueError: + self.REPORT_BYTES = self.report_bytes_nkro + self._evt = bytearray(self.REPORT_BYTES) + self._evt[0] = HIDReportTypes.KEYBOARD + self._nkro = True + + self._prev_evt = bytearray(self.REPORT_BYTES) + + # Landmine alert for HIDReportTypes.KEYBOARD: byte index 1 of this view + # is "reserved" and evidently (mostly?) unused. However, other modes (or + # at least consumer, so far) will use this byte, which is the main reason + # this view exists. For KEYBOARD, use report_mods and report_non_mods + self.report_keys = memoryview(self._evt)[1:] + + self.report_mods = memoryview(self._evt)[1:2] + self.report_non_mods = memoryview(self._evt)[3:] + + def setup_consumer_control(self): + self._cc_report = bytearray(HID_REPORT_SIZES[HIDReportTypes.CONSUMER] + 1) + self._cc_report[0] = HIDReportTypes.CONSUMER + self._cc_pending = False + + def setup_mouse_hid(self): + self._pd_report = bytearray(HID_REPORT_SIZES[HIDReportTypes.MOUSE] + 1) + self._pd_report[0] = HIDReportTypes.MOUSE + self._pd_pending = False + + # bodgy pointing device panning autodetect + try: + self.hid_send(self._pd_report) + except ValueError: + self._pd_report = bytearray(6) + self._pd_report[0] = HIDReportTypes.MOUSE + self._pan = True + except KeyError: + self._mouse = False + + def __repr__(self): + return f'{self.__class__.__name__}(REPORT_BYTES={self.REPORT_BYTES})' + + def create_report(self, keys_pressed, axes): + self.clear_all() + + for key in keys_pressed: + if isinstance(key, KeyboardKey): + self.add_key(key) + elif isinstance(key, ModifierKey): + self.add_modifier(key) + elif isinstance(key, ConsumerKey): + self.add_cc(key) + elif isinstance(key, MouseKey): + self.add_pd(key) + + for axis in axes: + self.move_axis(axis) + + def hid_send(self, evt): + # Don't raise a NotImplementedError so this can serve as our "dummy" HID + # when MCU/board doesn't define one to use (which should almost always be + # the CircuitPython-targeting one, except when unit testing or doing + # something truly bizarre. This will likely change eventually when Bluetooth + # is added) + pass + + def send(self): + if self._evt != self._prev_evt: + self._prev_evt[:] = self._evt + self.hid_send(self._evt) + + if self._cc_pending: + self.hid_send(self._cc_report) + self._cc_pending = False + + if self._pd_pending: + self.hid_send(self._pd_report) + self._pd_pending = False + + return self + + def clear_all(self): + for idx, _ in enumerate(self.report_keys): + self.report_keys[idx] = 0x00 + + self.remove_cc() + self.remove_pd() + self.clear_axis() + + return self + + def clear_non_modifiers(self): + for idx, _ in enumerate(self.report_non_mods): + self.report_non_mods[idx] = 0x00 + + return self + + def add_modifier(self, modifier): + if isinstance(modifier, ModifierKey): + self.report_mods[0] |= modifier.code + else: + self.report_mods[0] |= modifier + + return self + + def remove_modifier(self, modifier): + if isinstance(modifier, ModifierKey): + self.report_mods[0] ^= modifier.code + else: + self.report_mods[0] ^= modifier + + return self + + def add_key(self, key): + if not self._nkro: + # Try to find the first empty slot in the key report, and fill it + idx = self._evt.find(b'\x00', 3) + + if idx < len(self._evt): + self._evt[idx] = key.code + else: + # TODO what do we do here?...... + pass + else: + self.report_keys[(key.code >> 3) + 1] |= 1 << (key.code & 0x07) + + def remove_key(self, key): + if not self._nkro: + code = key.code.to_bytes(1, 'little') + idx = self._evt.find(code, 3) + self._evt[idx] = 0x00 + else: + self.report_keys[(key.code >> 3) + 1] &= ~(1 << (key.code & 0x07)) + + def add_cc(self, cc): + # Add (or write over) consumer control report. There can only be one CC + # active at any time. + memoryview(self._cc_report)[1:3] = cc.code.to_bytes(2, 'little') + self._cc_pending = True + + def remove_cc(self): + # Remove consumer control report. + report = memoryview(self._cc_report)[1:3] + if report != b'\x00\x00': + report[:] = b'\x00\x00' + self._cc_pending = True + + def add_pd(self, key): + self._pd_report[1] |= key.code + self._pd_pending = True + + def remove_pd(self): + if self._pd_report[1]: + self._pd_pending = True + self._pd_report[1] = 0x00 + + def move_axis(self, axis): + delta = clamp(axis.delta, -127, 127) + axis.delta -= delta + try: + self._pd_report[axis.code + 2] = 0xFF & delta + self._pd_pending = True + except IndexError: + if debug.enabled: + debug('Axis(', axis.code, ') not supported') + + def clear_axis(self): + for idx in range(2, len(self._pd_report)): + self._pd_report[idx] = 0x00 + + def has_key(self, key): + if isinstance(key, ModifierKey): + return bool(self.report_mods[0] & key.code) + else: + if not self._nkro: + code = key.code.to_bytes(1, 'little') + return self.report_non_mods.find(code) > 0 + else: + part = self.report_keys[(key.code >> 3) + 1] + return bool(part & (1 << (key.code & 0x07))) + return False + + +class USBHID(AbstractHID): + report_bytes_default = 9 + REPORT_BYTES = report_bytes_default + + def __init__(self, **kwargs): + self.hid = usb_hid + self.hid_devices = self.hid.devices + super().__init__(**kwargs) + self._setup_task = self.wait_until_connected() + + def test_reports(self): + if self._connected(): + try: + self.hid_ready = True + self.setup_keyboard_hid() + self.setup_consumer_control() + self.setup_mouse_hid() + cancel_task(self._setup_task) + self._setup_task = None + if debug.enabled: + self.show_debug() + self.hid_ready = True + except OSError as e: + if debug.enabled: + debug(type(e), ':', e) + + def wait_until_connected(self, period_ms=200): + return create_task(self.test_reports, period_ms=period_ms) + + def _connected(self): + return supervisor.runtime.usb_connected + + def hid_send(self, evt): + if not self.hid_ready or not self._connected(): + return + + # int, can be looked up in HIDReportTypes + reporting_device_const = evt[0] + + return self.devices[reporting_device_const].send_report(evt[1:]) + + +class BLEHID(AbstractHID): + BLE_APPEARANCE_HID_KEYBOARD = const(961) + # Hardcoded in CPy + MAX_CONNECTIONS = const(2) + ble_connected = False + + def __init__(self, ble_name=str(getmount('/').label), **kwargs): + self.ble_name = ble_name + self.ble = BLERadio() + self.ble.name = self.ble_name + self.hid = HIDService() + self.hid_devices = self.hid.devices + self.hid.protocol_mode = 0 # Boot protocol + super().__init__(**kwargs) + self.start_ble_monitor() + + def _connected(self): + return self.ble.connected + + def ble_monitor(self): + if self.ble_connected != self._connected(): + self.ble_connected = self._connected() + if self._connected(): + self.find_devices() + self.hid_ready = True + if debug.enabled: + debug('BLE connected') + else: + self.hid_ready = False + # Security-wise this is not right. While you're away someone turns + # on your keyboard and they can pair with it nice and clean and then + # listen to keystrokes. + # On the other hand we don't have LESC so it's like shouting your + # keystrokes in the air + self.start_advertising() + if debug.enabled: + debug('BLE disconnected') + + def start_ble_monitor(self, period_ms=200): + return create_task(self.setup, period_ms=period_ms) + + def hid_send(self, evt): + if not self.hid_ready or not self._connected(): + return + + # int, can be looked up in HIDReportTypes + reporting_device_const = evt[0] + + device = self.devices[reporting_device_const] + + report_size = len(device._characteristic.value) + while len(evt) < report_size + 1: + evt.append(0) + + return device.send_report(evt[1 : report_size + 1]) # noqa: E203 + + def clear_bonds(self): + import _bleio + + _bleio.adapter.erase_bonding() + + def start_advertising(self): + if not self.ble.advertising: + advertisement = ProvideServicesAdvertisement(self.hid) + advertisement.appearance = self.BLE_APPEARANCE_HID_KEYBOARD + + self.ble.start_advertising(advertisement) + + def stop_advertising(self): + self.ble.stop_advertising() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/hid_reports/nkro_keyboard.py b/hackpads/NumMarcroPad/Firmware/kmk/hid_reports/nkro_keyboard.py new file mode 100644 index 000000000..51933775e --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/hid_reports/nkro_keyboard.py @@ -0,0 +1,50 @@ +import usb_hid + +# fmt:off +report_descriptor = bytes( + ( + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls), + 0x09, 0x06, # Usage (Keyboard), + 0xA1, 0x01, # Collection (Application), + 0x85, 0x01, # Report ID (1) + # modifiers + 0x05, 0x07, # Usage Page (Key Codes), + 0x19, 0xE0, # Usage Minimum (224), + 0x29, 0xE7, # Usage Maximum (231), + 0x15, 0x00, # Logical Minimum (0), + 0x25, 0x01, # Logical Maximum (1), + 0x75, 0x01, # Report Size (1), + 0x95, 0x08, # Report Count (8), + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + # LEDs + 0x05, 0x08, # Usage Page (LEDs), + 0x19, 0x01, # Usage Minimum (1), + 0x29, 0x05, # Usage Maximum (5), + 0x95, 0x05, # Report Count (5), + 0x75, 0x01, # Report Size (1), + 0x91, 0x02, # Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non- olatile) + 0x95, 0x01, # Report Count (1), + 0x75, 0x03, # Report Size (3), + 0x91, 0x01, # Output (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,N n-volatile) + # keys + 0x05, 0x07, # Usage Page (Kbrd/Keypad), + 0x19, 0x00, # Usage Minimum (0), + 0x29, 0x77, # Usage Maximum (119), + 0x15, 0x00, # Logical Minimum (0), + 0x25, 0x01, # Logical Maximum(1), + 0x95, 0x78, # Report Count (120), + 0x75, 0x01, # Report Size (1), + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0xC0, # End Collection + ) +) +# fmt:on + +NKRO_KEYBOARD = usb_hid.Device( + report_descriptor=report_descriptor, + usage_page=0x01, + usage=0x06, + report_ids=(0x01,), + in_report_lengths=(16,), + out_report_lengths=(1,), +) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/hid_reports/pointer.py b/hackpads/NumMarcroPad/Firmware/kmk/hid_reports/pointer.py new file mode 100644 index 000000000..f2e25f807 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/hid_reports/pointer.py @@ -0,0 +1,48 @@ +import usb_hid + +# fmt:off +report_descriptor = bytes( + ( + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x09, 0x02, # Usage (Mouse) + 0xA1, 0x01, # Collection (Application) + 0x09, 0x01, # Usage (Pointer) + 0xA1, 0x00, # Collection (Physical) + 0x85, 0x02, # 10, 11 Report ID (2) + 0x05, 0x09, # Usage Page (Button) + 0x19, 0x01, # Usage Minimum (0x01) + 0x29, 0x05, # Usage Maximum (0x05) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0x01, # Logical Maximum (1) + 0x95, 0x05, # Report Count (5) + 0x75, 0x01, # Report Size (1) + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x95, 0x01, # Report Count (1) + 0x75, 0x03, # Report Size (3) + 0x81, 0x01, # Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x09, 0x30, # Usage (X) + 0x09, 0x31, # Usage (Y) + 0x09, 0x38, # Usage (Wheel) + 0x05, 0x0C, # Usage Page (Consumer Devices) 0x0A, + 0x38, 0x02, # Usage (AC Pan) + 0x15, 0x81, # Logical Minimum (-127) + 0x25, 0x7F, # Logical Maximum (127) + 0x95, 0x04, # Report Count (4) + 0x75, 0x08, # Report Size (8) + 0x81, 0x06, # Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position) + 0xC0, # End Collection + 0xC0, # End Collection + ) +) +# fmt:on + + +POINTER = usb_hid.Device( + report_descriptor=report_descriptor, + usage_page=0x01, + usage=0x02, + report_ids=(0x02,), + in_report_lengths=(5,), + out_report_lengths=(0,), +) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/keys.py b/hackpads/NumMarcroPad/Firmware/kmk/keys.py new file mode 100644 index 000000000..e34486392 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/keys.py @@ -0,0 +1,548 @@ +try: + from typing import Callable, Optional, Tuple +except ImportError: + pass + +import kmk.handlers.stock as handlers +from kmk.utils import Debug + +# Type aliases / forward declaration; can't use the proper types because of circular imports. +Keyboard = object +Key = object + + +ALL_ALPHAS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +ALL_NUMBERS = '1234567890' +# since KC.1 isn't valid Python, alias to KC.N1 +ALL_NUMBER_ALIASES = tuple(f'N{x}' for x in ALL_NUMBERS) + +debug = Debug(__name__) + + +class Axis: + def __init__(self, code: int) -> None: + self.code = code + self.delta = 0 + + def __repr__(self) -> str: + return f'Axis(code={self.code}, delta={self.delta})' + + def move(self, keyboard: Keyboard, delta: int): + self.delta += delta + if self.delta: + keyboard.axes.add(self) + keyboard.hid_pending = True + else: + keyboard.axes.discard(self) + + +class AX: + P = Axis(3) + W = Axis(2) + X = Axis(0) + Y = Axis(1) + + +def maybe_make_key( + names: Tuple[str, ...], + *args, + **kwargs, +) -> Callable[[str], Key]: + def closure(candidate): + if candidate in names: + return make_key(names=names, *args, **kwargs) + + return closure + + +def maybe_make_argumented_key( + names: Tuple[str, ...], + constructor: [Key, Callable[[...], Key]], + **kwargs, +) -> Callable[[str], Key]: + def closure(candidate): + if candidate in names: + return make_argumented_key( + names=names, + constructor=constructor, + **kwargs, + ) + + return closure + + +def maybe_make_no_key(candidate: str) -> Optional[Key]: + # NO and TRNS are functionally identical in how they (don't) mutate + # the state, but are tracked semantically separately, so create + # two keys with the exact same functionality + keys = ( + ('NO', 'XXXXXXX'), + ('TRANSPARENT', 'TRNS'), + ) + + for names in keys: + if candidate in names: + return make_key( + names=names, + on_press=handlers.passthrough, + on_release=handlers.passthrough, + ) + + +def maybe_make_alpha_key(candidate: str) -> Optional[Key]: + if len(candidate) != 1: + return + + candidate_upper = candidate.upper() + if candidate_upper in ALL_ALPHAS: + return make_key( + names=(candidate_upper, candidate.lower()), + constructor=KeyboardKey, + code=4 + ALL_ALPHAS.index(candidate_upper), + ) + + +def maybe_make_numeric_key(candidate: str) -> Optional[Key]: + if candidate in ALL_NUMBERS or candidate in ALL_NUMBER_ALIASES: + try: + offset = ALL_NUMBERS.index(candidate) + except ValueError: + offset = ALL_NUMBER_ALIASES.index(candidate) + + return make_key( + names=(ALL_NUMBERS[offset], ALL_NUMBER_ALIASES[offset]), + constructor=KeyboardKey, + code=30 + offset, + ) + + +def maybe_make_mod_key(candidate: str) -> Optional[Key]: + # MEH = LCTL | LALT | LSFT + # HYPR = LCTL | LALT | LSFT | LGUI + mods = ( + (0x01, ('LEFT_CONTROL', 'LCTRL', 'LCTL')), + (0x02, ('LEFT_SHIFT', 'LSHIFT', 'LSFT')), + (0x04, ('LEFT_ALT', 'LALT', 'LOPT')), + (0x08, ('LEFT_SUPER', 'LGUI', 'LCMD', 'LWIN')), + (0x10, ('RIGHT_CONTROL', 'RCTRL', 'RCTL')), + (0x20, ('RIGHT_SHIFT', 'RSHIFT', 'RSFT')), + (0x40, ('RIGHT_ALT', 'RALT', 'ROPT')), + (0x80, ('RIGHT_SUPER', 'RGUI', 'RCMD', 'RWIN')), + (0x07, ('MEH',)), + (0x0F, ('HYPER', 'HYPR')), + ) + + for code, names in mods: + if candidate in names: + return make_key(names=names, constructor=ModifierKey, code=code) + + +def maybe_make_more_ascii(candidate: str) -> Optional[Key]: + codes = ( + (40, ('ENTER', 'ENT', '\n')), + (41, ('ESCAPE', 'ESC')), + (42, ('BACKSPACE', 'BSPACE', 'BSPC', 'BKSP')), + (43, ('TAB', '\t')), + (44, ('SPACE', 'SPC', ' ')), + (45, ('MINUS', 'MINS', '-')), + (46, ('EQUAL', 'EQL', '=')), + (47, ('LBRACKET', 'LBRC', '[')), + (48, ('RBRACKET', 'RBRC', ']')), + (49, ('BACKSLASH', 'BSLASH', 'BSLS', '\\')), + (51, ('SEMICOLON', 'SCOLON', 'SCLN', ';')), + (52, ('QUOTE', 'QUOT', "'")), + (53, ('GRAVE', 'GRV', 'ZKHK', '`')), + (54, ('COMMA', 'COMM', ',')), + (55, ('DOT', '.')), + (56, ('SLASH', 'SLSH', '/')), + ) + + for code, names in codes: + if candidate in names: + return make_key(names=names, constructor=KeyboardKey, code=code) + + +def maybe_make_fn_key(candidate: str) -> Optional[Key]: + codes = ( + (58, ('F1',)), + (59, ('F2',)), + (60, ('F3',)), + (61, ('F4',)), + (62, ('F5',)), + (63, ('F6',)), + (64, ('F7',)), + (65, ('F8',)), + (66, ('F9',)), + (67, ('F10',)), + (68, ('F11',)), + (69, ('F12',)), + (104, ('F13',)), + (105, ('F14',)), + (106, ('F15',)), + (107, ('F16',)), + (108, ('F17',)), + (109, ('F18',)), + (110, ('F19',)), + (111, ('F20',)), + (112, ('F21',)), + (113, ('F22',)), + (114, ('F23',)), + (115, ('F24',)), + ) + + for code, names in codes: + if candidate in names: + return make_key(names=names, constructor=KeyboardKey, code=code) + + +def maybe_make_navlock_key(candidate: str) -> Optional[Key]: + codes = ( + (57, ('CAPS_LOCK', 'CAPSLOCK', 'CLCK', 'CAPS')), + # FIXME: Investigate whether this key actually works, and + # uncomment when/if it does. + # (130, ('LOCKING_CAPS', 'LCAP')), + (70, ('PRINT_SCREEN', 'PSCREEN', 'PSCR')), + (71, ('SCROLL_LOCK', 'SCROLLLOCK', 'SLCK')), + # FIXME: Investigate whether this key actually works, and + # uncomment when/if it does. + # (132, ('LOCKING_SCROLL', 'LSCRL')), + (72, ('PAUSE', 'PAUS', 'BRK')), + (73, ('INSERT', 'INS')), + (74, ('HOME',)), + (75, ('PGUP',)), + (76, ('DELETE', 'DEL')), + (77, ('END',)), + (78, ('PGDOWN', 'PGDN')), + (79, ('RIGHT', 'RGHT')), + (80, ('LEFT',)), + (81, ('DOWN',)), + (82, ('UP',)), + ) + + for code, names in codes: + if candidate in names: + return make_key(names=names, constructor=KeyboardKey, code=code) + + +def maybe_make_numpad_key(candidate: str) -> Optional[Key]: + codes = ( + (83, ('NUM_LOCK', 'NUMLOCK', 'NLCK')), + (84, ('KP_SLASH', 'NUMPAD_SLASH', 'PSLS')), + (85, ('KP_ASTERISK', 'NUMPAD_ASTERISK', 'PAST')), + (86, ('KP_MINUS', 'NUMPAD_MINUS', 'PMNS')), + (87, ('KP_PLUS', 'NUMPAD_PLUS', 'PPLS')), + (88, ('KP_ENTER', 'NUMPAD_ENTER', 'PENT')), + (89, ('KP_1', 'P1', 'NUMPAD_1')), + (90, ('KP_2', 'P2', 'NUMPAD_2')), + (91, ('KP_3', 'P3', 'NUMPAD_3')), + (92, ('KP_4', 'P4', 'NUMPAD_4')), + (93, ('KP_5', 'P5', 'NUMPAD_5')), + (94, ('KP_6', 'P6', 'NUMPAD_6')), + (95, ('KP_7', 'P7', 'NUMPAD_7')), + (96, ('KP_8', 'P8', 'NUMPAD_8')), + (97, ('KP_9', 'P9', 'NUMPAD_9')), + (98, ('KP_0', 'P0', 'NUMPAD_0')), + (99, ('KP_DOT', 'PDOT', 'NUMPAD_DOT')), + (103, ('KP_EQUAL', 'PEQL', 'NUMPAD_EQUAL')), + (133, ('KP_COMMA', 'PCMM', 'NUMPAD_COMMA')), + (134, ('KP_EQUAL_AS400', 'NUMPAD_EQUAL_AS400')), + ) + + for code, names in codes: + if candidate in names: + return make_key(names=names, constructor=KeyboardKey, code=code) + + +def maybe_make_shifted_key(candidate: str) -> Optional[Key]: + codes = ( + (30, ('EXCLAIM', 'EXLM', '!')), + (31, ('AT', '@')), + (32, ('HASH', 'POUND', '#')), + (33, ('DOLLAR', 'DLR', '$')), + (34, ('PERCENT', 'PERC', '%')), + (35, ('CIRCUMFLEX', 'CIRC', '^')), + (36, ('AMPERSAND', 'AMPR', '&')), + (37, ('ASTERISK', 'ASTR', '*')), + (38, ('LEFT_PAREN', 'LPRN', '(')), + (39, ('RIGHT_PAREN', 'RPRN', ')')), + (45, ('UNDERSCORE', 'UNDS', '_')), + (46, ('PLUS', '+')), + (47, ('LEFT_CURLY_BRACE', 'LCBR', '{')), + (48, ('RIGHT_CURLY_BRACE', 'RCBR', '}')), + (49, ('PIPE', '|')), + (51, ('COLON', 'COLN', ':')), + (52, ('DOUBLE_QUOTE', 'DQUO', 'DQT', '"')), + (53, ('TILDE', 'TILD', '~')), + (54, ('LEFT_ANGLE_BRACKET', 'LABK', '<')), + (55, ('RIGHT_ANGLE_BRACKET', 'RABK', '>')), + (56, ('QUESTION', 'QUES', '?')), + ) + + for code, names in codes: + if candidate in names: + return make_key( + names=names, constructor=ModifiedKey, code=code, modifier=KC.LSFT + ) + + +def maybe_make_firmware_key(candidate: str) -> Optional[Key]: + keys = ( + ((('BLE_REFRESH',), handlers.ble_refresh)), + ((('BLE_DISCONNECT',), handlers.ble_disconnect)), + ((('BOOTLOADER',), handlers.bootloader)), + ((('HID_SWITCH', 'HID'), handlers.hid_switch)), + ((('RELOAD', 'RLD'), handlers.reload)), + ((('RESET',), handlers.reset)), + ((('ANY',), handlers.any_pressed)), + ) + + for names, handler in keys: + if candidate in names: + return make_key(names=names, on_press=handler) + + +KEY_GENERATORS = ( + maybe_make_no_key, + maybe_make_alpha_key, + maybe_make_numeric_key, + maybe_make_firmware_key, + maybe_make_key( + ('BKDL',), + on_press=handlers.bkdl_pressed, + on_release=handlers.bkdl_released, + ), + maybe_make_key( + ('GESC', 'GRAVE_ESC'), + on_press=handlers.gesc_pressed, + on_release=handlers.gesc_released, + ), + maybe_make_mod_key, + # More ASCII standard keys + maybe_make_more_ascii, + # Function Keys + maybe_make_fn_key, + # Lock Keys, Navigation, etc. + maybe_make_navlock_key, + # Numpad + # FIXME: Investigate whether this key actually works, and + # uncomment when/if it does. + # maybe_make_key(131, ('LOCKING_NUM', 'LNUM')), + maybe_make_numpad_key, + # Making life better for folks on tiny keyboards especially: exposes + # the 'shifted' keys as raw keys. Under the hood we're still + # sending Shift+(whatever key is normally pressed) to get these, so + # for example `KC_AT` will hold shift and press 2. + maybe_make_shifted_key, +) + + +class KeyAttrDict: + # Instead of relying on the uncontrollable availability of a big chunk of + # contiguous memory for key caching, we can manually fragment the cache into + # reasonably small partitions. The partition size is chosen from the magic + # values of CPs hash allocation sizes. + # (https://github.com/adafruit/circuitpython/blob/main/py/map.c, 2023-02) + __partition_size = 37 + __cache = [{}] + + def __iter__(self): + for partition in self.__cache: + for name in partition: + yield name + + def __setitem__(self, name: str, key: Key): + # Overwrite existing reference. + for partition in self.__cache: + if name in partition: + partition[name] = key + return key + + # Insert new reference. + if len(self.__cache[-1]) >= self.__partition_size: + self.__cache.append({}) + self.__cache[-1][name] = key + return key + + def __getattr__(self, name: str): + return self.__getitem__(name) + + def get(self, name: str, default: Optional[Key] = None): + try: + return self.__getitem__(name) + except Exception: + return default + + def clear(self): + self.__cache.clear() + self.__cache.append({}) + + def __getitem__(self, name: str): + for partition in self.__cache: + if name in partition: + return partition[name] + + for func in KEY_GENERATORS: + maybe_key = func(name) + if maybe_key: + break + + if not maybe_key: + if debug.enabled: + debug('Invalid key: ', name) + return KC.NO + + return maybe_key + + +# Global state, will be filled in throughout this file, and +# anywhere the user creates custom keys +KC = KeyAttrDict() + + +class Key: + '''Generic Key class with assignable handlers.''' + + def __init__( + self, + on_press: Callable[[object, Key, Keyboard, ...], None] = handlers.passthrough, + on_release: Callable[[object, Key, Keyboard, ...], None] = handlers.passthrough, + ): + self._on_press = on_press + self._on_release = on_release + + def __repr__(self): + return self.__class__.__name__ + + def on_press(self, keyboard: Keyboard, coord_int: Optional[int] = None) -> None: + self._on_press(self, keyboard, KC, coord_int) + + def on_release(self, keyboard: Keyboard, coord_int: Optional[int] = None) -> None: + self._on_release(self, keyboard, KC, coord_int) + + +class _DefaultKey(Key): + '''Meta class implementing handlers for Keys with HID codes.''' + + def __init__(self, code: Optional[int] = None): + self.code = code + + def __repr__(self): + return super().__repr__() + '(code=' + str(self.code) + ')' + + def on_press(self, keyboard: Keyboard, coord_int: Optional[int] = None) -> None: + keyboard.hid_pending = True + keyboard.keys_pressed.add(self) + + def on_release(self, keyboard: Keyboard, coord_int: Optional[int] = None) -> None: + keyboard.hid_pending = True + keyboard.keys_pressed.discard(self) + + +class KeyboardKey(_DefaultKey): + pass + + +class ModifierKey(_DefaultKey): + def __call__(self, key: Key) -> Key: + # don't duplicate when applying the same modifier twice + if ( + isinstance(key, ModifiedKey) + and key.modifier.code & self.code == key.modifier.code + ): + return key + elif isinstance(key, ModifierKey) and key.code & self.code == key.code: + return key + + return ModifiedKey(key, self) + + +class ModifiedKey(Key): + code = -1 + + def __init__(self, code: [Key, int], modifier: [ModifierKey]): + # generate from code by maybe_make_shifted_key + if isinstance(code, int): + key = KeyboardKey(code=code) + else: + key = code + + # stack modified keys + if isinstance(key, ModifiedKey): + modifier = ModifierKey(key.modifier.code | modifier.code) + key = key.key + + self.key = key + self.modifier = modifier + + def on_press(self, keyboard: Keyboard, coord_int: Optional[int] = None) -> None: + self.modifier.on_press(keyboard, coord_int) + self.key.on_press(keyboard, coord_int) + + def on_release(self, keyboard: Keyboard, coord_int: Optional[int] = None) -> None: + self.key.on_release(keyboard, coord_int) + self.modifier.on_release(keyboard, coord_int) + + def __repr__(self): + return ( + super().__repr__() + + '(key=' + + str(self.key) + + ', modifier=' + + str(self.modifier) + + ')' + ) + + +class ConsumerKey(_DefaultKey): + pass + + +class MouseKey(_DefaultKey): + pass + + +def make_key( + names: Tuple[str, ...], + constructor: Key = Key, + **kwargs, +) -> Key: + ''' + Create a new key, aliased by `names` in the KC lookup table. + + Names are globally unique. If a later key is created with + the same name as an existing entry in `KC`, it will overwrite + the existing entry. + + Names are case sensitive. + + All **kwargs are passed to the Key constructor + ''' + + key = constructor(**kwargs) + + for name in names: + KC[name] = key + + return key + + +# Argumented keys are implicitly internal, so auto-gen of code +# is almost certainly the best plan here +def make_argumented_key( + names: Tuple[str, ...], + constructor: [Key, Callable[[...], Key]], + **_kwargs, +) -> Key: + + def argumented_key(*args, **kwargs) -> Key: + # This is a very ugly workaround for missing syntax in mpy-cross 8.x + # and, once EOL, can be replaced by: + # return constructor(*args, **_kwargs, **kwargs) + k = _kwargs.copy() + k.update(**kwargs) + return constructor(*args, **k) + + for name in names: + KC[name] = argumented_key + + return argumented_key diff --git a/hackpads/NumMarcroPad/Firmware/kmk/kmk_keyboard.py b/hackpads/NumMarcroPad/Firmware/kmk/kmk_keyboard.py new file mode 100644 index 000000000..96d69059f --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/kmk_keyboard.py @@ -0,0 +1,531 @@ +try: + from typing import Callable, Optional +except ImportError: + pass + +from collections import namedtuple +from keypad import Event as KeyEvent + +from kmk.hid import BLEHID, USBHID, AbstractHID, HIDModes +from kmk.keys import KC, Key +from kmk.modules import Module +from kmk.scanners.keypad import MatrixScanner +from kmk.scheduler import Task, cancel_task, create_task, get_due_task +from kmk.utils import Debug + +debug = Debug('kmk.keyboard') + +KeyBufferFrame = namedtuple( + 'KeyBufferFrame', ('key', 'is_pressed', 'int_coord', 'index') +) + + +def debug_error(module, message: str, error: Exception): + if debug.enabled: + debug( + message, ': ', error.__class__.__name__, ': ', error, name=module.__module__ + ) + + +class Sandbox: + matrix_update = None + secondary_matrix_update = None + active_layers = None + + +class KMKKeyboard: + ##### + # User-configurable + keymap = [] + coord_mapping = None + + row_pins = None + col_pins = None + diode_orientation = None + matrix = None + + modules = [] + extensions = [] + sandbox = Sandbox() + + ##### + # Internal State + keys_pressed = set() + axes = set() + _coordkeys_pressed = {} + hid_type = HIDModes.USB + secondary_hid_type = None + _hid_helper = None + _hid_send_enabled = False + hid_pending = False + matrix_update = None + secondary_matrix_update = None + matrix_update_queue = [] + _trigger_powersave_enable = False + _trigger_powersave_disable = False + _go_args = None + _resume_buffer = [] + _resume_buffer_x = [] + + # this should almost always be PREpended to, replaces + # former use of reversed_active_layers which had pointless + # overhead (the underlying list was never used anyway) + active_layers = [0] + + def __repr__(self) -> str: + return self.__class__.__name__ + + def _send_hid(self) -> None: + if not self._hid_send_enabled: + return + + if debug.enabled: + if self.keys_pressed: + debug('keys_pressed=', self.keys_pressed) + if self.axes: + debug('axes=', self.axes) + + self._hid_helper.create_report(self.keys_pressed, self.axes) + try: + self._hid_helper.send() + except Exception as err: + debug_error(self._hid_helper, 'send', err) + + self.hid_pending = False + + for axis in self.axes: + axis.move(self, 0) + + def _handle_matrix_report(self, kevent: KeyEvent) -> None: + if kevent is not None: + self._on_matrix_changed(kevent) + + def _find_key_in_map(self, int_coord: int) -> Key: + try: + idx = self.coord_mapping.index(int_coord) + except ValueError: + if debug.enabled: + debug('no such int_coord: ', int_coord) + return None + + key = None + for layer in self.active_layers: + try: + key = self.keymap[layer][idx] + except IndexError: + if debug.enabled: + debug('keymap IndexError: idx=', idx, ' layer=', layer) + + if key and key != KC.TRNS: + break + + return key + + def _on_matrix_changed(self, kevent: KeyEvent) -> None: + int_coord = kevent.key_number + is_pressed = kevent.pressed + + key = None + if not is_pressed: + try: + key = self._coordkeys_pressed[int_coord] + except KeyError: + if debug.enabled: + debug('release w/o press: ', int_coord) + + if key is None: + key = self._find_key_in_map(int_coord) + + if key is None: + return + + if debug.enabled: + debug(kevent, ': ', key) + + self.pre_process_key(key, is_pressed, int_coord) + + def _process_resume_buffer(self): + ''' + Resume the processing of buffered, delayed, deferred, etc. key events + emitted by modules. + + We use a copy of the `_resume_buffer` as a working buffer. The working + buffer holds all key events in the correct order for processing. If + during processing new events are pushed to the `_resume_buffer`, they + are prepended to the working buffer (which may not be emptied), in + order to preserve key event order. + We also double-buffer `_resume_buffer` with `_resume_buffer_x`, only + copying the reference to hopefully safe some time on allocations. + ''' + + buffer, self._resume_buffer = self._resume_buffer, self._resume_buffer_x + + while buffer: + ksf = buffer.pop(0) + key = ksf.key + + # Handle any unaccounted-for layer shifts by looking up the key resolution again. + if ksf.int_coord is not None: + key = self._find_key_in_map(ksf.int_coord) + + # Resume the processing of the key event and update the HID report + # when applicable. + self.pre_process_key(key, ksf.is_pressed, ksf.int_coord, ksf.index) + + if self.hid_pending: + self._send_hid() + self.hid_pending = False + + # Any newly buffered key events must be prepended to the working + # buffer. + if self._resume_buffer: + self._resume_buffer.extend(buffer) + buffer.clear() + buffer, self._resume_buffer = self._resume_buffer, buffer + + self._resume_buffer_x = buffer + + def pre_process_key( + self, + key: Key, + is_pressed: bool, + int_coord: Optional[int] = None, + index: int = 0, + ) -> None: + for module in self.modules[index:]: + try: + key = module.process_key(self, key, is_pressed, int_coord) + if key is None: + break + except Exception as err: + debug_error(module, 'process_key', err) + + if int_coord is not None: + if is_pressed: + self._coordkeys_pressed[int_coord] = key + else: + try: + del self._coordkeys_pressed[int_coord] + except KeyError: + if debug.enabled: + debug('release w/o press:', int_coord) + if debug.enabled: + debug('coordkeys_pressed=', self._coordkeys_pressed) + + if key: + self.process_key(key, is_pressed, int_coord) + + def process_key( + self, key: Key, is_pressed: bool, int_coord: Optional[int] = None + ) -> None: + if is_pressed: + key.on_press(self, int_coord) + else: + key.on_release(self, int_coord) + + def resume_process_key( + self, + module: Module, + key: Key, + is_pressed: bool, + int_coord: Optional[int] = None, + reprocess: Optional[bool] = False, + ) -> None: + index = self.modules.index(module) + (0 if reprocess else 1) + ksf = KeyBufferFrame( + key=key, is_pressed=is_pressed, int_coord=int_coord, index=index + ) + self._resume_buffer.append(ksf) + + def remove_key(self, keycode: Key) -> None: + self.process_key(keycode, False) + + def add_key(self, keycode: Key) -> None: + self.process_key(keycode, True) + + def tap_key(self, keycode: Key) -> None: + self.add_key(keycode) + # On the next cycle, we'll remove the key. + self.set_timeout(0, lambda: self.remove_key(keycode)) + + def set_timeout(self, after_ticks: int, callback: Callable[[None], None]) -> [Task]: + return create_task(callback, after_ms=after_ticks) + + def cancel_timeout(self, timeout_key: int) -> None: + cancel_task(timeout_key) + + def _process_timeouts(self) -> None: + for task in get_due_task(): + task() + + def _init_coord_mapping(self) -> None: + ''' + Attempt to sanely guess a coord_mapping if one is not provided. No-op + if `kmk.extensions.split.Split` is used, it provides equivalent + functionality in `on_bootup` + + To save RAM on boards that don't use Split, we don't import Split + and do an isinstance check, but instead do string detection + ''' + if any(x.__class__.__module__ == 'kmk.modules.split' for x in self.modules): + return + + if not self.coord_mapping: + cm = [] + for m in self.matrix: + cm.extend(m.coord_mapping) + self.coord_mapping = tuple(cm) + + def _init_hid(self) -> None: + if self.hid_type == HIDModes.NOOP: + self._hid_helper = AbstractHID + elif self.hid_type == HIDModes.USB: + self._hid_helper = USBHID + elif self.hid_type == HIDModes.BLE: + self._hid_helper = BLEHID + else: + self._hid_helper = AbstractHID + self._hid_helper = self._hid_helper(**self._go_args) + self._hid_send_enabled = True + + if debug.enabled: + debug('hid=', self._hid_helper) + + def _deinit_hid(self) -> None: + self._hid_helper.clear_all() + self._hid_helper.send() + + def _init_matrix(self) -> None: + if self.matrix is None: + self.matrix = MatrixScanner( + column_pins=self.col_pins, + row_pins=self.row_pins, + columns_to_anodes=self.diode_orientation, + ) + + try: + self.matrix = tuple(iter(self.matrix)) + offset = 0 + for matrix in self.matrix: + matrix.offset = offset + offset += matrix.key_count + except TypeError: + self.matrix = (self.matrix,) + + if debug.enabled: + debug('matrix=', [_.__class__.__name__ for _ in self.matrix]) + + def during_bootup(self) -> None: + # Modules and extensions that fail `during_bootup` get removed from + # their respective lists. This serves as a self-check mechanism; any + # modules or extensions that initialize peripherals or data structures + # should do that in `during_bootup`. + for idx, module in enumerate(self.modules): + try: + module.during_bootup(self) + except Exception as err: + debug_error(module, 'during_bootup', err) + self.modules[idx] = None + + self.modules[:] = [_ for _ in self.modules if _] + + if debug.enabled: + debug('modules=', [_.__class__.__name__ for _ in self.modules]) + + for idx, ext in enumerate(self.extensions): + try: + ext.during_bootup(self) + except Exception as err: + debug_error(ext, 'during_bootup', err) + self.extensions[idx] = None + + self.extensions[:] = [_ for _ in self.extensions if _] + + if debug.enabled: + debug('extensions=', [_.__class__.__name__ for _ in self.extensions]) + + def before_matrix_scan(self) -> None: + for module in self.modules: + try: + module.before_matrix_scan(self) + except Exception as err: + debug_error(module, 'before_matrix_scan', err) + + for ext in self.extensions: + try: + ext.before_matrix_scan(self.sandbox) + except Exception as err: + debug_error(ext, 'before_matrix_scan', err) + + def after_matrix_scan(self) -> None: + for module in self.modules: + try: + module.after_matrix_scan(self) + except Exception as err: + debug_error(module, 'after_matrix_scan', err) + + for ext in self.extensions: + try: + ext.after_matrix_scan(self.sandbox) + except Exception as err: + debug_error(ext, 'after_matrix_scan', err) + + def before_hid_send(self) -> None: + for module in self.modules: + try: + module.before_hid_send(self) + except Exception as err: + debug_error(module, 'before_hid_send', err) + + for ext in self.extensions: + try: + ext.before_hid_send(self.sandbox) + except Exception as err: + debug_error(ext, 'before_hid_send', err) + + def after_hid_send(self) -> None: + for module in self.modules: + try: + module.after_hid_send(self) + except Exception as err: + debug_error(module, 'after_hid_send', err) + + for ext in self.extensions: + try: + ext.after_hid_send(self.sandbox) + except Exception as err: + debug_error(ext, 'after_hid_send', err) + + def powersave_enable(self) -> None: + for module in self.modules: + try: + module.on_powersave_enable(self) + except Exception as err: + debug_error(module, 'powersave_enable', err) + + for ext in self.extensions: + try: + ext.on_powersave_enable(self.sandbox) + except Exception as err: + debug_error(ext, 'powersave_enable', err) + + def powersave_disable(self) -> None: + for module in self.modules: + try: + module.on_powersave_disable(self) + except Exception as err: + debug_error(module, 'powersave_disable', err) + + for ext in self.extensions: + try: + ext.on_powersave_disable(self.sandbox) + except Exception as err: + debug_error(ext, 'powersave_disable', err) + + def deinit(self) -> None: + for module in self.modules: + try: + module.deinit(self) + except Exception as err: + debug_error(module, 'deinit', err) + + for ext in self.extensions: + try: + ext.deinit(self.sandbox) + except Exception as err: + debug_error(ext, 'deinit', err) + + def go(self, hid_type=HIDModes.USB, secondary_hid_type=None, **kwargs) -> None: + try: + self._init( + hid_type=hid_type, + secondary_hid_type=secondary_hid_type, + **kwargs, + ) + while True: + self._main_loop() + except Exception as err: + import traceback + + traceback.print_exception(err) + finally: + debug('cleaning up...') + self._deinit_hid() + self.deinit() + debug('...done') + + if not debug.enabled: + import supervisor + + supervisor.reload() + + def _init( + self, + hid_type: HIDModes = HIDModes.USB, + secondary_hid_type: Optional[HIDModes] = None, + **kwargs, + ) -> None: + self._go_args = kwargs + self.hid_type = hid_type + self.secondary_hid_type = secondary_hid_type + + if debug.enabled: + debug('Initialising ', self) + + self._init_hid() + self._init_matrix() + self._init_coord_mapping() + self.during_bootup() + + if debug.enabled: + import gc + + gc.collect() + debug('mem_info used:', gc.mem_alloc(), ' free:', gc.mem_free()) + + def _main_loop(self) -> None: + self.sandbox.active_layers = self.active_layers.copy() + + self.before_matrix_scan() + + self._process_resume_buffer() + + for matrix in self.matrix: + update = matrix.scan_for_changes() + if update: + self.matrix_update = update + break + self.sandbox.matrix_update = self.matrix_update + self.sandbox.secondary_matrix_update = self.secondary_matrix_update + + self.after_matrix_scan() + + if self.secondary_matrix_update: + self.matrix_update_queue.append(self.secondary_matrix_update) + self.secondary_matrix_update = None + + if self.matrix_update: + self.matrix_update_queue.append(self.matrix_update) + self.matrix_update = None + + # only handle one key per cycle. + if self.matrix_update_queue: + self._handle_matrix_report(self.matrix_update_queue.pop(0)) + + self.before_hid_send() + + if self.hid_pending: + self._send_hid() + + self._process_timeouts() + + if self.hid_pending: + self._send_hid() + + self.after_hid_send() + + if self._trigger_powersave_enable: + self.powersave_enable() + + if self._trigger_powersave_disable: + self.powersave_disable() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/kmktime.py b/hackpads/NumMarcroPad/Firmware/kmk/kmktime.py new file mode 100644 index 000000000..7476c43cd --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/kmktime.py @@ -0,0 +1,34 @@ +from micropython import const +from supervisor import ticks_ms + +_TICKS_PERIOD = const(1 << 29) +_TICKS_MAX = const(_TICKS_PERIOD - 1) +_TICKS_HALFPERIOD = const(_TICKS_PERIOD // 2) + + +def ticks_diff(new: int, start: int) -> int: + diff = (new - start) & _TICKS_MAX + diff = ((diff + _TICKS_HALFPERIOD) & _TICKS_MAX) - _TICKS_HALFPERIOD + return diff + + +def ticks_add(ticks: int, delta: int) -> int: + return (ticks + delta) % _TICKS_PERIOD + + +def check_deadline(new: int, start: int, ms: int) -> int: + return ticks_diff(new, start) < ms + + +class PeriodicTimer: + def __init__(self, period: int): + self.period = period + self.last_tick = ticks_ms() + + def tick(self) -> bool: + now = ticks_ms() + if ticks_diff(now, self.last_tick) >= self.period: + self.last_tick = now + return True + else: + return False diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/__init__.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/__init__.py new file mode 100644 index 000000000..dd587c35f --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/__init__.py @@ -0,0 +1,46 @@ +class InvalidExtensionEnvironment(Exception): + pass + + +class Module: + ''' + Modules differ from extensions in that they not only can read the state, but + are allowed to modify the state. The will be loaded on boot, and are not + allowed to be unloaded as they are required to continue functioning in a + consistant manner. + ''' + + # The below methods should be implemented by subclasses + + def during_bootup(self, keyboard): + raise NotImplementedError + + def before_matrix_scan(self, keyboard): + ''' + Return value will be injected as an extra matrix update + ''' + raise NotImplementedError + + def after_matrix_scan(self, keyboard): + ''' + Return value will be replace matrix update if supplied + ''' + raise NotImplementedError + + def process_key(self, keyboard, key, is_pressed, int_coord): + return key + + def before_hid_send(self, keyboard): + raise NotImplementedError + + def after_hid_send(self, keyboard): + raise NotImplementedError + + def on_powersave_enable(self, keyboard): + raise NotImplementedError + + def on_powersave_disable(self, keyboard): + raise NotImplementedError + + def deinit(self, keyboard): + pass diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/adns9800.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/adns9800.py new file mode 100644 index 000000000..6b0302332 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/adns9800.py @@ -0,0 +1,230 @@ +import busio +import digitalio +import microcontroller + +import time + +from kmk.keys import AX +from kmk.modules import Module +from kmk.modules.adns9800_firmware import firmware +from kmk.utils import Debug + +debug = Debug(__name__) + + +class REG: + Product_ID = 0x0 + Revision_ID = 0x1 + MOTION = 0x2 + DELTA_X_L = 0x3 + DELTA_X_H = 0x4 + DELTA_Y_L = 0x5 + DELTA_Y_H = 0x6 + SQUAL = 0x7 + PIXEL_SUM = 0x8 + Maximum_Pixel = 0x9 + Minimum_Pixel = 0xA + Shutter_Lower = 0xB + Shutter_Upper = 0xC + Frame_Period_Lower = 0xD + Frame_Period_Upper = 0xE + Configuration_I = 0xF + Configuration_II = 0x10 + Frame_Capture = 0x12 + SROM_Enable = 0x13 + Run_Downshift = 0x14 + Rest1_Rate = 0x15 + Rest1_Downshift = 0x16 + Rest2_Rate = 0x17 + Rest2_Downshift = 0x18 + Rest3_Rate = 0x19 + Frame_Period_Max_Bound_Lower = 0x1A + Frame_Period_Max_Bound_Upper = 0x1B + Frame_Period_Min_Bound_Lower = 0x1C + Frame_Period_Min_Bound_Upper = 0x1D + Shutter_Max_Bound_Lower = 0x1E + Shutter_Max_Bound_Upper = 0x1F + LASER_CTRL0 = 0x20 + Observation = 0x24 + Data_Out_Lower = 0x25 + Data_Out_Upper = 0x26 + SROM_ID = 0x2A + Lift_Detection_Thr = 0x2E + Configuration_V = 0x2F + Configuration_IV = 0x39 + Power_Up_Reset = 0x3A + Shutdown = 0x3B + Inverse_Product_ID = 0x3F + Snap_Angle = 0x42 + Motion_Burst = 0x50 + SROM_Load_Burst = 0x62 + Pixel_Burst = 0x64 + + +class ADNS9800(Module): + tswr = tsww = 120 + tsrw = tsrr = 20 + tsrad = 100 + tbexit = 1 + baud = 2000000 + cpol = 1 + cpha = 1 + DIR_WRITE = 0x80 + DIR_READ = 0x7F + + def __init__(self, cs, sclk, miso, mosi, invert_x=False, invert_y=False): + self.cs = digitalio.DigitalInOut(cs) + self.cs.direction = digitalio.Direction.OUTPUT + self.spi = busio.SPI(clock=sclk, MOSI=mosi, MISO=miso) + self.invert_x = invert_x + self.invert_y = invert_y + + def adns_start(self): + self.cs.value = False + + def adns_stop(self): + self.cs.value = True + + def adns_write(self, reg, data): + while not self.spi.try_lock(): + pass + try: + self.spi.configure(baudrate=self.baud, polarity=self.cpol, phase=self.cpha) + self.adns_start() + self.spi.write(bytes([reg | self.DIR_WRITE, data])) + finally: + self.spi.unlock() + self.adns_stop() + + def adns_read(self, reg): + result = bytearray(1) + while not self.spi.try_lock(): + pass + try: + self.spi.configure(baudrate=self.baud, polarity=self.cpol, phase=self.cpha) + self.adns_start() + self.spi.write(bytes([reg & self.DIR_READ])) + microcontroller.delay_us(self.tsrad) + self.spi.readinto(result) + finally: + self.spi.unlock() + self.adns_stop() + + return result[0] + + def adns_upload_srom(self): + while not self.spi.try_lock(): + pass + try: + self.spi.configure(baudrate=self.baud, polarity=self.cpol, phase=self.cpha) + self.adns_start() + self.spi.write(bytes([REG.SROM_Load_Burst | self.DIR_WRITE])) + for b in firmware: + self.spi.write(bytes([b])) + finally: + self.spi.unlock() + self.adns_stop() + + def delta_to_int(self, high, low): + comp = (high << 8) | low + if comp & 0x8000: + return (-1) * (0xFFFF + 1 - comp) + return comp + + def adns_read_motion(self): + result = bytearray(14) + while not self.spi.try_lock(): + pass + try: + self.spi.configure(baudrate=self.baud, polarity=self.cpol, phase=self.cpha) + self.adns_start() + self.spi.write(bytes([REG.Motion_Burst & self.DIR_READ])) + microcontroller.delay_us(self.tsrad) + self.spi.readinto(result) + finally: + self.spi.unlock() + self.adns_stop() + microcontroller.delay_us(self.tbexit) + self.adns_write(REG.MOTION, 0x0) + return result + + def during_bootup(self, keyboard): + + self.adns_write(REG.Power_Up_Reset, 0x5A) + time.sleep(0.1) + self.adns_read(REG.MOTION) + microcontroller.delay_us(self.tsrr) + self.adns_read(REG.DELTA_X_L) + microcontroller.delay_us(self.tsrr) + self.adns_read(REG.DELTA_X_H) + microcontroller.delay_us(self.tsrr) + self.adns_read(REG.DELTA_Y_L) + microcontroller.delay_us(self.tsrr) + self.adns_read(REG.DELTA_Y_H) + microcontroller.delay_us(self.tsrw) + + self.adns_write(REG.Configuration_IV, 0x2) + microcontroller.delay_us(self.tsww) + self.adns_write(REG.SROM_Enable, 0x1D) + microcontroller.delay_us(1000) + self.adns_write(REG.SROM_Enable, 0x18) + microcontroller.delay_us(self.tsww) + + self.adns_upload_srom() + microcontroller.delay_us(2000) + + laser_ctrl0 = self.adns_read(REG.LASER_CTRL0) + microcontroller.delay_us(self.tsrw) + self.adns_write(REG.LASER_CTRL0, laser_ctrl0 & 0xF0) + microcontroller.delay_us(self.tsww) + self.adns_write(REG.Configuration_I, 0x10) + microcontroller.delay_us(self.tsww) + + if debug.enabled: + debug('ADNS: Product ID ', hex(self.adns_read(REG.Product_ID))) + microcontroller.delay_us(self.tsrr) + debug('ADNS: Revision ID ', hex(self.adns_read(REG.Revision_ID))) + microcontroller.delay_us(self.tsrr) + debug('ADNS: SROM ID ', hex(self.adns_read(REG.SROM_ID))) + microcontroller.delay_us(self.tsrr) + if self.adns_read(REG.Observation) & 0x20: + debug('ADNS: Sensor is running SROM') + else: + debug('ADNS: Error! Sensor is not running SROM!') + + return + + def before_matrix_scan(self, keyboard): + motion = self.adns_read_motion() + if motion[0] & 0x80: + delta_x = self.delta_to_int(motion[3], motion[2]) + delta_y = self.delta_to_int(motion[5], motion[4]) + + if self.invert_x: + delta_x *= -1 + if self.invert_y: + delta_y *= -1 + + if delta_x: + AX.X.move(keyboard, delta_x) + + if delta_y: + AX.Y.move(keyboard, delta_y) + + if debug.enabled: + debug('Delta: ', delta_x, ' ', delta_y) + + def after_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/autoshift.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/autoshift.py new file mode 100644 index 000000000..fc48f0f83 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/autoshift.py @@ -0,0 +1,82 @@ +from kmk.keys import KC, KeyboardKey +from kmk.modules import Module +from kmk.scheduler import cancel_task, create_task +from kmk.utils import Debug + +debug = Debug(__name__) + + +class Autoshift(Module): + def __init__(self, tap_time=300): + self.tap_time = tap_time + + self._active = False + self._task = None + self._key = None + + def during_bootup(self, keyboard): + self._task = create_task(lambda: self._shift(keyboard), after_ms=-1) + + def before_matrix_scan(self, keyboard): + pass + + def after_matrix_scan(self, keyboard): + pass + + def process_key(self, keyboard, key, is_pressed, int_coord): + # Unshift on any key event + if self._active: + self._unshift(keyboard) + return key + + # Only shift from an unshifted state + if keyboard._hid_helper.has_key(KC.LSHIFT): + return key + + # Ignore rolls from tapped to hold + if not is_pressed and key is not self._key: + return key + + # Only shift alpha keys, iff there's no pending potential shift + if ( + is_pressed + and not self._key + and isinstance(key, KeyboardKey) + and KC.A.code <= key.code <= KC.Z.code + ): + create_task(self._task, after_ms=self.tap_time) + self._key = key + else: + cancel_task(self._task) + keyboard.resume_process_key(self, self._key, True) + if key is self._key: + keyboard.resume_process_key(self, self._key, False) + else: + keyboard.resume_process_key(self, key, True) + self._key = None + + def before_hid_send(self, keyboard): + pass + + def after_hid_send(self, keyboard): + pass + + def on_powersave_enable(self, keyboard): + pass + + def on_powersave_disable(self, keyboard): + pass + + def _shift(self, keyboard): + if debug.enabled: + debug('activate') + self._active = True + keyboard.keys_pressed.add(KC.LSFT) + keyboard.resume_process_key(self, self._key, True) + + def _unshift(self, keyboard): + if debug.enabled: + debug('deactivate') + self._active = False + self._key = None + keyboard.keys_pressed.remove(KC.LSFT) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/capsword.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/capsword.py new file mode 100644 index 000000000..c1b44a030 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/capsword.py @@ -0,0 +1,102 @@ +from kmk.keys import KC, KeyboardKey, ModifierKey, make_key +from kmk.modules import Module + + +class CapsWord(Module): + # default timeout is 8000 + # alphabets, numbers and few more keys will not disable capsword + def __init__(self, timeout=8000): + self._alphabets = range(KC.A.code, KC.Z.code + 1) + self._numbers = range(KC.N1.code, KC.N0.code + 1) + self.keys_ignored = [ + KC.MINS, + KC.BSPC, + KC.UNDS, + ] + self._timeout_key = False + self._cw_active = False + self.timeout = timeout + make_key( + names=( + 'CAPSWORD', + 'CW', + ), + on_press=self.cw_pressed, + ) + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def process_key(self, keyboard, key, is_pressed, int_coord): + if not self._cw_active or key == KC.CW: + return key + + continue_cw = False + + # capitalize alphabets + if isinstance(key, KeyboardKey) and key.code in self._alphabets: + keyboard.process_key(KC.LSFT, is_pressed) + continue_cw = True + elif ( + not isinstance(key, KeyboardKey) + or isinstance(key, ModifierKey) + or key.code in self._numbers + or key in self.keys_ignored + ): + continue_cw = True + + # requests and cancels existing timeouts + if is_pressed: + if continue_cw: + self.discard_timeout(keyboard) + self.request_timeout(keyboard) + else: + self.process_timeout() + + return key + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def process_timeout(self): + self._cw_active = False + self._timeout_key = False + + def request_timeout(self, keyboard): + if self._cw_active: + if self.timeout: + self._timeout_key = keyboard.set_timeout( + self.timeout, lambda: self.process_timeout() + ) + + def discard_timeout(self, keyboard): + if self._timeout_key: + if self.timeout: + keyboard.cancel_timeout(self._timeout_key) + self._timeout_key = False + + def cw_pressed(self, key, keyboard, *args, **kwargs): + # enables/disables capsword + if key == KC.CW: + if not self._cw_active: + self._cw_active = True + self.discard_timeout(keyboard) + self.request_timeout(keyboard) + else: + self.discard_timeout(keyboard) + self.process_timeout() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/cg_swap.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/cg_swap.py new file mode 100644 index 000000000..9dbfbc778 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/cg_swap.py @@ -0,0 +1,70 @@ +from kmk.keys import KC, ModifierKey, make_key +from kmk.modules import Module + + +class CgSwap(Module): + # default cg swap is disabled, can be eanbled too if needed + def __init__(self, cg_swap_enable=False): + self.cg_swap_enable = cg_swap_enable + self._cg_mapping = { + KC.LCTL: KC.LGUI, + KC.RCTL: KC.RGUI, + KC.LGUI: KC.LCTL, + KC.RGUI: KC.RCTL, + } + make_key( + names=('CG_SWAP',), + ) + make_key( + names=('CG_NORM',), + ) + make_key( + names=('CG_TOGG',), + ) + + def during_bootup(self, keyboard): + return + + def matrix_detected_press(self, keyboard): + return keyboard.matrix_update is None + + def before_matrix_scan(self, keyboard): + return + + def process_key(self, keyboard, key, is_pressed, int_coord): + if is_pressed: + # enables or disables or toggles cg swap + if key == KC.CG_SWAP: + self.cg_swap_enable = True + elif key == KC.CG_NORM: + self.cg_swap_enable = False + elif key == KC.CG_TOGG: + if not self.cg_swap_enable: + self.cg_swap_enable = True + else: + self.cg_swap_enable = False + # performs cg swap + if ( + self.cg_swap_enable + and key not in (KC.CG_SWAP, KC.CG_NORM, KC.CG_TOGG) + and isinstance(key, ModifierKey) + and key in self._cg_mapping + ): + key = self._cg_mapping.get(key) + + return key + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/combos.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/combos.py new file mode 100644 index 000000000..ea00314e6 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/combos.py @@ -0,0 +1,330 @@ +try: + from typing import Optional, Tuple, Union +except ImportError: + pass +from micropython import const + +from kmk.keys import Key, make_key +from kmk.kmk_keyboard import KMKKeyboard +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + + +class _ComboState: + RESET = const(0) + MATCHING = const(1) + ACTIVE = const(2) + IDLE = const(3) + + +class Combo: + fast_reset = False + per_key_timeout = False + timeout = 50 + _remaining = [] + _timeout = None + _state = _ComboState.IDLE + _match_coord = False + + def __init__( + self, + match: Tuple[Union[Key, int], ...], + result: Key, + fast_reset=None, + per_key_timeout=None, + timeout=None, + match_coord=None, + ): + ''' + match: tuple of keys (KC.A, KC.B) + result: key KC.C + ''' + self.match = match + self.result = result + if fast_reset is not None: + self.fast_reset = fast_reset + if per_key_timeout is not None: + self.per_key_timeout = per_key_timeout + if timeout is not None: + self.timeout = timeout + if match_coord is not None: + self._match_coord = match_coord + + def __repr__(self): + return f'{self.__class__.__name__}({list(self.match)})' + + def matches(self, key: Key, int_coord: int): + raise NotImplementedError + + def has_match(self, key: Key, int_coord: int): + return self._match_coord and int_coord in self.match or key in self.match + + def insert(self, key: Key, int_coord: int): + if self._match_coord: + self._remaining.insert(0, int_coord) + else: + self._remaining.insert(0, key) + + def reset(self): + self._remaining = list(self.match) + + +class Chord(Combo): + def matches(self, key: Key, int_coord: int): + if not self._match_coord and key in self._remaining: + self._remaining.remove(key) + return True + elif self._match_coord and int_coord in self._remaining: + self._remaining.remove(int_coord) + return True + else: + return False + + +class Sequence(Combo): + fast_reset = True + per_key_timeout = True + timeout = 1000 + + def matches(self, key: Key, int_coord: int): + if ( + not self._match_coord and self._remaining and self._remaining[0] == key + ) or ( + self._match_coord and self._remaining and self._remaining[0] == int_coord + ): + self._remaining.pop(0) + return True + else: + return False + + +class Combos(Module): + def __init__(self, combos=[]): + self.combos = combos + self._key_buffer = [] + + make_key(names=('LEADER', 'LDR')) + + def during_bootup(self, keyboard): + self.reset(keyboard) + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def process_key(self, keyboard, key: Key, is_pressed, int_coord): + if is_pressed: + return self.on_press(keyboard, key, int_coord) + else: + return self.on_release(keyboard, key, int_coord) + + def on_press(self, keyboard: KMKKeyboard, key: Key, int_coord: Optional[int]): + # refill potential matches from timed-out matches + if self.count_matching() == 0: + for combo in self.combos: + if combo._state == _ComboState.RESET: + combo._state = _ComboState.MATCHING + + # filter potential matches + for combo in self.combos: + if combo._state != _ComboState.MATCHING: + continue + if combo.matches(key, int_coord): + continue + combo._state = _ComboState.IDLE + if combo._timeout: + keyboard.cancel_timeout(combo._timeout) + combo._timeout = keyboard.set_timeout( + combo.timeout, lambda c=combo: self.reset_combo(keyboard, c) + ) + + match_count = self.count_matching() + + if match_count: + # At least one combo matches current key: append key to buffer. + self._key_buffer.append((int_coord, key, True)) + key = None + + for first_match in self.combos: + if first_match._state == _ComboState.MATCHING: + break + + # Single match left: don't wait on timeout to activate + if match_count == 1 and not any(first_match._remaining): + combo = first_match + self.activate(keyboard, combo) + if combo._timeout: + keyboard.cancel_timeout(combo._timeout) + combo._timeout = None + self._key_buffer = [] + self.reset(keyboard) + + # Start or reset individual combo timeouts. + for combo in self.combos: + if combo._state != _ComboState.MATCHING: + continue + if combo._timeout: + if combo.per_key_timeout: + keyboard.cancel_timeout(combo._timeout) + else: + continue + combo._timeout = keyboard.set_timeout( + combo.timeout, lambda c=combo: self.on_timeout(keyboard, c) + ) + else: + # There's no matching combo: send and reset key buffer + if self._key_buffer: + self._key_buffer.append((int_coord, key, True)) + self.send_key_buffer(keyboard) + self._key_buffer = [] + key = None + + return key + + def on_release(self, keyboard: KMKKeyboard, key: Key, int_coord: Optional[int]): + for combo in self.combos: + if combo._state != _ComboState.ACTIVE: + continue + if combo.has_match(key, int_coord): + # Deactivate combo if it matches current key. + self.deactivate(keyboard, combo) + + if combo.fast_reset: + self.reset_combo(keyboard, combo) + self._key_buffer = [] + else: + combo.insert(key, int_coord) + combo._state = _ComboState.MATCHING + + key = None + break + + else: + # Non-active but matching combos can either activate on key release + # if they're the only match, or "un-match" the released key but stay + # matching if they're a repeatable combo. + for combo in self.combos: + if combo._state != _ComboState.MATCHING: + continue + if not combo.has_match(key, int_coord): + continue + + # Combo matches, but first key released before timeout. + elif not any(combo._remaining) and self.count_matching() == 1: + keyboard.cancel_timeout(combo._timeout) + self.activate(keyboard, combo) + self._key_buffer = [] + keyboard._send_hid() + self.deactivate(keyboard, combo) + if combo.fast_reset: + self.reset_combo(keyboard, combo) + else: + combo.insert(key, int_coord) + combo._state = _ComboState.MATCHING + self.reset(keyboard) + + elif not any(combo._remaining): + continue + + # Skip combos that allow tapping. + elif combo.fast_reset: + continue + + # This was the last key released of a repeatable combo. + elif len(combo._remaining) == len(combo.match) - 1: + self.reset_combo(keyboard, combo) + if not self.count_matching(): + self._key_buffer.append((int_coord, key, False)) + self.send_key_buffer(keyboard) + self._key_buffer = [] + key = None + + # Anything between first and last key released. + else: + combo.insert(key, int_coord) + + # Don't propagate key-release events for keys that have been + # buffered. Append release events only if corresponding press is in + # buffer. + pressed = self._key_buffer.count((int_coord, key, True)) + released = self._key_buffer.count((int_coord, key, False)) + if (pressed - released) > 0: + self._key_buffer.append((int_coord, key, False)) + key = None + + # Reset on non-combo key up + if not self.count_matching(): + self.reset(keyboard) + + return key + + def on_timeout(self, keyboard, combo): + # If combo reaches timeout and has no remaining keys, activate it; + # else, drop it from the match list. + combo._timeout = None + + if not any(combo._remaining): + self.activate(keyboard, combo) + # check if the last buffered key event was a 'release' + if not self._key_buffer[-1][2]: + keyboard._send_hid() + self.deactivate(keyboard, combo) + self._key_buffer = [] + self.reset(keyboard) + else: + if self.count_matching() == 1: + # This was the last pending combo: flush key buffer. + self.send_key_buffer(keyboard) + self._key_buffer = [] + self.reset_combo(keyboard, combo) + + def send_key_buffer(self, keyboard): + for int_coord, key, is_pressed in self._key_buffer: + keyboard.resume_process_key(self, key, is_pressed, int_coord) + + def activate(self, keyboard, combo): + if debug.enabled: + debug('activate', combo) + combo.result.on_press(keyboard) + combo._state = _ComboState.ACTIVE + + def deactivate(self, keyboard, combo): + if debug.enabled: + debug('deactivate', combo) + combo.result.on_release(keyboard) + combo._state = _ComboState.IDLE + + def reset_combo(self, keyboard, combo): + combo.reset() + if combo._timeout is not None: + keyboard.cancel_timeout(combo._timeout) + combo._timeout = None + combo._state = _ComboState.RESET + + def reset(self, keyboard): + for combo in self.combos: + if combo._state != _ComboState.ACTIVE: + self.reset_combo(keyboard, combo) + + def count_matching(self): + match_count = 0 + for combo in self.combos: + if combo._state == _ComboState.MATCHING: + match_count += 1 + return match_count diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/dynamic_sequences.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/dynamic_sequences.py new file mode 100644 index 000000000..7d1ce5b65 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/dynamic_sequences.py @@ -0,0 +1,261 @@ +from micropython import const +from supervisor import ticks_ms + +from collections import namedtuple + +from kmk.keys import KC, Key, make_argumented_key +from kmk.kmktime import check_deadline, ticks_diff +from kmk.modules import Module + + +class DynamicSequenceKey(Key): + def __init__(self, sequence_select=None, **kwargs): + super().__init__(**kwargs) + self.sequence_select = sequence_select + + +class SequenceStatus: + STOPPED = const(0) + RECORDING = const(1) + PLAYING = const(2) + SET_REPEPITIONS = const(3) + SET_INTERVAL = const(4) + + +# Keycodes for number keys +_numbers = range(KC.N1.code, KC.N0.code + 1) + +SequenceFrame = namedtuple('SequenceFrame', ['keys_pressed', 'timestamp']) + + +class Sequence: + def __init__(self): + self.repetitions = 1 + self.interval = 0 + self.sequence_data = [SequenceFrame(set(), 0) for i in range(3)] + + +class DynamicSequences(Module): + def __init__( + self, slots=1, timeout=60000, key_interval=0, use_recorded_speed=False + ): + self.sequences = [Sequence() for i in range(slots)] + self.current_slot = self.sequences[0] + self.status = SequenceStatus.STOPPED + + self.index = 0 + self.start_time = 0 + self.current_repetition = 0 + self.last_config_frame = set() + + self.timeout = timeout + self.key_interval = key_interval + self.use_recorded_speed = use_recorded_speed + + # Create keycodes + make_argumented_key( + names=('RECORD_SEQUENCE',), + constructor=DynamicSequenceKey, + on_press=self._record_sequence, + ) + + make_argumented_key( + names=('PLAY_SEQUENCE',), + constructor=DynamicSequenceKey, + on_press=self._play_sequence, + ) + + make_argumented_key( + names=('SET_SEQUENCE', 'STOP_SEQUENCE'), + constructor=DynamicSequenceKey, + on_press=self._stop_sequence, + ) + + make_argumented_key( + names=('SET_SEQUENCE_REPETITIONS',), + constructor=DynamicSequenceKey, + on_press=self._set_sequence_repetitions, + ) + + make_argumented_key( + names=('SET_SEQUENCE_INTERVAL',), + constructor=DynamicSequenceKey, + on_press=self._set_sequence_interval, + ) + + def _record_sequence(self, key, keyboard, *args, **kwargs): + self._stop_sequence(key, keyboard) + self.status = SequenceStatus.RECORDING + self.start_time = ticks_ms() + self.current_slot.sequence_data = [SequenceFrame(set(), 0)] + self.index = 0 + + def _play_sequence(self, key, keyboard, *args, **kwargs): + self._stop_sequence(key, keyboard) + self.status = SequenceStatus.PLAYING + self.start_time = ticks_ms() + self.index = 0 + self.current_repetition = 0 + + def _stop_sequence(self, key, keyboard, *args, **kwargs): + if self.status == SequenceStatus.RECORDING: + self.stop_recording() + elif self.status == SequenceStatus.SET_INTERVAL: + self.stop_config() + self.status = SequenceStatus.STOPPED + + # Change sequences here because stop is always called + if key.sequence_select is not None: + self.current_slot = self.sequences[key.sequence_select] + + # Configure repeat settings + def _set_sequence_repetitions(self, key, keyboard, *args, **kwargs): + self._stop_sequence(key, keyboard) + self.status = SequenceStatus.SET_REPEPITIONS + self.last_config_frame = set() + self.current_slot.repetitions = 0 + self.start_time = ticks_ms() + + def _set_sequence_interval(self, key, keyboard, *args, **kwargs): + self._stop_sequence(key, keyboard) + self.status = SequenceStatus.SET_INTERVAL + self.last_config_frame = set() + self.current_slot.interval = 0 + self.start_time = ticks_ms() + + # Add the current keypress state to the sequence + def record_frame(self, keys_pressed): + if self.current_slot.sequence_data[self.index].keys_pressed != keys_pressed: + self.index += 1 + + # Recorded speed + if self.use_recorded_speed: + self.current_slot.sequence_data.append( + SequenceFrame( + keys_pressed.copy(), ticks_diff(ticks_ms(), self.start_time) + ) + ) + + # Constant speed + else: + self.current_slot.sequence_data.append( + SequenceFrame(keys_pressed.copy(), self.index * self.key_interval) + ) + + if not check_deadline(ticks_ms(), self.start_time, self.timeout): + self.stop_recording() + + # Add the ending frames to the sequence + def stop_recording(self): + # Clear the remaining keys + self.current_slot.sequence_data.append( + SequenceFrame(set(), self.current_slot.sequence_data[-1].timestamp + 20) + ) + + # Wait for the specified interval + prev_timestamp = self.current_slot.sequence_data[-1].timestamp + self.current_slot.sequence_data.append( + SequenceFrame( + set(), + prev_timestamp + self.current_slot.interval * 1000, + ) + ) + + self.status = SequenceStatus.STOPPED + + def play_frame(self, keyboard): + # Send the keypresses at this point in the sequence + if not check_deadline( + ticks_ms(), + self.start_time, + self.current_slot.sequence_data[self.index].timestamp, + ): + if self.index: + prev = self.current_slot.sequence_data[self.index - 1].keys_pressed + cur = self.current_slot.sequence_data[self.index].keys_pressed + + for key in prev.difference(cur): + keyboard.remove_key(key) + for key in cur.difference(prev): + keyboard.add_key(key) + + self.index += 1 + if self.index >= len(self.current_slot.sequence_data): # Reached the end + self.current_repetition += 1 + if self.current_repetition == self.current_slot.repetitions: + self.status = SequenceStatus.STOPPED + else: + self.index = 0 + self.start_time = ticks_ms() + + # Configuration for repeating sequences + def config_mode(self, keyboard): + for key in keyboard.keys_pressed.difference(self.last_config_frame): + if key.code in _numbers: + digit = (key.code - KC.N1.code + 1) % 10 + if self.status == SequenceStatus.SET_REPEPITIONS: + self.current_slot.repetitions = ( + self.current_slot.repetitions * 10 + digit + ) + elif self.status == SequenceStatus.SET_INTERVAL: + self.current_slot.interval = self.current_slot.interval * 10 + digit + + elif key.code == KC.ENTER.code: + self.stop_config() + + self.last_config_frame = keyboard.keys_pressed.copy() + keyboard.hid_pending = False # Disable typing + + if not check_deadline(ticks_ms(), self.start_time, self.timeout): + self.stop_config() + + # Finish configuring repetitions + def stop_config(self): + self.current_slot.sequence_data[-1] = SequenceFrame( + self.current_slot.sequence_data[-1].keys_pressed, + self.current_slot.sequence_data[-2].timestamp + + self.current_slot.interval * 1000, + ) + self.current_slot.repetitions = max(self.current_slot.repetitions, 1) + self.status = SequenceStatus.STOPPED + + def on_runtime_enable(self, keyboard): + return + + def on_runtime_disable(self, keyboard): + return + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + + if not self.status: + return + + elif self.status == SequenceStatus.RECORDING: + self.record_frame(keyboard.keys_pressed) + + elif self.status == SequenceStatus.PLAYING: + self.play_frame(keyboard) + + elif ( + self.status == SequenceStatus.SET_REPEPITIONS + or self.status == SequenceStatus.SET_INTERVAL + ): + self.config_mode(keyboard) + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/easypoint.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/easypoint.py new file mode 100644 index 000000000..bf7023c09 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/easypoint.py @@ -0,0 +1,130 @@ +''' +Extension handles usage of AS5013 by AMS +''' + +from supervisor import ticks_ms + +from kmk.keys import AX +from kmk.modules import Module + +I2C_ADDRESS = 0x40 +I2X_ALT_ADDRESS = 0x41 + +X = 0x10 +Y_RES_INT = 0x11 + +XP = 0x12 +XN = 0x13 +YP = 0x14 +YN = 0x15 + +M_CTRL = 0x2B +T_CTRL = 0x2D + +Y_OFFSET = 17 +X_OFFSET = 7 + +DEAD_X = 5 +DEAD_Y = 5 + + +class Easypoint(Module): + '''Module handles usage of AS5013 by AMS''' + + def __init__( + self, + i2c, + address=I2C_ADDRESS, + y_offset=Y_OFFSET, + x_offset=X_OFFSET, + dead_x=DEAD_X, + dead_y=DEAD_Y, + ): + self._i2c_address = address + self._i2c_bus = i2c + + # HID parameters + self.polling_interval = 20 + self.last_tick = ticks_ms() + + # Offsets for poor soldering + self.y_offset = y_offset + self.x_offset = x_offset + + # Deadzone + self.dead_x = DEAD_X + self.dead_y = DEAD_Y + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + ''' + Return value will be injected as an extra matrix update + ''' + now = ticks_ms() + if now - self.last_tick < self.polling_interval: + return + self.last_tick = now + + x, y = self._read_raw_state() + + # I'm a shit coder, so offset is handled in software side + s_x = self.getSignedNumber(x, 8) - self.x_offset + s_y = self.getSignedNumber(y, 8) - self.y_offset + + # Evaluate Deadzone + if s_x in range(-self.dead_x, self.dead_x) and s_y in range( + -self.dead_y, self.dead_y + ): + # Within bounds, just die + return + else: + # Set the X/Y from easypoint + AX.X.move(keyboard, x) + AX.Y.move(keyboard, y) + + def after_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def _read_raw_state(self): + '''Read data from AS5013''' + x, y = self._i2c_rdwr([X], length=2) + return x, y + + def getSignedNumber(self, number, bitLength=8): + mask = (2**bitLength) - 1 + if number & (1 << (bitLength - 1)): + return number | ~mask + else: + return number & mask + + def _i2c_rdwr(self, data, length=1): + '''Write and optionally read I2C data.''' + while not self._i2c_bus.try_lock(): + pass + + try: + if length > 0: + result = bytearray(length) + self._i2c_bus.writeto_then_readfrom( + self._i2c_address, bytes(data), result + ) + return result + else: + self._i2c_bus.writeto(self._i2c_address, bytes(data)) + return [] + finally: + self._i2c_bus.unlock() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/encoder.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/encoder.py new file mode 100644 index 000000000..ca63610a2 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/encoder.py @@ -0,0 +1,334 @@ +# See docs/encoder.md for how to use + +import busio +import digitalio +from supervisor import ticks_ms + +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + +# NB : not using rotaryio as it requires the pins to be consecutive + + +class BaseEncoder: + + VELOCITY_MODE = True + + def __init__(self, is_inverted=False, divisor=4): + + self.is_inverted = is_inverted + self.divisor = divisor + + self._state = None + self._start_state = None + self._direction = None + self._pos = 0 + self._button_state = True + self._button_held = None + self._velocity = 0 + + self._movement = 0 + self._timestamp = ticks_ms() + + # callback functions on events. Need to be defined externally + self.on_move_do = None + self.on_button_do = None + + def get_state(self): + return { + 'direction': self.is_inverted and -self._direction or self._direction, + 'position': self.is_inverted and -self._pos or self._pos, + 'is_pressed': not self._button_state, + 'velocity': self._velocity, + } + + # Called in a loop to refresh encoder state + + def update_state(self): + # Rotation events + new_state = (self.pin_a.get_value(), self.pin_b.get_value()) + + if new_state != self._state: + # encoder moved + self._movement += 1 + # false / false and true / true are common half steps + # looking on the step just before helps determining + # the direction + if new_state[0] == new_state[1] and self._state[0] != self._state[1]: + if new_state[1] == self._state[0]: + self._direction = 1 + else: + self._direction = -1 + + # when the encoder settles on a position (every 2 steps) + if new_state[0] == new_state[1]: + # an encoder returned to the previous + # position halfway, cancel rotation + if ( + self._start_state[0] == new_state[0] + and self._start_state[1] == new_state[1] + and self._movement <= 2 + ): + self._movement = 0 + self._direction = 0 + + # when the encoder made a full loop according to its divisor + elif self._movement >= self.divisor - 1: + # 1 full step is 4 movements (2 for high-resolution encoder), + # however, when rotated quickly, some steps may be missed. + # This makes it behave more naturally + real_movement = self._movement // self.divisor + self._pos += self._direction * real_movement + if self.on_move_do is not None: + for i in range(real_movement): + self.on_move_do(self.get_state()) + + # Rotation finished, reset to identify new movement + self._movement = 0 + self._direction = 0 + self._start_state = new_state + + self._state = new_state + + # Velocity + self.velocity_event() + + # Button event + self.button_event() + + def velocity_event(self): + if self.VELOCITY_MODE: + new_timestamp = ticks_ms() + self._velocity = new_timestamp - self._timestamp + self._timestamp = new_timestamp + + def button_event(self): + raise NotImplementedError('subclasses must override button_event()!') + + # return knob velocity as milliseconds between position changes (detents) + # for backwards compatibility + def vel_report(self): + return self._velocity + + +class GPIOEncoder(BaseEncoder): + def __init__( + self, + pin_a, + pin_b, + pin_button=None, + is_inverted=False, + divisor=None, + button_pull=digitalio.Pull.UP, + ): + super().__init__(is_inverted) + + # Divisor can be 4 or 2 depending on whether the detent + # on the encoder is defined by 2 or 4 pulses + self.divisor = divisor + + self.pin_a = EncoderPin(pin_a) + self.pin_b = EncoderPin(pin_b) + if pin_button: + self.pin_button = EncoderPin(pin_button, button_type=True, pull=button_pull) + else: + self.pin_button = None + + self._state = (self.pin_a.get_value(), self.pin_b.get_value()) + self._start_state = self._state + + def button_event(self): + if self.pin_button: + new_button_state = self.pin_button.get_value() + if new_button_state != self._button_state: + self._button_state = new_button_state + if self.on_button_do is not None: + self.on_button_do(self.get_state()) + + +class EncoderPin: + def __init__(self, pin, button_type=False, pull=digitalio.Pull.UP): + self.pin = pin + self.button_type = button_type + self.pull = pull + self.prepare_pin() + + def prepare_pin(self): + if self.pin is not None: + if isinstance(self.pin, digitalio.DigitalInOut): + self.io = self.pin + else: + self.io = digitalio.DigitalInOut(self.pin) + self.io.direction = digitalio.Direction.INPUT + self.io.pull = self.pull + else: + self.io = None + + def get_value(self): + io = self.io + result = io.value + if digitalio.Pull.UP != io.pull: + result = not result + return result + + +class I2CEncoder(BaseEncoder): + def __init__(self, i2c, address, is_inverted=False): + + try: + from adafruit_seesaw import digitalio, neopixel, rotaryio, seesaw + except ImportError: + if debug.enabled: + debug('seesaw missing') + return + + super().__init__(is_inverted) + + self.seesaw = seesaw.Seesaw(i2c, address) + + # Check for correct product + + seesaw_product = (self.seesaw.get_version() >> 16) & 0xFFFF + if seesaw_product != 4991: + if debug.enabled: + debug('Wrong firmware loaded? Expected 4991') + + self.encoder = rotaryio.IncrementalEncoder(self.seesaw) + self.seesaw.pin_mode(24, self.seesaw.INPUT_PULLUP) + self.switch = digitalio.DigitalIO(self.seesaw, 24) + self.pixel = neopixel.NeoPixel(self.seesaw, 6, 1) + + self._state = self.encoder.position + + def update_state(self): + + # Rotation events + new_state = self.encoder.position + if new_state != self._state: + # it moves ! + self._movement += 1 + # false / false and true / true are common half steps + # looking on the step just before helps determining + # the direction + if self.encoder.position > self._state: + self._direction = 1 + else: + self._direction = -1 + self._state = new_state + self.on_move_do(self.get_state()) + + # Velocity + self.velocity_event() + + # Button events + self.button_event() + + def button_event(self): + if not self.switch.value and not self._button_held: + # Pressed + self._button_held = True + if self.on_button_do is not None: + self.on_button_do(self.get_state()) + + if self.switch.value and self._button_held: + # Released + self._button_held = False + + def get_state(self): + return { + 'direction': self.is_inverted and -self._direction or self._direction, + 'position': self._state, + 'is_pressed': not self.switch.value, + 'is_held': self._button_held, + 'velocity': self._velocity, + } + + +class EncoderHandler(Module): + def __init__(self): + self.encoders = [] + self.pins = None + self.map = None + self.divisor = 4 + + def on_runtime_enable(self, keyboard): + return + + def on_runtime_disable(self, keyboard): + return + + def during_bootup(self, keyboard): + if self.pins and self.map: + for idx, pins in enumerate(self.pins): + try: + # Check for busio.I2C + if isinstance(pins[0], busio.I2C): + new_encoder = I2CEncoder(*pins) + + # Else fall back to GPIO + else: + new_encoder = GPIOEncoder(*pins) + # Set default divisor if unset + if new_encoder.divisor is None: + new_encoder.divisor = self.divisor + + # In our case, we need to define keybord and encoder_id for callbacks + new_encoder.on_move_do = lambda x, bound_idx=idx: self.on_move_do( + keyboard, bound_idx, x + ) + new_encoder.on_button_do = ( + lambda x, bound_idx=idx: self.on_button_do( + keyboard, bound_idx, x + ) + ) + self.encoders.append(new_encoder) + except Exception as e: + if debug.enabled: + debug(e) + return + + def on_move_do(self, keyboard, encoder_id, state): + if self.map: + layer_id = keyboard.active_layers[0] + # if Left, key index 0 else key index 1 + if state['direction'] == -1: + key_index = 0 + else: + key_index = 1 + key = self.map[layer_id][encoder_id][key_index] + keyboard.tap_key(key) + + def on_button_do(self, keyboard, encoder_id, state): + if state['is_pressed'] is True: + layer_id = keyboard.active_layers[0] + key = self.map[layer_id][encoder_id][2] + keyboard.tap_key(key) + + def before_matrix_scan(self, keyboard): + ''' + Return value will be injected as an extra matrix update + ''' + for encoder in self.encoders: + encoder.update_state() + + return keyboard + + def after_matrix_scan(self, keyboard): + ''' + Return value will be replace matrix update if supplied + ''' + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/holdtap.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/holdtap.py new file mode 100644 index 000000000..3bd6cf49a --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/holdtap.py @@ -0,0 +1,272 @@ +from micropython import const + +from kmk.keys import Key, make_argumented_key +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + + +class ActivationType: + PRESSED = const(0) + RELEASED = const(1) + HOLD_TIMEOUT = const(2) + INTERRUPTED = const(3) + REPEAT = const(4) + + +class HoldTapRepeat: + NONE = const(0) + TAP = const(1) + HOLD = const(2) + ALL = const(3) + + +class HoldTapKeyState: + def __init__(self, timeout_key, *args, **kwargs): + self.timeout_key = timeout_key + self.args = args + self.kwargs = kwargs + self.activated = ActivationType.PRESSED + + +class HoldTapKey(Key): + def __init__( + self, + tap, + hold, + prefer_hold=True, + tap_interrupted=False, + tap_time=None, + repeat=HoldTapRepeat.NONE, + **kwargs, + ): + super().__init__(**kwargs) + self.tap = tap + self.hold = hold + self.prefer_hold = prefer_hold + self.tap_interrupted = tap_interrupted + self.tap_time = tap_time + self.repeat = repeat + + +class HoldTap(Module): + tap_time = 300 + + def __init__(self, _make_key=True): + self.key_buffer = [] + self.key_states = {} + + if _make_key: + make_argumented_key( + names=('HT',), + constructor=HoldTapKey, + on_press=self.ht_pressed, + on_release=self.ht_released, + ) + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def process_key(self, keyboard, key, is_pressed, int_coord): + '''Handle holdtap being interrupted by another key press/release.''' + current_key = key + send_buffer = False + append_buffer = False + + for key, state in self.key_states.items(): + if key == current_key: + continue + if state.activated != ActivationType.PRESSED: + continue + + # holdtap isn't interruptable, resolves on ht_release or timeout. + if not key.tap_interrupted and not key.prefer_hold: + append_buffer = is_pressed or self.key_buffer + continue + + # holdtap is interrupted by another key event. + if (is_pressed and not key.tap_interrupted) or ( + not is_pressed and key.tap_interrupted and self.key_buffer + ): + + keyboard.cancel_timeout(state.timeout_key) + self.key_states[key].activated = ActivationType.INTERRUPTED + self.ht_activate_on_interrupt( + key, + keyboard, + *state.args, + **state.kwargs, + ) + append_buffer = True + send_buffer = True + + # if interrupt on release: store interrupting keys until one of them + # is released. + if key.tap_interrupted and is_pressed: + append_buffer = True + + # apply changes with 'side-effects' on key_states or the loop behaviour + # outside the loop. + if append_buffer: + self.key_buffer.append((int_coord, current_key, is_pressed)) + current_key = None + + if send_buffer: + self.send_key_buffer(keyboard) + + return current_key + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def ht_pressed(self, key, keyboard, *args, **kwargs): + '''Unless in repeat mode, do nothing yet, action resolves when key is released, timer expires or other key is pressed.''' + if key in self.key_states: + state = self.key_states[key] + keyboard.cancel_timeout(self.key_states[key].timeout_key) + + if state.activated == ActivationType.RELEASED: + state.activated = ActivationType.REPEAT + self.ht_activate_tap(key, keyboard, *args, **kwargs) + elif state.activated == ActivationType.HOLD_TIMEOUT: + self.ht_activate_hold(key, keyboard, *args, **kwargs) + elif state.activated == ActivationType.INTERRUPTED: + self.ht_activate_on_interrupt(key, keyboard, *args, **kwargs) + return + + if key.tap_time is None: + tap_time = self.tap_time + else: + tap_time = key.tap_time + timeout_key = keyboard.set_timeout( + tap_time, + lambda: self.on_tap_time_expired(key, keyboard, *args, **kwargs), + ) + self.key_states[key] = HoldTapKeyState(timeout_key, *args, **kwargs) + return keyboard + + def ht_released(self, key, keyboard, *args, **kwargs): + '''On keyup, release mod or tap key.''' + if key not in self.key_states: + return keyboard + + state = self.key_states[key] + keyboard.cancel_timeout(state.timeout_key) + repeat = key.repeat & HoldTapRepeat.TAP + + if state.activated == ActivationType.HOLD_TIMEOUT: + # release hold + self.ht_deactivate_hold(key, keyboard, *args, **kwargs) + repeat = key.repeat & HoldTapRepeat.HOLD + elif state.activated == ActivationType.INTERRUPTED: + # release tap + self.ht_deactivate_on_interrupt(key, keyboard, *args, **kwargs) + if key.prefer_hold: + repeat = key.repeat & HoldTapRepeat.HOLD + elif state.activated == ActivationType.PRESSED: + # press and release tap because key released within tap time + self.ht_activate_tap(key, keyboard, *args, **kwargs) + self.send_key_buffer(keyboard) + self.ht_deactivate_tap(key, keyboard, *args, **kwargs) + state.activated = ActivationType.RELEASED + self.send_key_buffer(keyboard) + elif state.activated == ActivationType.REPEAT: + state.activated = ActivationType.RELEASED + self.ht_deactivate_tap(key, keyboard, *args, **kwargs) + + # don't delete the key state right now in this case + if repeat: + if key.tap_time is None: + tap_time = self.tap_time + else: + tap_time = key.tap_time + state.timeout_key = keyboard.set_timeout( + tap_time, lambda: self.key_states.pop(key) + ) + else: + del self.key_states[key] + + return keyboard + + def on_tap_time_expired(self, key, keyboard, *args, **kwargs): + '''When tap time expires activate hold if key is still being pressed. + Remove key if ActivationType is RELEASED.''' + try: + state = self.key_states[key] + except KeyError: + if debug.enabled: + debug(f'on_tap_time_expired: no such key {key}') + return + + if self.key_states[key].activated == ActivationType.PRESSED: + # press hold because timer expired after tap time + self.key_states[key].activated = ActivationType.HOLD_TIMEOUT + self.ht_activate_hold(key, keyboard, *args, **kwargs) + self.send_key_buffer(keyboard) + elif state.activated == ActivationType.RELEASED: + self.ht_deactivate_tap(key, keyboard, *args, **kwargs) + del self.key_states[key] + + def send_key_buffer(self, keyboard): + if not self.key_buffer: + return + + reprocess = False + for int_coord, key, is_pressed in self.key_buffer: + keyboard.resume_process_key(self, key, is_pressed, int_coord, reprocess) + if isinstance(key, HoldTapKey): + reprocess = True + + self.key_buffer.clear() + + def ht_activate_hold(self, key, keyboard, *args, **kwargs): + if debug.enabled: + debug('ht_activate_hold') + keyboard.resume_process_key(self, key.hold, True) + + def ht_deactivate_hold(self, key, keyboard, *args, **kwargs): + if debug.enabled: + debug('ht_deactivate_hold') + keyboard.resume_process_key(self, key.hold, False) + + def ht_activate_tap(self, key, keyboard, *args, **kwargs): + if debug.enabled: + debug('ht_activate_tap') + keyboard.resume_process_key(self, key.tap, True) + + def ht_deactivate_tap(self, key, keyboard, *args, **kwargs): + if debug.enabled: + debug('ht_deactivate_tap') + keyboard.resume_process_key(self, key.tap, False) + + def ht_activate_on_interrupt(self, key, keyboard, *args, **kwargs): + if debug.enabled: + debug('ht_activate_on_interrupt') + if key.prefer_hold: + self.ht_activate_hold(key, keyboard, *args, **kwargs) + else: + self.ht_activate_tap(key, keyboard, *args, **kwargs) + + def ht_deactivate_on_interrupt(self, key, keyboard, *args, **kwargs): + if debug.enabled: + debug('ht_deactivate_on_interrupt') + if key.prefer_hold: + self.ht_deactivate_hold(key, keyboard, *args, **kwargs) + else: + self.ht_deactivate_tap(key, keyboard, *args, **kwargs) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/layers.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/layers.py new file mode 100644 index 000000000..17cf84a67 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/layers.py @@ -0,0 +1,193 @@ +'''One layer isn't enough. Adds keys to get to more of them''' + +from kmk.keys import KC, Key, make_argumented_key +from kmk.modules.holdtap import HoldTap, HoldTapKey +from kmk.utils import Debug + +debug = Debug(__name__) + + +def lt_key(layer, key, prefer_hold=False, **kwargs): + return HoldTapKey(tap=key, hold=KC.MO(layer), prefer_hold=prefer_hold, **kwargs) + + +def tt_key(layer, prefer_hold=True, **kwargs): + return HoldTapKey( + tap=KC.TG(layer), + hold=KC.MO(layer), + prefer_hold=prefer_hold, + **kwargs, + ) + + +class LayerKey(Key): + def __init__(self, layer, key=None, **kwargs): + super().__init__(**kwargs) + self.layer = layer + self.key = key + + +class Layers(HoldTap): + '''Gives access to the keys used to enable the layer system''' + + _active_combo = None + + def __init__(self, combo_layers=None): + # Layers + super().__init__(_make_key=False) + self.combo_layers = combo_layers + make_argumented_key( + names=('MO',), + constructor=LayerKey, + on_press=self._mo_pressed, + on_release=self._mo_released, + ) + make_argumented_key( + names=('FD',), + constructor=LayerKey, + on_press=self._fd_pressed, + ) + make_argumented_key( + names=('DF',), + constructor=LayerKey, + on_press=self._df_pressed, + ) + make_argumented_key( + names=('LM',), + constructor=LayerKey, + on_press=self._lm_pressed, + on_release=self._lm_released, + ) + make_argumented_key( + names=('TG',), + constructor=LayerKey, + on_press=self._tg_pressed, + ) + make_argumented_key( + names=('TO',), + constructor=LayerKey, + on_press=self._to_pressed, + ) + make_argumented_key( + names=('LT',), + constructor=lt_key, + on_press=self.ht_pressed, + on_release=self.ht_released, + ) + make_argumented_key( + names=('TT',), + constructor=tt_key, + on_press=self.ht_pressed, + on_release=self.ht_released, + ) + + def _fd_pressed(self, key, keyboard, *args, **kwargs): + ''' + Switches the top layer + ''' + self.activate_layer(keyboard, key.layer, idx=0) + + def _df_pressed(self, key, keyboard, *args, **kwargs): + ''' + Switches the default layer + ''' + self.activate_layer(keyboard, key.layer, idx=-1) + + def _mo_pressed(self, key, keyboard, *args, **kwargs): + ''' + Momentarily activates layer, switches off when you let go + ''' + self.activate_layer(keyboard, key.layer) + + def _mo_released(self, key, keyboard, *args, **kwargs): + self.deactivate_layer(keyboard, key.layer) + + def _lm_pressed(self, key, keyboard, *args, **kwargs): + ''' + As MO(layer) but with mod active + ''' + keyboard.hid_pending = True + keyboard.keys_pressed.add(key.key) + self.activate_layer(keyboard, key.layer) + + def _lm_released(self, key, keyboard, *args, **kwargs): + ''' + As MO(layer) but with mod active + ''' + keyboard.hid_pending = True + keyboard.keys_pressed.discard(key.key) + self.deactivate_layer(keyboard, key.layer) + + def _tg_pressed(self, key, keyboard, *args, **kwargs): + ''' + Toggles the layer (enables it if not active, and vise versa) + ''' + # See mo_released for implementation details around this + if key.layer in keyboard.active_layers: + self.deactivate_layer(keyboard, key.layer) + else: + self.activate_layer(keyboard, key.layer) + + def _to_pressed(self, key, keyboard, *args, **kwargs): + ''' + Activates layer and deactivates all other layers + ''' + self._active_combo = None + keyboard.active_layers.clear() + self.activate_layer(keyboard, key.layer) + + def _print_debug(self, keyboard): + if debug.enabled: + debug(f'active_layers={keyboard.active_layers}') + + def activate_layer(self, keyboard, layer, idx=None): + if idx is None: + keyboard.active_layers.insert(0, layer) + else: + keyboard.active_layers[idx] = layer + + if self.combo_layers: + self._activate_combo_layer(keyboard) + + self._print_debug(keyboard) + + def deactivate_layer(self, keyboard, layer): + # Remove the first instance of the target layer from the active list + # under almost all normal use cases, this will disable the layer (but + # preserve it if it was triggered as a default layer, etc.). + # This also resolves an issue where using DF() on a layer + # triggered by MO() and then defaulting to the MO()'s layer + # would result in no layers active. + if len(keyboard.active_layers) > 1: + try: + idx = keyboard.active_layers.index(layer) + del keyboard.active_layers[idx] + except ValueError: + if debug.enabled: + debug(f'_mo_released: layer {layer} not active') + + if self.combo_layers: + self._deactivate_combo_layer(keyboard, layer) + + self._print_debug(keyboard) + + def _activate_combo_layer(self, keyboard): + if self._active_combo: + return + + for combo, result in self.combo_layers.items(): + matching = True + for layer in combo: + if layer not in keyboard.active_layers: + matching = False + break + + if matching: + self._active_combo = combo + keyboard.active_layers.insert(0, result) + break + + def _deactivate_combo_layer(self, keyboard, layer): + if self._active_combo and layer in self._active_combo: + keyboard.active_layers.remove(self.combo_layers[self._active_combo]) + self._active_combo = None diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/macros.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/macros.py new file mode 100644 index 000000000..59a0dd488 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/macros.py @@ -0,0 +1,313 @@ +from micropython import const + +from kmk.keys import KC, Key, make_argumented_key, make_key +from kmk.modules import Module +from kmk.scheduler import create_task +from kmk.utils import Debug + +debug = Debug(__name__) + +_IDLE = const(0) +_ON_PRESS = const(1) +_ON_HOLD = const(2) +_RELEASE = const(3) +_ON_RELEASE = const(4) + + +class MacroKey(Key): + def __init__( + self, + *args, + on_press=None, + on_hold=None, + on_release=None, + blocking=True, + _on_press=None, + _on_release=None, + ): + super().__init__(on_press=_on_press, on_release=_on_release) + + if on_press is not None: + self.on_press_macro = on_press + else: + self.on_press_macro = args + self.on_hold_macro = on_hold + self.on_release_macro = on_release + self.blocking = blocking + self.state = _IDLE + self._task = None + + +class UnicodeModeKey(Key): + def __init__(self, mode, **kwargs): + super().__init__(**kwargs) + self.mode = mode + + +def Delay(delay): + return lambda keyboard: delay + + +def Press(key): + return lambda keyboard: key.on_press(keyboard) + + +def Release(key): + return lambda keyboard: key.on_release(keyboard) + + +def Tap(key): + def _(keyboard): + key.on_press(keyboard) + yield + key.on_release(keyboard) + + return _ + + +class UnicodeModeIBus: + @staticmethod + def pre(keyboard): + macro = (KC.LCTL, KC.LSFT, KC.U) + for k in macro: + k.on_press(keyboard) + yield + for k in macro: + k.on_release(keyboard) + + @staticmethod + def post(keyboard): + KC.ENTER.on_press(keyboard) + yield + KC.ENTER.on_release(keyboard) + + +class UnicodeModeMacOS: + @staticmethod + def pre(keyboard): + KC.LALT.on_press(keyboard) + yield + + @staticmethod + def post(keyboard): + KC.LALT.on_release(keyboard) + yield + + +class UnicodeModeWinC: + @staticmethod + def pre(keyboard): + macro = (KC.RALT, KC.U) + for k in macro: + k.on_press(keyboard) + yield + for k in macro: + k.on_release(keyboard) + + @staticmethod + def post(keyboard): + KC.ENTER.on_press(keyboard) + yield + KC.ENTER.on_release(keyboard) + + +def MacroIter(keyboard, macro, unicode_mode): + for item in macro: + if callable(item): + ret = item(keyboard) + if ret.__class__.__name__ == 'generator': + for _ in ret: + yield _ + yield + else: + yield ret + + elif isinstance(item, str): + for char in item: + if ord(char) <= 127: + # ANSII key codes + key = KC[char] + if char.isupper(): + KC.LSHIFT.on_press(keyboard) + key.on_press(keyboard) + yield + + if char.isupper(): + KC.LSHIFT.on_release(keyboard) + key.on_release(keyboard) + yield + + else: + # unicode code points + for _ in unicode_mode.pre(keyboard): + yield _ + yield + + for digit in hex(ord(char))[2:]: + key = KC[digit] + key.on_press(keyboard) + yield + key.on_release(keyboard) + yield + + for _ in unicode_mode.post(keyboard): + yield _ + yield + + elif debug.enabled: + debug('unsupported macro type', item.__class__.__name__) + + +class Macros(Module): + def __init__(self, unicode_mode=UnicodeModeIBus, delay=10): + self._active = [] + self.key_buffer = [] + self.unicode_mode = unicode_mode + self.delay = delay + + make_argumented_key( + names=('MACRO',), + constructor=MacroKey, + _on_press=self.on_press_macro, + _on_release=self.on_release_macro, + ) + make_key( + names=('UC_MODE_IBUS',), + constructor=UnicodeModeKey, + mode=UnicodeModeIBus, + on_press=self.on_press_unicode_mode, + ) + make_key( + names=('UC_MODE_MACOS',), + constructor=UnicodeModeKey, + mode=UnicodeModeMacOS, + on_press=self.on_press_unicode_mode, + ) + make_key( + names=('UC_MODE_WINC',), + constructor=UnicodeModeKey, + mode=UnicodeModeWinC, + on_press=self.on_press_unicode_mode, + ) + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def process_key(self, keyboard, key, is_pressed, int_coord): + # Passthrough if there are no active macros, or the key belongs to an + # active macro, or all active macros or non-blocking. + if not self._active or key in self._active or not self._active[-1].blocking: + return key + + self.key_buffer.append((int_coord, key, is_pressed)) + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def on_press_unicode_mode(self, key, keyboard, *args, **kwargs): + self.unicode_mode = key.mode + + def on_press_macro(self, key, keyboard, *args, **kwargs): + if key.state == _IDLE: + key.state = _ON_PRESS + self.process_macro_async(keyboard, key) + else: + self.key_buffer.append((args[1], key, True)) + + def on_release_macro(self, key, keyboard, *args, **kwargs): + if key.state == _ON_PRESS or key.state == _ON_HOLD: + key.state = _RELEASE + if key._task is None: + self.process_macro_async(keyboard, key) + else: + self.key_buffer.append((args[1], key, False)) + + def process_macro_async(self, keyboard, key, _iter=None): + # There's no active macro iterator: select the next one. + if _iter is None: + key._task = None + + if key.state == _ON_PRESS: + self._active.append(key) + if (macro := key.on_press_macro) is None: + key.state = _ON_HOLD + elif debug.enabled: + debug('on_press') + + if key.state == _ON_HOLD: + if (macro := key.on_hold_macro) is None: + return + elif debug.enabled: + debug('on_hold') + + if key.state == _RELEASE: + key.state = _ON_RELEASE + + if key.state == _ON_RELEASE: + if (macro := key.on_release_macro) is None: + macro = () + elif debug.enabled: + debug('on_release') + + _iter = MacroIter(keyboard, macro, self.unicode_mode) + + # Run one step in the macro sequence. + delay = self.delay + try: + # any not None value the iterator yields is a delay value in ms. + ret = next(_iter) + if ret is not None: + delay = ret + keyboard._send_hid() + + # The sequence has reached its end: advance the macro state. + except StopIteration: + _iter = None + delay = 0 + key._task = None + + if key.state == _ON_PRESS: + key.state = _ON_HOLD + + elif key.state == _ON_RELEASE: + if debug.enabled: + debug('deactivate') + key.state = _IDLE + self._active.remove(key) + self.send_key_buffer(keyboard) + return + + # Schedule the next step. + # Reuse existing task objects and save a couple of bytes and cycles for the gc. + if key._task: + task = key._task + else: + + def task(): + self.process_macro_async(keyboard, key, _iter) + + key._task = create_task(task, after_ms=delay) + + def send_key_buffer(self, keyboard): + if not self.key_buffer or self._active: + return + + for int_coord, key, is_pressed in self.key_buffer: + keyboard.resume_process_key(self, key, is_pressed, int_coord, False) + + self.key_buffer.clear() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/midi.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/midi.py new file mode 100644 index 000000000..ca339f983 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/midi.py @@ -0,0 +1,114 @@ +import adafruit_midi +import usb_midi +from adafruit_midi.control_change import ControlChange +from adafruit_midi.note_off import NoteOff +from adafruit_midi.note_on import NoteOn +from adafruit_midi.pitch_bend import PitchBend +from adafruit_midi.program_change import ProgramChange +from adafruit_midi.start import Start +from adafruit_midi.stop import Stop + +from kmk.keys import Key, make_argumented_key +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + + +class MidiKey(Key): + def __init__(self, *args, command, channel=None, **kwargs): + super().__init__(**kwargs) + self.on_press_msg = command(*args, channel=channel) + self.on_release_msg = None + + +def midi_note_key(note=69, velocity=127, channel=None, **kwargs): + key = MidiKey(note, velocity, command=NoteOn, channel=channel, **kwargs) + key.on_release_msg = NoteOff(note, velocity, channel=channel) + return key + + +class MidiKeys(Module): + def __init__(self): + make_argumented_key( + names=('MIDI_CC',), + constructor=MidiKey, + command=ControlChange, + on_press=self.on_press, + ) + + make_argumented_key( + names=('MIDI_NOTE',), + constructor=midi_note_key, + on_press=self.on_press, + on_release=self.on_release, + ) + + make_argumented_key( + names=('MIDI_PB',), + constructor=MidiKey, + command=PitchBend, + on_press=self.on_press, + ) + + make_argumented_key( + names=('MIDI_PC',), + constructor=MidiKey, + command=ProgramChange, + on_press=self.on_press, + ) + + make_argumented_key( + names=('MIDI_START',), + constructor=MidiKey, + command=Start, + on_press=self.on_press, + ) + + make_argumented_key( + names=('MIDI_STOP',), + constructor=MidiKey, + command=Stop, + on_press=self.on_press, + ) + + try: + self.midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0) + except IndexError: + self.midi = None + if debug.enabled: + debug('No midi device found.') + + def during_bootup(self, keyboard): + return None + + def before_matrix_scan(self, keyboard): + return None + + def after_matrix_scan(self, keyboard): + return None + + def process_key(self, keyboard, key, is_pressed, int_coord): + return key + + def before_hid_send(self, keyboard): + return None + + def after_hid_send(self, keyboard): + return None + + def on_powersave_enable(self, keyboard): + return None + + def on_powersave_disable(self, keyboard): + return None + + def send(self, message): + if self.midi: + self.midi.send(message) + + def on_press(self, key, keyboard, *args, **kwargs): + self.send(key.on_press_msg) + + def on_release(self, key, keyboard, *args, **kwargs): + self.send(key.on_release_msg) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/mouse_keys.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/mouse_keys.py new file mode 100644 index 000000000..7ee98dc69 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/mouse_keys.py @@ -0,0 +1,152 @@ +from micropython import const + +from kmk.keys import AX, MouseKey, make_key +from kmk.modules import Module +from kmk.scheduler import cancel_task, create_task + +_MU = const(0x01) +_MD = const(0x02) +_ML = const(0x04) +_MR = const(0x08) +_WU = const(0x10) +_WD = const(0x20) +_WL = const(0x40) +_WR = const(0x80) + + +class MouseKeys(Module): + def __init__(self, max_speed=10, acc_interval=20, move_step=1): + self._movement = 0 + self.max_speed = max_speed + self.acc_interval = acc_interval + self.move_step = move_step + + codes = ( + (0x01, ('MB_LMB',)), + (0x02, ('MB_RMB',)), + (0x04, ('MB_MMB',)), + (0x08, ('MB_BTN4',)), + (0x10, ('MB_BTN5',)), + ) + for code, names in codes: + make_key(names=names, constructor=MouseKey, code=code) + + keys = ( + (('MW_UP',), self._mw_up_press, self._mw_up_release), + (('MW_DOWN', 'MW_DN'), self._mw_down_press, self._mw_down_release), + (('MW_LEFT', 'MW_LT'), self._mw_left_press, self._mw_left_release), + (('MW_RIGHT', 'MW_RT'), self._mw_right_press, self._mw_right_release), + (('MS_UP',), self._ms_up_press, self._ms_up_release), + (('MS_DOWN', 'MS_DN'), self._ms_down_press, self._ms_down_release), + (('MS_LEFT', 'MS_LT'), self._ms_left_press, self._ms_left_release), + (('MS_RIGHT', 'MS_RT'), self._ms_right_press, self._ms_right_release), + ) + for names, on_press, on_release in keys: + make_key(names=names, on_press=on_press, on_release=on_release) + + def during_bootup(self, keyboard): + self._task = create_task( + lambda: self._move(keyboard), + period_ms=self.acc_interval, + ) + cancel_task(self._task) + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def _move(self, keyboard): + if self._movement & (_MR + _ML + _MD + _MU): + if self.move_step < self.max_speed: + self.move_step = self.move_step + 1 + if self._movement & _MU: + AX.Y.move(keyboard, -self.move_step) + if self._movement & _MD: + AX.Y.move(keyboard, self.move_step) + if self._movement & _ML: + AX.X.move(keyboard, -self.move_step) + if self._movement & _MR: + AX.X.move(keyboard, self.move_step) + + if self._movement & _WU: + AX.W.move(keyboard, 1) + if self._movement & _WD: + AX.W.move(keyboard, -1) + if self._movement & _WL: + AX.P.move(keyboard, -1) + if self._movement & _WR: + AX.P.move(keyboard, 1) + + def _maybe_start_move(self, mask): + self._movement |= mask + if self._movement == mask: + self._task.restart() + + def _maybe_stop_move(self, mask): + self._movement &= ~mask + if not self._movement & (_MR + _ML + _MD + _MU): + self.move_step = 1 + if not self._movement: + cancel_task(self._task) + + def _mw_up_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_WU) + + def _mw_up_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_WU) + + def _mw_down_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_WD) + + def _mw_down_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_WD) + + def _mw_left_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_WL) + + def _mw_left_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_WL) + + def _mw_right_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_WR) + + def _mw_right_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_WR) + + def _ms_up_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_MU) + + def _ms_up_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_MU) + + def _ms_down_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_MD) + + def _ms_down_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_MD) + + def _ms_left_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_ML) + + def _ms_left_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_ML) + + def _ms_right_press(self, key, keyboard, *args, **kwargs): + self._maybe_start_move(_MR) + + def _ms_right_release(self, key, keyboard, *args, **kwargs): + self._maybe_stop_move(_MR) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/pimoroni_trackball.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/pimoroni_trackball.py new file mode 100644 index 000000000..0b6538851 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/pimoroni_trackball.py @@ -0,0 +1,318 @@ +''' +Extension handles usage of Trackball Breakout by Pimoroni +''' + +from micropython import const + +import math +import struct +from adafruit_pixelbuf import PixelBuf + +from kmk.keys import AX, KC, Key, make_argumented_key, make_key +from kmk.kmktime import PeriodicTimer +from kmk.modules import Module +from kmk.utils import Debug + +_I2C_ADDRESS = const(0x0A) +_I2C_ADDRESS_ALTERNATIVE = const(0x0B) + +_CHIP_ID = const(0xBA11) +_VERSION = const(1) + +_REG_LED_RED = const(0x00) +_REG_LED_GRN = const(0x01) +_REG_LED_BLU = const(0x02) +_REG_LED_WHT = const(0x03) + +_REG_LEFT = const(0x04) +_REG_RIGHT = const(0x05) +_REG_UP = const(0x06) +_REG_DOWN = const(0x07) +_REG_SWITCH = const(0x08) +_MSK_SWITCH_STATE = const(0b10000000) + +_REG_USER_FLASH = const(0xD0) +_REG_FLASH_PAGE = const(0xF0) +_REG_INT = const(0xF9) +_MSK_INT_TRIGGERED = const(0b00000001) +_MSK_INT_OUT_EN = const(0b00000010) +_REG_CHIP_ID_L = const(0xFA) +_REG_CHIP_ID_H = const(0xFB) +_REG_VERSION = const(0xFC) +_REG_I2C_ADDR = const(0xFD) +_REG_CTRL = const(0xFE) +_MSK_CTRL_SLEEP = const(0b00000001) +_MSK_CTRL_RESET = const(0b00000010) +_MSK_CTRL_FREAD = const(0b00000100) +_MSK_CTRL_FWRITE = const(0b00001000) + + +debug = Debug(__name__) + + +class TrackballMode: + '''Behaviour mode of trackball: mouse movement or vertical scroll''' + + MOUSE_MODE = const(0) + SCROLL_MODE = const(1) + + +class ScrollDirection: + '''Behaviour mode of scrolling: natural or reverse scrolling''' + + NATURAL = const(0) + REVERSE = const(1) + + +class TrackballHandlerKey(Key): + def __init__(self, handler=TrackballMode.MOUSE_MODE, **kwargs): + super().__init__(**kwargs) + self.handler = handler + + +class TrackballHandler: + def handle(self, keyboard, trackball, x, y, switch, state): + raise NotImplementedError + + +class PointingHandler(TrackballHandler): + def __init__(self, on_press=KC.MB_LMB): + self.on_press = on_press + + def handle(self, keyboard, trackball, x, y, switch, state): + if x: + AX.X.move(keyboard, x) + if y: + AX.Y.move(keyboard, y) + + if switch == 1: # Button changed state + keyboard.pre_process_key(self.on_press, is_pressed=state) + + +class ScrollHandler(TrackballHandler): + def __init__(self, scroll_direction=ScrollDirection.NATURAL, on_press=KC.MB_LMB): + self.scroll_direction = scroll_direction + self.on_press = on_press + + def handle(self, keyboard, trackball, x, y, switch, state): + if self.scroll_direction == ScrollDirection.REVERSE: + y = -y + + if y != 0: + AX.W.move(keyboard, y) + + if switch == 1: # Button changed state + keyboard.pre_process_key(self.on_press, is_pressed=state) + + +class KeyHandler(TrackballHandler): + x = 0 + y = 0 + + def __init__(self, up, right, down, left, press, axis_snap=0.25, steps=8): + self.up = up + self.right = right + self.down = down + self.left = left + self.press = press + self.axis_snap = axis_snap + self.steps = steps + + def handle(self, keyboard, trackball, x, y, switch, state): + if y and abs(x / y) < self.axis_snap: + x = 0 + if x and abs(y / x) < self.axis_snap: + y = 0 + + self.x += x + self.y += y + x_taps = self.x // self.steps + y_taps = self.y // self.steps + self.x %= self.steps + self.y %= self.steps + for i in range(x_taps, 0, 1): + keyboard.tap_key(self.left) + for i in range(x_taps, 0, -1): + keyboard.tap_key(self.right) + for i in range(y_taps, 0, 1): + keyboard.tap_key(self.up) + for i in range(y_taps, 0, -1): + keyboard.tap_key(self.down) + if switch and state: + keyboard.tap_key(self.press) + + +class Trackball(Module): + '''Module handles usage of Trackball Breakout by Pimoroni''' + + def __init__( + self, + i2c, + mode=TrackballMode.MOUSE_MODE, + address=_I2C_ADDRESS, + angle_offset=0, + handlers=None, + ): + self.angle_offset = angle_offset + if not handlers: + handlers = [PointingHandler(), ScrollHandler()] + if mode == TrackballMode.SCROLL_MODE: + handlers.reverse() + self._i2c_address = address + self._i2c_bus = i2c + + self.mode = mode + self.handlers = handlers + self.current_handler = self.handlers[0] + self.polling_interval = 20 + + make_key( + names=('TB_MODE', 'TB_NEXT_HANDLER', 'TB_N'), + on_press=self._tb_handler_next_press, + ) + + make_argumented_key( + names=('TB_HANDLER', 'TB_H'), + constructor=TrackballHandlerKey, + on_press=self._tb_handler_press, + ) + + def during_bootup(self, keyboard): + chip_id = struct.unpack('= len(self.handlers): + next_index = 0 + self.activate_handler(next_index) + + def _read_raw_state(self): + '''Read up, down, left, right and switch data from trackball.''' + left, right, up, down, switch = self._i2c_rdwr([_REG_LEFT], 5) + switch_changed, switch_state = ( + switch & ~_MSK_SWITCH_STATE, + (switch & _MSK_SWITCH_STATE) > 0, + ) + return up, down, left, right, switch_changed, switch_state + + def _i2c_rdwr(self, data, length=0): + '''Write and optionally read I2C data.''' + if not self._i2c_bus.try_lock(): + return + + try: + if length > 0: + result = bytearray(length) + self._i2c_bus.writeto_then_readfrom( + self._i2c_address, bytes(data), result + ) + return list(result) + else: + self._i2c_bus.writeto(self._i2c_address, bytes(data)) + + return [] + + finally: + self._i2c_bus.unlock() + + def _tb_handler_press(self, key, keyboard, *args, **kwargs): + self.activate_handler(key.handler) + + def _tb_handler_next_press(self, key, keyboard, *args, **kwargs): + self.next_handler() + + def _calculate_movement(self, raw_x, raw_y): + '''Calculate accelerated movement vector from raw data''' + if raw_x == 0 and raw_y == 0: + return 0, 0 + + scale = math.sqrt(raw_x**2 + raw_y**2) + x = (self.rot[0][0] * raw_x + self.rot[0][1] * raw_y) * scale + y = (self.rot[1][0] * raw_x + self.rot[1][1] * raw_y) * scale + + return int(x), int(y) + + +class TrackballPixel(PixelBuf): + '''PixelBuf interface for the Trackball RGBW LED''' + + def __init__(self, trackball, **kwargs): + self.trackball = trackball + kwargs['byteorder'] = 'RGBW' + super().__init__(1, **kwargs) + + def deinit(self): + self.trackball.set_rgbw(0, 0, 0, 0) + + def _transmit(self, b): + self.trackball.set_rgbw(b[0], b[1], b[2], b[3]) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/potentiometer.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/potentiometer.py new file mode 100644 index 000000000..03a3dc774 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/potentiometer.py @@ -0,0 +1,94 @@ +from analogio import AnalogIn +from supervisor import ticks_ms + +from kmk.modules import Module + + +class PotentiometerState: + def __init__(self, direction: int, position: int): + self.direction = direction + self.position = position + + +class Potentiometer: + def __init__(self, pin, move_callback, is_inverted=False): + self.is_inverted = is_inverted + self.read_pin = AnalogIn(pin) + self._direction = None + self._pos = self.get_pos() + self._timestamp = ticks_ms() + self.cb = move_callback + + # callback function on events. + self.on_move_do = lambda state: self.cb(state) + + def get_state(self) -> PotentiometerState: + return PotentiometerState( + direction=(self.is_inverted and -self._direction or self._direction), + position=(self.is_inverted and -self._pos or self._pos), + ) + + def get_pos(self): + ''' + Read from the analog pin assingned, truncate to 7 bits, + average over 10 readings, and return a value 0-127 + ''' + return int(sum([(self.read_pin.value >> 9) for i in range(10)]) / 10) + + def update_state(self): + self._direction = 0 + new_pos = self.get_pos() + if abs(new_pos - self._pos) > 2: + # movement detected! + if new_pos > self._pos: + self._direction = 1 + else: + self._direction = -1 + self._pos = new_pos + if self.on_move_do is not None: + self.on_move_do(self.get_state()) + + +class PotentiometerHandler(Module): + def __init__(self): + self.potentiometers = [] + self.pins = None + + def on_runtime_enable(self, keyboard): + return + + def on_runtime_disable(self, keyboard): + return + + def during_bootup(self, keyboard): + if self.pins: + for args in self.pins: + self.potentiometers.append(Potentiometer(*args)) + return + + def before_matrix_scan(self, keyboard): + ''' + Return value will be injected as an extra matrix update + ''' + for potentiometer in self.potentiometers: + potentiometer.update_state() + + return keyboard + + def after_matrix_scan(self, keyboard): + ''' + Return value will be replace matrix update if supplied + ''' + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/power.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/power.py new file mode 100644 index 000000000..07eca21c5 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/power.py @@ -0,0 +1,143 @@ +import board +import digitalio +from supervisor import ticks_ms + +from time import sleep + +from kmk.keys import make_key +from kmk.kmktime import check_deadline +from kmk.modules import Module + + +class Power(Module): + def __init__(self, powersave_pin=None): + self.enable = False + self.powersave_pin = powersave_pin # Powersave pin board object + self._powersave_start = ticks_ms() + self._usb_last_scan = ticks_ms() - 5000 + self._psp = None # Powersave pin object + self._i2c = 0 + self._i2c_deinit_count = 0 + self._loopcounter = 0 + + make_key(names=('PS_TOG',), on_press=self._ps_tog) + make_key(names=('PS_ON',), on_press=self._ps_enable) + make_key(names=('PS_OFF',), on_press=self._ps_disable) + + def __repr__(self): + return f'Power({self._to_dict()})' + + def _to_dict(self): + return { + 'enable': self.enable, + 'powersave_pin': self.powersave_pin, + '_powersave_start': self._powersave_start, + '_usb_last_scan': self._usb_last_scan, + '_psp': self._psp, + } + + def during_bootup(self, keyboard): + self._i2c_scan() + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + if keyboard.matrix_update or keyboard.secondary_matrix_update: + self.psave_time_reset() + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + if self.enable: + self.psleep() + + def on_powersave_enable(self, keyboard): + '''Gives 10 cycles to allow other extensions to clean up before powersave''' + if self._loopcounter > 10: + self.enable_powersave(keyboard) + self._loopcounter = 0 + else: + self._loopcounter += 1 + return + + def on_powersave_disable(self, keyboard): + self.disable_powersave(keyboard) + return + + def enable_powersave(self, keyboard): + '''Enables power saving features''' + if self._i2c_deinit_count >= self._i2c and self.powersave_pin: + # Allows power save to prevent RGB drain. + # Example here https://docs.nicekeyboards.com/#/nice!nano/pinout_schematic + + if not self._psp: + self._psp = digitalio.DigitalInOut(self.powersave_pin) + self._psp.direction = digitalio.Direction.OUTPUT + if self._psp: + self._psp.value = True + + self.enable = True + keyboard._trigger_powersave_enable = False + return + + def disable_powersave(self, keyboard): + '''Disables power saving features''' + if self._psp: + self._psp.value = False + # Allows power save to prevent RGB drain. + # Example here https://docs.nicekeyboards.com/#/nice!nano/pinout_schematic + + keyboard._trigger_powersave_disable = False + self.enable = False + return + + def psleep(self): + ''' + Sleeps longer and longer to save power the more time in between updates. + ''' + if check_deadline(ticks_ms(), self._powersave_start, 60000): + sleep(8 / 1000) + elif check_deadline(ticks_ms(), self._powersave_start, 240000) is False: + sleep(180 / 1000) + return + + def psave_time_reset(self): + self._powersave_start = ticks_ms() + + def _i2c_scan(self): + i2c = board.I2C() + while not i2c.try_lock(): + pass + try: + self._i2c = len(i2c.scan()) + finally: + i2c.unlock() + return + + def usb_rescan_timer(self): + return bool(check_deadline(ticks_ms(), self._usb_last_scan, 5000) is False) + + def usb_time_reset(self): + self._usb_last_scan = ticks_ms() + return + + def usb_scan(self): + # TODO Add USB detection here. Currently lies that it's connected + # https://github.com/adafruit/circuitpython/pull/3513 + return True + + def _ps_tog(self, key, keyboard, *args, **kwargs): + if self.enable: + keyboard._trigger_powersave_disable = True + else: + keyboard._trigger_powersave_enable = True + + def _ps_enable(self, key, keyboard, *args, **kwargs): + if not self.enable: + keyboard._trigger_powersave_enable = True + + def _ps_disable(self, key, keyboard, *args, **kwargs): + if self.enable: + keyboard._trigger_powersave_disable = True diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/rapidfire.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/rapidfire.py new file mode 100644 index 000000000..99c766293 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/rapidfire.py @@ -0,0 +1,118 @@ +from micropython import const + +from random import randint + +from kmk.keys import Key, make_argumented_key +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + +_INACTIVE = const(0) +_HOLD = const(1) +_ACTIVE = const(2) + + +class RapidFireKey(Key): + def __init__( + self, + key, + interval=100, + timeout=200, + enable_interval_randomization=False, + randomization_magnitude=15, + toggle=False, + **kwargs, + ): + super().__init__(**kwargs) + self.key = key + self.interval = interval + self.timeout = timeout + self.enable_interval_randomization = enable_interval_randomization + self.randomization_magnitude = randomization_magnitude + self.toggle = toggle + self._state = _INACTIVE + self._timeout = None + + +class RapidFire(Module): + def __init__(self): + make_argumented_key( + names=('RF',), + constructor=RapidFireKey, + on_press=self._rf_pressed, + on_release=self._rf_released, + ) + + def _on_timer_timeout(self, key, keyboard): + if key._state == _HOLD: + key._state = _ACTIVE + keyboard.remove_key(key.key) + key._timeout = keyboard.set_timeout( + 1, lambda: self._on_timer_timeout(key, keyboard) + ) + return + + keyboard.add_key(key.key) + keyboard.set_timeout(1, lambda: keyboard.remove_key(key.key)) + + interval = key.interval + if key.enable_interval_randomization: + interval += randint( + -key.randomization_magnitude, key.randomization_magnitude + ) + key._timeout = keyboard.set_timeout( + interval, lambda: self._on_timer_timeout(key, keyboard) + ) + + if debug.enabled: + debug(key.key, ' @', interval, 'ms') + + def _rf_pressed(self, key, keyboard, *args, **kwargs): + if key._state == _ACTIVE: + self._deactivate_key(key, keyboard) + return + + keyboard.add_key(key.key) + key._state = _HOLD + key._timeout = keyboard.set_timeout( + key.timeout, lambda: self._on_timer_timeout(key, keyboard) + ) + + def _rf_released(self, key, keyboard, *args, **kwargs): + if key._state == _ACTIVE: + if key.toggle: + return + key._state = _INACTIVE + elif key._state == _INACTIVE: + return + else: + keyboard.remove_key(key.key) + + self._deactivate_key(key, keyboard) + + def _deactivate_key(self, key, keyboard): + keyboard.cancel_timeout(key._timeout) + key._state = _INACTIVE + key._timeout = None + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/serialace.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/serialace.py new file mode 100644 index 000000000..c03037744 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/serialace.py @@ -0,0 +1,63 @@ +from usb_cdc import data + +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + + +class SerialACE(Module): + buffer = bytearray() + + def during_bootup(self, keyboard): + try: + data.timeout = 0 + except AttributeError: + pass + + def before_matrix_scan(self, keyboard): + pass + + def after_matrix_scan(self, keyboard): + pass + + def process_key(self, keyboard, key, is_pressed, int_coord): + return key + + def before_hid_send(self, keyboard): + # Serial.data isn't initialized. + if not data: + return + + # Nothing to parse. + if data.in_waiting == 0: + return + + self.buffer.extend(data.read()) + idx = self.buffer.find(b'\n') + + # No full command yet. + if idx == -1: + return + + # Split off command and evaluate. + line = self.buffer[:idx] + self.buffer = self.buffer[idx + 1 :] # noqa: E203 + + try: + if debug.enabled: + debug(f'eval({line})') + ret = eval(line, {'keyboard': keyboard}) + data.write(bytearray(str(ret) + '\n')) + except Exception as err: + if debug.enabled: + debug(f'error: {err}') + + def after_hid_send(self, keyboard): + pass + + def on_powersave_enable(self, keyboard): + pass + + def on_powersave_disable(self, keyboard): + pass diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/split.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/split.py new file mode 100644 index 000000000..a54b3e93f --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/split.py @@ -0,0 +1,391 @@ +'''Enables splitting keyboards wirelessly or wired''' + +import busio +from micropython import const +from supervisor import runtime, ticks_ms + +from keypad import Event as KeyEvent +from storage import getmount + +from kmk.hid import HIDModes +from kmk.kmktime import check_deadline +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + + +class SplitSide: + LEFT = const(1) + RIGHT = const(2) + + +class SplitType: + UART = const(1) + I2C = const(2) # unused + ONEWIRE = const(3) # unused + BLE = const(4) + + +class Split(Module): + '''Enables splitting keyboards wirelessly, or wired''' + + def __init__( + self, + split_flip=True, + split_side=None, + split_type=SplitType.UART, + split_target_left=True, + uart_interval=20, + data_pin=None, + data_pin2=None, + uart_flip=True, + use_pio=False, + ): + self._is_target = True + self._uart_buffer = [] + self.split_flip = split_flip + self.split_side = split_side + self.split_type = split_type + self.split_target_left = split_target_left + self.split_offset = None + self.data_pin = data_pin + self.data_pin2 = data_pin2 + self.uart_flip = uart_flip + self._use_pio = use_pio + self._uart = None + self._uart_interval = uart_interval + self.uart_header = bytearray([0xB2]) # Any non-zero byte should work + + if self.split_type == SplitType.BLE: + try: + from adafruit_ble import BLERadio + from adafruit_ble.advertising.standard import ( + ProvideServicesAdvertisement, + ) + from adafruit_ble.services.nordic import UARTService + + self.BLERadio = BLERadio + self.ProvideServicesAdvertisement = ProvideServicesAdvertisement + self.UARTService = UARTService + except ImportError: + if debug.enabled: + debug('BLE Import error') + return # BLE isn't supported on this platform + self._ble_last_scan = ticks_ms() - 5000 + self._connection_count = 0 + self._split_connected = False + self._uart_connection = None + self._advertisment = None # Seems to not be used anywhere + self._advertising = False + self._psave_enable = False + + if self._use_pio: + from kmk.transports.pio_uart import PIO_UART + + self.PIO_UART = PIO_UART + + def during_bootup(self, keyboard): + # Set up name for target side detection and BLE advertisment + name = str(getmount('/').label) + if self.split_type == SplitType.BLE: + if keyboard.hid_type == HIDModes.BLE: + self._ble = keyboard._hid_helper.ble + else: + self._ble = self.BLERadio() + self._ble.name = name + else: + # Try to guess data pins if not supplied + if not self.data_pin: + self.data_pin = keyboard.data_pin + + # if split side was given, find target from split_side. + if self.split_side == SplitSide.LEFT: + self._is_target = bool(self.split_target_left) + elif self.split_side == SplitSide.RIGHT: + self._is_target = not bool(self.split_target_left) + else: + # Detect split side from name + if ( + self.split_type == SplitType.UART + or self.split_type == SplitType.ONEWIRE + ): + self._is_target = runtime.usb_connected + elif self.split_type == SplitType.BLE: + self._is_target = name.endswith('L') == self.split_target_left + + if name.endswith('L'): + self.split_side = SplitSide.LEFT + elif name.endswith('R'): + self.split_side = SplitSide.RIGHT + + if not self._is_target: + keyboard._hid_send_enabled = False + + if self.split_offset is None: + self.split_offset = keyboard.matrix[-1].coord_mapping[-1] + 1 + + if self.split_type == SplitType.UART and self.data_pin is not None: + if self._is_target or not self.uart_flip: + if self._use_pio: + self._uart = self.PIO_UART(tx=self.data_pin2, rx=self.data_pin) + else: + self._uart = busio.UART( + tx=self.data_pin2, rx=self.data_pin, timeout=self._uart_interval + ) + else: + if self._use_pio: + self._uart = self.PIO_UART(tx=self.data_pin, rx=self.data_pin2) + else: + self._uart = busio.UART( + tx=self.data_pin, rx=self.data_pin2, timeout=self._uart_interval + ) + + # Attempt to sanely guess a coord_mapping if one is not provided. + if not keyboard.coord_mapping and keyboard.row_pins and keyboard.col_pins: + cm = [] + + rows_to_calc = len(keyboard.row_pins) + cols_to_calc = len(keyboard.col_pins) + + # Flips the col order if PCB is the same but flipped on right + cols_rhs = list(range(cols_to_calc)) + if self.split_flip: + cols_rhs = list(reversed(cols_rhs)) + + for ridx in range(rows_to_calc): + for cidx in range(cols_to_calc): + cm.append(cols_to_calc * ridx + cidx) + for cidx in cols_rhs: + cm.append(cols_to_calc * (rows_to_calc + ridx) + cidx) + + keyboard.coord_mapping = tuple(cm) + + if not keyboard.coord_mapping and debug.enabled: + debug('Error: please provide coord_mapping for custom scanner') + + if self.split_side == SplitSide.RIGHT: + offset = self.split_offset + for matrix in keyboard.matrix: + matrix.offset = offset + offset += matrix.key_count + + def before_matrix_scan(self, keyboard): + if self.split_type == SplitType.BLE: + self._check_all_connections(keyboard) + self._receive_ble(keyboard) + elif self.split_type == SplitType.UART: + if self._is_target or self.data_pin2: + self._receive_uart(keyboard) + elif self.split_type == SplitType.ONEWIRE: + pass # Protocol needs written + return + + def after_matrix_scan(self, keyboard): + if keyboard.matrix_update: + if self.split_type == SplitType.UART: + if not self._is_target or self.data_pin2: + self._send_uart(keyboard.matrix_update) + else: + pass # explicit pass just for dev sanity... + elif self.split_type == SplitType.BLE: + self._send_ble(keyboard.matrix_update) + elif self.split_type == SplitType.ONEWIRE: + pass # Protocol needs written + else: + if debug.enabled: + debug('Unexpected case in after_matrix_scan') + + return + + def before_hid_send(self, keyboard): + if not self._is_target: + keyboard.hid_pending = False + + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + if self.split_type == SplitType.BLE: + if self._uart_connection and not self._psave_enable: + self._uart_connection.connection_interval = self._uart_interval + self._psave_enable = True + + def on_powersave_disable(self, keyboard): + if self.split_type == SplitType.BLE: + if self._uart_connection and self._psave_enable: + self._uart_connection.connection_interval = 11.25 + self._psave_enable = False + + def _check_all_connections(self, keyboard): + '''Validates the correct number of BLE connections''' + self._previous_connection_count = self._connection_count + self._connection_count = len(self._ble.connections) + if self._is_target: + if self._advertising or not self._check_if_split_connected(): + self._target_advertise() + elif self._connection_count < 2 and keyboard.hid_type == HIDModes.BLE: + keyboard._hid_helper.start_advertising() + + elif not self._is_target and self._connection_count < 1: + self._initiator_scan() + + def _check_if_split_connected(self): + # I'm looking for a way how to recognize which connection is on and which one off + # For now, I found that service name relation to having other CP device + if self._connection_count == 0: + return False + if self._connection_count == 2: + self._split_connected = True + return True + + # Polling this takes some time so I check only if connection_count changed + if self._previous_connection_count == self._connection_count: + return self._split_connected + + bleio_connection = self._ble.connections[0]._bleio_connection + connection_services = bleio_connection.discover_remote_services() + for service in connection_services: + if str(service.uuid).startswith("UUID('adaf0001"): + self._split_connected = True + return True + return False + + def _initiator_scan(self): + '''Scans for target device''' + self._uart = None + self._uart_connection = None + # See if any existing connections are providing UARTService. + self._connection_count = len(self._ble.connections) + if self._connection_count > 0 and not self._uart: + for connection in self._ble.connections: + if self.UARTService in connection: + self._uart_connection = connection + self._uart_connection.connection_interval = 11.25 + self._uart = self._uart_connection[self.UARTService] + break + + if not self._uart: + if debug.enabled: + debug('Scanning') + self._ble.stop_scan() + for adv in self._ble.start_scan( + self.ProvideServicesAdvertisement, timeout=20 + ): + if debug.enabled: + debug('Scanning') + if self.UARTService in adv.services and adv.rssi > -70: + self._uart_connection = self._ble.connect(adv) + self._uart_connection.connection_interval = 11.25 + self._uart = self._uart_connection[self.UARTService] + self._ble.stop_scan() + if debug.enabled: + debug('Scan complete') + break + self._ble.stop_scan() + + def _target_advertise(self): + '''Advertises the target for the initiator to find''' + # Give previous advertising some time to complete + if self._advertising: + if self._check_if_split_connected(): + if debug.enabled: + debug('Advertising complete') + self._ble.stop_advertising() + self._advertising = False + return + + if not self.ble_rescan_timer(): + return + + if debug.enabled: + debug('Advertising not answered') + + self._ble.stop_advertising() + if debug.enabled: + debug('Advertising') + # Uart must not change on this connection if reconnecting + if not self._uart: + self._uart = self.UARTService() + advertisement = self.ProvideServicesAdvertisement(self._uart) + + self._ble.start_advertising(advertisement) + self._advertising = True + self.ble_time_reset() + + def ble_rescan_timer(self): + '''If true, the rescan timer is up''' + return not bool(check_deadline(ticks_ms(), self._ble_last_scan, 5000)) + + def ble_time_reset(self): + '''Resets the rescan timer''' + self._ble_last_scan = ticks_ms() + + def _serialize_update(self, update): + buffer = bytearray(2) + buffer[0] = update.key_number + buffer[1] = update.pressed + return buffer + + def _deserialize_update(self, update): + kevent = KeyEvent(key_number=update[0], pressed=update[1]) + return kevent + + def _send_ble(self, update): + if self._uart: + try: + self._uart.write(self._serialize_update(update)) + except OSError: + try: + self._uart.disconnect() + except: # noqa: E722 + if debug.enabled: + debug('UART disconnect failed') + + if debug.enabled: + debug('Connection error') + self._uart_connection = None + self._uart = None + + def _receive_ble(self, keyboard): + if self._uart is not None and self._uart.in_waiting > 0 or self._uart_buffer: + while self._uart.in_waiting >= 2: + update = self._deserialize_update(self._uart.read(2)) + self._uart_buffer.append(update) + if self._uart_buffer: + keyboard.secondary_matrix_update = self._uart_buffer.pop(0) + + def _checksum(self, update): + checksum = bytes([sum(update) & 0xFF]) + + return checksum + + def _send_uart(self, update): + # Change offsets depending on where the data is going to match the correct + # matrix location of the receiever + if self._uart is not None: + update = self._serialize_update(update) + self._uart.write(self.uart_header) + self._uart.write(update) + self._uart.write(self._checksum(update)) + + def _receive_uart(self, keyboard): + if self._uart is not None and self._uart.in_waiting > 0 or self._uart_buffer: + if self._uart.in_waiting >= 60: + # This is a dirty hack to prevent crashes in unrealistic cases + import microcontroller + + microcontroller.reset() + + while self._uart.in_waiting >= 4: + # Check the header + if self._uart.read(1) == self.uart_header: + update = self._uart.read(2) + + # check the checksum + if self._checksum(update) == self._uart.read(1): + self._uart_buffer.append(self._deserialize_update(update)) + if self._uart_buffer: + keyboard.secondary_matrix_update = self._uart_buffer.pop(0) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/steno.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/steno.py new file mode 100644 index 000000000..bd93da2e1 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/steno.py @@ -0,0 +1,107 @@ +import usb_cdc + +from kmk.keys import make_key +from kmk.modules import Module + +# key order from https://github.com/openstenoproject/plover/blob/main/plover/machine/geminipr.py +# do not rearrange +STENO_KEYS = ( + 'STN_FN', + 'STN_N1', + 'STN_N2', + 'STN_N3', + 'STN_N4', + 'STN_N5', + 'STN_N6', + 'STN_LS1', + 'STN_LS2', + 'STN_LT', + 'STN_LK', + 'STN_LP', + 'STN_LW', + 'STN_LH', + 'STN_LR', + 'STN_A', + 'STN_O', + 'STN_AS1', + 'STN_AS2', + 'STN_RES1', + 'STN_RES2', + 'STN_PWR', + 'STN_AS3', + 'STN_AS4', + 'STN_E', + 'STN_U', + 'STN_RF', + 'STN_RR', + 'STN_RP', + 'STN_RB', + 'STN_RL', + 'STN_RG', + 'STN_RT', + 'STN_RS', + 'STN_RD', + 'STN_N7', + 'STN_N8', + 'STN_N9', + 'STN_NA', + 'STN_NB', + 'STN_NC', + 'STN_RZ', +) + + +class Steno(Module): + def __init__(self): + self._should_write = False + + self._buffer = bytearray(6) + self._initialize_buffer() + + for idx, key in enumerate(STENO_KEYS): + make_key( + code=((idx // 7) << 8) | (0x40 >> (idx % 7)), + names=(key,), + on_press=self._steno_press, + on_release=self._steno_release, + ) + + def _initialize_buffer(self): + self._buffer[:] = b'\x80\x00\x00\x00\x00\x00' + + # flip a key's bit in the buffer + def _steno_press(self, key, *_): + self._should_write = True + self._buffer[key.code >> 8] |= key.code & 0xFF + + # send all keys that were pressed, and reset the buffer + def _steno_release(self, *_): + if self._should_write: + usb_cdc.data.write(self._buffer) + + self._should_write = False + self._initialize_buffer() + + def during_bootup(self, keyboard): + pass + + def before_matrix_scan(self, keyboard): + pass + + def after_matrix_scan(self, keyboard): + pass + + def process_key(self, keyboard, key, is_pressed, int_coord): + return key + + def before_hid_send(self, keyboard): + pass + + def after_hid_send(self, keyboard): + pass + + def on_powersave_enable(self, keyboard): + pass + + def on_powersave_disable(self, keyboard): + pass diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/sticky_keys.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/sticky_keys.py new file mode 100644 index 000000000..fd2a01c7e --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/sticky_keys.py @@ -0,0 +1,151 @@ +from micropython import const + +from kmk.keys import Key, make_argumented_key +from kmk.modules import Module +from kmk.utils import Debug + +debug = Debug(__name__) + + +_SK_IDLE = const(0) +_SK_PRESSED = const(1) +_SK_RELEASED = const(2) +_SK_HOLD = const(3) +_SK_STICKY = const(4) + + +class StickyKey(Key): + def __init__(self, key, defer_release=False, retap_cancel=True, **kwargs): + super().__init__(**kwargs) + self.key = key + self.defer_release = defer_release + self.timeout = None + self.state = _SK_IDLE + self.retap_cancel = retap_cancel + + +class StickyKeys(Module): + def __init__(self, release_after=1000): + self.active_keys = [] + self.release_after = release_after + + make_argumented_key( + names=('SK', 'STICKY'), + constructor=StickyKey, + on_press=self.on_press, + on_release=self.on_release, + ) + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def process_key(self, keyboard, current_key, is_pressed, int_coord): + delay_current = False + + for key in self.active_keys.copy(): + # Ignore keys that will resolve to and emit a different key + # eventually, potentially triggering twice. + # Handle interactions among sticky keys (stacking) in `on_press` + # instead of `process_key` to avoid race conditions / causal + # reordering when resetting timeouts. + if ( + isinstance(current_key, StickyKey) + or current_key.__class__.__name__ == 'TapDanceKey' + or current_key.__class__.__name__ == 'HoldTapKey' + or current_key.__class__.__name__ == 'LayerTapKeyMeta' + ): + continue + + if key.state == _SK_PRESSED and is_pressed: + key.state = _SK_HOLD + elif key.state == _SK_RELEASED and is_pressed: + key.state = _SK_STICKY + elif key.state == _SK_STICKY: + # Defer sticky release until last other key is released. + if key.defer_release: + if not is_pressed and len(keyboard._coordkeys_pressed) <= 1: + self.deactivate(keyboard, key) + # Release sticky key; if it's a new key pressed: delay + # propagation until after the sticky release. + else: + self.deactivate(keyboard, key) + delay_current = is_pressed + + if delay_current: + keyboard.resume_process_key(self, current_key, is_pressed, int_coord, False) + else: + return current_key + + def set_timeout(self, keyboard, key): + key.timeout = keyboard.set_timeout( + self.release_after, + lambda: self.on_release_after(keyboard, key), + ) + + def on_press(self, key, keyboard, *args, **kwargs): + # Let sticky keys stack while renewing timeouts. + for sk in self.active_keys: + keyboard.cancel_timeout(sk.timeout) + + # If active sticky key is tapped again, cancel. + if key.retap_cancel and (key.state == _SK_RELEASED or key.state == _SK_STICKY): + self.deactivate(keyboard, key) + # Reset on repeated taps. + elif key.state != _SK_IDLE: + key.state = _SK_PRESSED + else: + self.activate(keyboard, key) + + for sk in self.active_keys: + self.set_timeout(keyboard, sk) + + def on_release(self, key, keyboard, *args, **kwargs): + # No interrupt or timeout happend, mark key as RELEASED, ready to get + # STICKY. + if key.state == _SK_PRESSED: + key.state = _SK_RELEASED + # Key in HOLD state is handled like a regular release. + elif key.state == _SK_HOLD: + keyboard.cancel_timeout(key.timeout) + self.deactivate(keyboard, key) + + def on_release_after(self, keyboard, key): + # Key is still pressed but nothing else happend: set to HOLD. + if key.state == _SK_PRESSED: + key.state = _SK_HOLD + keyboard.cancel_timeout(key.timeout) + # Key got released but nothing else happend: deactivate. + elif key.state == _SK_RELEASED: + self.deactivate(keyboard, key) + + def activate(self, keyboard, key): + if debug.enabled: + debug('activate') + key.state = _SK_PRESSED + self.active_keys.insert(0, key) + keyboard.resume_process_key(self, key.key, True) + + def deactivate(self, keyboard, key): + if debug.enabled: + debug('deactivate') + key.state = _SK_IDLE + self.active_keys.remove(key) + keyboard.resume_process_key(self, key.key, False) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/sticky_mod.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/sticky_mod.py new file mode 100644 index 000000000..0896b14fd --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/sticky_mod.py @@ -0,0 +1,64 @@ +from kmk.keys import Key, make_argumented_key +from kmk.modules import Module + + +class StickyModKey(Key): + def __init__(self, key, mod, **kwargs): + super().__init__(**kwargs) + self.key = key + self.mod = mod + + +class StickyMod(Module): + def __init__(self): + self._active = False + self._active_key = None + make_argumented_key( + names=('SM',), + constructor=StickyModKey, + on_press=self.sm_pressed, + on_release=self.sm_released, + ) + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def process_key(self, keyboard, key, is_pressed, int_coord): + # release previous key if any other key is pressed + if self._active and self._active_key is not None: + self.release_key(keyboard, self._active_key) + + return key + + def before_hid_send(self, keyboard): + return + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return + + def release_key(self, keyboard, key): + keyboard.process_key(key.mod, False) + self._active = False + self._active_key = None + + def sm_pressed(self, key, keyboard, *args, **kwargs): + keyboard.process_key(key.mod, True) + keyboard.process_key(key.key, True) + self._active_key = key + + def sm_released(self, key, keyboard, *args, **kwargs): + keyboard.process_key(key.key, False) + self._active_key = key + self._active = True diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/string_substitution.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/string_substitution.py new file mode 100644 index 000000000..bbb7d3d2a --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/string_substitution.py @@ -0,0 +1,229 @@ +try: + from typing import Optional +except ImportError: + # we're not in a dev environment, so we don't need to worry about typing + pass +from micropython import const + +from kmk.keys import KC, Key, ModifiedKey, ModifierKey +from kmk.modules import Module + + +class State: + LISTENING = const(0) + DELETING = const(1) + SENDING = const(2) + IGNORING = const(3) + + +class Character: + '''Helper class for making a left-shifted key identical to a right-shifted key''' + + is_shifted: bool = False + + def __init__(self, key_code: Key, is_shifted: bool) -> None: + self.is_shifted = is_shifted + self.key_code = KC.LSHIFT(key_code) if is_shifted else key_code + + def __eq__(self, other: any) -> bool: # type: ignore + try: + if isinstance(self.key_code, ModifiedKey): + return ( + self.key_code.key.code == other.key_code.key.code + and self.is_shifted == other.is_shifted + ) + return ( + self.key_code.code == other.key_code.code + and self.is_shifted == other.is_shifted + ) + except AttributeError: + return False + + +class Phrase: + '''Manages a collection of characters and keeps an index of them so that potential matches can be tracked''' + + def __init__(self, string: str) -> None: + self._characters: list[Character] = [] + self._index: int = 0 + for char in string: + key_code = KC[char] + if key_code == KC.NO: + raise ValueError(f'Invalid character in dictionary: {char}') + shifted = char.isupper() or ( + isinstance(key_code, ModifiedKey) and key_code.modifier == KC.LSHIFT + ) + self._characters.append(Character(key_code, shifted)) + + def next_character(self) -> None: + '''Increment the current index for this phrase''' + if not self.index_at_end(): + self._index += 1 + + def get_character_at_index(self, index: int) -> Character: + '''Returns the character at the given index''' + return self._characters[index] + + def get_character_at_current_index(self) -> Character: + '''Returns the character at the current index for this phrase''' + return self._characters[self._index] + + def reset_index(self) -> None: + '''Reset the index to the start of the phrase''' + self._index = 0 + + def index_at_end(self) -> bool: + '''Returns True if the index is at the end of the phrase''' + return self._index == len(self._characters) + + def character_is_at_current_index(self, character) -> bool: + '''Returns True if the given character is the next character in the phrase''' + return self.get_character_at_current_index() == character + + +class Rule: + '''Represents the relationship between a phrase to be substituted and its substitution''' + + def __init__(self, to_substitute: Phrase, substitution: Phrase) -> None: + self.to_substitute: Phrase = to_substitute + self.substitution: Phrase = substitution + + def restart(self) -> None: + '''Resets this rule's to_substitute and substitution phrases''' + self.to_substitute.reset_index() + self.substitution.reset_index() + + +class StringSubstitution(Module): + _shifted: bool = False + _rules: list = [] + _state: State = State.LISTENING + _matched_rule: Optional[Phrase] = None + _active_modifiers: list[ModifierKey] = [] + + def __init__( + self, + dictionary: dict, + ): + for key, value in dictionary.items(): + self._rules.append(Rule(Phrase(key), Phrase(value))) + + def process_key(self, keyboard, key, is_pressed, int_coord): + if key is KC.LSFT or key is KC.RSFT: + if is_pressed: + self._shifted = True + else: + self._shifted = False + + # control ignoring state if the key is a non-shift modifier + elif type(key) is ModifierKey: + if is_pressed and key not in self._active_modifiers: + self._active_modifiers.append(key) + self._state = State.IGNORING + elif key in self._active_modifiers: + self._active_modifiers.remove(key) + if not self._active_modifiers: + self._state = State.LISTENING + # reset rules because pressing a modifier combination + # should interrupt any current matches + for rule in self._rules: + rule.restart() + + if not self._state == State.LISTENING: + return key + + if is_pressed: + character = Character(key, self._shifted) + + # run through the dictionary to check for a possible match on each new keypress + for rule in self._rules: + if rule.to_substitute.character_is_at_current_index(character): + rule.to_substitute.next_character() + else: + rule.restart() + # if character is not a match at the current index, + # it could still be a match at the start of the sequence + # so redo the check after resetting the sequence + if rule.to_substitute.character_is_at_current_index(character): + rule.to_substitute.next_character() + # we've matched all of the characters in a phrase to be substituted + if rule.to_substitute.index_at_end(): + rule.restart() + # set the phrase indexes to where they differ + # so that only the characters that differ are replaced + for character in rule.to_substitute._characters: + if ( + character + == rule.substitution.get_character_at_current_index() + ): + rule.to_substitute.next_character() + rule.substitution.next_character() + else: + break + if rule.to_substitute.index_at_end(): + break + self._matched_rule = rule + self._state = State.DELETING + # if we have a match there's no reason to continue the full key processing, so return out + return + return key + + def during_bootup(self, keyboard): + return + + def before_matrix_scan(self, keyboard): + return + + def before_hid_send(self, keyboard): + + if self._state == State.LISTENING: + return + + if self._state == State.DELETING: + # force-release modifiers so sending the replacement text doesn't interact with them + # it should not be possible for any modifiers other than shift to be held upon rule activation + # as a modified key won't send a keycode that is matched against the user's dictionary, + # but, just in case, we'll release those too + modifiers_to_release = [ + KC.LSFT, + KC.RSFT, + KC.LCTL, + KC.LGUI, + KC.LALT, + KC.RCTL, + KC.RGUI, + KC.RALT, + ] + for modifier in modifiers_to_release: + keyboard.remove_key(modifier) + + # send backspace taps equivalent to the length of the phrase to be substituted + to_substitute: Phrase = self._matched_rule.to_substitute # type: ignore + to_substitute.next_character() + if not to_substitute.index_at_end(): + keyboard.tap_key(KC.BSPC) + else: + self._state = State.SENDING + + if self._state == State.SENDING: + substitution = self._matched_rule.substitution # type: ignore + if not substitution.index_at_end(): + keyboard.tap_key(substitution.get_character_at_current_index().key_code) + substitution.next_character() + else: + self._state = State.LISTENING + self._matched_rule = None + for rule in self._rules: + rule.restart() + + def after_hid_send(self, keyboard): + return + + def on_powersave_enable(self, keyboard): + return + + def on_powersave_disable(self, keyboard): + return + + def after_matrix_scan(self, keyboard): + return diff --git a/hackpads/NumMarcroPad/Firmware/kmk/modules/tapdance.py b/hackpads/NumMarcroPad/Firmware/kmk/modules/tapdance.py new file mode 100644 index 000000000..ce4cd7a65 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/modules/tapdance.py @@ -0,0 +1,123 @@ +from kmk.keys import Key, make_argumented_key +from kmk.modules.holdtap import ActivationType, HoldTap, HoldTapKey + + +class TapDanceKey(Key): + def __init__(self, *keys, tap_time=None, **kwargs): + ''' + Any key in the tapdance sequence that is not already a holdtap + key gets converted to a holdtap key with identical tap and hold + attributes. + ''' + super().__init__(**kwargs) + self.tap_time = tap_time + self.keys = [] + + for key in keys: + if not isinstance(key, HoldTapKey): + ht_key = HoldTapKey( + tap=key, + hold=key, + prefer_hold=True, + tap_interrupted=False, + tap_time=self.tap_time, + ) + self.keys.append(ht_key) + else: + self.keys.append(key) + self.keys = tuple(self.keys) + + +class TapDance(HoldTap): + def __init__(self): + super().__init__(_make_key=False) + make_argumented_key( + names=('TD',), + constructor=TapDanceKey, + on_press=self.td_pressed, + on_release=self.td_released, + ) + + self.td_counts = {} + + def process_key(self, keyboard, key, is_pressed, int_coord): + if isinstance(key, TapDanceKey): + if key in self.td_counts: + return key + + for _key, state in self.key_states.copy().items(): + if state.activated == ActivationType.RELEASED: + keyboard.cancel_timeout(state.timeout_key) + self.ht_activate_tap(_key, keyboard) + self.send_key_buffer(keyboard) + self.ht_deactivate_tap(_key, keyboard) + keyboard.resume_process_key(self, key, is_pressed, int_coord) + key = None + + del self.key_states[_key] + del self.td_counts[state.tap_dance] + + key = super().process_key(keyboard, key, is_pressed, int_coord) + + return key + + def td_pressed(self, key, keyboard, *args, **kwargs): + # active tap dance + if key in self.td_counts: + count = self.td_counts[key] + kc = key.keys[count] + keyboard.cancel_timeout(self.key_states[kc].timeout_key) + + count += 1 + + # Tap dance reached the end of the list: send last tap in sequence + # and start from the beginning. + if count >= len(key.keys): + self.key_states[kc].activated = ActivationType.RELEASED + self.on_tap_time_expired(kc, keyboard) + count = 0 + else: + del self.key_states[kc] + + # new tap dance + else: + count = 0 + + current_key = key.keys[count] + + self.ht_pressed(current_key, keyboard, *args, **kwargs) + self.td_counts[key] = count + + # Add the active tap dance to key_states; `on_tap_time_expired` needs + # the back-reference. + self.key_states[current_key].tap_dance = key + + def td_released(self, key, keyboard, *args, **kwargs): + try: + kc = key.keys[self.td_counts[key]] + except KeyError: + return + state = self.key_states[kc] + if state.activated == ActivationType.HOLD_TIMEOUT: + # release hold + self.ht_deactivate_hold(kc, keyboard, *args, **kwargs) + del self.key_states[kc] + del self.td_counts[key] + elif state.activated == ActivationType.INTERRUPTED: + # release tap + self.ht_deactivate_on_interrupt(kc, keyboard, *args, **kwargs) + del self.key_states[kc] + del self.td_counts[key] + else: + # keep counting + state.activated = ActivationType.RELEASED + + def on_tap_time_expired(self, key, keyboard, *args, **kwargs): + # Note: the `key` argument is the current holdtap key in the sequence, + # not the tapdance key. + state = self.key_states[key] + if state.activated == ActivationType.RELEASED: + self.ht_activate_tap(key, keyboard, *args, **kwargs) + self.send_key_buffer(keyboard) + del self.td_counts[state.tap_dance] + super().on_tap_time_expired(key, keyboard, *args, **kwargs) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/avr_promicro.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/avr_promicro.py new file mode 100644 index 000000000..e8396b6a9 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/avr_promicro.py @@ -0,0 +1,20 @@ +translate = { + 'D3': 0, + 'D2': 1, + 'D1': 4, + 'D0': 5, + 'D4': 6, + 'C6': 7, + 'D7': 8, + 'E6': 9, + 'B4': 10, + 'B5': 11, + 'B6': 12, + 'B2': 13, + 'B3': 14, + 'B1': 15, + 'F7': 16, + 'F6': 17, + 'F5': 18, + 'F4': 19, +} diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/bitc_promicro.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/bitc_promicro.py new file mode 100644 index 000000000..8c2bcf152 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/bitc_promicro.py @@ -0,0 +1,32 @@ +import board + +# Bit-C-Pro RP2040 pinout for reference, see https://nullbits.co/bit-c-pro/ +# (unused) +pinout = [ + board.D0, # Enc 3 + board.D1, # Enc 3 + None, # GND + None, # GND + board.D2, # Enc 2 + board.D3, # Enc 2 + board.D4, # Row 4 + breakout SDA + board.D5, # Row 3 + breakout SCL + board.D6, # Row 2 + board.D7, # Row 1 + board.D8, # Enc 1 + board.D9, # Enc 1 + # Unconnected breakout pins D11, D12, GND, D13, D14 + board.D21, # WS2812 LEDs labeled D10/GP21 but only board.D21 is defined + board.D23, # MOSI - Enc 0 + board.D20, # MISO - Enc 0 + board.D22, # SCK - Row 0 + board.D26, # A0 - Col 3 + board.D27, # A1 - Col 2 + board.D28, # A2 - Col 1 + board.D29, # A3 - Col 0 + None, # 3.3v + None, # RST + None, # GND + None, # RAW +] +# also defined: board.LED_RED, board.LED_GREEN, and board.LED_BLUE == board.LED diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/boardsource_blok.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/boardsource_blok.py new file mode 100644 index 000000000..713cbe15a --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/boardsource_blok.py @@ -0,0 +1,28 @@ +import board + +pinout = [ + board.TX, + board.RX, + None, # GND + None, # GND + board.SDA, + board.SCL, + board.GP04, + board.GP05, + board.GP06, + board.GP07, + board.GP08, + board.GP09, + board.GP21, + board.GP23, + board.GP20, + board.GP22, + board.GP26, + board.GP27, + board.GP28, + board.GP29, + None, # 3.3v + None, # RST + None, # GND + None, # RAW +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/elite_pi.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/elite_pi.py new file mode 100644 index 000000000..1cc24717e --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/elite_pi.py @@ -0,0 +1,28 @@ +import board + +pinout = [ + board.D0, + board.D1, + None, # GND + None, # GND + board.D2, + board.D3, + board.D4, + board.D5, + board.D6, + board.D7, + board.D8, + board.D9, + board.D21, + board.D23, + board.D20, + board.D22, + board.D26, + board.D27, + board.D28, + board.D29, + None, # VCC + None, # RUN + None, # GND + None, # RAW +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/frood.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/frood.py new file mode 100644 index 000000000..c45a2d04e --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/frood.py @@ -0,0 +1,33 @@ +import board + +pinout = [ + board.TX, + board.RX, + None, # GND + None, # GND + board.D2, + board.D3, + board.D4, + board.D5, + board.D6, + board.D7, + board.D8, + board.D9, + board.D12, + board.D13, + board.D14, + board.D15, + board.D16, + board.D21, + board.MOSI, + board.MISO, + board.SCK, + board.D26, + board.D27, + board.D28, + board.D29, + None, # 3.3v + None, # RST + None, # GND + None, # RAW +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/helios.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/helios.py new file mode 100644 index 000000000..6924254cd --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/helios.py @@ -0,0 +1,28 @@ +import board + +pinout = [ + board.TX, + board.RX, + None, # GND + None, # GND + board.GP2, + board.GP3, + board.GP4, + board.GP5, + board.GP6, + board.GP7, + board.GP8, + board.GP9, + board.CS, + board.SDO, + board.SDI, + board.SCK, + board.GP26, + board.GP27, + board.GP28, + board.GP29, + None, # 3.3v + None, # RST + None, # GND + None, # RAW +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/kb2040.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/kb2040.py new file mode 100644 index 000000000..363de3d2f --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/kb2040.py @@ -0,0 +1,28 @@ +import board + +pinout = [ + board.D0, + board.D1, + None, # GND + None, # GND + board.D2, + board.D3, + board.D4, + board.D5, + board.D6, + board.D7, + board.D8, + board.D9, + board.D10, + board.MOSI, + board.MISO, + board.SCK, + board.A0, + board.A1, + board.A2, + board.A3, + None, # 3.3v + None, # RST + None, # GND + None, # RAW +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/liatris.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/liatris.py new file mode 100644 index 000000000..b65af7ed2 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/liatris.py @@ -0,0 +1,43 @@ +import board + +pinout = [ + # Left, top->bottom + board.TX, + board.RX, + None, # GND + None, # GND + board.SDA, + board.SCL, + board.D4, + board.D5, # C6 + board.D6, # D7 + board.D7, # E6 + board.D8, # B4 + board.D9, # B5 + # Right, bottom->top + board.D21, # B6 + board.D23, # B2 + board.D20, # B3 + board.D22, # B1 + board.D26, # F7 + board.D27, # F6 + board.D28, # F5 + board.D29, # F4 + None, # 3.3v + None, # RST + None, # GND + None, # RAW + # Bottom, left->right + board.D12, + board.D13, + board.D14, + board.D15, + board.D16, + # Internal + board.NEOPIXEL, + board.VBUS_SENSE, + board.POWER_LED, + board.I2C, + board.SPI, + board.UART, +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/nice_nano.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/nice_nano.py new file mode 100644 index 000000000..36d5f1309 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/nice_nano.py @@ -0,0 +1,28 @@ +import board + +pinout = [ + board.TX, + board.RX, + None, # GND + None, # GND + board.SDA, + board.SCL, + board.P0_22, + board.P0_24, + board.P1_00, + board.P0_11, + board.P1_04, + board.P1_06, + board.P0_09, + board.P0_10, + board.P1_11, + board.P1_13, + board.P1_15, + board.P0_02, + board.P0_29, + board.P0_31, + None, # 3.3v + None, # RST + None, # GND + None, # Battery+ +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/sparkfun_promicro_rp2040.py b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/sparkfun_promicro_rp2040.py new file mode 100644 index 000000000..13b109894 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/quickpin/pro_micro/sparkfun_promicro_rp2040.py @@ -0,0 +1,28 @@ +import board + +pinout = [ + board.TX, + board.RX, + None, # GND + None, # GND + board.D2, + board.D3, + board.D4, + board.D5, + board.D6, + board.D7, + board.D8, + board.D9, + board.D21, + board.MOSI, + board.MISO, + board.SCK, + board.D26, + board.D27, + board.D28, + board.D29, + None, # 3.3v + None, # RST + None, # GND + None, # RAW +] diff --git a/hackpads/NumMarcroPad/Firmware/kmk/scanners/__init__.py b/hackpads/NumMarcroPad/Firmware/kmk/scanners/__init__.py new file mode 100644 index 000000000..bf6edba97 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/scanners/__init__.py @@ -0,0 +1,38 @@ +class DiodeOrientation: + ''' + Orientation of diodes on handwired boards. You can think of: + COLUMNS = vertical + ROWS = horizontal + + COL2ROW and ROW2COL are equivalent to their meanings in QMK. + ''' + + COLUMNS = 1 + ROWS = 0 + COL2ROW = COLUMNS + ROW2COL = ROWS + + +class Scanner: + ''' + Base class for scanners. + ''' + + # for split keyboards, the offset value will be assigned in Split module + offset = 0 + + @property + def coord_mapping(self): + return tuple(range(self.offset, self.offset + self.key_count)) + + @property + def key_count(self): + raise NotImplementedError + + def scan_for_changes(self): + ''' + Scan for key events and return a key report if an event exists. + + The key report is a byte array with contents [row, col, True if pressed else False] + ''' + raise NotImplementedError diff --git a/hackpads/NumMarcroPad/Firmware/kmk/scanners/digitalio.py b/hackpads/NumMarcroPad/Firmware/kmk/scanners/digitalio.py new file mode 100644 index 000000000..73ffb611d --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/scanners/digitalio.py @@ -0,0 +1,144 @@ +import digitalio + +from keypad import Event as KeyEvent + +from kmk.scanners import DiodeOrientation, Scanner + + +def ensure_DIO(x): + # __class__.__name__ is used instead of isinstance as the MCP230xx lib + # does not use the digitalio.DigitalInOut, but rather a self defined one: + # https://github.com/adafruit/Adafruit_CircuitPython_MCP230xx/blob/3f04abbd65ba5fa938fcb04b99e92ae48a8c9406/adafruit_mcp230xx/digital_inout.py#L33 + if x.__class__.__name__ == 'DigitalInOut': + return x + else: + return digitalio.DigitalInOut(x) + + +class MatrixScanner(Scanner): + def __init__( + self, + cols, + rows, + diode_orientation=DiodeOrientation.COL2ROW, + pull=digitalio.Pull.UP, + rollover_cols_every_rows=None, + offset=0, + ): + self.len_cols = len(cols) + self.len_rows = len(rows) + self.pull = pull + self.offset = offset + + # A pin cannot be both a row and column, detect this by combining the + # two tuples into a set and validating that the length did not drop + # + # repr() hackery is because CircuitPython Pin objects are not hashable + unique_pins = {repr(c) for c in cols} | {repr(r) for r in rows} + assert ( + len(unique_pins) == self.len_cols + self.len_rows + ), 'Cannot use a pin as both a column and row' + del unique_pins + + self.diode_orientation = diode_orientation + + if self.diode_orientation == DiodeOrientation.COL2ROW: + self.anodes = [ensure_DIO(x) for x in cols] + self.cathodes = [ensure_DIO(x) for x in rows] + self.translate_coords = True + elif self.diode_orientation == DiodeOrientation.ROW2COL: + self.anodes = [ensure_DIO(x) for x in rows] + self.cathodes = [ensure_DIO(x) for x in cols] + self.translate_coords = False + else: + raise ValueError(f'Invalid DiodeOrientation: {self.diode_orienttaion}') + + if self.pull == digitalio.Pull.DOWN: + self.outputs = self.anodes + self.inputs = self.cathodes + elif self.pull == digitalio.Pull.UP: + self.outputs = self.cathodes + self.inputs = self.anodes + self.translate_coords = not self.translate_coords + else: + raise ValueError(f'Invalid pull: {self.pull}') + + for pin in self.outputs: + pin.switch_to_output() + + for pin in self.inputs: + pin.switch_to_input(pull=self.pull) + + self.rollover_cols_every_rows = rollover_cols_every_rows + if self.rollover_cols_every_rows is None: + self.rollover_cols_every_rows = self.len_rows + + self._key_count = self.len_cols * self.len_rows + initial_state_value = b'\x01' if self.pull is digitalio.Pull.UP else b'\x00' + self.state = bytearray(initial_state_value) * self.key_count + + @property + def key_count(self): + return self._key_count + + def scan_for_changes(self): + ''' + Poll the matrix for changes and return either None (if nothing updated) + or a bytearray (reused in later runs so copy this if you need the raw + array itself for some crazy reason) consisting of (row, col, pressed) + which are (int, int, bool) + ''' + ba_idx = 0 + any_changed = False + + for oidx, opin in enumerate(self.outputs): + opin.value = self.pull is not digitalio.Pull.UP + + for iidx, ipin in enumerate(self.inputs): + # cast to int to avoid + # + # >>> xyz = bytearray(3) + # >>> xyz[2] = True + # Traceback (most recent call last): + # File "", line 1, in + # OverflowError: value would overflow a 1 byte buffer + # + # I haven't dived too far into what causes this, but it's + # almost certainly because bool types in Python aren't just + # aliases to int values, but are proper pseudo-types + new_val = int(ipin.value) + old_val = self.state[ba_idx] + + if old_val != new_val: + if self.translate_coords: + new_oidx = oidx + self.len_cols * ( + iidx // self.rollover_cols_every_rows + ) + new_iidx = iidx - self.rollover_cols_every_rows * ( + iidx // self.rollover_cols_every_rows + ) + + row = new_iidx + col = new_oidx + else: + row = oidx + col = iidx + + if self.pull is digitalio.Pull.UP: + pressed = not new_val + else: + pressed = new_val + self.state[ba_idx] = new_val + + any_changed = True + break + + ba_idx += 1 + + opin.value = self.pull is digitalio.Pull.UP + if any_changed: + break + + if any_changed: + key_number = self.len_cols * row + col + self.offset + return KeyEvent(key_number, pressed) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/scanners/encoder.py b/hackpads/NumMarcroPad/Firmware/kmk/scanners/encoder.py new file mode 100644 index 000000000..301ebb6a4 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/scanners/encoder.py @@ -0,0 +1,43 @@ +import keypad +import rotaryio + +from kmk.scanners import Scanner + + +class RotaryioEncoder(Scanner): + def __init__(self, pin_a, pin_b, divisor=4): + self.encoder = rotaryio.IncrementalEncoder(pin_a, pin_b, divisor) + self.position = 0 + self._pressed = False + self._queue = [] + + @property + def key_count(self): + return 2 + + def scan_for_changes(self): + position = self.encoder.position + + if position != self.position: + self._queue.append(position - self.position) + self.position = position + + if not self._queue: + return + + key_number = self.offset + if self._queue[0] > 0: + key_number += 1 + + if self._pressed: + self._queue[0] -= 1 if self._queue[0] > 0 else -1 + + if self._queue[0] == 0: + self._queue.pop(0) + + self._pressed = False + + else: + self._pressed = True + + return keypad.Event(key_number, self._pressed) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/scanners/keypad.py b/hackpads/NumMarcroPad/Firmware/kmk/scanners/keypad.py new file mode 100644 index 000000000..a02c119c5 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/scanners/keypad.py @@ -0,0 +1,59 @@ +import keypad + +from kmk.scanners import Scanner + + +class KeypadScanner(Scanner): + ''' + Translation layer around a CircuitPython 7 keypad scanner. + + :param pin_map: A sequence of (row, column) tuples for each key. + :param kp: An instance of the keypad class. + ''' + + @property + def key_count(self): + return self.keypad.key_count + + def scan_for_changes(self): + ''' + Scan for key events and return a key report if an event exists. + + The key report is a byte array with contents [row, col, True if pressed else False] + ''' + ev = self.keypad.events.get() + if ev and self.offset: + return keypad.Event(ev.key_number + self.offset, ev.pressed) + return ev + + +class MatrixScanner(KeypadScanner): + ''' + Row/Column matrix using the CircuitPython 7 keypad scanner. + + :param row_pins: A sequence of pins used for rows. + :param col_pins: A sequence of pins used for columns. + :param direction: The diode orientation of the matrix. + ''' + + def __init__(self, *args, **kwargs): + self.keypad = keypad.KeyMatrix(*args, **kwargs) + super().__init__() + + +class KeysScanner(KeypadScanner): + ''' + GPIO-per-key 'matrix' using the native CircuitPython 7 keypad scanner. + + :param pins: An array of arrays of CircuitPython Pin objects, such that pins[r][c] is the pin for row r, column c. + ''' + + def __init__(self, *args, **kwargs): + self.keypad = keypad.Keys(*args, **kwargs) + super().__init__() + + +class ShiftRegisterKeys(KeypadScanner): + def __init__(self, *args, **kwargs): + self.keypad = keypad.ShiftRegisterKeys(*args, **kwargs) + super().__init__() diff --git a/hackpads/NumMarcroPad/Firmware/kmk/scheduler.py b/hackpads/NumMarcroPad/Firmware/kmk/scheduler.py new file mode 100644 index 000000000..6383a74d5 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/scheduler.py @@ -0,0 +1,75 @@ +''' +Here we're abusing _asyncios TaskQueue to implement a very simple priority +queue task scheduler. +Despite documentation, Circuitpython doesn't usually ship with a min-heap +module; it does however implement a pairing-heap for `TaskQueue` in native code. +''' + +try: + from typing import Callable +except ImportError: + pass + +from supervisor import ticks_ms + +from _asyncio import Task, TaskQueue + +from kmk.kmktime import ticks_add, ticks_diff + +_task_queue = TaskQueue() + + +class PeriodicTaskMeta: + def __init__(self, func: Callable[[None], None], period: int) -> None: + self._task = Task(self.call) + self._coro = func + self.period = period + + def call(self) -> None: + after_ms = ticks_add(self._task.ph_key, self.period) + _task_queue.push_sorted(self._task, after_ms) + self._coro() + + def restart(self) -> None: + _task_queue.push_sorted(self._task) + + +def create_task( + func: [Callable[[None], None], Task, PeriodicTaskMeta], + *, + after_ms: int = 0, + period_ms: int = 0, +) -> [Task, PeriodicTaskMeta]: + if isinstance(func, Task): + t = r = func + elif isinstance(func, PeriodicTaskMeta): + r = func + t = r._task + elif period_ms: + r = PeriodicTaskMeta(func, period_ms) + t = r._task + else: + t = r = Task(func) + + if after_ms > 0: + _task_queue.push_sorted(t, ticks_add(ticks_ms(), after_ms)) + elif after_ms == 0: + _task_queue.push_head(t) + + return r + + +def get_due_task() -> [Callable, None]: + now = ticks_ms() + while True: + t = _task_queue.peek() + if not t or ticks_diff(t.ph_key, now) > 0: + break + _task_queue.pop_head() + yield t.coro + + +def cancel_task(t: [Task, PeriodicTaskMeta]) -> None: + if isinstance(t, PeriodicTaskMeta): + t = t._task + _task_queue.remove(t) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/transports/__init__.py b/hackpads/NumMarcroPad/Firmware/kmk/transports/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/hackpads/NumMarcroPad/Firmware/kmk/transports/pio_uart.py b/hackpads/NumMarcroPad/Firmware/kmk/transports/pio_uart.py new file mode 100644 index 000000000..108d9b46c --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/transports/pio_uart.py @@ -0,0 +1,93 @@ +''' +Circuit Python wrapper around PIO implementation of UART +Original source of these examples: https://github.com/adafruit/Adafruit_CircuitPython_PIOASM/tree/main/examples (MIT) +''' + +import rp2pio +from array import array + +''' +.program uart_tx +.side_set 1 opt +; An 8n1 UART transmit program. +; OUT pin 0 and side-set pin 0 are both mapped to UART TX pin. + pull side 1 [7] ; Assert stop bit, or stall with line in idle state + set x, 7 side 0 [7] ; Preload bit counter, assert start bit for 8 clocks +bitloop: ; This loop will run 8 times (8n1 UART) + out pins, 1 ; Shift 1 bit from OSR to the first OUT pin + jmp x-- bitloop [6] ; Each loop iteration is 8 cycles. + +; compiles to: +''' +tx_code = array('H', [40864, 63271, 24577, 1602]) + + +''' +.program uart_rx_mini + +; Minimum viable 8n1 UART receiver. Wait for the start bit, then sample 8 bits +; with the correct timing. +; IN pin 0 is mapped to the GPIO used as UART RX. +; Autopush must be enabled, with a threshold of 8. + + wait 0 pin 0 ; Wait for start bit + set x, 7 [10] ; Preload bit counter, delay until eye of first data bit +bitloop: ; Loop 8 times + in pins, 1 ; Sample data + jmp x-- bitloop [6] ; Each iteration is 8 cycles + +; compiles to: +''' +rx_code = array('H', [8224, 59943, 16385, 1602]) + + +class PIO_UART: + def __init__(self, *, tx, rx, baudrate=9600): + if tx: + self.tx_pio = rp2pio.StateMachine( + tx_code, + first_out_pin=tx, + first_sideset_pin=tx, + frequency=8 * baudrate, + initial_sideset_pin_state=1, + initial_sideset_pin_direction=1, + initial_out_pin_state=1, + initial_out_pin_direction=1, + sideset_enable=True, + ) + if rx: + self.rx_pio = rp2pio.StateMachine( + rx_code, + first_in_pin=rx, + frequency=8 * baudrate, + auto_push=True, + push_threshold=8, + ) + + @property + def timeout(self): + return 0 + + @property + def baudrate(self): + return self.tx_pio.frequency // 8 + + @baudrate.setter + def baudrate(self, frequency): + self.tx_pio.frequency = frequency * 8 + self.rx_pio.frequency = frequency * 8 + + def write(self, buf): + return self.tx_pio.write(buf) + + @property + def in_waiting(self): + return self.rx_pio.in_waiting + + def read(self, n): + b = bytearray(n) + n = self.rx_pio.readinto(b) + return b[:n] + + def readinto(self, buf): + return self.rx_pio.readinto(buf) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/utils.py b/hackpads/NumMarcroPad/Firmware/kmk/utils.py new file mode 100644 index 000000000..e0830d9d2 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/utils.py @@ -0,0 +1,49 @@ +try: + from typing import Optional +except ImportError: + pass + +from supervisor import ticks_ms + +from usb_cdc import console + + +def clamp(x: int, bottom: int = 0, top: int = 100) -> int: + return min(max(bottom, x), top) + + +_debug_enabled = None + + +class Debug: + '''default usage: + debug = Debug(__name__) + ''' + + def __init__(self, name: str = __name__): + self.name = name + + def __call__(self, *message: str, name: Optional[str] = None) -> None: + if not name: + name = self.name + print(ticks_ms(), end=' ') + print(name, end=': ') + print(*message, sep='') + + @property + def enabled(self) -> bool: + global _debug_enabled + if ( + _debug_enabled is None + and console + and console.connected + and console.out_waiting == 0 + ): + return True + return bool(_debug_enabled) + + @enabled.setter + def enabled(self, enabled: bool): + global _debug_enabled + _debug_enabled = enabled + self('debug.enabled=', enabled) diff --git a/hackpads/NumMarcroPad/Firmware/kmk/version b/hackpads/NumMarcroPad/Firmware/kmk/version new file mode 100644 index 000000000..d8f0af3f7 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/kmk/version @@ -0,0 +1 @@ +dbc26504ac9111e6f0b5ba99d1dbf35275319e27 \ No newline at end of file diff --git a/hackpads/NumMarcroPad/Firmware/neopixel.py b/hackpads/NumMarcroPad/Firmware/neopixel.py new file mode 100644 index 000000000..d12a306f0 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/neopixel.py @@ -0,0 +1,181 @@ +# SPDX-FileCopyrightText: 2016 Damien P. George +# SPDX-FileCopyrightText: 2017 Scott Shawcroft for Adafruit Industries +# SPDX-FileCopyrightText: 2019 Carter Nelson +# SPDX-FileCopyrightText: 2019 Roy Hooper +# +# SPDX-License-Identifier: MIT + +""" +`neopixel` - NeoPixel strip driver +==================================================== + +* Author(s): Damien P. George, Scott Shawcroft, Carter Nelson, Rose Hooper +""" + +import sys +import board +import digitalio +from neopixel_write import neopixel_write + +import adafruit_pixelbuf + +try: + # Used only for typing + from typing import Optional, Type + from types import TracebackType + import microcontroller +except ImportError: + pass + + +__version__ = "6.3.13" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel.git" + + +# Pixel color order constants +RGB = "RGB" +"""Red Green Blue""" +GRB = "GRB" +"""Green Red Blue""" +RGBW = "RGBW" +"""Red Green Blue White""" +GRBW = "GRBW" +"""Green Red Blue White""" + + +class NeoPixel(adafruit_pixelbuf.PixelBuf): + """ + A sequence of neopixels. + + :param ~microcontroller.Pin pin: The pin to output neopixel data on. + :param int n: The number of neopixels in the chain + :param int bpp: Bytes per pixel. 3 for RGB and 4 for RGBW pixels. + :param float brightness: Brightness of the pixels between 0.0 and 1.0 where 1.0 is full + brightness + :param bool auto_write: True if the neopixels should immediately change when set. If False, + `show` must be called explicitly. + :param str pixel_order: Set the pixel color channel order. The default is GRB if bpp is set + to 3, otherwise GRBW is used as the default. + + Example for Circuit Playground Express: + + .. code-block:: python + + import neopixel + from board import * + + RED = 0x100000 # (0x10, 0, 0) also works + + pixels = neopixel.NeoPixel(NEOPIXEL, 10) + for i in range(len(pixels)): + pixels[i] = RED + + Example for Circuit Playground Express setting every other pixel red using a slice: + + .. code-block:: python + + import neopixel + from board import * + import time + + RED = 0x100000 # (0x10, 0, 0) also works + + # Using ``with`` ensures pixels are cleared after we're done. + with neopixel.NeoPixel(NEOPIXEL, 10) as pixels: + pixels[::2] = [RED] * (len(pixels) // 2) + time.sleep(2) + + .. py:method:: NeoPixel.show() + + Shows the new colors on the pixels themselves if they haven't already + been autowritten. + + The colors may or may not be showing after this function returns because + it may be done asynchronously. + + .. py:method:: NeoPixel.fill(color) + + Colors all pixels the given ***color***. + + .. py:attribute:: brightness + + Overall brightness of the pixel (0 to 1.0) + + """ + + def __init__( + self, + pin: microcontroller.Pin, + n: int, + *, + bpp: int = 3, + brightness: float = 1.0, + auto_write: bool = True, + pixel_order: str = None + ): + if not pixel_order: + pixel_order = GRB if bpp == 3 else GRBW + elif isinstance(pixel_order, tuple): + order_list = [RGBW[order] for order in pixel_order] + pixel_order = "".join(order_list) + + self._power = None + if ( + sys.implementation.version[0] >= 7 + and getattr(board, "NEOPIXEL", None) == pin + ): + power = getattr(board, "NEOPIXEL_POWER_INVERTED", None) + polarity = power is None + if not power: + power = getattr(board, "NEOPIXEL_POWER", None) + if power: + try: + self._power = digitalio.DigitalInOut(power) + self._power.switch_to_output(value=polarity) + except ValueError: + pass + + super().__init__( + n, brightness=brightness, byteorder=pixel_order, auto_write=auto_write + ) + + self.pin = digitalio.DigitalInOut(pin) + self.pin.direction = digitalio.Direction.OUTPUT + + def deinit(self) -> None: + """Blank out the NeoPixels and release the pin.""" + self.fill(0) + self.show() + self.pin.deinit() + if self._power: + self._power.deinit() + + def __enter__(self): + return self + + def __exit__( + self, + exception_type: Optional[Type[BaseException]], + exception_value: Optional[BaseException], + traceback: Optional[TracebackType], + ): + self.deinit() + + def __repr__(self): + return "[" + ", ".join([str(x) for x in self]) + "]" + + @property + def n(self) -> int: + """ + The number of neopixels in the chain (read-only) + """ + return len(self) + + def write(self) -> None: + """.. deprecated: 1.0.0 + + Use ``show`` instead. It matches Micro:Bit and Arduino APIs.""" + self.show() + + def _transmit(self, buffer: bytearray) -> None: + neopixel_write(self.pin, buffer) diff --git a/hackpads/NumMarcroPad/Firmware/nummacropad/config.h b/hackpads/NumMarcroPad/Firmware/nummacropad/config.h deleted file mode 100644 index c32f1fed5..000000000 --- a/hackpads/NumMarcroPad/Firmware/nummacropad/config.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0x03A8 -#define PRODUCT_ID 0xA701 -#define DEVICE_VER 0x0001 -#define MANUFACTURER YourName -#define PRODUCT 4x4 Macropad RP2040 -#define DESCRIPTION A simple 4x4 macropad using RP2040 - -/* Key matrix size */ -#define MATRIX_ROWS 4 -#define MATRIX_COLS 4 - -/* Pin definitions */ -#define MATRIX_ROW_PINS { D3, D4, D5, D6 } // Define your row pins (GPIO0 to GPIO3 for example) -#define MATRIX_COL_PINS { D0, D1, D2, D10 } // Define your column pins (GPIO4 to GPIO7 for example) - -#define UNUSED_PINS - -/* Diode direction */ -#define DIODE_DIRECTION COL2ROW - -/* Debounce configuration */ -#define DEBOUNCE 5 - -/* RGB LEDS */ -#define WS2812_DI_PIN 10 -#define RGBLIGHT_LED_COUNT 10 - -/* Encoder */ -#define ENCODER_A_PINS { D8 } -#define ENCODER_B_PINS { D7 } -#define ENCODER_RESOLUTION 4 - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM, or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -#define LOCKING_RESYNC_ENABLE - -/* Encoder support (if needed, set in rules.mk) */ -// #define ENCODERS_PAD_A { GP14 } -// #define ENCODERS_PAD_B { GP15 } -// #define ENCODER_RESOLUTION 4 - -/* Bootmagic Lite keycode (optional, allows resetting keymap) */ -#define BOOTMAGIC_LITE_ROW 0 -#define BOOTMAGIC_LITE_COLUMN 0 diff --git a/hackpads/NumMarcroPad/Firmware/nummacropad/keyboard.json b/hackpads/NumMarcroPad/Firmware/nummacropad/keyboard.json deleted file mode 100644 index 191f28d30..000000000 --- a/hackpads/NumMarcroPad/Firmware/nummacropad/keyboard.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "manufacturer": "Ben Park", - "keyboard_name": "nummacropad", - "maintainer": "benPark20", - "bootloader": "rp2040", - "diode_direction": "COL2ROW", - "features": { - "bootmagic": true, - "command": false, - "console": false, - "extrakey": true, - "mousekey": true, - "nkro": true - }, - "matrix_pins": { - "cols": ["D3", "D4", "D5", "D6"], - "rows": ["D0", "D1", "D2", "D10"] - }, - "processor": "RP2040", - "url": "", - "usb": { - "device_version": "1.0.0", - "pid": "0x0000", - "vid": "0xFEED" - }, - "layouts": { - "LAYOUT_ortho_4x4": { - "layout": [ - {"matrix": [0, 0], "x": 0, "y": 0}, - {"matrix": [0, 1], "x": 1, "y": 0}, - {"matrix": [0, 2], "x": 2, "y": 0}, - {"matrix": [0, 3], "x": 3, "y": 0}, - {"matrix": [1, 0], "x": 0, "y": 1}, - {"matrix": [1, 1], "x": 1, "y": 1}, - {"matrix": [1, 2], "x": 2, "y": 1}, - {"matrix": [1, 3], "x": 3, "y": 1}, - {"matrix": [2, 0], "x": 0, "y": 2}, - {"matrix": [2, 1], "x": 1, "y": 2}, - {"matrix": [2, 2], "x": 2, "y": 2}, - {"matrix": [2, 3], "x": 3, "y": 2}, - {"matrix": [3, 0], "x": 0, "y": 3}, - {"matrix": [3, 1], "x": 1, "y": 3}, - {"matrix": [3, 2], "x": 2, "y": 3}, - {"matrix": [3, 3], "x": 3, "y": 3} - ] - } - } -} \ No newline at end of file diff --git a/hackpads/NumMarcroPad/Firmware/nummacropad/keymaps/default/keymap.c b/hackpads/NumMarcroPad/Firmware/nummacropad/keymaps/default/keymap.c deleted file mode 100644 index e4fe5bbea..000000000 --- a/hackpads/NumMarcroPad/Firmware/nummacropad/keymaps/default/keymap.c +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2023 QMK -// SPDX-License-Identifier: GPL-2.0-or-later - -#include QMK_KEYBOARD_H - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* - * ┌───┬───┬───┬───┐ - * │ 7 │ 8 │ 9 │ / │ - * ├───┼───┼───┼───┤ - * │ 4 │ 5 │ 6 │ * │ - * ├───┼───┼───┼───┤ - * │ 1 │ 2 │ 3 │ - │ - * ├───┼───┼───┼───┤ - * │ 0 │ . │Ent│ + │ - * └───┴───┴───┴───┘ - */ - [0] = LAYOUT_ortho_4x4( - KC_P7, KC_P8, KC_P9, KC_PSLS, - KC_P4, KC_P5, KC_P6, KC_PAST, - KC_P1, KC_P2, KC_P3, KC_PMNS, - KC_P0, KC_PDOT, KC_PENT, KC_PPLS - ) - -}; -#if defined(ENCODER_MAP_ENABLE) - const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, -}; -#endif diff --git a/hackpads/NumMarcroPad/Firmware/nummacropad/readme.md b/hackpads/NumMarcroPad/Firmware/nummacropad/readme.md deleted file mode 100644 index 0a0393ea6..000000000 --- a/hackpads/NumMarcroPad/Firmware/nummacropad/readme.md +++ /dev/null @@ -1,27 +0,0 @@ -# nummacropad - -![nummacropad](imgur.com image replace me!) - -*A short description of the keyboard/project* - -* Keyboard Maintainer: [Ben Park](https://github.com/benPark20) -* Hardware Supported: *The PCBs, controllers supported* -* Hardware Availability: *Links to where you can find this hardware* - -Make example for this keyboard (after setting up your build environment): - - make nummacropad:default - -Flashing example for this keyboard: - - make nummacropad:default:flash - -See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). - -## Bootloader - -Enter the bootloader in 3 ways: - -* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard -* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead -* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/hackpads/NumMarcroPad/Firmware/nummacropad/rules.mk b/hackpads/NumMarcroPad/Firmware/nummacropad/rules.mk deleted file mode 100644 index 5f701ab59..000000000 --- a/hackpads/NumMarcroPad/Firmware/nummacropad/rules.mk +++ /dev/null @@ -1,32 +0,0 @@ -# MCU Settings -MCU = rp2040 - -# Bootloader Selection (usually rp2040) -BOOTLOADER = rp2040 - -# Build options -# You can enable or disable features here -RGBLIGHT_ENABLE = yes # Disable RGB lighting by default -RGBLIGHT_DRIVER = ws2812 -MOUSEKEY_ENABLE = no # Disable mouse keys -EXTRAKEY_ENABLE = yes # Enable extra keys (media control, etc.) -CONSOLE_ENABLE = no # Disable console output -COMMAND_ENABLE = no # Disable command feature - -# Define matrix size (rows x columns) -MATRIX_ROWS = 4 -MATRIX_COLS = 4 - -# Enable USB Features -VUSB_ENABLE = no # Disable virtual USB for this project -USB_VID = 0x03A8 # Vendor ID -USB_PID = 0xA701 # Product ID for the macropad - -# Set processor frequency -F_CPU = 12000000 - -# Enable bootmagic lite for keymap reset -BOOTMAGIC_ENABLE = lite # Allows for holding a key during boot to reset QMK - -# Enable encoder support if needed -ENCODER_ENABLE = yes # Disable by default diff --git a/hackpads/NumMarcroPad/Firmware/pog.json b/hackpads/NumMarcroPad/Firmware/pog.json new file mode 100644 index 000000000..8d92008d9 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/pog.json @@ -0,0 +1,210 @@ +{ + "id": "01JHB3MV1CCJ3T5P5Q7VRTYX72", + "name": "Macropad", + "manufacturer": "", + "description": "", + "tags": [], + "controller": "", + "keyboardType": "normal", + "wiringMethod": "matrix", + "diodeDirection": "COL2ROW", + "rows": 4, + "cols": 4, + "pins": 0, + "rowPins": [ + "D0", + "D1", + "D2", + "D10" + ], + "colPins": [ + "D3", + "D4", + "D5", + "D6" + ], + "directPins": [], + "encoders": [ + { + "pad_a": "D7", + "pad_b": "D8" + } + ], + "layouts": [], + "keys": [ + { + "x": 0, + "y": 0, + "idx": 0 + }, + { + "x": 1, + "y": 0, + "idx": 1 + }, + { + "x": 2, + "y": 0, + "idx": 2 + }, + { + "x": 3, + "y": 0, + "idx": 3 + }, + { + "x": 0, + "y": 1, + "idx": 4 + }, + { + "x": 1, + "y": 1, + "idx": 5 + }, + { + "x": 2, + "y": 1, + "idx": 6 + }, + { + "x": 3, + "y": 1, + "idx": 7 + }, + { + "x": 0, + "y": 2, + "idx": 8 + }, + { + "x": 1, + "y": 2, + "idx": 9 + }, + { + "x": 2, + "y": 2, + "idx": 10 + }, + { + "x": 3, + "y": 2, + "idx": 11 + }, + { + "x": 0, + "y": 3, + "idx": 12 + }, + { + "x": 1, + "y": 3, + "idx": 13 + }, + { + "x": 2, + "y": 3, + "idx": 14 + }, + { + "x": 3, + "y": 3, + "idx": 15 + } + ], + "keymap": [ + [ + "KC.N1", + "KC.N2", + "KC.N3", + "KC.N4", + "KC.N5", + "KC.N6", + "KC.N7", + "KC.N8", + "KC.N9", + "KC.N0", + "KC.A", + "KC.B", + "KC.C", + "KC.D", + "KC.E", + "KC.F" + ] + ], + "encoderKeymap": [ + [ + [ + "KC.VOLD", + "KC.VOLU" + ] + ] + ], + "layers": [ + { + "name": "Encoder", + "color": "#0ca508" + } + ], + "split": false, + "splitPinA": "", + "splitPinB": "", + "splitSide": "left", + "vbusPin": "VBUS_SENSE", + "splitUsePio": true, + "splitFlip": false, + "spitUartFlip": false, + "coordMap": [ + [ + "000", + "001", + "002", + "003" + ], + [ + "004", + "005", + "006", + "007" + ], + [ + "008", + "009", + "010", + "011" + ], + [ + "012", + "013", + "014", + "015" + ] + ], + "pinPrefix": "board", + "coordMapSetup": false, + "rgbPin": "board.D9", + "rgbNumLeds": 10, + "rgbOptions": { + "animationMode": 7, + "hueDefault": 168, + "satDefault": 212, + "valDefault": 78, + "animationSpeed": 3, + "breatheCenter": 1.5, + "knightEffectLength": 3 + }, + "kbFeatures": [ + "basic", + "serial", + "oneshot", + "tapdance", + "holdtap", + "mousekeys", + "combos", + "macros", + "rgb" + ], + "flashingMode": "automatic", + "lastEdited": "2025-01-15 18:03" +} \ No newline at end of file diff --git a/hackpads/NumMarcroPad/Firmware/pog.py b/hackpads/NumMarcroPad/Firmware/pog.py new file mode 100644 index 000000000..4208417bd --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/pog.py @@ -0,0 +1,148 @@ +# pog.py Import the pog config - v0.9.5 +import json +import board +from kmk.keys import KC +import microcontroller + +config = {} +configbuffer = bytearray() +configbufferlen = 0 +try: + with open("/pog.json", "r") as fp: + x = fp.read() + # parse x: + config = json.loads(x) + configbuffer = json.dumps(config) + configbufferlen = len(configbuffer) +except OSError as e: + microcontroller.nvm[0] = 1 + raise Exception("Could not read pog.json file. mounting drive") + +print("starting keyboard %s (%s)" % (config["name"], config["id"])) + +def pinValid(pin): + if pin == "": + return False + if config["pinPrefix"] == "quickpin": + pin = f'{eval(pin)}' + if pin in [f'board.{alias}' for alias in dir(board)]: + return True + else: + print(f'INVALID PIN FOUND {pin}') + return False + +# Pin setup +def renderPin(pin): + pinLabel = '' + if config["pinPrefix"] == "gp": + pinLabel = "board.GP" + pin + elif config["pinPrefix"] == "board": + pinLabel = "board." + pin + elif config["pinPrefix"] == "quickpin": + pinLabel = "pins[" + pin + "]" + else: + pinLabel = pin + if pinValid(pinLabel): + return pinLabel + + + +colPinsArray = [] +for i, item in enumerate(config["colPins"]): + colPinsArray.append(renderPin(item)) +# Remove the 'None's from the list of pins +colPinsArray = [pin for pin in colPinsArray if pin is not None] +colPins = ",".join(colPinsArray) +if len(colPinsArray) == 1: + colPins = colPins + "," + +rowPinsArray = [] +for i, item in enumerate(config["rowPins"]): + rowPinsArray.append(renderPin(item)) +# Remove the 'None's from the list of pins +rowPinsArray = [pin for pin in rowPinsArray if pin is not None] +rowPins = ",".join(rowPinsArray) +if len(rowPinsArray) == 1: + rowPins = rowPins + "," + +pinsArray = [] +for i, item in enumerate(config["directPins"]): + pinsArray.append(renderPin(item)) +# Remove the 'None's from the list of pins +pinsArray = [pin for pin in pinsArray if pin is not None] +pins = ",".join(pinsArray) +if len(pinsArray) == 1: + pins = pins + "," + +kbFeatures = config.get('kbFeatures') + +rgbPin = config["rgbPin"] if pinValid(config["rgbPin"]) else None +rgbNumLeds = config["rgbNumLeds"] +rgbOptions = config["rgbOptions"] +if not config["rgbOptions"] and "rgb" in kbFeatures: + print("rgbOptions not set when rgb is needed") + + +matrixWiring = False +directWiring = False + +if config['wiringMethod'] == 'matrix': + matrixWiring = True + keyCount = len(rowPinsArray) * len(colPinsArray) +else: + directWiring = True + keyCount = len(pinsArray) + + +# encoders +hasEncoders = len(config['encoders']) != 0 + +encoderArray = [] +for i, item in enumerate(config["encoders"]): + encoderArray.append([eval(renderPin(item['pad_a'])), eval(renderPin(item['pad_b'])), None]) +encoderTupleArray = [] +for i, item in enumerate(encoderArray): + encoderTupleArray.append(tuple(item)) +encoders = tuple(encoderTupleArray) + + +# coord map +coordMappingAssistant = config['coordMapSetup'] +def convert_coord_mapping(): + if not config.get("coordMap"): + return "" + str = "" + for row in config["coordMap"]: + str += " " + ",".join(val for val in row)+"," + return str.replace("spc,", " ") + + +coordMapping = convert_coord_mapping() + +keyboardType = None +if config.get('keyboardType'): + keyboardType = config['keyboardType'] + +splitSide = None +if config.get('splitSide'): + splitSide = config['splitSide'] + +splitPinA = None +splitPinB = None +if config.get('splitPinA'): + splitPinA = eval(renderPin(config['splitPinA'])) +if config.get('splitPinB'): + splitPinB = eval(renderPin(config['splitPinB'])) +splitUsePio = config.get('splitUsePio') +splitFlip = config.get('splitFlip') +splitUartFlip = config.get('splitUartFlip') + +vbusPin = None +if config.get('vbusPin') and config.get('splitSide') == 'vbus' and pinValid("board." + config['vbusPin']): + vbusPin = eval("board." + config['vbusPin']) + +# led pin without prefix for now +if config.get('ledPin'): + ledPin = eval(config.get('ledPin')) + ledLength = int(config.get('ledLength')) + diff --git a/hackpads/NumMarcroPad/Firmware/pog_serial.py b/hackpads/NumMarcroPad/Firmware/pog_serial.py new file mode 100644 index 000000000..2125c53c4 --- /dev/null +++ b/hackpads/NumMarcroPad/Firmware/pog_serial.py @@ -0,0 +1,207 @@ +# pog_serial module - v0.9.5 +from usb_cdc import data +from kmk.modules import Module +from kmk.utils import Debug +import pog +import json +import gc +import time +import microcontroller +import os +import supervisor +import math +import board + +debug = Debug(__name__) + +action = "" +chunkindex = 0 + +def sendConfig(): + def cross_sum(s): + """ + Returns the cross sum of a string, where each character is mapped to its Unicode code point. + """ + # Compute the cross sum + total = 0 + for c in s: + total += ord(c) + + return total + global action + global chunkindex + print('writing chunk', chunkindex) + + chunksize = 800 + chunk_count = pog.configbufferlen / chunksize + if chunkindex > chunk_count: + return + chunk = (json.dumps({ + 'type': 'pogconfig', + 'current_chunk': chunkindex + 1, # start at 1 for the first chunk + 'total_chunks': math.ceil(chunk_count), # only show full chunks + 'data': pog.configbuffer[chunksize*chunkindex:chunksize*chunkindex+chunksize], + 'totalsize': pog.configbufferlen, + 'cross_sum': cross_sum(pog.configbuffer[chunksize*chunkindex:chunksize*chunkindex+chunksize]) + })+"\n").encode() + print(chunk) + wrote = data.write(chunk) + print('wrote', wrote) + +def readConfigChunk(line): + global action + global chunkindex + lasttime = time.monotonic_ns() + jsondata = json.loads(line) + print('json loadin chunk', jsondata['current_chunk'] ,jsondata['total_chunks'],time.monotonic_ns() - lasttime) + lasttime = time.monotonic_ns() + + #tmpConfigFile = open('received_file.json', 'a') + #tmpConfigFile.write(jsondata['data']) + # print(jsondata['current_chunk']) + tmpConfigFile = open('received_file.json', 'a') + print('open file',time.monotonic_ns() - lasttime) + lasttime = time.monotonic_ns() + # print('saving to file', line) + tmpConfigFile.write(jsondata['data']) + tmpConfigFile.close() + + print('writing', jsondata['current_chunk'], "of", jsondata['total_chunks']) + if jsondata['total_chunks'] == jsondata['current_chunk']: + print('done with reading the pog.config') + data.write('y\n'.encode()) + action = "" + chunkindex = 0 + try: + jsonfile = open('received_file.json', 'r') + json.loads(jsonfile.read()) + jsonfile.close() + print('file close') + # set as new pog.json + os.rename('/pog.json','/pog.json.bk') + os.rename('/received_file.json','/pog.json') + except ValueError as err: + print('sent file is not valid json', err) + else: + data.write('1\n'.encode()) + +def readKeymapChunk(line): + global action + jsondata = json.loads(line) + print('json loadin chunk', jsondata['current_chunk'] ,jsondata['total_chunks']) + tmpConfigFile = open('received_file.py', 'a') + print('open file') + tmpConfigFile.write(jsondata['data']) + tmpConfigFile.close() + print('writing', jsondata['current_chunk'], "of", jsondata['total_chunks']) + if jsondata['total_chunks'] == jsondata['current_chunk']: + print('done with reading the pog.config') + data.write('y\n'.encode()) + action = "" + os.rename('/keymap.py','/keymap.py.bk') + os.rename('/received_file.py','/keymap.py') + else: + data.write('1\n'.encode()) + +class pogSerial(Module): + buffer = bytearray() + + def during_bootup(self, keyboard): + try: + data.timeout = 0 + except AttributeError: + pass + + def before_matrix_scan(self, keyboard): + pass + + def after_matrix_scan(self, keyboard): + pass + + def process_key(self, keyboard, key, is_pressed, int_coord): + return key + + def before_hid_send(self, keyboard): + # Serial.data isn't initialized. + if not data: + return + # Nothing to parse. + if data.in_waiting == 0: + return + self.buffer.extend(data.read(64)) + idx = self.buffer.find(b'\n') + # No full command yet. + if idx == -1: + return + + print('got serial request') + + try: + line = (self.buffer[:idx]).decode('utf-8') + self.buffer = self.buffer[idx + 1 :] + global action + global chunkindex + if action == 'readConfig': + print('data transmit mode: reading config file in chunks') + readConfigChunk(line) + elif action == 'readKeymap': + print('data transmit mode: reading keymap file in chunks') + readKeymapChunk(line) + else: + split = line.split() + if split[0] == 'info': + # print keyboard info + action = 'info' + chunkindex = 0 + print('query keyboard info from serial') + sendConfig() + if split[0] == 'info_simple': + # print basic keyboard info + print('getting basic keyboard info') + data.write((json.dumps({"driveMounted": microcontroller.nvm[0]!=0 ,"name": pog.config['name'], "manufacturer": pog.config['manufacturer'], "id": pog.config['id'], "board": dir(board) })+"\n").encode()) + if split[0] == 'save': + # read chunks + file_to_delete = open("received_file.json",'w') + file_to_delete.close() + print('start reading chunks') + action = "readConfig" + data.write('1\n'.encode()) + if split[0] == 'saveKeymap': + # read chunks + file_to_delete = open("received_file.py",'w') + file_to_delete.close() + print('start reading chunks') + action = "readKeymap" + data.write('1\n'.encode()) + if split[0] == 'reset': + microcontroller.reset() + if split[0] == 'drive': + if microcontroller.nvm[0] == 0: + microcontroller.nvm[0] = 1 + else: + microcontroller.nvm[0] = 0 + print('toggling Drive to', microcontroller.nvm[0]) + if split[0] == '1' or split[0] == '0': + # contine chunk + if split[0] == '1': + chunkindex += 1 + if action == 'info': + sendConfig() + if split[0] == 'y': + print('resetting action') + action = "" + chunkindex = 0 + + + except Exception as err: + debug(f'error: {err}') + + def after_hid_send(self, keyboard): + pass + + def on_powersave_enable(self, keyboard): + pass + + def on_powersave_disable(self, keyboard): + pass + diff --git a/hackpads/NumMarcroPad/README.md b/hackpads/NumMarcroPad/README.md index 9d80f4a6b..7b714f787 100644 --- a/hackpads/NumMarcroPad/README.md +++ b/hackpads/NumMarcroPad/README.md @@ -1,6 +1,22 @@ +# NumMacroPad This is my Numpad/Macropad project for Hackpad. This was made so that I can have a number pad since I upgraded my keyboard to a smaller one and I am missing the full numpad size. It features a rotary encoder, 15 switches, and status LEDs. -Fabrication files are in PCB Fab and 3D models. The assembly stl and step should not be printed. PCB fabrication was made using JLC plugin in KiCad + + +## PCB +The PCB was probably the most time consuming part. I followed Joe Scottos tutorials on Youtube as a baseline, but overall the design is 100% mine. The PCB was designed in KiCad and used the trace rounding/fillet feature to give it that nice look. I also made a faux "ground plane" so the traces really stand out. + + + +## Design +The case was designed using onshape ([file here](https://cad.onshape.com/documents/9bd2fe8a66b630f7849ad79b/w/b976060d2e7b414287d23070/e/58c7f637e0987dc33dad021f?renderMode=0&uiState=6788508f46be634465965f4d)) and the shown version is actually the second iteration. The first used a plate made from acrylic but after some mishappenings with that I redesigned it to use clear PETG. I opted for a plateless design for the second iteration so that I wouldnt have to desolder and resolder on all the switches each time if I wanted to make a change or take off the plate. With the plateless design, I use a ledge built in to the body to hold the pcb up. I gave that ledge just enough tolerance so i caould use electrical tape around the edges to fill in the gaps and dampen the sound when you press down on the key (it sounds super nice). The petg top and bottom helps diffuse the leds and provides that nice underglow on the bottom. + + + +## Firmware +This was prgrammed in KMK using POG. POG is a great gui for programming in kmk as you dont ahve to worry about the file organization or compilation. It does it all for you (assuming you are using an rp2040 based MCU) KMK has most of the functionality as QMK, but with POG I found it the easiest option. + + # BOM: @@ -12,8 +28,6 @@ Fabrication files are in PCB Fab and 3D models. The assembly stl and step should | WS2812b LED | 10 | | Keycaps | 15 | | Knob | 1 | -| Clear Acrylic (for bottom and middle plates) | 2 | -| Frosted Acrylic (for top plate) | 1 | +| Acrylic (for top and bottom plates) | 2 | | Black PLA for Middle 3DP | 1 | -| White PLA for Top 3DP | 1 | | PCB | 1 | diff --git a/website/src/main.tsx b/website/src/main.tsx index 6c9d6f54e..44ec8fede 100644 --- a/website/src/main.tsx +++ b/website/src/main.tsx @@ -17,7 +17,9 @@ import "./index.css"; // IMPORT YOUR PROJECTS HERE -import OrpheusPad from "./pages/submissions/Orpheuspad/OrpheusPad.mdx" + +import OrpheusPad from "./pages/submissions/OrpheusPad/OrpheusPad.mdx" +import NumMacroPad from "./pages/submissions/NumMacroPad.mdx" import CyaoPad from "./pages/submissions/Cyaopad/CyaoPad.mdx" const router = createBrowserRouter([ diff --git a/website/src/pages/submissions/NumMacroPad.mdx b/website/src/pages/submissions/NumMacroPad.mdx new file mode 100644 index 000000000..7b714f787 --- /dev/null +++ b/website/src/pages/submissions/NumMacroPad.mdx @@ -0,0 +1,33 @@ +# NumMacroPad +This is my Numpad/Macropad project for Hackpad. This was made so that I can have a number pad since I upgraded my keyboard to a smaller one and I am missing the full numpad size. It features a rotary encoder, 15 switches, and status LEDs. + + + +## PCB +The PCB was probably the most time consuming part. I followed Joe Scottos tutorials on Youtube as a baseline, but overall the design is 100% mine. The PCB was designed in KiCad and used the trace rounding/fillet feature to give it that nice look. I also made a faux "ground plane" so the traces really stand out. + + + +## Design +The case was designed using onshape ([file here](https://cad.onshape.com/documents/9bd2fe8a66b630f7849ad79b/w/b976060d2e7b414287d23070/e/58c7f637e0987dc33dad021f?renderMode=0&uiState=6788508f46be634465965f4d)) and the shown version is actually the second iteration. The first used a plate made from acrylic but after some mishappenings with that I redesigned it to use clear PETG. I opted for a plateless design for the second iteration so that I wouldnt have to desolder and resolder on all the switches each time if I wanted to make a change or take off the plate. With the plateless design, I use a ledge built in to the body to hold the pcb up. I gave that ledge just enough tolerance so i caould use electrical tape around the edges to fill in the gaps and dampen the sound when you press down on the key (it sounds super nice). The petg top and bottom helps diffuse the leds and provides that nice underglow on the bottom. + + + +## Firmware +This was prgrammed in KMK using POG. POG is a great gui for programming in kmk as you dont ahve to worry about the file organization or compilation. It does it all for you (assuming you are using an rp2040 based MCU) KMK has most of the functionality as QMK, but with POG I found it the easiest option. + + + +# BOM: + +| Item | Amount | +| :--: | :----: | +| Gateron Milky Yellows | 15 | +| EC11 Rotary Encoder | 1 | +| Thruhole Diodes | 16 | +| WS2812b LED | 10 | +| Keycaps | 15 | +| Knob | 1 | +| Acrylic (for top and bottom plates) | 2 | +| Black PLA for Middle 3DP | 1 | +| PCB | 1 |